You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jc...@apache.org on 2005/10/15 16:24:28 UTC

svn commit: r321338 - in /jakarta/commons/sandbox/proxy/trunk/src: java/org/apache/commons/proxy/ProxyUtils.java test/org/apache/commons/proxy/TestProxyUtils.java

Author: jcarman
Date: Sat Oct 15 07:24:23 2005
New Revision: 321338

URL: http://svn.apache.org/viewcvs?rev=321338&view=rev
Log:
Introduced getProxyFactory() method.

Modified:
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyUtils.java
    jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/TestProxyUtils.java

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyUtils.java?rev=321338&r1=321337&r2=321338&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyUtils.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyUtils.java Sat Oct 15 07:24:23 2005
@@ -16,6 +16,7 @@
  */
 package org.apache.commons.proxy;
 
+import org.apache.commons.proxy.exception.ProxyFactoryException;
 import org.apache.commons.proxy.handler.NullInvocationHandler;
 
 import java.util.ArrayList;
@@ -32,6 +33,7 @@
 // Fields
 //----------------------------------------------------------------------------------------------------------------------
 
+    public static final String PROXY_FACTORY_PROPERTY = "commons-proxy.factory";
     public static final Object[] EMPTY_ARGUMENTS = new Object[0];
     public static final Class[] EMPTY_ARGUMENT_TYPES = new Class[0];
 
@@ -41,6 +43,7 @@
 
     /**
      * Creates a "null object" which implements the <code>proxyClasses</code>.
+     *
      * @param proxyFactory the proxy factory to be used to create the proxy object
      * @param proxyClasses the proxy interfaces
      * @return a "null object" which implements the <code>proxyClasses</code>.
@@ -52,8 +55,9 @@
 
     /**
      * Creates a "null object" which implements the <code>proxyClasses</code>.
+     *
      * @param proxyFactory the proxy factory to be used to create the proxy object
-     * @param classLoader the class loader to be used by the proxy factory to create the proxy object
+     * @param classLoader  the class loader to be used by the proxy factory to create the proxy object
      * @param proxyClasses the proxy interfaces
      * @return a "null object" which implements the <code>proxyClasses</code>.
      */
@@ -63,20 +67,19 @@
     }
 
     /**
-     * <p>Gets an array of {@link Class} objects representing all interfaces implemented by the given
-     * class and its superclasses.</p>
+     * <p>Gets an array of {@link Class} objects representing all interfaces implemented by the given class and its
+     * superclasses.</p>
+     * <p/>
+     * <p>The order is determined by looking through each interface in turn as declared in the source file and following
+     * its hierarchy up. Then each superclass is considered in the same way. Later duplicates are ignored, so the order
+     * is maintained.</p>
+     * <p/>
+     * <b>Note</b>: Implementation of this method was "borrowed" from <a href="http://jakarta.apache.org/commons/lang/">Jakarta
+     * Commons Lang</a> to avoid a dependency. </p>
      *
-     * <p>The order is determined by looking through each interface in turn as
-     * declared in the source file and following its hierarchy up. Then each
-     * superclass is considered in the same way. Later duplicates are ignored,
-     * so the order is maintained.</p>
-     * <p>
-     * <b>Note</b>: Implementation of this method was "borrowed" from
-     * <a href="http://jakarta.apache.org/commons/lang/">Jakarta Commons Lang</a> to avoid a dependency.
-     * </p>
-     * @param cls  the class to look up, may be <code>null</code>
-     * @return an array of {@link Class} objects representing all interfaces implemented by the given
-     * class and its superclasses or <code>null</code> if input class is null.
+     * @param cls the class to look up, may be <code>null</code>
+     * @return an array of {@link Class} objects representing all interfaces implemented by the given class and its
+     *         superclasses or <code>null</code> if input class is null.
      */
     public static Class[] getAllInterfaces( Class cls )
     {
@@ -117,13 +120,10 @@
 
     /**
      * Returns the class name as you would expect to see it in Java code.
-     * <p>
-     * <b>Examples:</b>
-     * <ul>
-     *   <li>getJavaClassName( Object[].class ) == "Object[]"</li>
-     *   <li>getJavaClassName( Object[][].class ) == "Object[][]"</li>
-     *   <li>getJavaClassName( Integer.TYPE ) == "int"</li>
-     * </p>
+     * <p/>
+     * <b>Examples:</b> <ul> <li>getJavaClassName( Object[].class ) == "Object[]"</li> <li>getJavaClassName(
+     * Object[][].class ) == "Object[][]"</li> <li>getJavaClassName( Integer.TYPE ) == "int"</li> </p>
+     *
      * @param clazz the class
      * @return the class' name as you would expect to see it in Java code
      */
@@ -134,6 +134,83 @@
             return getJavaClassName( clazz.getComponentType() ) + "[]";
         }
         return clazz.getName();
+    }
+
+    /**
+     * Returns an appropriate {@link ProxyFactory} implementation for the current environment.
+     * The implementation class search order is as follows:
+     * <ul>
+     *  <li>Try to use the type indicated by the system property "commons-proxy.factory"</li>
+     *  <li>Try to use {@link org.apache.commons.proxy.factory.javassist.JavassistProxyFactory}</li>
+     *  <li>Try to use {@link org.apache.commons.proxy.factory.cglib.CglibProxyFactory}</li>
+     *  <li>Default to {@link org.apache.commons.proxy.factory.reflect.ReflectionProxyFactory} (should always be available)</li>
+     * </ul>
+     * @param classLoader the class loader to use to instantiate the proxy factory
+     * @return an appropriate {@link ProxyFactory} implementation for the current environment
+     */
+    public static ProxyFactory getProxyFactory( ClassLoader classLoader )
+    {
+        final String[] classNames = new String[]{ System.getProperty( PROXY_FACTORY_PROPERTY ),
+                "org.apache.commons.proxy.factory.javassist.JavassistProxyFactory",
+                "org.apache.commons.proxy.factory.cglib.CglibProxyFactory",
+                "org.apache.commons.proxy.factory.reflect.ReflectionProxyFactory" };
+        for( int i = 0; i < classNames.length; i++ )
+        {
+            final String className = classNames[i];
+            final ProxyFactory factory = instantiateProxyFactory( className, classLoader );
+            if( factory != null )
+            {
+                return factory;
+            }
+        }
+        throw new ProxyFactoryException( "Unable to find a suitable proxy factory implementation class." );
+    }
+
+    /**
+     * Returns an appropriate {@link ProxyFactory} implementation for the current environment.
+     * The implementation class search order is as follows:
+     * <ul>
+     *  <li>Try to the type indicated by the system property "commons-proxy.factory"</li>
+     *  <li>Try to use {@link org.apache.commons.proxy.factory.javassist.JavassistProxyFactory}</li>
+     *  <li>Try to use {@link org.apache.commons.proxy.factory.cglib.CglibProxyFactory}</li>
+     *  <li>Default to {@link org.apache.commons.proxy.factory.reflect.ReflectionProxyFactory} (should always be available)</li>
+     * </ul>
+     * <p>
+     * <b>Note</b>: This implementation uses the current thread's context class loader!
+     * @return an appropriate {@link ProxyFactory} implementation for the current environment
+     */
+    public static ProxyFactory getProxyFactory()
+    {
+        return getProxyFactory( Thread.currentThread().getContextClassLoader() );
+    }
+
+    private static ProxyFactory instantiateProxyFactory( String className, ClassLoader classLoader )
+    {
+        try
+        {
+            if( className == null )
+            {
+                return null;
+            }
+            Class proxyFactoryClass = classLoader.loadClass( className );
+            if( proxyFactoryClass.isAssignableFrom( ProxyFactory.class ) )
+            {
+                return null;
+            }
+            return ( ProxyFactory ) proxyFactoryClass.newInstance();
+        }
+        catch( IllegalAccessException e )
+        {
+            return null;
+        }
+        catch( InstantiationException e )
+        {
+            return null;
+        }
+        catch( ClassNotFoundException e )
+        {
+            return null;
+        }
     }
 }
 

Modified: jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/TestProxyUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/TestProxyUtils.java?rev=321338&r1=321337&r2=321338&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/TestProxyUtils.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/TestProxyUtils.java Sat Oct 15 07:24:23 2005
@@ -16,7 +16,9 @@
  */
 package org.apache.commons.proxy;
 import junit.framework.TestCase;
+import org.apache.commons.proxy.factory.cglib.CglibProxyFactory;
 import org.apache.commons.proxy.factory.javassist.JavassistProxyFactory;
+import org.apache.commons.proxy.factory.reflect.ReflectionProxyFactory;
 import org.apache.commons.proxy.util.Echo;
 
 public class TestProxyUtils extends TestCase
@@ -50,5 +52,39 @@
         assertEquals( "byte", ProxyUtils.getJavaClassName( Byte.TYPE ) );
         assertEquals( "char", ProxyUtils.getJavaClassName( Character.TYPE ) );
         assertEquals( "boolean", ProxyUtils.getJavaClassName( Boolean.TYPE ) );
+    }
+
+    public void testGetProxyFactory() throws Exception
+    {
+        assertTrue( ProxyUtils.getProxyFactory() instanceof JavassistProxyFactory );
+        System.setProperty( ProxyUtils.PROXY_FACTORY_PROPERTY, CglibProxyFactory.class.getName() );
+        assertTrue( ProxyUtils.getProxyFactory() instanceof CglibProxyFactory );
+        System.setProperty( ProxyUtils.PROXY_FACTORY_PROPERTY, ReflectionProxyFactory.class.getName() );
+        assertTrue( ProxyUtils.getProxyFactory() instanceof ReflectionProxyFactory );
+        System.setProperty( ProxyUtils.PROXY_FACTORY_PROPERTY, "" );
+        ClassLoader cl = new IsolatingClassLoader( JavassistProxyFactory.class, Thread.currentThread().getContextClassLoader() );
+        assertTrue( ProxyUtils.getProxyFactory( cl ) instanceof CglibProxyFactory );
+        cl = new IsolatingClassLoader( CglibProxyFactory.class, cl );
+        assertTrue( ProxyUtils.getProxyFactory( cl ) instanceof ReflectionProxyFactory );
+    }
+
+    private static class IsolatingClassLoader extends ClassLoader
+    {
+        private Class isolatedClass;
+
+        public IsolatingClassLoader( Class isolatedClass, ClassLoader parent )
+        {
+            super( parent );
+            this.isolatedClass = isolatedClass;
+        }
+
+        public Class loadClass( String name ) throws ClassNotFoundException
+        {
+            if( isolatedClass.getName().equals( name ) )
+            {
+                throw new ClassNotFoundException( name + " not found." );
+            }
+            return getParent().loadClass( name );
+        }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org