<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3373531796419048868</id><updated>2011-11-27T16:08:52.871-08:00</updated><category term='JasperReports'/><category term='JBoss RichFaces'/><category term='JGnuteca'/><category term='amazon ec2'/><category term='Apache Trinidad'/><category term='JavaServer Faces'/><category term='spring framework'/><category term='jndi'/><category term='junit'/><category term='certificação digital'/><category term='Contexto'/><category term='Java'/><category term='Oracle'/><category term='e-cpf'/><category term='JDBC'/><category term='X.509'/><category term='test'/><category term='Tomcat'/><category term='javaEE'/><category term='dns dinâmico'/><category term='JSF'/><category term='AndroMDA'/><category term='ubuntu'/><category term='Criptografia'/><category term='nx'/><title type='text'>Blog do Walter</title><subtitle type='html'>Comentários sobre desenvolvimento de software envolvendo MDA, Andromda, JavaEE e tecnologias relacionadas.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-6709639934629317800</id><published>2010-09-25T03:50:00.000-07:00</published><updated>2010-09-25T04:06:30.357-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AndroMDA'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='javaEE'/><category scheme='http://www.blogger.com/atom/ns#' term='spring framework'/><title type='text'>Geração de métodos de pesquisa para atributos &lt;&lt;Unique&gt;&gt;</title><content type='html'>Acrescentei um novo recurso ao cartucho Spring: a geração automática de métodos de pesquisa quando o atributo da entidade é único. Para todos os atributos marcados como únicos ( &amp;lt;&amp;lt;Unique&amp;gt;&amp;gt; ) da sua entidade, será gerado um método de pesquisa no DAO que recebe um valor do mesmo tipo do atributo como parâmetro e retorna uma instância da entidade.&lt;br /&gt;Por exemplo, se a sua entidade &lt;span style="font-weight: bold;"&gt;Aluno&lt;/span&gt; tem um atributo &lt;span style="font-weight: bold;"&gt;nome&lt;/span&gt; do tipo &lt;span style="font-weight: bold;"&gt;String&lt;/span&gt;, será gerado no DAO o seguinte método:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;public Aluno searchUniqueNome(nome: String)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Caso esse método retorne mais de uma intância de &lt;span style="font-weight: bold;"&gt;Aluno&lt;/span&gt;, a exceção &lt;span style="font-weight: bold;"&gt;org.hibernate.NonUniqueResultException&lt;/span&gt; é disparada.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-6709639934629317800?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/6709639934629317800/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=6709639934629317800' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/6709639934629317800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/6709639934629317800'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2010/09/geracao-de-metodos-de-pesquisa-para.html' title='Geração de métodos de pesquisa para atributos &amp;lt;&amp;lt;Unique&amp;gt;&amp;gt;'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-452526922910009381</id><published>2010-09-19T03:23:00.000-07:00</published><updated>2010-09-19T04:00:53.841-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AndroMDA'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='javaEE'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces'/><title type='text'>Simplificando Casos de Uso no cartucho andromda-jsf</title><content type='html'>Uma coisa que sempre me incomodou na modelagem de atividades do cartucho andromda-jsf foi a obrigação de se modelar métodos para responder aos eventos. Apesar de considerar que é uma modelagem válida do ponto de vista da aderência quando os métodos são reutilizados, eu considero que o simples fato de existir o evento de saída do &amp;lt;&amp;lt;FrontEndView&amp;gt;&amp;gt; deveria gerar um "gancho" para o programador escrever sua lógica.&lt;br /&gt;Finalmente agreguei essa simplificação ao cartucho andromda-jsf, de modo que agora o desenvolvedor não precisa criar métodos no controller se não quiser. Pode de fato deixar o controller completamente em branco e simplesmente sobrepor os (novos) métodos que são gerados no controller ancestral para responder aos eventos do usuário. Por exemplo, no modelo abaixo:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_L2ukB2CKF70/TJXn13yGdNI/AAAAAAAABsQ/OdnDg1AEp8Y/s1600/sacsis_incluir_aluno.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 151px;" src="http://1.bp.blogspot.com/_L2ukB2CKF70/TJXn13yGdNI/AAAAAAAABsQ/OdnDg1AEp8Y/s320/sacsis_incluir_aluno.png" alt="" id="BLOGGER_PHOTO_ID_5518571831105582290" border="0" /&gt;&lt;/a&gt;o controller não tem método nenhum e ao programá-lo, basta ao programador sobrepor o método &lt;span style="font-weight: bold;"&gt;_dadosDoAluno_confirmar&lt;/span&gt; da classe ancestral para executar a inclusão do aluno, fazendo com que a implementação do controller fique assim:&lt;br /&gt;&lt;br /&gt;&lt;/frontendview&gt;&lt;a href="http://4.bp.blogspot.com/_L2ukB2CKF70/TJXqjAVoQLI/AAAAAAAABsY/4uB24EbJ6BE/s1600/IncluirAlunoController.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 90px;" src="http://4.bp.blogspot.com/_L2ukB2CKF70/TJXqjAVoQLI/AAAAAAAABsY/4uB24EbJ6BE/s320/IncluirAlunoController.png" alt="" id="BLOGGER_PHOTO_ID_5518574805519450290" border="0" /&gt;&lt;/a&gt;São gerados também métodos para cada estado de ação que não seja &amp;lt;&amp;lt;FrontEndView&amp;gt;&amp;gt;, mas é um caso mais complicado, porque são gerados métodos que atendam a todas as combinações de transições de entrada, eventualmente dificultando a programação. O melhor é sobrepor os eventos mesmo...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-452526922910009381?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/452526922910009381/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=452526922910009381' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/452526922910009381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/452526922910009381'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2010/09/simplificando-casos-de-uso-no-cartucho.html' title='Simplificando Casos de Uso no cartucho andromda-jsf'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_L2ukB2CKF70/TJXn13yGdNI/AAAAAAAABsQ/OdnDg1AEp8Y/s72-c/sacsis_incluir_aluno.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-7885241515779067847</id><published>2010-08-05T07:39:00.000-07:00</published><updated>2010-08-05T07:58:28.337-07:00</updated><title type='text'>TextUML e Andromda</title><content type='html'>Ontem fiz uma pequena experiência com o &lt;a href="http://abstratt.com/"&gt;TextUML&lt;/a&gt; e o &lt;a href="http://www.andromda.org"&gt;Andromda&lt;/a&gt;. Foi uma experiência pequena porém bem sucedida, consistindo na criação de uma aplicação com 2 CRUDs associados.&lt;br /&gt;Entendo que a possibilidade de se programar modelos sem desenhá-los abre um leque de caminhos para aqueles que, como eu, gostam do desenvolvimento organizado e com visão de alto nível, não abrindo mão da agilidade no processo.&lt;br /&gt;O que mais senti falta foi dos casos de uso e das máquinas de estado. Espero que o TextUML evolua logo nesse sentido para que possamos fazer modelagens completas de aplicações sem, obrigatoriamente, termos que desenhar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-7885241515779067847?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/7885241515779067847/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=7885241515779067847' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/7885241515779067847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/7885241515779067847'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2010/08/textuml-e-andromda.html' title='TextUML e Andromda'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-4011459305516377980</id><published>2010-07-11T03:32:00.000-07:00</published><updated>2010-07-11T04:09:22.253-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dns dinâmico'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='nx'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>DNS Dinâmico no Amazon EC2</title><content type='html'>&lt;div style="text-align: justify;"&gt;Recentemente passei a usar alguns servidores no &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt; para testar o ambiente e as possibilidades. Montei ambientes Ubuntu seguindo o AMI do Lucid disponibilizado pela Canonical.&lt;br /&gt;Como eu queria ter acesso remoto ao ambiente desktop também, depois de criar os ambientes básicos eu instalei o Gnome e o &lt;a href="http://nomachine.com/"&gt;NoMachine NX Server&lt;/a&gt;. Em poucas palavras, o NX Server (e o client) são uma forma MUITO eficiente de se acessar ambiente baseados em XWindows remotamente. É MUITO mais eficiente que o VNC, por exemplo.&lt;br /&gt;Funcionou tudo muito bem, exceto por um detalhe: a cada vez que a máquina é ligada no EC2, ela ganha um IP novo... claro que a Amazon oferece um serviço de IP fixo, mas como esses ambientes são de teste, eu não queria inve$tir nada além do mínimo necessário.&lt;br /&gt;Já uso o serviço de DNS do &lt;a href="http://dnspark.com/"&gt;DNS Park&lt;/a&gt; e, depois de pesquisar muito consegui configurar o &lt;a href="http://ddclient.sourceforge.net/"&gt;DDClient&lt;/a&gt; para atualizar o serviço de DNS dinâmico do DNS Park.&lt;br /&gt;O arquivo de configuração do DDClient ( /etc/ddclient/ddclient.conf ) que usei foi:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;daemon=300 # check every 300 seconds&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;syslog=yes # log update msgs to syslog&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;#mail=email@dnspark.com # mail all msgs to address&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;#mail-failure=email@dnspark.com # mail failed update msgs to address&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;pid=/var/run/ddclient.pid # record PID in file.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;login=loginDoUsuarioDDNS # DNS Park DDNS username (NOT your DNS Park account login)&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;password=passwordDoUsuarioDDNS&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;use=cmd, cmd='curl http://169.254.169.254/2007-08-29//meta-data/public-ipv4'&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;protocol=dnspark subdominio.dominio.com.br #dominio que vc configurou no DNS Park para ser dinâmico&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Um detalhe importante: em login/password não vai o seu login/password geral do DNS Park e sim um login específico para dns dinâmico que você cria livremente, no DNS Park.&lt;br /&gt;Depois de testar na mão rodando do ddclient direto na linha de comando, montei o seguinte arquivo de configuração ( /etc/init/ddclient.conf ) para que o upstart do Ubuntu executasse o ddclient logo na inicialização:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;# ddclient initialization&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;description "Starts ddclient"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;start on (net-device-up&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;          and local-filesystems)&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;exec /usr/sbin/ddclient&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Funcionou que foi uma beleza. Todas as vezes que ligo a máquina o DDClient atualiza o IP no DNS Park e o meu sub domínio aponta para a máquina recém-ligada.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-4011459305516377980?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/4011459305516377980/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=4011459305516377980' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/4011459305516377980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/4011459305516377980'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2010/07/dns-dinamico-no-amazon-ec2.html' title='DNS Dinâmico no Amazon EC2'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-5303351879830827664</id><published>2010-03-20T08:54:00.000-07:00</published><updated>2010-03-20T11:18:33.939-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='javaEE'/><category scheme='http://www.blogger.com/atom/ns#' term='jndi'/><title type='text'>Paramêtros de Inicialização em Aplicações Web</title><content type='html'>&lt;span style="font-family:verdana;"&gt;As aplicações baseadas em servidor tem características próprias no que diz respeito aos parâmetros de inicialização. Em aplicações locais pode-se optar por passar os parâmetros "na linha de comando", criar um arquivo de configurações ou usar variáveis de ambiente. Apesar de ser possível o uso de qualquer um dos método acima ( mais parâmetros de contexto/filtros/servlets) meu método predileto em aplicações em baseadas em servidor é a criação de variáveis de ambiente &lt;a href="http://java.sun.com/products/jndi/"&gt;JNDI&lt;/a&gt;.&lt;br /&gt;Esse tipo de variável de ambiente pode ser usado em servidores JavaEE em geral, ou seja: em servidores de servlets/EJB ou outros que suportem JNDI.&lt;br /&gt;De volta aos servidores web, a vantagem que vejo desse tipo de parâmetro em relação aos parâmetros de contexto (&amp;lt;context-param/&amp;gt;) ou de filtros e servlets (&amp;lt;init-param/&amp;gt;) é que nesses casos é necessário que o arquivo web.xml seja alterado... ou seja: se você enviar um .war/.ear para ser disponibilizado, quem for disponibilizá-lo terá que alterar o arquivo web.xml que fica dentro do .war/.ear antes de colocá-lo no ar. Por outro lado, as variável de ambiente JNDI podem ser  configuradas em arquivos de contexto ou ambientes de configuração externos. Por exemplo, para configurar um arquivo de contexto do Tomcat, usamos a entrada &amp;lt;Environment/&amp;gt;, conforme segue:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;...&lt;br /&gt;&amp;lt;Environment name="com.wim.jgnuteca.disableAllMonitors" type="java.lang.String" value="true"/&amp;gt;&lt;/span&gt;&lt;br /&gt;...&lt;/blockquote&gt;&lt;span style="font-family:verdana;"&gt;Nesse caso o valor da variável poderia ser lido pela aplicação, por exemplo, com a seguinte classe:&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;...&lt;br /&gt;/**&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;package com.wim.jgnuteca;&lt;br /&gt;&lt;br /&gt;import javax.naming.Context;&lt;br /&gt;import javax.naming.InitialContext;&lt;br /&gt;import javax.naming.NamingException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author walter&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class Config {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;private static String getContextParamValue(String parameter) throws NamingException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final Context ctx = new InitialContext();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (String)ctx.lookup("java:comp/env/"+parameter);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;private static String DISABLE_ALL_MONITORS="com.wim.jgnuteca.disableAllMonitors";&lt;br /&gt;&amp;nbsp;&amp;nbsp;private static Boolean disableAllDTEMonitors=null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public static boolean disableAllDTEMonitors(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(disableAllDTEMonitors == null){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;disableAllDTEMonitors=Boolean.valueOf(getContextParamValue(DISABLE_ALL_MONITORS));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch(Throwable t) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;disableAllDTEMonitors=false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return disableAllDTEMonitors;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;...&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;De fato essa classe poderia ser usada de forma genérica e lendo parâmetros de várias fontes. Teríamos então uma classe genérica de configuração independente do ambiente de execução da aplicação.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-5303351879830827664?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/5303351879830827664/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=5303351879830827664' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/5303351879830827664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/5303351879830827664'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2010/03/parametros-de-inicializacao-em.html' title='Paramêtros de Inicialização em Aplicações Web'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-9174869701763259336</id><published>2008-06-30T04:39:00.000-07:00</published><updated>2008-06-30T05:02:38.194-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring framework'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><title type='text'>Inicialização do contexto Spring em testes unitários</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Durante o desenvolvimento de uma classe de testes na semana passada, decidi que ela devia acessar o banco da forma mais realista possível. Como a aplicação usa Spring/Hibernate e jndi, procurei solução para a questão da inicialização do ambiente. Optei por criar uma classe "helper" para garantir a inicialização e as classes de teste executam um método de inicialização dessa classe:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;package&amp;nbsp;com.arcadian.logOne.interfacedte;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;javax.naming.NamingException;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;org.apache.commons.dbcp.BasicDataSource;&lt;br /&gt;import&amp;nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;&lt;br /&gt;import&amp;nbsp;org.springframework.mock.jndi.SimpleNamingContextBuilder;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;walter&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;TestHelper&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;String[]&amp;nbsp;springFiles&amp;nbsp;=&amp;nbsp;{&amp;nbsp;"beanRefFactory.xml"&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;ClassPathXmlApplicationContext&amp;nbsp;context=null;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;startSpringContext()&amp;nbsp;throws&amp;nbsp;NamingException{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(context&amp;nbsp;==&amp;nbsp;null){//was&amp;nbsp;not&amp;nbsp;started&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BasicDataSource&amp;nbsp;ds&amp;nbsp;=&amp;nbsp;new&amp;nbsp;BasicDataSource();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ds.setDriverClassName("org.postgresql.Driver");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ds.setUsername("morganalborg");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ds.setPassword("jpfr33");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ds.setUrl("jdbc:postgresql://localhost/interfacedte_teste");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SimpleNamingContextBuilder&amp;nbsp;builder&amp;nbsp;=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SimpleNamingContextBuilder.emptyActivatedContextBuilder();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.bind("java:comp/env/jdbc/interfacedte",&amp;nbsp;ds);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;new&amp;nbsp;ClassPathXmlApplicationContext(springFiles);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-9174869701763259336?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/9174869701763259336/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=9174869701763259336' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/9174869701763259336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/9174869701763259336'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2008/06/inicializao-do-contexto-spring-em.html' title='Inicialização do contexto Spring em testes unitários'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-8595151956168988639</id><published>2008-04-20T12:30:00.000-07:00</published><updated>2008-04-20T12:45:26.679-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AndroMDA'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces'/><title type='text'>Criando Aplicações Javaserver Faces com o AndroMDA - Parte 2</title><content type='html'>&lt;a href="http://www.waltermourao.com.br/opencms/opencms/waltermourao/apresentacoes/AppJSF2Parte2/AppJSF2Parte2.htm"&gt;Na segunda parte da apresentação&lt;/a&gt; acrescento uma classe e uma associação, com o objetivo de mostrar o comportamento do CRUD nessa situação. Mantêm-se 100% gerado pelo AndroMDA.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-8595151956168988639?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/8595151956168988639/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=8595151956168988639' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/8595151956168988639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/8595151956168988639'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2008/04/criando-aplicaes-javaserver-faces-com-o_20.html' title='Criando Aplicações Javaserver Faces com o AndroMDA - Parte 2'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-8974394958156337257</id><published>2008-04-13T05:46:00.000-07:00</published><updated>2008-04-13T06:00:43.888-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AndroMDA'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces'/><title type='text'>Criando Aplicações Javaserver Faces com o AndroMDA</title><content type='html'>&lt;a href="http://www.waltermourao.com.br/opencms/opencms/waltermourao/apresentacoes/AppJSF2Parte1/AppJSF2Parte1.htm"&gt;Criando Aplicações Javaserver Faces com o AndroMDA&lt;/a&gt; é uma apresentação em flash (minha primeira !) demonstrando a criação de uma aplicação simples com o AndroMDA. Essa apresentação tem dois objetivos: o primeiro é gerar interesse no AndroMDA em pessoas que não o conhecem. O segundo é servir como um roteiro para que está começando a usar o AndroMDA.&lt;br /&gt;Aguardo críticas e sugestões :-).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-8974394958156337257?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/8974394958156337257/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=8974394958156337257' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/8974394958156337257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/8974394958156337257'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2008/04/criando-aplicaes-javaserver-faces-com-o.html' title='Criando Aplicações Javaserver Faces com o AndroMDA'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-1035612395680117516</id><published>2008-04-11T07:25:00.000-07:00</published><updated>2008-04-11T09:06:19.909-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JDBC'/><category scheme='http://www.blogger.com/atom/ns#' term='Contexto'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='Criptografia'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Criptografia de Senha em Descritores de Contexto do Tomcat</title><content type='html'>Recentemente um cliente reclamou, com razão, que as senhas de acesso aos bancos apareciam em texto não criptografado nos arquivos de contexto do Tomcat. Uma vez que essa senha vai direto para o driver jdbc, não encontrei outra forma de criptografar essa senha que não fosse criando meus próprios drivers jdbc, extendendo os drivers existentes.&lt;br /&gt;No caso do Oracle, por exemplo, criei a classe abaixo:&lt;br /&gt;&lt;blockquote style="font-family:courier new; font-size:small"&gt;&lt;br /&gt;public class OracleDriver extends oracle.jdbc.driver.OracleDriver {&lt;br /&gt;static {&lt;br /&gt;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;java.sql.DriverManager.registerDriver(new OracleDriver());&lt;br /&gt;&amp;nbsp;&amp;nbsp;} catch (SQLException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;System.out.println("Arcadian Oracle wrapper jdbc driver");&lt;br /&gt;}&lt;br /&gt;private static final String URL_PREFIX="jdbc:arcadian:oracle";&lt;br /&gt;@Override&lt;br /&gt;public Connection connect(String url, Properties info) throws SQLException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;if(url.startsWith(URL_PREFIX)){//senha cryptografada&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Util.decryptPassword(info);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return super.connect(url.replace(URL_PREFIX, "jdbc:oracle"), info);&lt;br /&gt;&amp;nbsp;&amp;nbsp;} else {//senha não criptografada&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return super.connect(url, info);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;@Override&lt;br /&gt;public boolean acceptsURL(String url) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;if(url == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return url.startsWith(URL_PREFIX);&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Dessa forma, o caso o url de acesso jdbc comece com o prefixo "jdbc:arcadian" eu sei que a senha está criptografada e o método Util.decryptPassword é chamado pelo método connect antes do método ancestral ser chamado.&lt;br /&gt;&lt;br /&gt;Um datasource que use esse mecanismo deve ficar mais ou menos com o seguinte aspecto:&lt;br /&gt;&lt;blockquote style="font-family:courier new; font-size:small"&gt;&lt;br /&gt;&amp;lt;resource name="jdbc/previne/datasource" auth="Container"&lt;br /&gt;type="javax.sql.DataSource"&lt;br /&gt;driverClassName="com.arcadian.commons.jdbc.OracleDriver"&lt;br /&gt;url="jdbc:arcadian:oracle:thin:@120.120.126.209:5623:DBACC84C"&lt;br /&gt;username="USER987"&lt;br /&gt;password="ui#ghkuyt%--)(*CFR"&lt;br /&gt;maxActive="10"&lt;br /&gt;maxIdle="30"&lt;br /&gt;maxWait="10000"/&amp;gt;&lt;br /&gt; &amp;lt;/resource&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Observe que para obter o mesmo efeito para outros bancos basta substituir a classe ancestral...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-1035612395680117516?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/1035612395680117516/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=1035612395680117516' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/1035612395680117516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/1035612395680117516'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2008/04/criptografia-de-senha-em-descritores-de.html' title='Criptografia de Senha em Descritores de Contexto do Tomcat'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-6577832765971323981</id><published>2008-03-21T05:20:00.000-07:00</published><updated>2008-03-22T03:16:49.463-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='certificação digital'/><category scheme='http://www.blogger.com/atom/ns#' term='X.509'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='e-cpf'/><title type='text'>Autenticação X.509 (e-cpf) e FORM no Tomcat, simultâneamente</title><content type='html'>Nessa semana tive um desafio interessante: como fazer uma aplicação que está rodando no Tomcat suportar tanto a autenticação comum (FORM ou BASIC) quanto via &lt;a href="http://www.receita.fazenda.gov.br/atendvirtual/InformacoesBasicas/"&gt;e-cpf&lt;/a&gt; (certificado cliente X.509), simultâneamente.&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://www.arcadian.com.br/"&gt;Previne&lt;/a&gt; é uma aplicação voltada para empresas que fazem uso de regimes especiais da receita federal e tipicamente é acessada tanto pela empresa que a contrata quanto por fiscais da receita federal. A demanda era fazer com que o Previne suportasse a autenticação atual (FORM) no uso interno da empresa e via e-cpf para uso externo pelos fiscais da receita.&lt;br /&gt;&lt;br /&gt;Fiz o trabalho de pesquisa tradicional e achei o excelente material &lt;a href="http://pdfmenot.com/view/http://www.ime.usp.br/%7Eriko/java/controle-acesso-riko.pdf"&gt;Controle de Acesso com Certificação Digital usando JCE e JSSE&lt;/a&gt; desenvolvido por &lt;a href="http://www.ime.usp.br/%7Eriko"&gt;Ricardo Koji Ushizaki&lt;/a&gt;. Depois de construir o servlet de teste conforme indica a apresentação, me deparei com o fato de um mesmo web.xml não suportar duas marcações auth-method&lt;auth-method&gt;. A princípio pensei em usar uma válvula (Tomcat Valve) customizada, conforme o &lt;a href="http://wiki.apache.org/tomcat/SSLWithFormFallbackAuthenticator"&gt;exemplo do wiki do tomcat&lt;/a&gt;, mas não fiquei muito seguro do funcionamento.&lt;br /&gt;&lt;br /&gt;Finalmente optei pela seguinte solução: criei uma segunda aplicação autenticada via e-cpf que consiste somente de um servlet que redireciona para a aplicação destino e usei o recurso de &lt;a href="http://tomcat.apache.org/tomcat-5.5-doc/config/valve.html"&gt;single sign on do Tomcat&lt;/a&gt;. Dessa forma o usuário é autenticado na primeira aplicação e redirecionado para a segunda sem ter que passar por uma nova autenticação.&lt;br /&gt;&lt;br /&gt;A grande vantagem que vi nessa solução foi que a aplicação original não sofreu nenhum tipo de manutenção e a aplicação que faz a autenticação ficou genérica, recebendo como parâmetro de contexto o caminho destino do redirecionamento de modo que pode ser usada com outras aplicações sem nenhuma alteração.&lt;/auth-method&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-6577832765971323981?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/6577832765971323981/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=6577832765971323981' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/6577832765971323981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/6577832765971323981'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2008/03/autenticao-x509-e-cpf-e-form-no-tomcat.html' title='Autenticação X.509 (e-cpf) e FORM no Tomcat, simultâneamente'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-6312753804727354310</id><published>2008-03-14T04:33:00.000-07:00</published><updated>2008-03-14T04:34:25.350-07:00</updated><title type='text'>Autocomplete (Ajax) no JSF2</title><content type='html'>O cartucho &lt;a href="http://sourceforge.net/projects/andromdaplugins"&gt;JSF2&lt;/a&gt; ganhou um componente Ajax adicional, tipo "autocomplete". Esse componente foi desenvolvido usando somente Trinidad/Facelets para não incluir novas dependências no projeto.&lt;br /&gt;O componente em si é independente do JSF2, ou seja: pode ser facilmente utilizado em projetos que não usam Andromda. Por outro lado tentei fazer com que o JSF2 o utilizasse de forma bem ampla e integrada.&lt;br /&gt;Para vê-lo em ação, clique &lt;a href="http://andromda.com.br/jgnuteca"&gt;aqui&lt;/a&gt;, vá na opção "Reservar Material" e clique na lupa do campo "Usuário" ou digite nesse campo a(s) primeira(s) letras de algum usuário existente.&lt;br /&gt;Espero em breve colocar no ar um pequeno projeto sem Andromda que faça uso do componente, como um exemplo de uso independente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-6312753804727354310?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/6312753804727354310/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=6312753804727354310' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/6312753804727354310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/6312753804727354310'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2008/03/autocomplete-ajax-no-jsf2.html' title='Autocomplete (Ajax) no JSF2'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-7810081501944472167</id><published>2008-01-23T09:06:00.000-08:00</published><updated>2008-01-23T09:31:34.509-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AndroMDA'/><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces'/><category scheme='http://www.blogger.com/atom/ns#' term='JasperReports'/><category scheme='http://www.blogger.com/atom/ns#' term='JGnuteca'/><title type='text'>JasperReports no JGnuteca</title><content type='html'>Implementei suporte a relatórios &lt;a href="http://www.jasperforge.org/jaspersoft/opensource/business_intelligence/jasperreports/"&gt;JasperReports&lt;/a&gt; no &lt;a href="http://sourceforge.net/projects/jgnuteca"&gt;JGnuteca&lt;/a&gt; para demonstrar tanto o suporte ao JasperReports quanto o suporte a relatórios criados pelo próprio usuário, ou seja: o usuário, não necessariamente o programador, cria o relatório no &lt;a href="http://jasperforge.org/jaspersoft/opensource/business_intelligence/ireport/"&gt;iReport&lt;/a&gt; (por exemplo) e o publica de modo que o relatório esteja disponível imediatamente e possa ser executado por qualquer pessoa.&lt;br /&gt;Para ver em funcionamento, &lt;a href="http://andromda.com.br/jgnuteca/"&gt;clique aqui&lt;/a&gt; e selecione a opção "Manter Relatórios".&lt;br /&gt;A maior dificuldade que se tem nesse tipo de funcionalidade diz respeito à apresentação e entrada dinâmica dos parâmetros. Essa implementação foi feita de forma simples, mas suporta essa característica, apresentando e repassando ao JasperReports os parâmetros que o usuário acrescentou ao relatório. O &lt;a href="https://facelets.dev.java.net/"&gt;Facelets&lt;/a&gt; teve um papel importante uma vez que com o seu uso a página JavaServer Faces pode ser alterada dinamicamente, permitindo a montagem da página de entrada de parâmetros em tempo de execução da aplicação.&lt;br /&gt;Atualmente somente parâmetros simples (texto, números, datas, etc.)  são suportados, mas em uma próxima iteração pretendo adicionar suporte a seleção de valores (select, radio) e pesquisas (lookups) em tabelas.&lt;br /&gt;Uma outra funcionalidade que considero importante é o suporte a segurança de modo que o usuário ao criar ou registrar o relatório possa indicar que grupos de usuários podem visualizá-lo. Também pretendo implementar essa funcionalidade no futuro, mas primeiro preciso implementar a segurança no JGnuteca ;-) .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-7810081501944472167?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/7810081501944472167/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=7810081501944472167' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/7810081501944472167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/7810081501944472167'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2008/01/jasperreports-no-jgnuteca.html' title='JasperReports no JGnuteca'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3373531796419048868.post-9012560868222651006</id><published>2008-01-20T10:10:00.000-08:00</published><updated>2008-01-20T11:06:21.809-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Trinidad'/><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss RichFaces'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces'/><title type='text'>RichFaces X Trinidad</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Tenho trabalhado como o Apache Trinidad (antigo Oracle ADF Faces) a 3 anos. Desde Julho passado participo de 2 projetos com RichFaces 3.1, minhas impressões e até agora:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;o Trinidad tem mais componentes e é mais estável;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;o RichFaces tem um visual mais "Web 2.0" por default, mas é possível fazer a aplicação Trinidad ter um visual semelhante, com um pouco de configuração;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;no RichFaces o uso de Ajax é mais intuitivo do que no Trinidad, graças ao uso do Ajax4JSF;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;os componentes do Trinidad são de mais alto nível (exemplo: painéis que organizam o conteúdo e entrada de dados com mensagem de erro e labels integrados);&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;ambos tem o suporte de empresas grandes. O Trinidad (mantido pela fundação Apache) é a base do ADF Faces da Oracle e o RichFaces é mantido pelo JBoss (leia-se Red Hat).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;Tem dois outros pontos, mas acho que são muito subjetivos:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;achei o suporte do Trinidad mais eficiente, mas não tenho números ou comprovação específica;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;acho que a tendência do RichFaces é se integrar mais como o Seam do que ser um conjunto independente.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;Se eu tiver que escolher um dos dois para um projeto novo, escolho o Trinidad... principalmente pela estabilidade, nível e quantidade de componentes.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3373531796419048868-9012560868222651006?l=waltermourao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://waltermourao.blogspot.com/feeds/9012560868222651006/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3373531796419048868&amp;postID=9012560868222651006' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/9012560868222651006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3373531796419048868/posts/default/9012560868222651006'/><link rel='alternate' type='text/html' href='http://waltermourao.blogspot.com/2008/01/richfaces-x-trinidad.html' title='RichFaces X Trinidad'/><author><name>Walter Itamar Mourão</name><uri>http://www.blogger.com/profile/07438624705896549545</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
