<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Marcos Sousa's Blog &#187; Transactions</title>
	<atom:link href="http://www.marcossousa.com/tag/transactions/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcossousa.com</link>
	<description>Blog sobre desenvolvimento de software</description>
	<lastBuildDate>Sun, 06 Jun 2010 22:05:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>FacesContext em Seam Remoting calls</title>
		<link>http://www.marcossousa.com/2009/06/27/facescontext-em-seam-remoting-calls/</link>
		<comments>http://www.marcossousa.com/2009/06/27/facescontext-em-seam-remoting-calls/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 04:56:42 +0000</pubDate>
		<dc:creator>Marcos Sousa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Java EE]]></category>
		<category><![CDATA[Java Server Faces]]></category>
		<category><![CDATA[Jboss Seam]]></category>
		<category><![CDATA[FacesContext]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Seam Framework]]></category>
		<category><![CDATA[Seam Remoting]]></category>
		<category><![CDATA[Transactions]]></category>

		<guid isPermaLink="false">http://www.marcossousa.com/?p=175</guid>
		<description><![CDATA[Faz um tempinho que não escrevo nada por aqui. Além de projetos críticos que estou participando, estava muito envolvido na leitura de dois livros relacionados a Agile, que os comentarei em breve, e também estou escrevendo uma série de artigos para a revista Java Magazine, o primeiro sai na edição 72. A partir de agora [...]]]></description>
			<content:encoded><![CDATA[<p>Faz um tempinho que não escrevo nada por aqui. Além de projetos críticos que estou participando, estava muito envolvido na leitura de dois livros relacionados a Agile, que os comentarei em breve, e também estou escrevendo uma série de artigos para a revista Java Magazine, o primeiro sai na edição 72. A partir de agora devo publicar pelo menos uns 2 post mensais. <img src='http://www.marcossousa.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>O <a href="http://docs.jboss.com/seam/latest/reference/en-US/html/remoting.html">Seam Remoting</a> oferece uma forma conveniente de acessar componentes backing beans via AJAX. Com uma simples anotação é possível chamar ações, intanciar objeto e etc. Porém este recurso é uma maneira limitada de acessar o contexto dos componentes e requer uma certa atenção de nós desenvolvedores. Pessoalmente, pude presenciar soluções fantásticas usando remoting e mas algumas implementações desastrosas. Fica a dica: <strong>use o remoting apenas quando os componentes AJAX existentes não solucionam um dado problema.</strong></p>
<p>Por padrão, uma requisição AJAX via <a href="http://docs.jboss.com/seam/latest/reference/en-US/html/remoting.html">Seam Remoting </a>não possui controle de transações e o contexto JSF não é criado. Para ambos os casos é possível habilitá-los. O controle de transações é mais simples, basta adicionar a anotação @Transactional com o tipo <strong>REQUIRED</strong>. Veja o exemplo:</p>
<pre class="brush: java;">@WebRemote @Transactional(TransactionPropagationType.REQUIRED)
public void updateUserProfile(Profile profile) {
entityManager.merge(profile);
}</pre>
<p>Criar o contexto JSF exige algo um pouco mais avançado. Antes de iniciar a execução das ações, o contexto JSF deve ser criado, e para a sua criação é preciso o <strong>HttpServletRequest</strong> e o <strong>HttpServletResponse</strong>. Uma forma seria criando um filtro, mas acredito que não é uma boa solução. O Seam possui um recurso de ExecutionHandler que permite executar determinadas operações em requisições Remoting antes executar a ação. Este recurso usa o padrão <a href="http://www.google.com.br/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FObserver_pattern&amp;ei=hqVFSt_nAdSLtgf-m9S3Ag&amp;usg=AFQjCNGRWwxlv75N0vj4Ifwc0q4NnXIbrg&amp;sig2=gNBtStw_hbSmpwARjfBWSQ">Observer</a>, onde o primeiro passo é criar o observer, ele precisa de implementar a interface ExecutionHandler:</p>
<pre class="brush: java;">public class RemotingFacesContextHandler extends ExecutionHandler {

private ServletContext servletContext;

protected FacesContext getFacesContext(HttpServletRequest request,
HttpServletResponse response) {

FacesContext facesContext = FacesContext.getCurrentInstance();

if (facesContext == null) {
FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
facesContext = contextFactory.getFacesContext(servletContext,request, response, lifecycle);
}

return facesContext;
}
@Override
public void handle(HttpServletRequest request, HttpServletResponse response)
throws Exception {
getFacesContext(request, response);
super.handle(request, response);
}
@Override
public void setServletContext(ServletContext ctx) {
this.servletContext = ctx;
super.setServletContext(ctx);
}
}</pre>
<p>O método <strong>handle</strong> chama o método <strong>getFacesContext</strong> que é responsável por iniciar o contexto. A inicialização do FacesContext é feita por meio do método <strong>getFacesContext</strong> da classe FacesContextFactory. Além do contexto servlet, do request e do response, é necessário informar o ciclo de vida JSF.O Ciclo de vida é criado por meio da classe LifecycleFactory.</p>
<p>Uma vez criado o observer, basta registrá-lo. Uma das várias alternativas é registrá-lo após a inicialização usando a anotação @Observe:</p>
<pre class="brush: java;">@Name(&quot;registerHandler&quot;)
public class RegisterFacesContextHandler {
private static final String REQUEST_PATH_EXECUTE = &quot;/execute&quot;;

@Observer(&quot;org.jboss.seam.postInitialization&quot;)
public void initHandler() {
RequestHandlerFactory.getInstance().registerHandler(REQUEST_PATH_EXECUTE, new RemotingFacesContextHandler());

}

}</pre>
<p>Após inicializado o Seam (org.jboss.seam.postInitialization) o observer é registrado. Com isto você pode chamar FacesContext.getCurrentInstance() que não receberá aquele NullPointerException indesejado. <img src='http://www.marcossousa.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcossousa.com/2009/06/27/facescontext-em-seam-remoting-calls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
