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