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;
+ }
}
}