You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jc...@apache.org on 2007/11/20 12:11:34 UTC

svn commit: r596619 - /wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/io/IObjectStreamFactory.java

Author: jcompagner
Date: Tue Nov 20 03:11:32 2007
New Revision: 596619

URL: http://svn.apache.org/viewvc?rev=596619&view=rev
Log:
Default ObjectInputStream should override resolveClass so that the IClassResolver is used when the class is not found

Modified:
    wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/io/IObjectStreamFactory.java

Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/io/IObjectStreamFactory.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/io/IObjectStreamFactory.java?rev=596619&r1=596618&r2=596619&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/io/IObjectStreamFactory.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/io/IObjectStreamFactory.java Tue Nov 20 03:11:32 2007
@@ -21,9 +21,16 @@
 import java.io.NotSerializableException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.io.ObjectStreamClass;
 import java.io.OutputStream;
 
+import org.apache.wicket.Application;
+import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.application.IClassResolver;
+import org.apache.wicket.settings.IApplicationSettings;
 import org.apache.wicket.util.lang.Objects;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -42,12 +49,57 @@
 	 */
 	public static final class DefaultObjectStreamFactory implements IObjectStreamFactory
 	{
+		private static final Logger log = LoggerFactory.getLogger(DefaultObjectStreamFactory.class);
+
 		/**
 		 * @see org.apache.wicket.util.io.IObjectStreamFactory#newObjectInputStream(java.io.InputStream)
 		 */
 		public ObjectInputStream newObjectInputStream(InputStream in) throws IOException
 		{
-			return new ObjectInputStream(in);
+			return new ObjectInputStream(in)
+			{
+				// This override is required to resolve classes inside in different bundle, i.e.
+				// The classes can be resolved by OSGI classresolver implementation
+				protected Class resolveClass(ObjectStreamClass desc) throws IOException,
+					ClassNotFoundException
+				{
+					String className = desc.getName();
+
+					try
+					{
+						return super.resolveClass(desc);
+					}
+					catch (ClassNotFoundException ex1)
+					{
+						// ignore this exception.
+						log.debug("Class not found by the object outputstream itself, trying the IClassResolver");
+					}
+
+
+					Class candidate = null;
+					try
+					{
+						// Can the application always be taken??
+						Application application = Application.get();
+						IApplicationSettings applicationSettings = application.getApplicationSettings();
+						IClassResolver classResolver = applicationSettings.getClassResolver();
+
+						candidate = classResolver.resolveClass(className);
+						if (candidate == null)
+						{
+							candidate = super.resolveClass(desc);
+						}
+					}
+					catch (WicketRuntimeException ex)
+					{
+						if (ex.getCause() instanceof ClassNotFoundException)
+						{
+							throw (ClassNotFoundException)ex.getCause();
+						}
+					}
+					return candidate;
+				}
+			};
 		}
 
 		/**