diff --git a/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/FacesMessageAppender.java b/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/FacesMessageAppender.java index f9e8a7e..5926bfe 100644 --- a/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/FacesMessageAppender.java +++ b/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/FacesMessageAppender.java @@ -37,18 +37,26 @@ package br.gov.frameworkdemoiselle.internal.implementation; import static br.gov.frameworkdemoiselle.annotation.Priority.L3_PRIORITY; + +import javax.enterprise.context.ContextNotActiveException; + import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.message.Message; -import br.gov.frameworkdemoiselle.message.MessageAppender; import br.gov.frameworkdemoiselle.util.Faces; @Priority(L3_PRIORITY) -public class FacesMessageAppender implements MessageAppender { +public class FacesMessageAppender extends LoggerMessageAppender { private static final long serialVersionUID = 1L; @Override public void append(Message message) { - Faces.addMessage(message); + try { + Faces.addMessage(message); + } catch (ContextNotActiveException cause) { + // TODO Logar warning... + + super.append(message); + } } } diff --git a/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/FacesContextProxy.java b/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/FacesContextProxy.java index bc81b86..f6834c1 100644 --- a/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/FacesContextProxy.java +++ b/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/FacesContextProxy.java @@ -5,7 +5,9 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import javax.annotation.PostConstruct; import javax.el.ELContext; +import javax.enterprise.context.ContextNotActiveException; import javax.enterprise.inject.Default; import javax.faces.application.Application; import javax.faces.application.FacesMessage; @@ -26,8 +28,16 @@ public class FacesContextProxy extends FacesContext implements Serializable { private static final long serialVersionUID = 1L; - private FacesContext getDelegate() { - return FacesContext.getCurrentInstance(); + @PostConstruct + public FacesContext getDelegate() { + FacesContext facesContext = FacesContext.getCurrentInstance(); + + if (facesContext == null) { + // TODO Colocar a mensagem correta + throw new ContextNotActiveException(); + } + + return facesContext; } public int hashCode() { diff --git a/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/util/Faces.java b/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/util/Faces.java index d55580f..e27db36 100644 --- a/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/util/Faces.java +++ b/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/util/Faces.java @@ -59,7 +59,7 @@ import br.gov.frameworkdemoiselle.message.SeverityType; * Utility class to insert messages in the FacesContext. * * @author SERPRO - * */ + */ public class Faces { private Faces() { diff --git a/impl/extension/jsf/src/test/java/proxy/FacesContextProxyBean.java b/impl/extension/jsf/src/test/java/proxy/FacesContextProxyBean.java new file mode 100644 index 0000000..1aef3ae --- /dev/null +++ b/impl/extension/jsf/src/test/java/proxy/FacesContextProxyBean.java @@ -0,0 +1,61 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package proxy; + +import static javax.servlet.http.HttpServletResponse.SC_ACCEPTED; + +import javax.faces.context.FacesContext; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.http.HttpServletResponse; + +import br.gov.frameworkdemoiselle.util.Beans; + +@Named +public class FacesContextProxyBean { + + @Inject + private HttpServletResponse response; + + public String getOk() { + FacesContext facesContext = Beans.getReference(FacesContext.class); + facesContext.responseComplete(); + + response.setStatus(SC_ACCEPTED); + return null; + } +} diff --git a/impl/extension/jsf/src/test/java/proxy/FacesContextProxyServlet.java b/impl/extension/jsf/src/test/java/proxy/FacesContextProxyServlet.java index 29cf2b0..97bd9c9 100644 --- a/impl/extension/jsf/src/test/java/proxy/FacesContextProxyServlet.java +++ b/impl/extension/jsf/src/test/java/proxy/FacesContextProxyServlet.java @@ -36,8 +36,12 @@ */ package proxy; +import static javax.servlet.http.HttpServletResponse.SC_EXPECTATION_FAILED; +import static javax.servlet.http.HttpServletResponse.SC_OK; + import java.io.IOException; +import javax.enterprise.context.ContextNotActiveException; import javax.faces.context.FacesContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; @@ -45,9 +49,6 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.httpclient.HttpStatus; - -import br.gov.frameworkdemoiselle.internal.proxy.FacesContextProxy; import br.gov.frameworkdemoiselle.util.Beans; @WebServlet("/index") @@ -55,15 +56,14 @@ public class FacesContextProxyServlet extends HttpServlet { private static final long serialVersionUID = 1L; - private FacesContext facesContext; - @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - facesContext = Beans.getReference(FacesContext.class); - if (facesContext.getClass() == FacesContextProxy.class) { - response.setStatus(HttpStatus.SC_OK); - } else { - response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); + try { + Beans.getReference(FacesContext.class); + response.setStatus(SC_OK); + + } catch (ContextNotActiveException cause) { + response.setStatus(SC_EXPECTATION_FAILED); } } } diff --git a/impl/extension/jsf/src/test/java/proxy/FacesContextProxyTest.java b/impl/extension/jsf/src/test/java/proxy/FacesContextProxyTest.java index 95161d0..3c5b508 100644 --- a/impl/extension/jsf/src/test/java/proxy/FacesContextProxyTest.java +++ b/impl/extension/jsf/src/test/java/proxy/FacesContextProxyTest.java @@ -36,6 +36,8 @@ */ package proxy; +import static javax.servlet.http.HttpServletResponse.SC_ACCEPTED; +import static javax.servlet.http.HttpServletResponse.SC_EXPECTATION_FAILED; import static org.junit.Assert.assertEquals; import java.io.IOException; @@ -43,7 +45,6 @@ import java.net.URL; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; -import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.GetMethod; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; @@ -64,16 +65,26 @@ public class FacesContextProxyTest { @Deployment(testable = false) public static WebArchive createDeployment() { - return Tests.createDeployment().addClass(FacesContextProxyServlet.class) + return Tests.createDeployment().addClasses(FacesContextProxyServlet.class, FacesContextProxyBean.class) + .addAsWebResource(Tests.createFileAsset(PATH + "/index.xhtml"), "index.xhtml") .addAsWebInfResource(Tests.createFileAsset(PATH + "/web.xml"), "web.xml"); } @Test - public void facesContextProxy() throws HttpException, IOException { + public void validProxyCreated() throws HttpException, IOException { + HttpClient client = new HttpClient(); + GetMethod method = new GetMethod(deploymentUrl + "/index.jsf"); + + int status = client.executeMethod(method); + assertEquals(SC_ACCEPTED, status); + } + + @Test + public void inValidProxyCreatedCausedByContextNotActiveException() throws HttpException, IOException { HttpClient client = new HttpClient(); GetMethod method = new GetMethod(deploymentUrl + "/index"); int status = client.executeMethod(method); - assertEquals(HttpStatus.SC_OK, status); + assertEquals(SC_EXPECTATION_FAILED, status); } } diff --git a/impl/extension/jsf/src/test/resources/proxy/index.xhtml b/impl/extension/jsf/src/test/resources/proxy/index.xhtml new file mode 100644 index 0000000..3bbb1a4 --- /dev/null +++ b/impl/extension/jsf/src/test/resources/proxy/index.xhtml @@ -0,0 +1,43 @@ + + + + + #{facesContextProxyBean.ok} + + + diff --git a/impl/extension/jsf/src/test/resources/proxy/web.xml b/impl/extension/jsf/src/test/resources/proxy/web.xml index f9b0d59..e3b101e 100644 --- a/impl/extension/jsf/src/test/resources/proxy/web.xml +++ b/impl/extension/jsf/src/test/resources/proxy/web.xml @@ -48,7 +48,17 @@ Demoiselle Servlet Filter /* - + + + Faces Servlet + javax.faces.webapp.FacesServlet + 1 + + + Faces Servlet + *.jsf + + Servlet Class proxy.FacesContextProxyServlet @@ -56,6 +66,6 @@ Servlet Class /index - + \ No newline at end of file -- libgit2 0.21.2