Bruno Rossetto Machado
Satisfaction does not come with achievement, but with effort.
Full effort is full victory.
Mohandas Gandhi
segunda-feira, 4 de março de 2013
quarta-feira, 20 de fevereiro de 2013
De volta ao bom e velho Java, mas...
terça-feira, 15 de janeiro de 2013
Lendo arquivos de propriedades de um .war ou .ear usando módulos no JBoss AS 7
Uma outra possibilidade para ler arquivos .properties no JBoss AS 7 é utilizar módulos. Desta forma, será possível obter o arquivo .properties utilizando um simples Thread.currentThread().getContextClassLoader().getResource("...") ou getResourceAsStream("...").
Os passos estão abaixo:
1. Crie um módulo com a seguinte estrutura de diretórios:
{jboss.home}/modules/propriedades/conf/main
2. Crie o arquivo module.xml em {jboss.home}/modules/propriedades/conf/main com o seguinte conteúdo
<module xmlns="urn:jboss:module:1.1" name="propriedades.conf">
<resources>
<resource-root path="arquivos"/>
</resources>
</module>
3. Crie o diretório arquivos na estrutura do módulo:
{jboss.home}/modules/propriedades/conf/main/arquivos
4. Adicionar o arquivo de propriedades na nova estrutura de diretórios, exemplo:
{jboss.home}/modules/propriedades/conf/main/arquivos/meuarquivo.properties
5. Adicionar o arquivo jboss-deployment-structure.xml no diretório WEB-INF da aplicação .war ([arquivo].war/WEB-INF/jboss-deployment-structure.xml) com o seguinte conteúdo:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="propriedades.conf" />
</dependencies>
</deployment>
</jboss-deployment-structure>
Note que propriedades.conf é o nome do módulo criado no passo 2.
Caso esteja utilizando um .ear, adicione o arquivo jboss-deployment-structure.xml no diretório META-INF
6. No código java, você poderá ler os atributos do arquivo .properties conforme abaixo:
Properties properties = new Properties();
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("meuarquivo.properties"))
properties.get("nome-da-propriedade")
sexta-feira, 11 de janeiro de 2013
Como ler propriedades java no JBoss AS 7
Voltando ao blog depois de alguns anos sem novos posts. Creio que estou em dívida com ele :). Meu foco nos novos posts será adicionar conteúdo relacionado ao JBoss AS 7.x e novas versões que poderão vir deste servidor de aplicações.
Neste post específico, irei descrever formas de substituir o antigo properties-service.xml dos JBoss AS 4.x e 5.x para o JBoss AS 7.
A princípio, não encontrei nenhum serviço semelhante ao properties-service.xml, porém há diversas formas de contornar isto. Uma delas é passar diversos arquivos .properties em linha de comando durante a inicialização do JBoss.
./standalone.sh --properties=arquivo1.properties --properties=arquivo2.properties
Estas propriedades poderão ser lidas como System.getProperty("nome-da-sua-propriedade");
Poderia também ser passado via property no startup ou até mesmo na própria instância via Console Web.
./standalone.sh -Dproperty1=value1 -Dproperty2=value2
No próximo post, irei exemplificar outras formas de utilizar arquivos .properties no JBoss AS 7
Esta solução pode ser encontrada no fórum do jboss.org: https://community.jboss.org/message/750465
sexta-feira, 23 de abril de 2010
sexta-feira, 20 de março de 2009
"Injetando" funcionalidades nas páginas do JBoss Portal
O JBoss Portal disponibiliza uma API de Injeção de Dependências onde é possível criar interceptadores a partir da classe abstrata JBossInterceptor. A classe ControllerInterceptor (q extends JBossInterceptor), é utilizada como base para adicionar segurança em commands, navegação, menus, header, dashboard, etc...
É possível criar seu Aspecto para o JBoss Portal herdando ControllerInterceptor e criando seu método invoke.
Para exemplificar, iremos adicionar um título ao layout do Portal utilizando o nome de cada página criado via interface administrativa em uma área pré-definida no layout utilizando o Interceptador PageCustomizerInterceptor, o qual já está sendo utilizado para outros fins. Resumindo, iremos alterar o PageCustomizerInterceptor para que a partir dele os títulos sejam incluídos dinamicamente.
O Código 1 define o MBean PageCustomizer com o atributo Title, onde é passado o Path da página que irá exibir o Título da página.
Código 1
<mbean code="org.jboss.portal.core.aspects.controller.PageCustomizerInterceptor"
name="portal:service=Interceptor,type=Command,name=PageCustomizer" xmbean-dd=""
xmbean-code="org.jboss.portal.jems.as.system.JBossServiceModelMBean">
<xmbean/>
<attribute name="TargetContextPath">/portal-core</attribute>
<attribute name="HeaderPath">/WEB-INF/jsp/header/header.jsp</attribute>
<attribute name="TabsPath">/WEB-INF/jsp/header/tabs.jsp</attribute>
<attribute name="Breadcrumbs">/WEB-INF/jsp/header/breadcrumbs.jsp</attribute>
<attribute name="Title">/WEB-INF/jsp/header/title.jsp</attribute>
<!-- Overrides the value of core.login.namespace in config.xml --><!-- attribute name="LoginNamespace">dashboard</attribute -->
<depends optional-attribute-name="Config" proxy-type="attribute">portal:service=ServerConfig</depends>
<depends optional-attribute-name="PortalAuthorizationManagerFactory" proxy-type="attribute">
portal:service=PortalAuthorizationManagerFactory
</depends>
<depends optional-attribute-name="PortalObjectContainer" proxy-type="attribute">portal:container=PortalObject
</depends>
</mbean>
O Código 2 mostra a customização da classe PageCustomizerInterceptor onde foi criado o atributo de classe privado chamado title e seus métodos get e set. Este atributo está associado ao Title definido no MBean e será utilizado pelo método injectTitle para fazer o redirecionamento para o jsp de exibição do título. Além disso, o método injectTitle também adiciona dois atributos a requisição: org.jboss.portal.api.PORTAL_NODE e org.jboss.portal.api.PORTAL_RUNTIME_CONTEXT, com valor do Nó corrente e do contexto respectivamente. O método invoke é utilizado para montar a página com suas respectivas propriedades.
Código 2
public class PageCustomizerInterceptor extends ControllerInterceptor {
...
/** title */
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
...
public ControllerResponse invoke(ControllerCommand cmd) throws Exception {
ControllerResponse resp = (ControllerResponse)cmd.invokeNext();
// Insert navigation portlet in the page
if (resp instanceof PageRendition) {
PageRendition rendition = (PageRendition)resp;
if (cmd instanceof PageCommand) {
PageCommand rpc = (PageCommand)cmd;
String tabbedTitle = injectTitle(rpc);
if (tabbedTitle != null) {
Map windowProps = new HashMap();
windowProps.put(ThemeConstants.PORTAL_PROP_WINDOW_RENDERER, "emptyRenderer");
windowProps.put(ThemeConstants.PORTAL_PROP_DECORATION_RENDERER, "emptyRenderer");
windowProps.put(ThemeConstants.PORTAL_PROP_PORTLET_RENDERER, "emptyRenderer");
WindowResult res = new WindowResult("", tabbedTitle, Collections.EMPTY_MAP, windowProps, null, WindowState.NORMAL, Mode.VIEW);
WindowContext blah = new WindowContext("BLAH", "tituloPrincipal", "0", res);
rendition.getPageResult().addWindowContext(blah);
//
Region region = rendition.getPageResult().getRegion2("tituloPrincipal");
DynaRenderOptions.NO_AJAX.setOptions(region.getProperties());
}
}
}
return resp;
}
...
public String injectTitle(PageCommand rpc) {
ControllerContext controllerCtx = rpc.getControllerContext();
ControllerRequestDispatcher rd = controllerCtx.getRequestDispatcher(targetContextPath, title);
if (rd != null) {
Page page = rpc.getPage();
PortalAuthorizationManager pam = portalAuthorizationManagerFactory.getManager();
PortalNodeImpl node = new PortalNodeImpl(pam, page);
rd.setAttribute("org.jboss.portal.api.PORTAL_NODE", node);
rd.setAttribute("org.jboss.portal.api.PORTAL_RUNTIME_CONTEXT", Navigation.getPortalRuntimeContext());
rd.include();
return rd.getMarkup();
}
return null;
}
...
}
O Código 3 mostra o JSP que exibe o título da página.
Código 3
<%@ page import="org.jboss.portal.api.node.PortalNode" %>
<%@ page import="java.util.Locale" %>
<%
PortalNode node = (PortalNode)request.getAttribute("org.jboss.portal.api.PORTAL_NODE");
// Get a locale
Locale locale = request.getLocale();
if (locale == null)
{
locale = Locale.getDefault();
}
%>
<%= node.getDisplayName(locale) %>
O Código 4 mostra a chamada a taglib para encaixar o título no layout desejado.
Código 4
<p:region regionName='tituloPrincipal' regionID='tituloPrincipal'/>
Considerações finais
Este post tratou uma forma flexível de inclusão de funcionalidades ao layout do JBoss Portal. Atualmente já é utilizada para outras áreas, mas, além da inclusão de títulos dinâmicos, pode ser totalmente adaptada para inclusão de breadcrumbs, por exemplo, principalmente para evitar ter que incluir seu respectivo Portlet em todas as páginas necessárias manualmente, economizando tempo precioso de desenvolvimento.

