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;
+                               }
+                       };
                }
 
                /**


Reply via email to