You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by gd...@apache.org on 2008/11/08 01:28:43 UTC

svn commit: r712321 - in /geronimo/server/trunk/framework/modules/geronimo-kernel/src: main/java/org/apache/geronimo/gbean/ main/java/org/apache/geronimo/gbean/annotation/ test/java/org/apache/geronimo/gbean/

Author: gdamour
Date: Fri Nov  7 16:28:43 2008
New Revision: 712321

URL: http://svn.apache.org/viewvc?rev=712321&view=rev
Log:
GBeanInfo.getGBeanInfo should call the MultiGBeanInfoFactory so that the annotation GBean configuration style is attempted.

(GERONIMO-4399) GBean Annotations are not supported for GBeans declared in XML configuration

Removed:
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/AbstractGBeanInfoFactory.java
Modified:
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/BasicGBeanInfoFactory.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanData.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfo.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfoFactoryException.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/MultiGBeanInfoFactory.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/annotation/AnnotationGBeanInfoFactory.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/gbean/GBeanInfoTest.java

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/BasicGBeanInfoFactory.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/BasicGBeanInfoFactory.java?rev=712321&r1=712320&r2=712321&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/BasicGBeanInfoFactory.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/BasicGBeanInfoFactory.java Fri Nov  7 16:28:43 2008
@@ -19,19 +19,61 @@
 
 package org.apache.geronimo.gbean;
 
+import java.lang.reflect.Method;
+
+
 
 /**
  *
  * @version $Rev:$ $Date:$
  */
-public class BasicGBeanInfoFactory extends AbstractGBeanInfoFactory {
+public class BasicGBeanInfoFactory implements GBeanInfoFactory {
 
     public GBeanInfo getGBeanInfo(Class clazz) throws GBeanInfoFactoryException {
+        return getGBeanInfo(clazz.getName(), clazz.getClassLoader());
+    }
+
+    public GBeanInfo getGBeanInfo(String className, ClassLoader classLoader) throws GBeanInfoFactoryException {
+        Class clazz;
         try {
-            return GBeanInfo.getGBeanInfo(clazz.getName(), clazz.getClassLoader());
-        } catch (InvalidConfigurationException e) {
-            throw new GBeanInfoFactoryException(e);
+            clazz = classLoader.loadClass(className);
+        } catch (ClassNotFoundException e) {
+            throw new GBeanInfoFactoryException("Could not load class " + className, e);
+        } catch (NoClassDefFoundError e) {
+            throw new GBeanInfoFactoryException("Could not load class " + className, e);
+        }
+        Method method;
+        try {
+            method = clazz.getDeclaredMethod("getGBeanInfo", new Class[]{});
+        } catch (NoSuchMethodException e) {
+            try {
+                // try to get the info from ${className}GBean
+                clazz = classLoader.loadClass(className + "GBean");
+                method = clazz.getDeclaredMethod("getGBeanInfo", new Class[]{});
+            } catch (Exception ignored) {
+                throw new GBeanInfoFactoryException("Class does not have a getGBeanInfo() method: " + className);
+            }
+        } catch (NoClassDefFoundError e) {
+            String message = e.getMessage();
+            StringBuffer buf = new StringBuffer("Could not load gbean class ").append(className).append(" due to NoClassDefFoundError\n");
+            if (message != null) {
+                message = message.replace('/', '.');
+                buf.append("    problematic class ").append(message);
+                try {
+                    Class hardToLoad = classLoader.loadClass(message);
+                    buf.append(" can be loaded in supplied classloader ").append(classLoader).append("\n");
+                    buf.append("    and is found in ").append(hardToLoad.getClassLoader());
+                } catch (ClassNotFoundException e1) {
+                    buf.append(" cannot be loaded in supplied classloader ").append(classLoader).append("\n");
+                }
+            }
+            throw new GBeanInfoFactoryException(buf.toString(), e);
+        }
+        try {
+            return (GBeanInfo) method.invoke(null, new Object[]{});
+        } catch (Exception e) {
+            throw new GBeanInfoFactoryException("Could not get GBeanInfo from class: " + className, e);
         }
     }
-
+    
 }
\ No newline at end of file

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanData.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanData.java?rev=712321&r1=712320&r2=712321&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanData.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanData.java Fri Nov  7 16:28:43 2008
@@ -20,7 +20,6 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.NotSerializableException;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfo.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfo.java?rev=712321&r1=712320&r2=712321&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfo.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfo.java Fri Nov  7 16:28:43 2008
@@ -20,7 +20,6 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -57,48 +56,14 @@
      *          if there is a problem getting the GBeanInfo from the class
      */
     public static GBeanInfo getGBeanInfo(String className, ClassLoader classLoader) throws InvalidConfigurationException {
-        Class clazz;
+        GBeanInfoFactory infoFactory = new MultiGBeanInfoFactory();
         try {
-            clazz = classLoader.loadClass(className);
-        } catch (ClassNotFoundException e) {
-            throw new InvalidConfigurationException("Could not load class " + className, e);
-        } catch (NoClassDefFoundError e) {
-            throw new InvalidConfigurationException("Could not load class " + className, e);
-        }
-        Method method;
-        try {
-            method = clazz.getDeclaredMethod("getGBeanInfo", new Class[]{});
-        } catch (NoSuchMethodException e) {
-            try {
-                // try to get the info from ${className}GBean
-                clazz = classLoader.loadClass(className + "GBean");
-                method = clazz.getDeclaredMethod("getGBeanInfo", new Class[]{});
-            } catch (Exception ignored) {
-                throw new InvalidConfigurationException("Class does not have a getGBeanInfo() method: " + className);
-            }
-        } catch (NoClassDefFoundError e) {
-            String message = e.getMessage();
-            StringBuffer buf = new StringBuffer("Could not load gbean class ").append(className).append(" due to NoClassDefFoundError\n");
-            if (message != null) {
-                message = message.replace('/', '.');
-                buf.append("    problematic class ").append(message);
-                try {
-                    Class hardToLoad = classLoader.loadClass(message);
-                    buf.append(" can be loaded in supplied classloader ").append(classLoader).append("\n");
-                    buf.append("    and is found in ").append(hardToLoad.getClassLoader());
-                } catch (ClassNotFoundException e1) {
-                    buf.append(" cannot be loaded in supplied classloader ").append(classLoader).append("\n");
-                }
-            }
-            throw new InvalidConfigurationException(buf.toString(), e);
-        }
-        try {
-            return (GBeanInfo) method.invoke(null, new Object[]{});
-        } catch (Exception e) {
-            throw new InvalidConfigurationException("Could not get GBeanInfo from class: " + className, e);
+            return infoFactory.getGBeanInfo(className, classLoader);
+        } catch (GBeanInfoFactoryException e) {
+            throw new InvalidConfigurationException("See nested", e);
         }
     }
-
+    
     private final String sourceClass;
     private final String name;
     private final String className;

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfoFactoryException.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfoFactoryException.java?rev=712321&r1=712320&r2=712321&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfoFactoryException.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfoFactoryException.java Fri Nov  7 16:28:43 2008
@@ -26,6 +26,13 @@
  */
 public class GBeanInfoFactoryException extends RuntimeException {
 
+    public GBeanInfoFactoryException() {
+    }
+
+    public GBeanInfoFactoryException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
     public GBeanInfoFactoryException(String message) {
         super(message);
     }

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/MultiGBeanInfoFactory.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/MultiGBeanInfoFactory.java?rev=712321&r1=712320&r2=712321&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/MultiGBeanInfoFactory.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/MultiGBeanInfoFactory.java Fri Nov  7 16:28:43 2008
@@ -19,8 +19,6 @@
 
 package org.apache.geronimo.gbean;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.geronimo.gbean.annotation.AnnotationGBeanInfoFactory;
@@ -30,24 +28,24 @@
  *
  * @version $Rev:$ $Date:$
  */
-public class MultiGBeanInfoFactory extends AbstractGBeanInfoFactory implements GBeanInfoFactoryRegistry {
-    private final static CopyOnWriteArrayList<GBeanInfoFactory> factories = new CopyOnWriteArrayList<GBeanInfoFactory>();
+public class MultiGBeanInfoFactory implements GBeanInfoFactory, GBeanInfoFactoryRegistry {
+    private final static CopyOnWriteArrayList<GBeanInfoFactory> FACTORIES = new CopyOnWriteArrayList<GBeanInfoFactory>();
     
     static {
-        factories.add(new BasicGBeanInfoFactory());
-        factories.add(new AnnotationGBeanInfoFactory());
+        FACTORIES.add(new BasicGBeanInfoFactory());
+        FACTORIES.add(new AnnotationGBeanInfoFactory());
     }
 
     public void registerFactory(GBeanInfoFactory factory) {
-        factories.add(0, factory);
+        FACTORIES.add(0, factory);
     }
     
     public void unregisterFactory(GBeanInfoFactory factory) {
-        factories.remove(factory);
+        FACTORIES.remove(factory);
     }
     
     public GBeanInfo getGBeanInfo(Class clazz) throws GBeanInfoFactoryException {
-        for (GBeanInfoFactory factory : factories) {
+        for (GBeanInfoFactory factory : FACTORIES) {
             try {
                 return factory.getGBeanInfo(clazz);
             } catch (GBeanInfoFactoryException e) {
@@ -56,4 +54,14 @@
         throw new GBeanInfoFactoryException("Cannot create a GBeanInfo for [" + clazz + "]");
     }
 
+    public GBeanInfo getGBeanInfo(String className, ClassLoader classLoader) throws GBeanInfoFactoryException {
+        for (GBeanInfoFactory factory : FACTORIES) {
+            try {
+                return factory.getGBeanInfo(className, classLoader);
+            } catch (GBeanInfoFactoryException e) {
+            }
+        }
+        throw new GBeanInfoFactoryException("Cannot create a GBeanInfo for [" + className + "]");
+    }
+    
 }
\ No newline at end of file

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/annotation/AnnotationGBeanInfoFactory.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/annotation/AnnotationGBeanInfoFactory.java?rev=712321&r1=712320&r2=712321&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/annotation/AnnotationGBeanInfoFactory.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/annotation/AnnotationGBeanInfoFactory.java Fri Nov  7 16:28:43 2008
@@ -19,9 +19,10 @@
 
 package org.apache.geronimo.gbean.annotation;
 
-import org.apache.geronimo.gbean.AbstractGBeanInfoFactory;
 import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoFactory;
 import org.apache.geronimo.gbean.GBeanInfoFactoryException;
+import org.apache.geronimo.gbean.InvalidConfigurationException;
 
 
 
@@ -30,7 +31,19 @@
  *
  * @version $Rev:$ $Date:$
  */
-public class AnnotationGBeanInfoFactory extends AbstractGBeanInfoFactory {
+public class AnnotationGBeanInfoFactory implements GBeanInfoFactory {
+
+    public GBeanInfo getGBeanInfo(String className, ClassLoader classLoader) throws GBeanInfoFactoryException {
+        Class clazz;
+        try {
+            clazz = classLoader.loadClass(className);
+        } catch (ClassNotFoundException e) {
+            throw new InvalidConfigurationException("Could not load class " + className, e);
+        } catch (NoClassDefFoundError e) {
+            throw new InvalidConfigurationException("Could not load class " + className, e);
+        }
+        return getGBeanInfo(clazz);
+    }
 
     public GBeanInfo getGBeanInfo(Class clazz) throws GBeanInfoFactoryException {
         AnnotationGBeanInfoBuilder infoFactory = new AnnotationGBeanInfoBuilder(clazz);

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/gbean/GBeanInfoTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/gbean/GBeanInfoTest.java?rev=712321&r1=712320&r2=712321&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/gbean/GBeanInfoTest.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/gbean/GBeanInfoTest.java Fri Nov  7 16:28:43 2008
@@ -45,14 +45,6 @@
             fail("InvalidConfigurationException expected");
         } catch (InvalidConfigurationException expected) {
         }
-
-        // 3. Test GBean that exist, but doesn't declare a getGBeanInfo()
-        // method
-        try {
-            GBeanInfo.getGBeanInfo(String.class.getName(), this.getClass().getClassLoader());
-            fail("InvalidConfigurationException expected");
-        } catch (InvalidConfigurationException expected) {
-        }
     }
 
     public void testGetName() {