You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by wo...@apache.org on 2009/05/06 11:01:55 UTC

svn commit: r772103 - in /portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/wicket: JetspeedContextAwareWicketFilter.java MockPortletApplication.java

Author: woonsan
Date: Wed May  6 09:01:55 2009
New Revision: 772103

URL: http://svn.apache.org/viewvc?rev=772103&view=rev
Log:
Improves the cross context classloading wicket filter:
 - Not to cache classloader because portal application can be reloaded.
 - Not to be dependent on a specific local PA.

Removed:
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/wicket/MockPortletApplication.java
Modified:
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/wicket/JetspeedContextAwareWicketFilter.java

Modified: portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/wicket/JetspeedContextAwareWicketFilter.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/wicket/JetspeedContextAwareWicketFilter.java?rev=772103&r1=772102&r2=772103&view=diff
==============================================================================
--- portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/wicket/JetspeedContextAwareWicketFilter.java (original)
+++ portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/wicket/JetspeedContextAwareWicketFilter.java Wed May  6 09:01:55 2009
@@ -18,14 +18,27 @@
 
 import org.apache.jetspeed.Jetspeed;
 import org.apache.jetspeed.components.ComponentManager;
-import org.apache.jetspeed.factory.PortletFactory;
 import org.apache.wicket.protocol.http.WicketFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A special wicket filter to allow access portal context class loader.
+ * Wikcet framework needs serialization and deserialization sometimes.
+ * If there are some objects to serialize/deserialize in a Wicket application, 
+ * which is accessed via shared interface but originally created in other classloader,
+ * it could cause errors because Wicket framework cannot find the proper classes
+ * during deserialization within the current context classloader by default.
  * <P>
- * <EM>NOTE: Don't use this filter outside j2-admin and it is not really desirable to use this filter.</EM>
- * Instead of using this filter, please make your models detachable!
+ * However, fortunately, {@link WicketFilter} provides a mechanism to customize the context classloader.
+ * </P> 
+ * <P>
+ * <EM>NOTE: Don't use this filter outside j2-admin and it is not desirable to overuse this filter.</EM>
+ * Instead of using this filter, please consider to make your models detachable.
+ * It will make your application more portable and easily-deployable.
+ * </P>
+ * <P>
+ * <EM>NOTE: This classloader switching solution will not help http session deserialization by the app server.</EM>
  * </P>
  * 
  * @version $Id$
@@ -33,43 +46,43 @@
 public class JetspeedContextAwareWicketFilter extends WicketFilter
 {
     
-    private JetspeedContextAwareClassLoader jetspeedContextAwareClassLoader;
-    
-    public JetspeedContextAwareWicketFilter()
-    {
-        super();
-    }
+    final Logger logger = LoggerFactory.getLogger(JetspeedContextAwareWicketFilter.class);
     
+    /**
+     * By overriding this method of {@link WicketFilter}, we can use other classloader to
+     * have Wicket deserialize some objects which were originally created by the other classloader.
+     */
     @Override
     protected ClassLoader getClassLoader()
     {
-        if (jetspeedContextAwareClassLoader == null)
+        ClassLoader defaultClassLoader = super.getClassLoader();
+        JetspeedContextAwareClassLoader jetspeedContextAwareClassLoader = null;
+        
+        ComponentManager componentManager = Jetspeed.getComponentManager();
+            
+        if (componentManager != null)
         {
+            ClassLoader jetspeedContextClassLoader = null;
+            
             try
             {
-                ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
-                ComponentManager componentManager = Jetspeed.getComponentManager();
-                
-                if (componentManager != null)
-                {
-                    PortletFactory portletFactory = (PortletFactory) componentManager.getComponent("portletFactory");
-                    
-                    if (portletFactory != null)
-                    {
-                        MockPortletApplication layoutApp = new MockPortletApplication();
-                        layoutApp.setName("jetspeed-layouts");
-                        ClassLoader jetspeedContextClassLoader = portletFactory.getPortletApplicationClassLoader(layoutApp);
-                        jetspeedContextAwareClassLoader = new JetspeedContextAwareClassLoader(contextClassLoader, jetspeedContextClassLoader);
-                    }
-                }
+                jetspeedContextClassLoader = componentManager.getClass().getClassLoader();
+            }
+            catch (SecurityException e)
+            {
+                // The app server can disallow accessing the classloader.
+                // We need to print information about this.
+                logger.warn("Failed to access the portal context classloader: {}", e.toString());
+                logger.warn("Without access portal context classloader, it might not available to use some admin portlets.");
             }
-            catch (Exception e)
+            
+            if (jetspeedContextClassLoader != null)
             {
-                e.printStackTrace();
+                jetspeedContextAwareClassLoader = new JetspeedContextAwareClassLoader(defaultClassLoader, jetspeedContextClassLoader);
             }
         }
         
-        return (jetspeedContextAwareClassLoader != null ? jetspeedContextAwareClassLoader : super.getClassLoader());
+        return (jetspeedContextAwareClassLoader != null ? jetspeedContextAwareClassLoader : defaultClassLoader);
     }
 
     private class JetspeedContextAwareClassLoader extends ClassLoader
@@ -101,6 +114,6 @@
             
             return result;
         }
-
     }
+    
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org