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));
+ }
}