Author: niallp
Date: Sat Mar 12 01:13:38 2011
New Revision: 1080833

URL: http://svn.apache.org/viewvc?rev=1080833&view=rev
Log:
IO-260 Fix ClassLoaderObjectInputStream does not handle Proxy classes - thanks 
to John Carrino

Modified:
    
commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/ClassLoaderObjectInputStream.java
    
commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/ClassLoaderObjectInputStreamTest.java

Modified: 
commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/ClassLoaderObjectInputStream.java
URL: 
http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/ClassLoaderObjectInputStream.java?rev=1080833&r1=1080832&r2=1080833&view=diff
==============================================================================
--- 
commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/ClassLoaderObjectInputStream.java
 (original)
+++ 
commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/ClassLoaderObjectInputStream.java
 Sat Mar 12 01:13:38 2011
@@ -21,6 +21,7 @@ import java.io.InputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectStreamClass;
 import java.io.StreamCorruptedException;
+import java.lang.reflect.Proxy;
 
 /**
  * A special ObjectInputStream that loads a class based on a specified
@@ -75,4 +76,27 @@ public class ClassLoaderObjectInputStrea
             return super.resolveClass(objectStreamClass);
         }
     }
+
+    /**
+     * Create a proxy class that implements the specified interfaces using
+     * the specified ClassLoader or the super ClassLoader.
+     *
+     * @param interfaces the interfaces to implemnt
+     * @return the class
+     * @see java.io.ObjectInputStream#resolveProxyClass(java.lang.String[])
+     */
+    @Override
+    protected Class<?> resolveProxyClass(String[] interfaces) throws 
IOException,
+            ClassNotFoundException {
+        Class<?>[] interfaceClasses = new Class[interfaces.length];
+        for (int i = 0; i < interfaces.length; i++) {
+            interfaceClasses[i] = Class.forName(interfaces[i], false, 
classLoader);
+        }
+        try {
+            return Proxy.getProxyClass(classLoader, interfaceClasses);
+        } catch (IllegalArgumentException e) {
+            return super.resolveProxyClass(interfaces);
+        }
+    }
+    
 }

Modified: 
commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/ClassLoaderObjectInputStreamTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/ClassLoaderObjectInputStreamTest.java?rev=1080833&r1=1080832&r2=1080833&view=diff
==============================================================================
--- 
commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/ClassLoaderObjectInputStreamTest.java
 (original)
+++ 
commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/ClassLoaderObjectInputStreamTest.java
 Sat Mar 12 01:13:38 2011
@@ -54,5 +54,19 @@ public class ClassLoaderObjectInputStrea
 
         assertTrue( !result.booleanValue() );
     }
+
+    public void testResolveProxyClass() throws Exception {
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject( Boolean.FALSE );
+        InputStream bais = new ByteArrayInputStream(baos.toByteArray());
+
+        ClassLoaderObjectInputStream clois = 
+            new ClassLoaderObjectInputStream(getClass().getClassLoader(), 
bais);
+        String[] interfaces = new String[] { Comparable.class.getName() };
+        Class<?> result = clois.resolveProxyClass(interfaces);
+        assertTrue("Assignable", Comparable.class.isAssignableFrom(result));
+    }
     
 }


Reply via email to