Author Archives: sutradi

Bysutradi

Configurar SVN com Apache2 no Ubuntu em servidor AWS

Se você precisa configurar o SVN com Apache2 (para acesso remoto via http(s)) no Ubuntu, provavelmente encontrará vários sites/blogs com seus passo-a-passo para realizar tal tarefa.

Fui um destes usuários necessitados.

Aparentemente, parece uma tarefa muito simples. Se não fosse por um detalhe. Por algum motivo, todos os tutoriais que encontrei não mencionaram sobre a necessidade de habilitar o módulo DAV_SVN no Apache2. Ao fazer o restart, este módulo não é instalado/iniciado automaticamente.

Então, vamos aos passos.

1 – Instalar Subversion

apt-get update && apt-get install subversion subversion-tools libapache2-svn

2 – Criar  diretório para o SVN

mkdir -p /usr/local/svn

3 – Criar o repositório

svnadmin create --fs-type fsfs /usr/local/svn/repositorio

4 – Criar o grupo subversion (ou outro qualquer) para ser owner dos diretórios

addgroup subversion
usermod -G subversion fabioqb

5 – Definir owner (aqui estou usando o usuário fabioqb, que

chown -R fabioqb:subversion /usr/local/svn/repositorio

chmod -R 777 /usr/local/svn/repositorio

6 – Editar o arquivo DAV_SVN.conf

vi /etc/apache2/mods-available/dav_svn.conf

e adicionar o trecho abaixo

<Location /svn/repositorio>
DAV svn
SVNPath /usr/local/svn/repositorio
AuthType Basic
AuthName "Acessando repositorio Subversion"
AuthUserFile /etc/apache2/auth
Require valid-user
</Location>

7 – Definir a senha para os usuários

htpasswd -c /etc/apache2/auth fabioqb

* Para os demais usuários, remova a opção -c

8 – Habilitar módulo DAV_SVN no Apache2

a2enmod dav_svn

* Não constava em nenhum tutorial – percebi que o módulo não era carregado no restart do apache2

9 – Reiniciar Apache

service apache2 restart
Bysutradi

Usando Cookies em Portlets com JSF 2 no IBM WebSphere Portal 8

Para se usar Cookies em portlets (JSR 286), de acordo com a especificação, bastaria apenas adicionar o XML abaixo no arquivo portlet.xml e implementar o método doHeaders no Portlet.

<container-runtime-option>
	<name>javax.portlet.renderHeaders</name>
	<value>true</value>
</container-runtime-option>

Porém, se você requer usar Cookies em portlets (JSR 286) com JSF 2 no IBM WebSphere Portal, encontrará o problema abaixo:

[14/02/14 12:03:12:180 BRST] 0000006d servlet       E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E: An exception was thrown by one of the service methods of the servlet [PortletMensagem] in application [PA_PortletMensagem]. Exception created : [java.lang.NullPointerException
	at com.ibm.faces20.portlet.FacesPortlet.init(FacesPortlet.java:131)
	at com.empresa.mensagem.PortletMensagemPortlet.init(PortletMensagemPortlet.java:38)
	at javax.portlet.GenericPortlet.init(GenericPortlet.java:107)

Diante deste cenário, pensamos em soluções alternativas definitivas (também chamada de POG) para conseguir chegar no resultado esperado.

Paralelamente ao andamento da implementação que a equipe estava fazendo, INCONFORMADO, resolvi procurar a tal classe que apresentava o erro e verificar (decompilar) o que ela estava fazendo.

Após verificar o que a classe estava fazendo, consegui entender o problema e encontrar a solução.

Juntamente com a opção “renderHeaders”, também necessitaríamos adicionar a opção “actionScopedRequestAttributes”. Veja como ficou nosso portlet.xml agora.

<container-runtime-option>
	<name>javax.portlet.renderHeaders</name>
	<value>true</value>
</container-runtime-option>
<container-runtime-option>
	<name>javax.portlet.actionScopedRequestAttributes</name>
	<value>true</value>
</container-runtime-option>

Após a adição destes dois itens, o portlet passou a entrar normalmente no doHeaders e conseguimos manipular os Cookies.

Bysutradi

Como usar Log em aplicações

O uso de Logs em aplicações é uma boa prática para apoiar a equipe de desenvolvimento a encontrar ocorrências (erros) apontadas pelos usuários. Neste ponto não abordarei a prática do TDD, ok?

Pensando no uso do Log4J, um dos principais frameworks de Log, você sabe usar os tipos mensagens que podem ser apresentadas e usá-las de uma forma a ajudá-lo?

Vejam abaixo alguns pontos sobre os principais usos.

INFO

O nível INFO é utilizado para informar eventos significativos do ciclo de vida normal da aplicação. Exemplo:

LOG.info("Conta para o CPF " + cpf + " foi cadastrada com sucesso pelo usuário " + usuario);
LOG.info("SMS enviado com sucesso para o cliente " + cpf);

DEBUG

O nível DEBUG é normalmente utilizado como um complemento ao nível INFO como, por exemplo, parâmetros de um determinado método ou resultado de uma operação que pode ser importante para o rastreamento de problemas na aplicação. Exemplo:

// no início do método
LOG.debug("salvarConta(" + cpf + ", " + usuario + ")");

// no fim do método
LOG.debug("salvarConta finalizado em " + tempo + " milisegundos");

ERROR

O nível ERROR é utilizado mais freqüentemente, normalmente seguindo uma Java Exception. Essas condições de erro, não necessariamente causam o término anormal da aplicação, sendo que a aplicação pode continuar atendendo às próximas requisições normalmente. Exemplo:

// Dentro de um catch
LOG.error("Erro na tentativa de salvar a conta para o CPF " + cpf + ". Erro: " + exception);

WARN

O nível WARN indica problemas de menor gravidade, normalmente causados por fatores externos, como falta ou inconsistência de parâmetros passados pelo usuário. Exemplo:

LOG.warn("O parâmetro CPF não foi preenchido");

LOG.warn("A Mensagem " + nomeMensagem + " deveria ter 120 caracteres, mas veio com 118");

Exemplo prático

Suponhamos que temos a regra “Ao cadastrar a conta, enviar SMS para cliente.”, a implementação seria algo como:

// Início do método salvarConta
LOG.debug("salvarConta(" + cpf + ", " + usuario + ")");
try {
// Cadastrar Conta
LOG.info("Conta para o CPF " + cpf + " foi cadastrada com sucesso pelo usuário " + usuario);
// Enviar SMS
LOG.info("SMS enviado com sucesso para o cliente " + cpf);
} catch (ExceptionNegocio en) {
// Tratar aqui também com WARN, DEBUG ou ERROR
} catch (Exception exception) {
LOG.error("Erro na tentativa de salvar a conta para o CPF " + cpf + ". Erro: " + exception);
}
LOG.debug("salvarConta finalizado em " + tempo + " milisegundos");
// Fim do método salvarConta

Claro, a forma de uso pode ser mais refinada para cada projeto.

Bysutradi

Uso de Namespaces e Schemas a partir do Java EE 7

Lendo uma questão em uma comunidade JAVA sobre namespace, fiquei curioso com o namespace.

Qual o namespace do JSF devo utilizar. Nas bibliografias consultadas é utilizado o namespace: http://java.sun.com/jsf/html. Porém percebi que também existe o http://xmlns.jcp.org/jsf/html.

Fazendo uma consulta rápida, a Oracle apresenta que a partir do Java EE 7, os novos schemas estarão contidos no namespace http://xmlns.jcp.org/xml/ns/javaee/, mantendo os antigos no namespace http://java.sun.com/xml/ns/javaee/.

Referência: http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html