You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2010/05/25 09:51:18 UTC

svn commit: r947954 - in /geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment: AbstractNamingBuilder.java EnvironmentEntryBuilder.java

Author: djencks
Date: Tue May 25 07:51:18 2010
New Revision: 947954

URL: http://svn.apache.org/viewvc?rev=947954&view=rev
Log:
GERONIMO-5346 infer jndi type from injection target, for env-entries

Modified:
    geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/AbstractNamingBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/EnvironmentEntryBuilder.java

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/AbstractNamingBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/AbstractNamingBuilder.java?rev=947954&r1=947953&r2=947954&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/AbstractNamingBuilder.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/AbstractNamingBuilder.java Tue May 25 07:51:18 2010
@@ -17,6 +17,7 @@
 
 package org.apache.geronimo.naming.deployment;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -347,6 +348,65 @@ public abstract class AbstractNamingBuil
     public QName getBaseQName() {
         return BASE_NAMING_QNAME;
     }
+
+    protected String InferAndCheckType(Module module, Bundle bundle, InjectionTargetType[] injectionTargets, String name, String typeName) throws DeploymentException {
+        Class<?> type = null;
+        if (typeName != null) {
+            try {
+                type = bundle.loadClass(typeName);
+            } catch (ClassNotFoundException e) {
+                throw new DeploymentException("could not load type class for env entry named: " + name, e);
+            }
+        }
+        for (InjectionTargetType injectionTarget : injectionTargets) {
+            String className = getStringValue(injectionTarget.getInjectionTargetClass());
+            try {
+                Class<?> clazz = bundle.loadClass(className);
+                String fieldName = getStringValue(injectionTarget.getInjectionTargetName());
+                Field field = getField(clazz, fieldName);
+                Class<?> fieldType = field.getType();
+                fieldType = fieldType.isPrimitive()? primitives.get(fieldType): fieldType;
+                if (type == null) {
+                    type = fieldType;
+                } else if (!fieldType.equals(type)) {
+                    throw new DeploymentException("Mismatched types in env-entry named: " + name + " type: " + type + " injections " + injectionTargets);
+                }
+            } catch (ClassNotFoundException e) {
+                throw new DeploymentException("could not load injection target class for env entry named: " + name + " in class: " + className, e);
+            } catch (NoSuchFieldException e) {
+                throw new DeploymentException("could not access field for env entry named: " + name + " in class: " + className + "of type: " + type, e);
+            }
+        }
+        if (type == null) {
+            throw new DeploymentException("No way to determine type of env-entry " + name + " in component " + module.getAnnotatedApp().toString());
+        }
+        return type.getName();
+    }
+
+    private static final Map<Class<?>, Class<?>> primitives = new HashMap<Class<?>, Class<?>>();
+
+    static {
+        primitives.put(boolean.class, Boolean.class);
+        primitives.put(byte.class, Byte.class);
+        primitives.put(char.class, Character.class);
+        primitives.put(double.class, Double.class);
+        primitives.put(float.class, Float.class);
+        primitives.put(int.class, Integer.class);
+        primitives.put(long.class, Long.class);
+        primitives.put(short.class, Short.class);
+    }
+
+    private Field getField(Class<?> clazz, String fieldName) throws NoSuchFieldException {
+        do {
+            try {
+                return clazz.getDeclaredField(fieldName);
+            } catch (NoSuchFieldException e) {
+                //look at superclass
+            }
+            clazz = clazz.getSuperclass();
+        } while (clazz != null);
+        throw new NoSuchFieldException(fieldName);
+    }
 }
 
 

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/EnvironmentEntryBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/EnvironmentEntryBuilder.java?rev=947954&r1=947953&r2=947954&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/EnvironmentEntryBuilder.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/EnvironmentEntryBuilder.java Tue May 25 07:51:18 2010
@@ -30,6 +30,8 @@ import org.apache.geronimo.deployment.xm
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
 import org.apache.geronimo.gbean.GBeanLifecycle;
+import org.apache.geronimo.gbean.annotation.GBean;
+import org.apache.geronimo.gbean.annotation.ParamAttribute;
 import org.apache.geronimo.j2ee.deployment.EARContext;
 import org.apache.geronimo.j2ee.deployment.Module;
 import org.apache.geronimo.j2ee.deployment.annotation.AnnotatedApp;
@@ -55,10 +57,13 @@ import org.slf4j.LoggerFactory;
 /**
  * @version $Rev$ $Date$
  */
+
+@GBean(j2eeType = NameFactory.MODULE_BUILDER)
 public class EnvironmentEntryBuilder extends AbstractNamingBuilder implements GBeanLifecycle {
 
     private static final Logger log = LoggerFactory.getLogger(EnvironmentEntryBuilder.class);
     private static final Map<String, String> NAMESPACE_UPDATES = new HashMap<String, String>();
+
     static {
         NAMESPACE_UPDATES.put("http://geronimo.apache.org/xml/ns/naming", "http://geronimo.apache.org/xml/ns/naming-1.2");
         NAMESPACE_UPDATES.put("http://geronimo.apache.org/xml/ns/naming-1.1", "http://geronimo.apache.org/xml/ns/naming-1.2");
@@ -68,7 +73,7 @@ public class EnvironmentEntryBuilder ext
     private static final QNameSet GER_ENV_ENTRY_QNAME_SET = QNameSet.singleton(GER_ENV_ENTRY_QNAME);
     private final QNameSet envEntryQNameSet;
 
-    public EnvironmentEntryBuilder(String[] eeNamespaces) {
+    public EnvironmentEntryBuilder(@ParamAttribute(name = "eeNamespaces")String[] eeNamespaces) {
         envEntryQNameSet = buildQNameSet(eeNamespaces, "env-entry");
     }
 
@@ -102,7 +107,7 @@ public class EnvironmentEntryBuilder ext
         List<EnvEntryType> envEntriesUntyped = convert(specDD.selectChildren(envEntryQNameSet), JEE_CONVERTER, EnvEntryType.class, EnvEntryType.type);
         XmlObject[] gerEnvEntryUntyped = plan == null ? NO_REFS : plan.selectChildren(GER_ENV_ENTRY_QNAME_SET);
         Map<String, String> envEntryMap = mapEnvEntries(gerEnvEntryUntyped);
-        for (EnvEntryType envEntry: envEntriesUntyped) {
+        for (EnvEntryType envEntry : envEntriesUntyped) {
             String name = getStringValue(envEntry.getEnvEntryName());
             String type = getStringValue(envEntry.getEnvEntryType());
 
@@ -127,6 +132,8 @@ public class EnvironmentEntryBuilder ext
                 strValue = strValueOverride;
             }
 
+            type = InferAndCheckType(module, bundle, envEntry.getInjectionTargetArray(), name, type);
+
 
             if (value == null) {
                 if (strValue == null) {
@@ -134,51 +141,49 @@ public class EnvironmentEntryBuilder ext
                         value = new KernelReference();
                     }
                 } else {
-                    if (type != null) {
-                        Class typeClass;
-                        try {
-                            typeClass = bundle.loadClass(type);
-                        } catch (ClassNotFoundException e) {
-                            throw new DeploymentException("Could not env-entry type class " + type, e);
-                        }
-                        try {
-                            if (String.class.equals(typeClass)) {
-                                value = strValue;
-                            } else if (Character.class.equals(typeClass)) {
-                                if (strValue.length() == 1) {
-                                    value = strValue.charAt(0);
-                                } else {
-                                    log.warn("invalid character value: {} for name {}", strValue, name );
-                                    value = ' ';
-                                }
-                            } else if (Boolean.class.equals(typeClass)) {
-                                value = Boolean.valueOf(strValue);
-                            } else if (Byte.class.equals(typeClass)) {
-                                value = Byte.valueOf(strValue);
-                            } else if (Short.class.equals(typeClass)) {
-                                value = Short.valueOf(strValue);
-                            } else if (Integer.class.equals(typeClass)) {
-                                value = Integer.valueOf(strValue);
-                            } else if (Long.class.equals(typeClass)) {
-                                value = Long.valueOf(strValue);
-                            } else if (Float.class.equals(typeClass)) {
-                                value = Float.valueOf(strValue);
-                            } else if (Double.class.equals(typeClass)) {
-                                value = Double.valueOf(strValue);
-                            } else if (Class.class.equals(typeClass)) {
-                                value = new ClassReference(strValue);
-                            } else if (typeClass.isEnum()) {
-                                value = Enum.valueOf(typeClass, strValue);
+                    Class typeClass;
+                    try {
+                        typeClass = bundle.loadClass(type);
+                    } catch (ClassNotFoundException e) {
+                        throw new DeploymentException("Could not env-entry type class " + type, e);
+                    }
+                    try {
+                        if (String.class.equals(typeClass)) {
+                            value = strValue;
+                        } else if (Character.class.equals(typeClass)) {
+                            if (strValue.length() == 1) {
+                                value = strValue.charAt(0);
                             } else {
-                                throw new DeploymentException("Unrecognized env-entry type: " + type);
+                                log.warn("invalid character value: {} for name {}", strValue, name);
+                                value = ' ';
                             }
-                        } catch (NumberFormatException e) {
-                            throw new DeploymentException("Invalid env-entry value for name: " + name, e);
+                        } else if (Boolean.class.equals(typeClass)) {
+                            value = Boolean.valueOf(strValue);
+                        } else if (Byte.class.equals(typeClass)) {
+                            value = Byte.valueOf(strValue);
+                        } else if (Short.class.equals(typeClass)) {
+                            value = Short.valueOf(strValue);
+                        } else if (Integer.class.equals(typeClass)) {
+                            value = Integer.valueOf(strValue);
+                        } else if (Long.class.equals(typeClass)) {
+                            value = Long.valueOf(strValue);
+                        } else if (Float.class.equals(typeClass)) {
+                            value = Float.valueOf(strValue);
+                        } else if (Double.class.equals(typeClass)) {
+                            value = Double.valueOf(strValue);
+                        } else if (Class.class.equals(typeClass)) {
+                            value = new ClassReference(strValue);
+                        } else if (typeClass.isEnum()) {
+                            value = Enum.valueOf(typeClass, strValue);
+                        } else {
+                            throw new DeploymentException("Unrecognized env-entry type: " + type);
                         }
+                    } catch (NumberFormatException e) {
+                        throw new DeploymentException("Invalid env-entry value for name: " + name, e);
                     }
                 }
             }
-            
+
             // perform resource injection only if there is a value specified
             // see Java EE 5 spec, section EE.5.4.1.3
             if (value != null) {
@@ -186,7 +191,7 @@ public class EnvironmentEntryBuilder ext
                 put(name, value, getJndiContextMap(sharedContext));
             }
         }
-        
+
         if (!envEntryMap.isEmpty()) {
             throw new DeploymentException("Unknown env-entry elements in geronimo plan: " + envEntryMap);
         }
@@ -203,6 +208,7 @@ public class EnvironmentEntryBuilder ext
         }
         return envEntryMap;
     }
+
     public QNameSet getSpecQNameSet() {
         return envEntryQNameSet;
     }
@@ -269,7 +275,7 @@ public class EnvironmentEntryBuilder ext
                             // env-entry-type
                             EnvEntryTypeValuesType envEntryType = envEntry.addNewEnvEntryType();
                             envEntryType.setStringValue(resourceType.getCanonicalName());
-                        }                         
+                        }
                         if (method != null || field != null) {
                             // injectionTarget
                             InjectionTargetType injectionTarget = envEntry.addNewInjectionTarget();
@@ -279,7 +285,7 @@ public class EnvironmentEntryBuilder ext
                         //------------------------------------------------------------------------------
                         // <env-entry> optional elements:
                         //------------------------------------------------------------------------------
-                        
+
                         // mappedName
                         String mappdedNameAnnotation = annotation.mappedName();
                         if (!mappdedNameAnnotation.equals("")) {
@@ -310,18 +316,4 @@ public class EnvironmentEntryBuilder ext
         }
     }
 
-    public static final GBeanInfo GBEAN_INFO;
-
-    static {
-        GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(EnvironmentEntryBuilder.class, NameFactory.MODULE_BUILDER);
-        infoBuilder.addAttribute("eeNamespaces", String[].class, true, true);
-        infoBuilder.setConstructor(new String[] {"eeNamespaces"});
-
-        GBEAN_INFO = infoBuilder.getBeanInfo();
-    }
-
-    public static GBeanInfo getGBeanInfo() {
-        return GBEAN_INFO;
-    }
-
 }