You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by da...@apache.org on 2006/03/31 23:57:04 UTC

svn commit: r390512 - in /geronimo/branches/1.1/modules/kernel/src: java/org/apache/geronimo/kernel/basic/BasicProxyManager.java test/org/apache/geronimo/kernel/GBeanTest.java

Author: dain
Date: Fri Mar 31 13:57:02 2006
New Revision: 390512

URL: http://svn.apache.org/viewcvs?rev=390512&view=rev
Log:
Basic proxy manager will no longer attempt to create an auto-proxy using a base class without a default constructor.
Basic proxy manager now thows an IllegalArgumentException if a caller attempts to create a proxy or proxy factory using a class without a default constructor.

Modified:
    geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicProxyManager.java
    geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/kernel/GBeanTest.java

Modified: geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicProxyManager.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicProxyManager.java?rev=390512&r1=390511&r2=390512&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicProxyManager.java (original)
+++ geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/basic/BasicProxyManager.java Fri Mar 31 13:57:02 2006
@@ -40,6 +40,8 @@
 import java.util.Map;
 import java.util.Collections;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Modifier;
 
 /**
  * Creates proxies that communicate directly with a Kernel located in the same
@@ -68,6 +70,9 @@
      */
     public ProxyFactory createProxyFactory(Class type) {
         if (type == null) throw new NullPointerException("type is null");
+        if (!type.isInterface() && !hasDefaultConstructor(type)) {
+            throw new IllegalArgumentException("Type class does not have a default constructor " + type.getName());
+        }
 
         ClassLoader classLoader = type.getClassLoader();
         if(classLoader == null) {
@@ -131,15 +136,18 @@
                 return null;
             }
             String[] names = (String[]) interfaces.toArray(new String[0]);
-            List intfs = new ArrayList();
+            List types = new ArrayList();
             for (int i = 0; i < names.length; i++) {
                 try {
-                    intfs.add(classLoader.loadClass(names[i]));
+                    Class type = classLoader.loadClass(names[i]);
+                    if (type.isInterface() || hasDefaultConstructor(type)) {
+                        types.add(type);
+                    }
                 } catch (ClassNotFoundException e) {
                     log.warn("Could not load interface "+names[i]+" in provided ClassLoader for "+target.getKeyProperty("name"));
                 }
             }
-            return createProxyFactory((Class[]) intfs.toArray(new Class[intfs.size()]), classLoader).createProxy(target);
+            return createProxyFactory((Class[]) types.toArray(new Class[types.size()]), classLoader).createProxy(target);
         } catch (GBeanNotFoundException e) {
             throw new IllegalArgumentException("Could not get GBeanInfo for target object: " + target);
         }
@@ -157,15 +165,18 @@
                 return null;
             }
             String[] names = (String[]) interfaces.toArray(new String[0]);
-            List intfs = new ArrayList();
+            List types = new ArrayList();
             for (int i = 0; i < names.length; i++) {
                 try {
-                    intfs.add(classLoader.loadClass(names[i]));
+                    Class type = classLoader.loadClass(names[i]);
+                    if (type.isInterface() || hasDefaultConstructor(type)) {
+                        types.add(type);
+                    }
                 } catch (ClassNotFoundException e) {
                     log.warn("Could not load interface "+names[i]+" in provided ClassLoader for "+target);
                 }
             }
-            return createProxyFactory((Class[]) intfs.toArray(new Class[intfs.size()]), classLoader).createProxy(target);
+            return createProxyFactory((Class[]) types.toArray(new Class[types.size()]), classLoader).createProxy(target);
         } catch (GBeanNotFoundException e) {
             throw new IllegalArgumentException("Could not get GBeanInfo for target object: " + target);
         }
@@ -317,5 +328,21 @@
     private AbstractName getAbstractName(ObjectName objectName, Kernel kernel) throws GBeanNotFoundException {
         GBeanData gBeanData = kernel.getGBeanData(objectName);
         return gBeanData.getAbstractName();
+    }
+
+    public static boolean hasDefaultConstructor(Class type) {
+        if (!Modifier.isPublic(type.getModifiers())) {
+            return false;
+        }
+        Constructor[] constructors = type.getDeclaredConstructors();
+        for (int i = 0; i < constructors.length; i++) {
+            Constructor constructor = constructors[i];
+            boolean accessible = Modifier.isPublic(constructor.getModifiers()) ||
+                    Modifier.isProtected(constructor.getModifiers());
+            if (accessible && constructor.getParameterTypes().length == 0) {
+                return true;
+            }
+        }
+        return false;
     }
 }

Modified: geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/kernel/GBeanTest.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/kernel/GBeanTest.java?rev=390512&r1=390511&r2=390512&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/kernel/GBeanTest.java (original)
+++ geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/kernel/GBeanTest.java Fri Mar 31 13:57:02 2006
@@ -21,20 +21,21 @@
 import java.net.URLClassLoader;
 import java.util.Set;
 
+import junit.extensions.TestSetup;
+import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
-import junit.framework.Test;
-import junit.extensions.TestSetup;
 import org.apache.geronimo.gbean.AbstractName;
 import org.apache.geronimo.gbean.AbstractNameQuery;
 import org.apache.geronimo.gbean.GBeanData;
 import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.kernel.jmx.KernelDelegate;
+import org.apache.geronimo.kernel.jmx.MBeanServerDelegate;
 import org.apache.geronimo.kernel.management.State;
 import org.apache.geronimo.kernel.proxy.ProxyFactory;
 import org.apache.geronimo.kernel.proxy.ProxyManager;
 import org.apache.geronimo.kernel.repository.Artifact;
-import org.apache.geronimo.kernel.jmx.KernelDelegate;
-import org.apache.geronimo.kernel.jmx.MBeanServerDelegate;
 import org.apache.log4j.ConsoleAppender;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
@@ -514,6 +515,34 @@
         }
     }
 
+    public void testProxyClass() throws Exception {
+        ClassLoader cl = getClass().getClassLoader();
+        ClassLoader myCl = new URLClassLoader(new URL[0], cl);
+
+        GBeanData gbean = buildGBeanData("name", "test", ClassGBean.getGBeanInfo());
+        gbean.setAttribute("name", "Test");
+        kernel.loadGBean(gbean, myCl);
+        kernel.startGBean(gbean.getAbstractName());
+        ProxyManager mgr = kernel.getProxyManager();
+
+        Object test = mgr.createProxy(gbean.getAbstractName(), Named.class);
+        assertTrue(test instanceof Named);
+        assertFalse(test instanceof ClassGBean);
+        assertEquals("Test", ((Named)test).getName());
+
+        test = mgr.createProxy(gbean.getAbstractName(), myCl);
+        assertTrue(test instanceof Named);
+        assertFalse(test instanceof ClassGBean);
+        assertEquals("Test", ((Named)test).getName());
+
+        try {
+            mgr.createProxy(gbean.getAbstractName(), ClassGBean.class);
+            fail("expected an IllegalArgumentException");
+        } catch (IllegalArgumentException ignored) {
+            // expected
+        }
+    }
+
     protected void setUp() throws Exception {
         super.setUp();
         Logger.getRootLogger().addAppender(new ConsoleAppender(new PatternLayout("%p [%t] %m %n")));
@@ -533,5 +562,34 @@
     private GBeanData buildGBeanData(String name, String type, GBeanInfo info) {
         AbstractName abstractName = kernel.getNaming().createRootName(new Artifact("test", "foo", "1", "car"), name, type);
         return new GBeanData(abstractName, info);
+    }
+
+    public static interface Named {
+        String getName();
+    }
+
+    public static class ClassGBean implements Named {
+        private final String name;
+
+        public ClassGBean(String name) {
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        private static final GBeanInfo GBEAN_INFO;
+
+        static {
+            GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(ClassGBean.class);
+            infoFactory.setConstructor(new String[]{"name"});
+
+            GBEAN_INFO = infoFactory.getBeanInfo();
+        }
+
+        public static GBeanInfo getGBeanInfo() {
+            return GBEAN_INFO;
+        }
     }
 }