Author: manaRH
Date: 2012-11-28 06:59:36 -0500 (Wed, 28 Nov 2012)
New Revision: 15373

Added:
   
branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/jsf/SeamExceptionHandlerFactory.java
Modified:
   
branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/mock/MockExternalContext.java
   
branches/community/Seam_2_3/jboss-seam/src/main/resources/META-INF/faces-config.xml
Log:
JBSEAM-5045 Ajax handling for ExceptionFilter

Added: 
branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/jsf/SeamExceptionHandlerFactory.java
===================================================================
--- 
branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/jsf/SeamExceptionHandlerFactory.java
                            (rev 0)
+++ 
branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/jsf/SeamExceptionHandlerFactory.java
    2012-11-28 11:59:36 UTC (rev 15373)
@@ -0,0 +1,49 @@
+package org.jboss.seam.jsf;
+
+import javax.faces.context.ExceptionHandler;
+import javax.faces.context.ExceptionHandlerFactory;
+import javax.faces.context.FacesContext;
+
+import org.jboss.seam.web.ExceptionFilter;
+
+import com.sun.faces.application.ApplicationAssociate;
+import com.sun.faces.context.AjaxExceptionHandlerImpl;
+import com.sun.faces.context.ExceptionHandlerImpl;
+
+
+
+/**
+ * Factory not to be used AjaxExceptionHandlerImpl class and 
+ * always be an exception to be thrown by capturad ExceptionFilter
+ * 
+ * @see AjaxExceptionHandlerImpl
+ * @see ExceptionFilter  
+ * @author Tiago Peruzzo
+ * 
+ */
+public class SeamExceptionHandlerFactory extends ExceptionHandlerFactory {
+
+       private ApplicationAssociate associate;
+
+
+       @Override
+    public ExceptionHandler getExceptionHandler() {
+        FacesContext fc = FacesContext.getCurrentInstance();
+        ApplicationAssociate associate = getAssociate(fc);
+        return new ExceptionHandlerImpl(((associate != null) ? 
associate.isErrorPagePresent() : Boolean.TRUE));
+    }
+
+
+    // --------------------------------------------------------- Private 
Methods
+
+    private ApplicationAssociate getAssociate(FacesContext ctx) {
+        if (associate == null) {
+            associate = ApplicationAssociate.getCurrentInstance();
+            if (associate == null) {
+                associate = 
ApplicationAssociate.getInstance(ctx.getExternalContext());
+            }
+        }
+        return associate;
+    }
+       
+}

Modified: 
branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/mock/MockExternalContext.java
===================================================================
--- 
branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/mock/MockExternalContext.java
   2012-11-28 11:12:35 UTC (rev 15372)
+++ 
branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/mock/MockExternalContext.java
   2012-11-28 11:59:36 UTC (rev 15373)
@@ -8,6 +8,7 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Writer;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.security.Principal;
@@ -21,20 +22,26 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.logging.Level;
 
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
+import javax.faces.context.PartialResponseWriter;
+import javax.faces.context.ResponseWriter;
 import javax.servlet.ServletContext;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import org.jboss.seam.log.LogProvider;
+import org.jboss.seam.log.Logging;
 import org.jboss.seam.util.EnumerationIterator;
 
 /**
  * @author Gavin King
  * @author <a href="mailto:[email protected]";>Thomas Heute</a>
+ * @author Marek Novotny
  * @version $Revision: 13963 $
  */
 public class MockExternalContext extends ExternalContext
@@ -44,6 +51,8 @@
    private HttpServletRequest request;
 
    private HttpServletResponse response;
+   
+   private static final LogProvider log = Logging.getLogProvider( 
MockExternalContext.class );
 
    public MockExternalContext()
    {
@@ -525,12 +534,64 @@
    @Override
    public void redirect(String url) throws IOException
    {
-      response.sendRedirect(url);
+      if ("partial/ajax".equals(this.request.getHeader("Faces-Request")))
+      {
+         this.response.setContentType("text/xml");
+         this.response.setCharacterEncoding("UTF-8");
+         this.response.addHeader("Cache-Control", "no-cache");
+         this.response.setStatus(HttpServletResponse.SC_OK);
+         
+         FacesContext facesContext = FacesContext.getCurrentInstance();
+         PartialResponseWriter pwriter = 
facesContext.getPartialViewContext().getPartialResponseWriter();
+         
+         if (pwriter == null)
+         {
+            pwriter = createPartialResponseWriter();
+         }
+         pwriter.startDocument();
+         pwriter.redirect(url);
+         pwriter.endDocument();
+      }
+      else
+      {
+         this.response.sendRedirect(url);
+      }
+
       FacesContext.getCurrentInstance().responseComplete();
    }
    
-   
+   private PartialResponseWriter createPartialResponseWriter()
+   {
+      FacesContext facesCtx = FacesContext.getCurrentInstance();
+      ExternalContext externalCtx = facesCtx.getExternalContext();
+      String encoding = externalCtx.getRequestCharacterEncoding();
+      externalCtx.setResponseCharacterEncoding(encoding);
+      ResponseWriter responseWriter = null;
+      Writer outputWriter = null;
+      try
+      {
+         outputWriter = externalCtx.getResponseOutputWriter();
+      }
+      catch (IOException ioe)
+      {
+         log.error("couldn't get ResponseOutputWriter for Partial Ajax 
request", ioe);
+      }
 
+      if (outputWriter != null)
+      {
+         responseWriter = 
facesCtx.getRenderKit().createResponseWriter(outputWriter, "text/xml", 
encoding);
+      }
+      if (responseWriter instanceof PartialResponseWriter)
+      {
+         return (PartialResponseWriter) responseWriter;
+      }
+      else
+      {
+         return new PartialResponseWriter(responseWriter);
+      }
+
+   }
+
    @Override
    public void setRequest(Object myrequest)
    {

Modified: 
branches/community/Seam_2_3/jboss-seam/src/main/resources/META-INF/faces-config.xml
===================================================================
--- 
branches/community/Seam_2_3/jboss-seam/src/main/resources/META-INF/faces-config.xml
 2012-11-28 11:12:35 UTC (rev 15372)
+++ 
branches/community/Seam_2_3/jboss-seam/src/main/resources/META-INF/faces-config.xml
 2012-11-28 11:59:36 UTC (rev 15373)
@@ -6,6 +6,7 @@
 
    <factory>
       
<application-factory>org.jboss.seam.jsf.SeamApplicationFactory</application-factory>
+      
<exception-handler-factory>org.jboss.seam.jsf.SeamExceptionHandlerFactory</exception-handler-factory>
    </factory>
 
    <application>

_______________________________________________
seam-commits mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/seam-commits

Reply via email to