Return-Path: Delivered-To: apmail-commons-commits-archive@minotaur.apache.org Received: (qmail 43658 invoked from network); 12 Mar 2011 01:14:02 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 12 Mar 2011 01:14:02 -0000 Received: (qmail 89530 invoked by uid 500); 12 Mar 2011 01:14:01 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 89476 invoked by uid 500); 12 Mar 2011 01:14:01 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 89469 invoked by uid 99); 12 Mar 2011 01:14:01 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 12 Mar 2011 01:14:01 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 12 Mar 2011 01:14:01 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 7115C2388A3F; Sat, 12 Mar 2011 01:13:38 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1080833 - in /commons/proper/io/trunk/src: main/java/org/apache/commons/io/input/ClassLoaderObjectInputStream.java test/java/org/apache/commons/io/input/ClassLoaderObjectInputStreamTest.java Date: Sat, 12 Mar 2011 01:13:38 -0000 To: commits@commons.apache.org From: niallp@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110312011338.7115C2388A3F@eris.apache.org> 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)); + } }