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