[seam-commits] Seam SVN: r10266 - in trunk: ui/src/main/java/org/jboss/seam/ui/facelet and 1 other directory.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Wed Apr 1 07:48:55 EDT 2009


Author: pete.muir at jboss.org
Date: 2009-04-01 07:48:55 -0400 (Wed, 01 Apr 2009)
New Revision: 10266

Modified:
   trunk/src/main/org/jboss/seam/contexts/ServletLifecycle.java
   trunk/ui/src/main/java/org/jboss/seam/ui/facelet/RendererRequest.java
Log:
JBSEAM-3555

Modified: trunk/src/main/org/jboss/seam/contexts/ServletLifecycle.java
===================================================================
--- trunk/src/main/org/jboss/seam/contexts/ServletLifecycle.java	2009-04-01 07:34:13 UTC (rev 10265)
+++ trunk/src/main/org/jboss/seam/contexts/ServletLifecycle.java	2009-04-01 11:48:55 UTC (rev 10266)
@@ -6,6 +6,7 @@
  */
 package org.jboss.seam.contexts;
 
+import java.lang.ref.WeakReference;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
@@ -23,7 +24,7 @@
 /**
  * Methods for setup and teardown of Seam contexts at the
  * beginning and end of servlet requests.
- * 
+ *
  * @author Gavin King
  * @author <a href="mailto:theute at jboss.org">Thomas Heute</a>
  */
@@ -40,7 +41,7 @@
       return servletContext;
    }
 
-   public static void beginRequest(HttpServletRequest request) 
+   public static void beginRequest(HttpServletRequest request)
    {
       log.debug( ">>> Begin web request" );
       Contexts.eventContext.set( new EventContext( new ServletRequestMap(request) ) );
@@ -112,7 +113,7 @@
       Contexts.startup(ScopeType.APPLICATION);
       
       Events.instance().raiseEvent("org.jboss.seam.postInitialization");
-      
+
       // Clean up contexts used during initialization
       Contexts.destroy( Contexts.getConversationContext() );
       Contexts.conversationContext.set(null);
@@ -120,12 +121,17 @@
       Contexts.eventContext.set(null);
       Contexts.sessionContext.set(null);
       Contexts.applicationContext.set(null);
-      
+
       log.debug("<<< End initialization");
    }
 
-   public static void beginApplication(ServletContext context) 
+   public static void beginApplication(ServletContext context)
    {
+      // caching the classloader to servletContext
+      WeakReference<ClassLoader> ref = new WeakReference<ClassLoader>(Thread.currentThread().getContextClassLoader());
+      context.setAttribute("seam.context.classLoader",ref);
+      log.info("Cached the context classloader in servletContext as 'seam.context.classLoader'");
+
       servletContext = context;
       Lifecycle.beginApplication( new ServletApplicationMap(context) );
    }

Modified: trunk/ui/src/main/java/org/jboss/seam/ui/facelet/RendererRequest.java
===================================================================
--- trunk/ui/src/main/java/org/jboss/seam/ui/facelet/RendererRequest.java	2009-04-01 07:34:13 UTC (rev 10265)
+++ trunk/ui/src/main/java/org/jboss/seam/ui/facelet/RendererRequest.java	2009-04-01 11:48:55 UTC (rev 10266)
@@ -2,12 +2,16 @@
 
 import java.io.IOException;
 import java.io.StringWriter;
+import java.lang.ref.WeakReference;
 import java.net.URL;
 
 import javax.faces.component.UIViewRoot;
 import javax.faces.context.FacesContext;
+import javax.servlet.ServletContext;
 
 import org.jboss.seam.core.ResourceLoader;
+import org.jboss.seam.log.LogProvider;
+import org.jboss.seam.log.Logging;
 import org.jboss.seam.jsf.DelegatingFacesContext;
 import org.jboss.seam.mock.MockHttpServletRequest;
 import org.jboss.seam.mock.MockHttpServletResponse;
@@ -19,61 +23,78 @@
 
 public class RendererRequest
 {
-   
+   private static final LogProvider log = Logging.getLogProvider(RendererRequest.class);
+
    private FacesContext originalFacesContext;
    private FacesContext facesContext;
-   
+
    private MockHttpServletRequest request;
    private MockHttpServletResponse response;
-   
+
    private StringWriter writer;
-   
+
    private String viewId;
-   
+
+   private ClassLoader originalClassLoader;
+
    public RendererRequest(String viewId)
    {
       this.viewId = viewId;
    }
-   
+
    private void init()
    {
       request = new MockHttpServletRequest(HttpSessionManager.instance());
       response = new MockHttpServletResponse();
-      
+
       // Generate the FacesContext from the JSF FacesContextFactory
       originalFacesContext = FacesContext.getCurrentInstance();
       facesContext = RendererFacesContextFactory.instance().getFacesContext(request, response);
       DelegatingFacesContext.setCurrentInstance(facesContext);
-      
+
       // Create the viewRoot
       UIViewRoot newRoot = facesContext.getApplication().getViewHandler().createView(facesContext, viewId);
       facesContext.setViewRoot(newRoot);
-      
+
       // Set the responseWriter to write to a buffer
       writer = new StringWriter();
       facesContext.setResponseWriter(facesContext.getRenderKit().createResponseWriter(writer,
       null, null));
+
+      // Set the context classloader to the cached one
+      originalClassLoader = Thread.currentThread().getContextClassLoader();
+      ServletContext ctx = request.getSession().getServletContext();
+      WeakReference<ClassLoader> ref = (WeakReference<ClassLoader>)ctx.getAttribute("seam.context.classLoader");
+      if (ref == null || ref.get() == null) {
+          log.warn("Failed to bootstrap context classloader. Facelets may not work properly from MDBs");
+      } else {
+          Thread.currentThread().setContextClassLoader(ref.get());
+      }
    }
-   
+
    private void cleanup()
    {
+      if (originalClassLoader != null) {
+          Thread.currentThread().setContextClassLoader(originalClassLoader);
+          originalClassLoader = null;
+      }
+
       facesContext.release();
       DelegatingFacesContext.setCurrentInstance(originalFacesContext);
-      
-      
+
       originalFacesContext = null;
       facesContext = null;
       request = null;
       response = null;
    }
-   
+
    public void run() throws IOException
    {
       init();
       renderFacelet(facesContext, faceletForViewId(viewId));
       cleanup();
    }
-   
+
    public String getOutput()
    {
       return writer.getBuffer().toString();




More information about the seam-commits mailing list