You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by ga...@apache.org on 2010/08/15 07:24:06 UTC

svn commit: r985615 - in /openejb/trunk/openejb3/container/openejb-core/src: main/java/org/apache/openejb/assembler/classic/ main/java/org/apache/openejb/config/ main/java/org/apache/openejb/util/ test/java/org/apache/openejb/config/

Author: gawor
Date: Sun Aug 15 05:24:05 2010
New Revision: 985615

URL: http://svn.apache.org/viewvc?rev=985615&view=rev
Log:
infer type from injection information (for env-entries for now)

Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Classes.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/IntrospectionSupport.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/InjectionTest.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java?rev=985615&r1=985614&r2=985615&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java Sun Aug 15 05:24:05 2010
@@ -39,6 +39,8 @@ import org.apache.openejb.core.webservic
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.persistence.JtaEntityManager;
 import org.apache.openejb.persistence.JtaEntityManagerRegistry;
+import org.apache.openejb.util.Classes;
+import org.apache.openejb.util.IntrospectionSupport;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.core.timer.TimerServiceWrapper;
@@ -179,9 +181,9 @@ public class JndiEncBuilder {
                 bindings.put(normalize(entry.referenceName), reference);
                 continue;
             }
-
+            
             try {
-                Class type = Class.forName(entry.type.trim());
+                Class type = Classes.deprimitivize(getType(entry.type, entry));
                 Object obj = null;
                 if (type == String.class)
                     obj = new String(entry.value);
@@ -213,8 +215,6 @@ public class JndiEncBuilder {
                 }
 
                 bindings.put(normalize(entry.referenceName), obj);
-            } catch (ClassNotFoundException e) {
-                throw new IllegalArgumentException("Invalid environment entry type: " + entry.type.trim() + " for entry: " + entry.referenceName, e);
             } catch (NumberFormatException e) {
                 throw new IllegalArgumentException("The env-entry-value for entry " + entry.referenceName + " was not recognizable as type " + entry.type + ". Received Message: " + e.getLocalizedMessage(), e);
             } catch (MalformedURLException e) {
@@ -448,6 +448,32 @@ public class JndiEncBuilder {
         return name;
     }
 
+    private Class getType(String type, InjectableInfo injectable) throws OpenEJBException {
+        if (type != null) {
+            try {
+                return classLoader.loadClass(type.trim());
+            } catch (ClassNotFoundException e) {
+                throw new OpenEJBException("Unable to load type '" + type + "' for " + injectable.referenceName);
+            }
+        }
+        return inferType(injectable);   
+    }
+    
+    private Class inferType(InjectableInfo injectable) throws OpenEJBException {
+        for (InjectionInfo injection : injectable.targets) {
+            try {
+                Class target = classLoader.loadClass(injection.className.trim());
+                Class type = IntrospectionSupport.getPropertyType(target, injection.propertyName.trim());
+                return type;
+            } catch (ClassNotFoundException e) {
+                // ignore
+            } catch (NoSuchFieldException e) {
+                // ignore
+            }
+        }
+        throw new OpenEJBException("Unable to infer type for " + injectable.referenceName);
+    }
+    
     private static class Ref implements EjbResolver.Reference, Serializable {
         private final EjbReferenceInfo info;
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java?rev=985615&r1=985614&r2=985615&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java Sun Aug 15 05:24:05 2010
@@ -332,19 +332,11 @@ public class JndiEncInfoBuilder {
             if (env.getEnvEntryValue() == null && env.getLookupName() == null) {
                 continue;
             }
-              //TODO this is wrong, need to infer type from injections.
-//            if (env.getEnvEntryType() == null){
-//                // TODO: Maybe Move this into the EnvEntry class
-//                env.setEnvEntryType("java.lang.String");
-//            }
             
             EnvEntryInfo info = new EnvEntryInfo();
 
             info.referenceName = env.getEnvEntryName();
             info.type = env.getEnvEntryType();
-            if (info.type == null) {
-                info.type = "java.lang.String";
-            }
             info.value = env.getEnvEntryValue();
             info.location = buildLocationInfo(env);
             info.targets.addAll(buildInjectionInfos(env));

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Classes.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Classes.java?rev=985615&r1=985614&r2=985615&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Classes.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Classes.java Sun Aug 15 05:24:05 2010
@@ -19,6 +19,7 @@ package org.apache.openejb.util;
 import java.util.HashMap;
 import java.util.List;
 import java.util.ArrayList;
+import java.util.Map;
 import java.lang.reflect.Array;
 
 /**
@@ -26,16 +27,27 @@ import java.lang.reflect.Array;
  */
 public class Classes {
 
-    private static final HashMap<String, Class> primitives = new HashMap();
+    private static final Map<Class<?>, Class<?>> primitiveWrappers = new HashMap<Class<?>, Class<?>>();
+    private static final HashMap<String, Class> primitives = new HashMap<String, Class>();
+    
     static {
-        Classes.primitives.put("boolean", boolean.class);
-        Classes.primitives.put("byte", byte.class);
-        Classes.primitives.put("char", char.class);
-        Classes.primitives.put("short", short.class);
-        Classes.primitives.put("int", int.class);
-        Classes.primitives.put("long", long.class);
-        Classes.primitives.put("float", float.class);
-        Classes.primitives.put("double", double.class);
+        primitives.put("boolean", boolean.class);
+        primitives.put("byte", byte.class);
+        primitives.put("char", char.class);
+        primitives.put("short", short.class);
+        primitives.put("int", int.class);
+        primitives.put("long", long.class);
+        primitives.put("float", float.class);
+        primitives.put("double", double.class);
+        
+        primitiveWrappers.put(boolean.class, Boolean.class);
+        primitiveWrappers.put(byte.class, Byte.class);
+        primitiveWrappers.put(char.class, Character.class);
+        primitiveWrappers.put(double.class, Double.class);
+        primitiveWrappers.put(float.class, Float.class);
+        primitiveWrappers.put(int.class, Integer.class);
+        primitiveWrappers.put(long.class, Long.class);
+        primitiveWrappers.put(short.class, Short.class);       
     }
 
     public static Class forName(String string, ClassLoader classLoader) throws ClassNotFoundException {
@@ -76,4 +88,8 @@ public class Classes {
 
         return list;
     }
+    
+    public static Class<?> deprimitivize(Class<?> fieldType) {
+        return fieldType = fieldType.isPrimitive() ? primitiveWrappers.get(fieldType): fieldType;
+    }
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/IntrospectionSupport.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/IntrospectionSupport.java?rev=985615&r1=985614&r2=985615&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/IntrospectionSupport.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/IntrospectionSupport.java Sun Aug 15 05:24:05 2010
@@ -17,6 +17,7 @@
  */
 package org.apache.openejb.util;
 
+import java.beans.Introspector;
 import java.beans.PropertyEditor;
 import java.beans.PropertyEditorManager;
 import java.lang.reflect.Field;
@@ -284,4 +285,28 @@ public class IntrospectionSupport {
         }
 
     }
+    
+    public static Class getPropertyType(Class clazz, String propertyName) throws NoSuchFieldException {
+        do {
+            try {
+                return clazz.getDeclaredField(propertyName).getType();
+            } catch (NoSuchFieldException e) {
+                //look at superclass
+            }
+            for (Method method: clazz.getDeclaredMethods()) {
+                if (method.getReturnType() == void.class && method.getParameterTypes().length == 1) {
+                    String methodName = method.getName();
+                    if (methodName.startsWith("set")) {
+                        String type = Introspector.decapitalize(methodName.substring(3));
+                        if (propertyName.equals(type)) {
+                            return method.getParameterTypes()[0];
+                        }
+                    }
+                }
+            }
+            clazz = clazz.getSuperclass();
+        } while (clazz != null);
+        
+        throw new NoSuchFieldException(propertyName);
+    }
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/InjectionTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/InjectionTest.java?rev=985615&r1=985614&r2=985615&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/InjectionTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/InjectionTest.java Sun Aug 15 05:24:05 2010
@@ -23,6 +23,7 @@ import javax.annotation.Resource;
 import javax.ejb.SessionContext;
 import javax.ejb.Stateless;
 import javax.naming.InitialContext;
+import javax.naming.NamingException;
 
 import junit.framework.TestCase;
 
@@ -34,6 +35,7 @@ import org.apache.openejb.assembler.clas
 import org.apache.openejb.core.ivm.naming.InitContextFactory;
 import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.EnvEntry;
+import org.apache.openejb.jee.InjectionTarget;
 import org.apache.openejb.jee.StatelessBean;
 
 /**
@@ -50,6 +52,7 @@ public class InjectionTest extends TestC
 
         Widget widget = (Widget) object;
 
+        // injected via annotations
         assertEquals("2", widget.getString());
         assertEquals(3.0D, widget.getDouble());
         assertEquals(new Long(4), widget.getLong());
@@ -60,6 +63,10 @@ public class InjectionTest extends TestC
         assertEquals(new Character('9'), widget.getCharacter());
         assertEquals(Widget.class, widget.getMyClass());
         assertEquals(TimeUnit.HOURS, widget.getTimeUnit());
+                
+        // injected via DD
+        assertEquals(true, widget.getInjectedBoolean());
+        assertEquals(true, widget.lookup("injectedBoolean"));
     }
 
     protected void setUp() throws Exception {
@@ -101,6 +108,10 @@ public class InjectionTest extends TestC
         bean.getEnvEntry().add(new EnvEntry(name("myCharacter"), "java.lang.Character", "9"));
         bean.getEnvEntry().add(new EnvEntry(name("myClass"), "java.lang.Class", Widget.class.getName()));
         bean.getEnvEntry().add(new EnvEntry(name("myTimeUnit"), TimeUnit.class.getName(), "HOURS"));
+        
+        EnvEntry entry = new EnvEntry("injectedBoolean", (String) null, "true");
+        entry.getInjectionTarget().add((new InjectionTarget(WidgetBean.class.getName(), "injectedBoolean")));
+        bean.getEnvEntry().add(entry);
 
         assembler.createApplication(config.configureApplication(ejbJar));
     }
@@ -121,6 +132,10 @@ public class InjectionTest extends TestC
         Byte getByte();
         Class getMyClass();
         TimeUnit getTimeUnit();
+        
+        Object lookup(String name) throws NamingException;
+        
+        boolean getInjectedBoolean();
     }
 
     public static interface RemoteWidget extends Widget {
@@ -129,6 +144,8 @@ public class InjectionTest extends TestC
     @Stateless
     public static class WidgetBean implements Widget, RemoteWidget {
 
+        private SessionContext sessionContext;
+        
         @Resource
         private String myString = "1";
 
@@ -162,13 +179,21 @@ public class InjectionTest extends TestC
         @Resource
         private TimeUnit myTimeUnit = TimeUnit.DAYS;
 
+        // injected via DD
+        private boolean injectedBoolean = false;
+        
         public WidgetBean() {           
         }
 
         @Resource
         public void setSessionContext(SessionContext sessionContext) {
+            this.sessionContext = sessionContext;
         }
 
+        public Object lookup(String name) throws NamingException {
+            return sessionContext.lookup(name);
+        }
+        
         public Boolean getBoolean() {
             return myBoolean;
         }
@@ -213,5 +238,8 @@ public class InjectionTest extends TestC
             return myTimeUnit;
         }
 
+        public boolean getInjectedBoolean() {
+            return injectedBoolean;
+        }
     }
 }