You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2011/09/18 02:58:11 UTC

svn commit: r1172164 - in /openejb/trunk/openejb3: assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/ assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/ container...

Author: dblevins
Date: Sun Sep 18 00:58:10 2011
New Revision: 1172164

URL: http://svn.apache.org/viewvc?rev=1172164&view=rev
Log:
OPENEJB-1680	Remove <env-entry> items that have no configured value and no 'lookup'
OPENEJB-1679	Guess type for any <env-entry> items with a value and injection points, but no type
OPENEJB-1678	Missing <env-entry> more easily matched
OPENEJB-1677	Tomcat support for @Resource "java:comp/TransactionSynchronizationRegistry" injection/lookup
OPENEJB-1676	Tomcat support for @Resource "java:comp/TransactionManager" injection/lookup
OPENEJB-1675	Tomcat support for @Resource "java:app/AppName" injection/lookup
OPENEJB-1674	Tomcat support for @Resource "java:module/ModuleName" injection/lookup
OPENEJB-1673	Tomcat support for @Resource BeanManger injection/lookup
OPENEJB-1672	Tomcat support for new 'lookup' reference style
OPENEJB-1671	Tomcat support for new Enum EnvEntry type
OPENEJB-1670	Tomcat support for new Class EnvEntry type

Added:
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/EnumFactory.java
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/LookupFactory.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/BuiltInEnvironmentEntries.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CleanEnvEntries.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/BuiltInEnvironmentEntriesTest.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/CleanEnvEntriesTest.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/VagueEnvEntriesMatchTest.java
Modified:
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/OpenEJBNamingResource.java
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/ResourceFactory.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbReferenceInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnvEntryInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InjectableInfo.java
    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/assembler/classic/PersistenceContextReferenceInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceUnitReferenceInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceEnvReferenceInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceReferenceInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceReferenceInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/MergeWebappJndiContext.java
    openejb/trunk/openejb3/tck/cdi-tomee/pom.xml

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/OpenEJBNamingResource.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/OpenEJBNamingResource.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/OpenEJBNamingResource.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/OpenEJBNamingResource.java Sun Sep 18 00:58:10 2011
@@ -15,7 +15,9 @@ public class OpenEJBNamingResource exten
 
     @Override
     public void addEnvironment(ContextEnvironment environment) {
-        normalize(environment);
+        if (environment.getType() == null) {
+            normalize(environment);
+        }
         super.addEnvironment(environment);
     }
 

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java Sun Sep 18 00:58:10 2011
@@ -36,6 +36,7 @@ import org.apache.openejb.OpenEJBExcepti
 import org.apache.openejb.assembler.classic.EjbLocalReferenceInfo;
 import org.apache.openejb.assembler.classic.EjbReferenceInfo;
 import org.apache.openejb.assembler.classic.EnvEntryInfo;
+import org.apache.openejb.assembler.classic.InjectableInfo;
 import org.apache.openejb.assembler.classic.PersistenceContextReferenceInfo;
 import org.apache.openejb.assembler.classic.PersistenceUnitReferenceInfo;
 import org.apache.openejb.assembler.classic.PortRefInfo;
@@ -51,6 +52,8 @@ import org.apache.openejb.persistence.Jt
 import org.apache.openejb.persistence.JtaEntityManagerRegistry;
 import org.apache.openejb.spi.ContainerSystem;
 import org.apache.openejb.tomcat.common.EjbFactory;
+import org.apache.openejb.tomcat.common.EnumFactory;
+import org.apache.openejb.tomcat.common.LookupFactory;
 import org.apache.openejb.tomcat.common.NamingUtil;
 import org.apache.openejb.tomcat.common.PersistenceContextFactory;
 import org.apache.openejb.tomcat.common.PersistenceUnitFactory;
@@ -86,6 +89,7 @@ import static org.apache.openejb.tomcat.
 import static org.apache.openejb.tomcat.common.NamingUtil.NAME;
 import static org.apache.openejb.tomcat.common.NamingUtil.RESOURCE_ID;
 import static org.apache.openejb.tomcat.common.NamingUtil.UNIT;
+import static org.apache.openejb.tomcat.common.EnumFactory.ENUM_VALUE;
 import static org.apache.openejb.tomcat.common.NamingUtil.WSDL_URL;
 import static org.apache.openejb.tomcat.common.NamingUtil.WS_CLASS;
 import static org.apache.openejb.tomcat.common.NamingUtil.WS_ID;
@@ -157,11 +161,10 @@ public class TomcatJndiBuilder {
         for (ServiceReferenceInfo ref : webAppInfo.jndiEnc.serviceRefs) {
             mergeRef(naming, ref);
         }
+
         ContextTransaction contextTransaction = new ContextTransaction();
         contextTransaction.setProperty(Constants.FACTORY, UserTransactionFactory.class.getName());
         naming.setTransaction(contextTransaction);
-
-
     }
 
     public static void mergeJava(StandardContext standardContext) {
@@ -279,6 +282,40 @@ public class TomcatJndiBuilder {
     }
 
     public void mergeRef(NamingResources naming, EnvEntryInfo ref) {
+
+        if ("java.lang.Class".equals(ref.type)) {
+            ContextResourceEnvRef resourceEnv = new ContextResourceEnvRef();
+            resourceEnv.setName(ref.referenceName.replaceAll("^comp/env/", ""));
+            resourceEnv.setProperty(Constants.FACTORY, ResourceFactory.class.getName());
+            resourceEnv.setType(ref.type);
+            resourceEnv.setProperty(RESOURCE_ID, ref.value);
+            resourceEnv.setOverride(false);
+            naming.addResourceEnvRef(resourceEnv);
+
+            return;
+        }
+
+
+        try {
+            final ClassLoader loader = this.standardContext.getLoader().getClassLoader();
+            final Class<?> type = loader.loadClass(ref.type);
+            if (Enum.class.isAssignableFrom(type)) {
+
+                final ContextResourceEnvRef enumRef = new ContextResourceEnvRef();
+                enumRef.setName(ref.referenceName.replaceAll("^comp/env/", ""));
+                enumRef.setProperty(Constants.FACTORY, EnumFactory.class.getName());
+                enumRef.setProperty(ENUM_VALUE, ref.value);
+                enumRef.setType(ref.type);
+                enumRef.setOverride(false);
+                naming.addResourceEnvRef(enumRef);
+
+                return;
+            }
+        } catch (Throwable e) {
+        }
+
+        if (isLookupRef(naming, ref)) return;
+
         ContextEnvironment environment = naming.findEnvironment(ref.referenceName.replaceAll("^comp/env/", ""));
         boolean addEntry = false;
         if (environment == null) {
@@ -289,6 +326,7 @@ public class TomcatJndiBuilder {
 
         environment.setType(ref.type);
         environment.setValue(ref.value);
+        environment.setOverride(false);
 
         if (addEntry) {
             naming.addEnvironment(environment);
@@ -302,7 +340,27 @@ public class TomcatJndiBuilder {
         }
     }
 
+    private boolean isLookupRef(NamingResources naming, InjectableInfo ref) {
+        if (ref.location == null) return false;
+        if (ref.location.jndiName == null) return false;
+        if (!ref.location.jndiName.startsWith("java:")) return false;
+
+        final ContextResourceEnvRef lookup = new ContextResourceEnvRef();
+
+        lookup.setName(ref.referenceName.replaceAll("^comp/env/", ""));
+        lookup.setProperty(Constants.FACTORY, LookupFactory.class.getName());
+        lookup.setProperty(JNDI_NAME, ref.location.jndiName);
+        lookup.setType(Object.class.getName());
+        lookup.setOverride(false);
+
+        naming.addResourceEnvRef(lookup);
+
+        return true;
+    }
+
     public void mergeRef(NamingResources naming, EjbReferenceInfo ref) {
+        if (isLookupRef(naming, ref)) return;
+
         ContextEjb ejb = naming.findEjb(ref.referenceName.replaceAll("^comp/env/", ""));
         boolean addEntry = false;
         if (ejb == null) {
@@ -343,6 +401,8 @@ public class TomcatJndiBuilder {
     }
 
     public void mergeRef(NamingResources naming, EjbLocalReferenceInfo ref) {
+        if (isLookupRef(naming, ref)) return;
+
         // NamingContextListener.addLocalEjb is empty so we'll just use an ejb ref
         ContextEjb ejb = naming.findEjb(ref.referenceName.replaceAll("^comp/env/", ""));
         boolean addEntry = false;
@@ -383,6 +443,8 @@ public class TomcatJndiBuilder {
 
     @SuppressWarnings({"UnusedDeclaration"})
     public void mergeRef(NamingResources naming, PersistenceContextReferenceInfo ref, URI moduleUri) {
+        if (isLookupRef(naming, ref)) return;
+
         ContextResource resource = naming.findResource(ref.referenceName.replaceAll("^comp/env/", ""));
         boolean addEntry = false;
         if (resource == null) {
@@ -435,6 +497,8 @@ public class TomcatJndiBuilder {
 
     @SuppressWarnings({"UnusedDeclaration"})
     public void mergeRef(NamingResources naming, PersistenceUnitReferenceInfo ref, URI moduleUri) {
+        if (isLookupRef(naming, ref)) return;
+
         ContextResource resource = naming.findResource(ref.referenceName.replaceAll("^comp/env/", ""));
         boolean addEntry = false;
         if (resource == null) {
@@ -479,6 +543,8 @@ public class TomcatJndiBuilder {
     }
 
     public void mergeRef(NamingResources naming, ResourceReferenceInfo ref) {
+        if (isLookupRef(naming, ref)) return;
+
         ContextResource resource = naming.findResource(ref.referenceName.replaceAll("^comp/env/", ""));
         boolean addEntry = false;
         if (resource == null) {
@@ -518,6 +584,8 @@ public class TomcatJndiBuilder {
     }
 
     public void mergeRef(NamingResources naming, ResourceEnvReferenceInfo ref) {
+        if (isLookupRef(naming, ref)) return;
+
         ContextResourceEnvRef resourceEnv = naming.findResourceEnvRef(ref.referenceName.replaceAll("^comp/env/", ""));
         boolean addEntry = false;
         if (resourceEnv == null) {
@@ -557,6 +625,8 @@ public class TomcatJndiBuilder {
     }
 
     public void mergeRef(NamingResources naming, ServiceReferenceInfo ref) {
+        if (isLookupRef(naming, ref)) return;
+
         ContextResource resource = naming.findResource(ref.referenceName.replaceAll("^comp/env/", ""));
         boolean addEntry = false;
         if (resource == null) {

Added: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/EnumFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/EnumFactory.java?rev=1172164&view=auto
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/EnumFactory.java (added)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/EnumFactory.java Sun Sep 18 00:58:10 2011
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.tomcat.common;
+
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.Reference;
+import javax.naming.spi.ObjectFactory;
+import java.util.Hashtable;
+
+import static org.apache.openejb.tomcat.common.NamingUtil.getProperty;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class EnumFactory implements ObjectFactory {
+
+    public static final String ENUM_VALUE = "enumValue";
+
+    public Object getObjectInstance(Object object, Name name, Context context, Hashtable environment) throws Exception {
+        if (!(object instanceof Reference)) return null;
+
+        final Reference reference = ((Reference) object);
+
+        final String typeName = reference.getClassName();
+
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+
+        final Class<?> type = loader.loadClass(typeName);
+
+        final String value = getProperty(reference, ENUM_VALUE);
+
+        return Enum.valueOf((Class<Enum>) type, value);
+    }
+
+}

Added: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/LookupFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/LookupFactory.java?rev=1172164&view=auto
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/LookupFactory.java (added)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/LookupFactory.java Sun Sep 18 00:58:10 2011
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.tomcat.common;
+
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.Reference;
+import javax.naming.spi.ObjectFactory;
+import java.util.Hashtable;
+
+import static org.apache.openejb.tomcat.common.NamingUtil.JNDI_NAME;
+import static org.apache.openejb.tomcat.common.NamingUtil.getProperty;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class LookupFactory implements ObjectFactory {
+
+    public Object getObjectInstance(Object object, Name name, Context context, Hashtable environment) throws Exception {
+        if (!(object instanceof Reference)) return null;
+
+        final Reference reference = ((Reference) object);
+
+        String jndiName = getProperty(reference, JNDI_NAME);
+
+        if (jndiName == null) return null;
+
+        jndiName = jndiName.replaceFirst("^java:","");
+
+        return context.lookup(jndiName);
+    }
+
+}

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/ResourceFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/ResourceFactory.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/ResourceFactory.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-common/src/main/java/org/apache/openejb/tomcat/common/ResourceFactory.java Sun Sep 18 00:58:10 2011
@@ -30,11 +30,22 @@ import java.util.Hashtable;
 
 public class ResourceFactory extends AbstractObjectFactory {
     public Object getObjectInstance(Object object, Name name, Context context, Hashtable environment) throws Exception {
-        Reference reference = ((Reference) object);
-        if (reference.getClassName().equals("java.net.URL")) {
-            String resourceId = getProperty(reference, RESOURCE_ID);
+
+        final Reference reference = ((Reference) object);
+
+        final String type = reference.getClassName();
+
+        if ("java.net.URL".equals(type)) {
+            final String resourceId = getProperty(reference, RESOURCE_ID);
             return new URL(resourceId);
         }
+
+        if ("java.lang.Class".equals(type)) {
+            final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+            final String resourceId = getProperty(reference, RESOURCE_ID);
+            return loader.loadClass(resourceId);
+        }
+
         return super.getObjectInstance(object, name, context, environment);
     }
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Sun Sep 18 00:58:10 2011
@@ -722,6 +722,8 @@ public class Assembler extends Assembler
 
             ensureWebBeansContext(appContext);
 
+            appJndiContext.bind("app/BeanManager", appContext.getBeanManager());
+
             // now that everything is configured, deploy to the container
             if (start) {
                 // deploy

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbReferenceInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbReferenceInfo.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbReferenceInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbReferenceInfo.java Sun Sep 18 00:58:10 2011
@@ -25,6 +25,5 @@ public class EjbReferenceInfo extends In
     public boolean externalReference;
     public String link;
 
-    public ReferenceLocationInfo location;
     public boolean localbean;
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnvEntryInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnvEntryInfo.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnvEntryInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnvEntryInfo.java Sun Sep 18 00:58:10 2011
@@ -21,5 +21,4 @@ public class EnvEntryInfo extends Inject
     public String type;
     public String value;
 
-    public ReferenceLocationInfo location;
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InjectableInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InjectableInfo.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InjectableInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InjectableInfo.java Sun Sep 18 00:58:10 2011
@@ -25,4 +25,6 @@ import java.util.ArrayList;
 public class InjectableInfo extends InfoObject {
     public final List<InjectionInfo> targets = new ArrayList<InjectionInfo>();
     public String referenceName;
+
+    public ReferenceLocationInfo location;
 }

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=1172164&r1=1172163&r2=1172164&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 Sep 18 00:58:10 2011
@@ -51,6 +51,7 @@ import javax.annotation.ManagedBean;
 import javax.ejb.EJBContext;
 import javax.ejb.TimerService;
 import javax.ejb.spi.HandleDelegate;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.naming.Context;
 import javax.naming.LinkRef;
 import javax.naming.Name;
@@ -302,12 +303,15 @@ public class JndiEncBuilder {
                 continue;
             }
 
-            Class<?> type = getType(referenceInfo.resourceEnvRefType, referenceInfo);
+            final Class<?> type = getType(referenceInfo.resourceEnvRefType, referenceInfo);
+            final Object reference;
 
-            Object reference;
             if (EJBContext.class.isAssignableFrom(type)) {
                 String jndiName = "comp/EJBContext";
                 reference = new LinkRef(jndiName);
+
+                // Let the container bind this into JNDI
+                if (jndiName.equals(referenceInfo.referenceName)) continue;
             } else if (Validator.class.equals(type)) {
                 String jndiName = "comp/Validator";
                 reference = new LinkRef(jndiName);
@@ -320,6 +324,12 @@ public class JndiEncBuilder {
             } else if (TimerService.class.equals(type)) {
                 String jndiName = "comp/TimerService";
                 reference = new LinkRef(jndiName);
+
+                // TODO Bind the BeanManager
+            } else if (BeanManager.class.equals(type)) {
+                String jndiName = "app/BeanManager";
+                reference = new LinkRef(jndiName);
+
             } else if (UserTransaction.class.equals(type)) {
                 reference = new IntraVmJndiReference("comp/UserTransaction");
             } else if (referenceInfo.resourceID != null) {
@@ -491,9 +501,9 @@ public class JndiEncBuilder {
     }
 
     private void addSpecialModuleBindings(Map<String, Object> bindings) {
-        if (moduleId != null) {
-            bindings.put("module/ModuleName", moduleId);
-        }
+//        if (moduleId != null) {
+//            bindings.put("module/ModuleName", moduleId);
+//        }
         // ensure the bindings will be non-empty
         if (bindings.isEmpty()) {
             bindings.put("module/dummy", "dummy");
@@ -501,9 +511,9 @@ public class JndiEncBuilder {
     }
 
     private void addSpecialAppBindings(Map<String, Object> bindings) {
-        if (moduleId != null) {
-            bindings.put("app/AppName", moduleId);
-        }
+//        if (moduleId != null) {
+//            bindings.put("app/AppName", moduleId);
+//        }
         // ensure the bindings will be non-empty
         if (bindings.isEmpty()) {
             bindings.put("app/dummy", "dummy");

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceContextReferenceInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceContextReferenceInfo.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceContextReferenceInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceContextReferenceInfo.java Sun Sep 18 00:58:10 2011
@@ -27,5 +27,4 @@ public class PersistenceContextReference
     public boolean extended;
     public final Properties properties = new Properties();
 
-    public ReferenceLocationInfo location;
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceUnitReferenceInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceUnitReferenceInfo.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceUnitReferenceInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceUnitReferenceInfo.java Sun Sep 18 00:58:10 2011
@@ -23,5 +23,4 @@ public class PersistenceUnitReferenceInf
     public String persistenceUnitName;
     public String unitId;
 
-    public ReferenceLocationInfo location;
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceEnvReferenceInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceEnvReferenceInfo.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceEnvReferenceInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceEnvReferenceInfo.java Sun Sep 18 00:58:10 2011
@@ -21,5 +21,4 @@ public class ResourceEnvReferenceInfo ex
     public String mappedName;
     public String resourceID;
 
-    public ReferenceLocationInfo location;
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceReferenceInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceReferenceInfo.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceReferenceInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceReferenceInfo.java Sun Sep 18 00:58:10 2011
@@ -23,5 +23,4 @@ public class ResourceReferenceInfo exten
     public String resourceID;
     public java.util.Properties properties;
 
-    public ReferenceLocationInfo location;
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceReferenceInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceReferenceInfo.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceReferenceInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceReferenceInfo.java Sun Sep 18 00:58:10 2011
@@ -38,5 +38,4 @@ public class ServiceReferenceInfo extend
     public final List<HandlerChainInfo> handlerChains = new ArrayList<HandlerChainInfo>();
     public final List<PortRefInfo> portRefs =new ArrayList<PortRefInfo>();
     
-    public ReferenceLocationInfo location;
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Sun Sep 18 00:58:10 2011
@@ -170,6 +170,7 @@ import javax.ejb.TransactionAttributeTyp
 import javax.ejb.TransactionManagement;
 import javax.ejb.TransactionManagementType;
 import javax.enterprise.inject.Specializes;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.Extension;
 import javax.interceptor.ExcludeClassInterceptors;
 import javax.interceptor.ExcludeDefaultInterceptors;
@@ -243,6 +244,7 @@ public class AnnotationDeployer implemen
             "javax.jms.Topic",
             "javax.xml.ws.WebServiceContext",
             "javax.ejb.TimerService",
+            "javax.enterprise.inject.spi.BeanManager",
             "javax.validation.Validator",
             "javax.validation.ValidatorFactory"
     ));
@@ -264,12 +266,16 @@ public class AnnotationDeployer implemen
     private final ProcessAnnotatedBeans processAnnotatedBeans;
     private final EnvEntriesPropertiesDeployer envEntriesPropertiesDeployer;
     private final MBeanDeployer mBeanDeployer;
+    private final BuiltInEnvironmentEntries builtInEnvironmentEntries;
+    private final MergeWebappJndiContext mergeWebappJndiContext;
 
     public AnnotationDeployer() {
         discoverAnnotatedBeans = new DiscoverAnnotatedBeans();
         processAnnotatedBeans = new ProcessAnnotatedBeans();
+        builtInEnvironmentEntries = new BuiltInEnvironmentEntries();
         envEntriesPropertiesDeployer = new EnvEntriesPropertiesDeployer();
         mBeanDeployer = new MBeanDeployer();
+        mergeWebappJndiContext = new MergeWebappJndiContext();
     }
 
     public AppModule deploy(AppModule appModule) throws OpenEJBException {
@@ -277,7 +283,10 @@ public class AnnotationDeployer implemen
         try {
             appModule = discoverAnnotatedBeans.deploy(appModule);
             appModule = envEntriesPropertiesDeployer.deploy(appModule);
+            appModule = mergeWebappJndiContext.deploy(appModule);
+            appModule = builtInEnvironmentEntries.deploy(appModule);
             appModule = processAnnotatedBeans.deploy(appModule);
+            appModule = mergeWebappJndiContext.deploy(appModule);
             appModule = mBeanDeployer.deploy(appModule);
             return appModule;
         } finally {
@@ -3613,10 +3622,17 @@ public class AnnotationDeployer implemen
                         consumer.getEnvEntry().add(envEntry);
                         reference = envEntry;
                     } else {
-                        EnvEntry envEntry = new EnvEntry();
-                        envEntry.setName(refName);
-                        consumer.getEnvEntry().add(envEntry);
-                        reference = envEntry;
+
+                        final String shortName = normalize(member.getName());
+                        reference = consumer.getEnvEntryMap().get(shortName);
+
+                        if (reference == null) {
+                            EnvEntry envEntry = new EnvEntry();
+                            envEntry.setName(refName);
+                            consumer.getEnvEntry().add(envEntry);
+                            reference = envEntry;
+                        }
+
 //                        /*
 //                         * Can't add env-entry since @Resource.lookup is not set and it is NOT in a shareable JNDI name space
 //                         */
@@ -3657,6 +3673,10 @@ public class AnnotationDeployer implemen
                 }
             }
 
+            if (reference.getType() == null && member != null) {
+                reference.setType(member.getType().getName());
+            }
+
             /*
              * Fill in the injection information <injection-target>
              */

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Sun Sep 18 00:58:10 2011
@@ -16,7 +16,12 @@
  */
 package org.apache.openejb.config;
 
+import javax.ejb.TimerService;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.sql.DataSource;
+import javax.transaction.TransactionManager;
+import javax.transaction.TransactionSynchronizationRegistry;
+import javax.transaction.UserTransaction;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Request;
@@ -102,11 +107,15 @@ public class AutoConfig implements Dynam
         // URLs are automatically handled
         ignoredReferenceTypes.add("java.net.URL");
         // User transaction is automatically handled
-        ignoredReferenceTypes.add("javax.transaction.UserTransaction");
-        ignoredReferenceTypes.add("javax.ejb.TimerService");
+        ignoredReferenceTypes.add(UserTransaction.class.getName());
+        ignoredReferenceTypes.add(TransactionManager.class.getName());
+        ignoredReferenceTypes.add(TransactionSynchronizationRegistry.class.getName());
+        ignoredReferenceTypes.add(TimerService.class.getName());
         // Bean Validation is automatically handled
         ignoredReferenceTypes.add(Validator.class.getName());
         ignoredReferenceTypes.add(ValidatorFactory.class.getName());
+        // CDI BeanManager is handled
+        ignoredReferenceTypes.add(BeanManager.class.getName());
         // REST injections done via @Context and bound into a resource env...
         ignoredReferenceTypes.add(Request.class.getName());
         ignoredReferenceTypes.add(UriInfo.class.getName());

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/BuiltInEnvironmentEntries.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/BuiltInEnvironmentEntries.java?rev=1172164&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/BuiltInEnvironmentEntries.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/BuiltInEnvironmentEntries.java Sun Sep 18 00:58:10 2011
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.config;
+
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.EnterpriseBean;
+import org.apache.openejb.jee.EnvEntry;
+import org.apache.openejb.jee.JndiConsumer;
+import org.apache.openejb.jee.JndiReference;
+import org.apache.openejb.jee.ResourceEnvRef;
+
+import javax.enterprise.inject.spi.BeanManager;
+import java.util.Map;
+
+/**
+ */
+public class BuiltInEnvironmentEntries implements DynamicDeployer {
+
+    public AppModule deploy(AppModule appModule) throws OpenEJBException {
+
+        for (ClientModule module : appModule.getClientModules()) {
+            final JndiConsumer consumer = module.getApplicationClient();
+            if (consumer == null) continue;
+
+            add(consumer, module, appModule);
+        }
+
+        for (WebModule module : appModule.getWebModules()) {
+            final JndiConsumer consumer = module.getWebApp();
+            if (consumer == null) continue;
+
+            add(consumer, module, appModule);
+        }
+
+        for (EjbModule module : appModule.getEjbModules()) {
+            final EjbJar ejbJar = module.getEjbJar();
+            if (ejbJar == null) continue;
+
+            for (EnterpriseBean consumer : ejbJar.getEnterpriseBeans()) {
+                add(consumer, module, appModule);
+            }
+        }
+
+        return appModule;
+    }
+
+    private void add(JndiConsumer jndi, DeploymentModule module, DeploymentModule app) {
+
+        // Standard names
+        add(jndi.getEnvEntryMap(), new EnvEntry().name("java:module/ModuleName").value(module.getModuleId()).type(String.class));
+        add(jndi.getEnvEntryMap(), new EnvEntry().name("java:app/AppName").value(app.getModuleId()).type(String.class));
+
+        // Standard References to built-in objects
+        add(jndi.getResourceEnvRefMap(), new ResourceEnvRef().name("java:comp/BeanManager").type(BeanManager.class));
+        add(jndi.getResourceEnvRefMap(), new ResourceEnvRef().name("java:comp/Validator").type(javax.validation.Validator.class));
+        add(jndi.getResourceEnvRefMap(), new ResourceEnvRef().name("java:comp/ValidatorFactory").type(javax.validation.ValidatorFactory.class));
+        add(jndi.getResourceEnvRefMap(), new ResourceEnvRef().name("java:comp/TransactionManager").type(javax.transaction.TransactionManager.class));
+        add(jndi.getResourceEnvRefMap(), new ResourceEnvRef().name("java:comp/TransactionSynchronizationRegistry").type(javax.transaction.TransactionSynchronizationRegistry.class));
+
+
+        // OpenEJB specific feature
+        add(jndi.getEnvEntryMap(), new EnvEntry().name("java:comp/ComponentName").value(jndi.getJndiConsumerName()).type(String.class));
+
+    }
+
+    private <E extends JndiReference> void add(Map<String, E> map, E entry) {
+        final E existing = map.get(entry.getKey());
+
+        map.put(entry.getKey(), entry);
+
+        if (existing != null) {
+            entry.getInjectionTarget().addAll(existing.getInjectionTarget());
+        }
+    }
+}

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CleanEnvEntries.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CleanEnvEntries.java?rev=1172164&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CleanEnvEntries.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CleanEnvEntries.java Sun Sep 18 00:58:10 2011
@@ -0,0 +1,222 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.config;
+
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.EnterpriseBean;
+import org.apache.openejb.jee.EnvEntry;
+import org.apache.openejb.jee.InjectionTarget;
+import org.apache.openejb.jee.JndiConsumer;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class CleanEnvEntries implements DynamicDeployer {
+
+    @Override
+    public AppModule deploy(AppModule appModule) throws OpenEJBException {
+
+        // Any EnvEntry types missing the <value> and having no <lookup> should be removed
+        appModule = removeUnsetEnvEntries(appModule);
+
+        // Any EnvEntry types having the <value> but missing the type should have the type implied
+        // based on the injection points
+        appModule = fillInMissingType(appModule);
+
+        return appModule;
+    }
+
+    public AppModule removeUnsetEnvEntries(AppModule appModule) throws OpenEJBException {
+
+        for (ClientModule module : appModule.getClientModules()) {
+            final JndiConsumer consumer = module.getApplicationClient();
+            if (consumer == null) continue;
+
+            removeUnsetEnvEntries(consumer);
+        }
+
+        for (WebModule module : appModule.getWebModules()) {
+            final JndiConsumer consumer = module.getWebApp();
+            if (consumer == null) continue;
+
+            removeUnsetEnvEntries(consumer);
+        }
+
+        for (EjbModule module : appModule.getEjbModules()) {
+            final EjbJar ejbJar = module.getEjbJar();
+            if (ejbJar == null) continue;
+
+            for (EnterpriseBean consumer : ejbJar.getEnterpriseBeans()) {
+                removeUnsetEnvEntries(consumer);
+            }
+        }
+
+        return appModule;
+    }
+
+    private void removeUnsetEnvEntries(JndiConsumer consumer) {
+        final Iterator<EnvEntry> entries = consumer.getEnvEntry().iterator();
+        while (entries.hasNext()) {
+            final EnvEntry entry = entries.next();
+            if (entry.getEnvEntryValue() != null) continue;
+            if (entry.getLookupName() != null) continue;
+
+            entries.remove();
+        }
+    }
+
+
+    public AppModule fillInMissingType(AppModule appModule) throws OpenEJBException {
+
+        for (ClientModule module : appModule.getClientModules()) {
+            final JndiConsumer consumer = module.getApplicationClient();
+            if (consumer == null) continue;
+
+            fillInMissingType(consumer, module);
+        }
+
+        for (WebModule module : appModule.getWebModules()) {
+            final JndiConsumer consumer = module.getWebApp();
+            if (consumer == null) continue;
+
+            fillInMissingType(consumer, module);
+        }
+
+        for (EjbModule module : appModule.getEjbModules()) {
+            final EjbJar ejbJar = module.getEjbJar();
+            if (ejbJar == null) continue;
+
+            for (EnterpriseBean consumer : ejbJar.getEnterpriseBeans()) {
+                fillInMissingType(consumer, module);
+            }
+        }
+
+        return appModule;
+    }
+
+    private void fillInMissingType(JndiConsumer consumer, DeploymentModule module) {
+        final ClassLoader loader = module.getClassLoader();
+
+        for (EnvEntry entry : consumer.getEnvEntry()) {
+            fillInMissingType(loader, entry);
+        }
+
+    }
+
+    private void fillInMissingType(ClassLoader loader, EnvEntry entry) {
+        if (entry.getType() != null) return;
+
+        // If it has the lookup supplied we don't care if there is no type
+        if (entry.getLookupName() != null) return;
+
+        // We can't imply type without at least one injection point
+        if (entry.getInjectionTarget().size() == 0) return;
+
+        final Set<Class> types = new HashSet<Class>();
+
+        for (InjectionTarget target : entry.getInjectionTarget()) {
+            if (target.getInjectionTargetClass() == null) continue;
+            if (target.getInjectionTargetName() == null) continue;
+
+            types.add(getType(loader, target));
+        }
+
+        normalize(types);
+
+        final Class<?> type = (types.size() == 1) ? types.iterator().next() : String.class;
+
+        entry.setType(type.getName());
+    }
+
+    private void normalize(Set<Class> types) {
+        types.remove(Object.class);
+
+        if (types.contains(int.class)) {
+            types.remove(int.class);
+            types.add(Integer.class);
+        }
+
+        if (types.contains(char.class)) {
+            types.remove(char.class);
+            types.add(Character.class);
+        }
+
+        if (types.contains(short.class)) {
+            types.remove(short.class);
+            types.add(Short.class);
+        }
+
+        if (types.contains(long.class)) {
+            types.remove(long.class);
+            types.add(Long.class);
+        }
+
+        if (types.contains(float.class)) {
+            types.remove(float.class);
+            types.add(Float.class);
+        }
+
+        if (types.contains(double.class)) {
+            types.remove(double.class);
+            types.add(Double.class);
+        }
+
+        if (types.contains(boolean.class)) {
+            types.remove(boolean.class);
+            types.add(Boolean.class);
+        }
+
+        if (types.contains(byte.class)) {
+            types.remove(byte.class);
+            types.add(Byte.class);
+        }
+
+    }
+
+    private Class<?> getType(ClassLoader loader, InjectionTarget target) {
+        try {
+            final Class<?> clazz = loader.loadClass(target.getInjectionTargetClass());
+
+            try {
+                final Field field = clazz.getDeclaredField(target.getInjectionTargetName());
+                return field.getType();
+            } catch (NoSuchFieldException e) {
+            }
+
+            // TODO Technically we should match by case
+            final String name = "set" + target.getInjectionTargetName().toLowerCase();
+            for (Method method : clazz.getDeclaredMethods()) {
+                if (method.getParameterTypes().length == 1 && method.getName().toLowerCase().equals(name)) {
+                    return method.getParameterTypes()[0];
+                }
+            }
+
+        } catch (Throwable e) {
+        }
+
+        return Object.class;
+    }
+
+
+}

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Sun Sep 18 00:58:10 2011
@@ -187,6 +187,7 @@ public class ConfigurationFactory implem
         }
 
         chain.add(new ConvertDataSourceDefinitions());
+        chain.add(new CleanEnvEntries());
 
         if (offline) {
             AutoConfig autoConfig = new AutoConfig(this);
@@ -202,7 +203,7 @@ public class ConfigurationFactory implem
         chain.add(new ActivationConfigPropertyOverride());
         chain.add(new OutputGeneratedDescriptors());
 
-        chain.add(new MergeWebappJndiContext());
+//        chain.add(new MergeWebappJndiContext());
         this.deployer = chain;
     }
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/MergeWebappJndiContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/MergeWebappJndiContext.java?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/MergeWebappJndiContext.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/MergeWebappJndiContext.java Sun Sep 18 00:58:10 2011
@@ -20,6 +20,7 @@ import org.apache.openejb.OpenEJBExcepti
 import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.EnterpriseBean;
 import org.apache.openejb.jee.EnvEntry;
+import org.apache.openejb.jee.InjectionTarget;
 import org.apache.openejb.jee.JndiConsumer;
 import org.apache.openejb.jee.JndiReference;
 import org.apache.openejb.jee.ResourceEnvRef;
@@ -27,10 +28,17 @@ import org.apache.openejb.jee.ResourceEn
 import javax.ejb.EJBContext;
 import javax.ejb.MessageDrivenContext;
 import javax.ejb.SessionContext;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.Iterator;
 import java.util.Map;
 
 /**
+ * In a webapp all ejbs will share the JNDI namespace of the servlets
+ * This means no private namespace for each EJB.
+ *
+ * To make this happen we merge the JNDI entries of each ejb into
+ *
  * @version $Rev$ $Date$
  */
 public class MergeWebappJndiContext implements DynamicDeployer {
@@ -128,6 +136,10 @@ public class MergeWebappJndiContext impl
                 if (eb.getEnvEntryValue() == null) {
                     eb.setEnvEntryValue(ea.getEnvEntryValue());
                 }
+
+                if (eb.getEnvEntryType() == null) {
+                    eb.setEnvEntryType(ea.getEnvEntryType());
+                }
             }
         }
     }
@@ -151,8 +163,4 @@ public class MergeWebappJndiContext impl
         }
         return invalid;
     }
-
-    private void yank(ResourceEnvRef ref, Class<EJBContext> ejbContextClass, Class<SessionContext> sessionContextClass, Class<MessageDrivenContext> messageDrivenContextClass) {
-    }
-
 }

Added: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/BuiltInEnvironmentEntriesTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/BuiltInEnvironmentEntriesTest.java?rev=1172164&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/BuiltInEnvironmentEntriesTest.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/BuiltInEnvironmentEntriesTest.java Sun Sep 18 00:58:10 2011
@@ -0,0 +1,109 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.config;
+
+import org.apache.openejb.jee.SingletonBean;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.junit.Module;
+import org.apache.openejb.util.SetAccessible;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import javax.ejb.EJBContext;
+import javax.ejb.Singleton;
+import javax.ejb.TransactionManagement;
+import javax.ejb.TransactionManagementType;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.transaction.TransactionManager;
+import javax.transaction.TransactionSynchronizationRegistry;
+import javax.transaction.UserTransaction;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import java.lang.reflect.Field;
+
+/**
+ * @version $Rev$ $Date$
+ */
+@RunWith(ApplicationComposer.class)
+public class BuiltInEnvironmentEntriesTest {
+
+    @EJB
+    private Blue blue;
+
+    @Module
+    public SingletonBean fantastic() {
+        return new SingletonBean(Blue.class);
+    }
+
+    @Test
+    public void test() throws Exception {
+        blue.test();
+    }
+
+    @Singleton
+    @TransactionManagement(value = TransactionManagementType.BEAN)
+    public static class Blue {
+
+        @Resource(name = "java:comp/EJBContext")
+        private EJBContext ejbContext;
+
+        @Resource(name = "java:comp/Validator")
+        private Validator validator;
+
+        @Resource(name = "java:comp/ValidatorFactory")
+        private ValidatorFactory validatorFactory;
+
+        @Resource(name = "java:comp/TransactionManager")
+        private TransactionManager transactionManager;
+
+        @Resource(name = "java:comp/TransactionSynchronizationRegistry")
+        private TransactionSynchronizationRegistry transactionSynchronizationRegistry;
+
+        @Resource(name = "java:comp/UserTransaction")
+        private UserTransaction userTransaction;
+
+        @Resource(name = "java:comp/BeanManager")
+        private BeanManager beanManager;
+
+        @Resource(name = "java:app/AppName")
+        private String app;
+
+        @Resource(name = "java:module/ModuleName")
+        private String module;
+
+        @Resource(name = "java:comp/ComponentName")
+        private String component;
+
+        public void test() throws Exception {
+
+            final Field[] fields = this.getClass().getDeclaredFields();
+
+            for (Field field : fields) {
+                SetAccessible.on(field);
+                Assert.assertNotNull(field.getName(), field.get(this));
+            }
+
+            Assert.assertEquals("app", "BuiltInEnvironmentEntriesTest", app);
+            Assert.assertEquals("module", module, "fantastic");
+            Assert.assertEquals("component", component, "Blue");
+        }
+
+    }
+}

Added: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/CleanEnvEntriesTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/CleanEnvEntriesTest.java?rev=1172164&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/CleanEnvEntriesTest.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/CleanEnvEntriesTest.java Sun Sep 18 00:58:10 2011
@@ -0,0 +1,132 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.config;
+
+import junit.framework.TestCase;
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.EjbJarInfo;
+import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
+import org.apache.openejb.assembler.classic.EnvEntryInfo;
+import org.apache.openejb.assembler.classic.JndiEncInfo;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.EnvEntry;
+import org.apache.openejb.jee.SingletonBean;
+import org.apache.openejb.util.SetAccessible;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.annotation.Resource;
+import javax.ejb.EJBContext;
+import javax.ejb.Singleton;
+import javax.ejb.TransactionManagement;
+import javax.ejb.TransactionManagementType;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.transaction.TransactionManager;
+import javax.transaction.TransactionSynchronizationRegistry;
+import javax.transaction.UserTransaction;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class CleanEnvEntriesTest extends TestCase {
+
+    @Test
+    public void test() throws Exception {
+
+        final Assembler assembler = new Assembler();
+        final ConfigurationFactory factory = new ConfigurationFactory();
+
+        final SingletonBean singletonBean = new SingletonBean(Blue.class);
+        // keep
+
+        singletonBean.getEnvEntry().add(new EnvEntry()
+                .name("message")
+                .type(String.class)
+                .value("hello")
+                .injectionTarget(Blue.class, "message")
+        );
+
+        // remove
+        singletonBean.getEnvEntry().add(new EnvEntry().name("novalue1").type(String.class));
+        singletonBean.getEnvEntry().add(new EnvEntry().name("novalue2"));
+
+        // fill in type
+        singletonBean.getEnvEntry().add(new EnvEntry().name("value-but-no-type1").value("10")
+                .injectionTarget(Blue.class, "number")
+                .injectionTarget(Orange.class, "number") // attempt to confuse the type
+        );
+
+        singletonBean.getEnvEntry().add(new EnvEntry().name("value-but-no-type2").value("D")
+                .injectionTarget(Blue.class, "letter"))
+        ;
+
+        singletonBean.getEnvEntry().add(new EnvEntry().name("value-but-no-type3").value("2")
+                .injectionTarget(Blue.class, "vague")    // short
+                .injectionTarget(Orange.class, "vague")  // character
+        );
+
+        final EjbJar ejbJar = new EjbJar();
+        ejbJar.addEnterpriseBean(singletonBean);
+        final EjbJarInfo ejbJarInfo = factory.configureApplication(ejbJar);
+
+        final Map<String, EnvEntryInfo> entries = map(ejbJarInfo.enterpriseBeans.get(0).jndiEnc.envEntries);
+
+        assertNotNull(entries.get("comp/env/control"));
+        assertNotNull(entries.get("comp/env/value-but-no-type1"));
+        assertNotNull(entries.get("comp/env/value-but-no-type2"));
+
+        assertNull(entries.get("comp/env/novalue1"));
+        assertNull(entries.get("comp/env/novalue2"));
+
+        assertEquals(Integer.class.getName(), entries.get("comp/env/value-but-no-type1").type);
+        assertEquals(Character.class.getName(), entries.get("comp/env/value-but-no-type2").type);
+        assertEquals(String.class.getName(), entries.get("comp/env/value-but-no-type3").type);
+    }
+
+    private Map<String, EnvEntryInfo> map(List<EnvEntryInfo> envEntries) {
+        Map<String, EnvEntryInfo> map = new HashMap<String, EnvEntryInfo>();
+        for (EnvEntryInfo entry : envEntries) {
+            map.put(entry.referenceName, entry);
+        }
+        return map;
+    }
+
+
+    public static class Blue {
+        private Character letter;
+        private Short vague;
+
+        public void setNumber(int number) {
+        }
+
+        // False positive if case is not considered
+        public void setNumBer(long number) {
+        }
+    }
+
+    public static class Orange {
+        private Object letter;
+        private Character vague;
+
+    }
+}

Added: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/VagueEnvEntriesMatchTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/VagueEnvEntriesMatchTest.java?rev=1172164&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/VagueEnvEntriesMatchTest.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/VagueEnvEntriesMatchTest.java Sun Sep 18 00:58:10 2011
@@ -0,0 +1,83 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.config;
+
+import junit.framework.TestCase;
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.EjbJarInfo;
+import org.apache.openejb.assembler.classic.EnvEntryInfo;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.EnvEntry;
+import org.apache.openejb.jee.SingletonBean;
+import org.apache.openejb.junit.*;
+import org.apache.openejb.junit.Module;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+@RunWith(ApplicationComposer.class)
+public class VagueEnvEntriesMatchTest extends TestCase {
+
+    @EJB
+    public Blue blue;
+
+    @Module
+    public SingletonBean foo() {
+
+        final SingletonBean singletonBean = new SingletonBean(Blue.class);
+
+        singletonBean.getEnvEntry().add(new EnvEntry().name("one").type(String.class).value("hello"));
+        singletonBean.getEnvEntry().add(new EnvEntry().name("two").type(String.class).value("false"));
+        singletonBean.getEnvEntry().add(new EnvEntry().name(Blue.class.getName() + "/two").type(String.class).value("true"));
+
+        return singletonBean;
+    }
+
+    @Test
+    public void test() {
+
+        assertEquals("hello", blue.getOne());
+        assertEquals("true", blue.getTwo());
+    }
+
+
+    public static class Blue {
+
+        @Resource
+        private String one;
+
+        @Resource
+        private String two;
+
+        public String getOne() {
+            return one;
+        }
+
+        public String getTwo() {
+            return two;
+        }
+    }
+
+}

Modified: openejb/trunk/openejb3/tck/cdi-tomee/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/tck/cdi-tomee/pom.xml?rev=1172164&r1=1172163&r2=1172164&view=diff
==============================================================================
--- openejb/trunk/openejb3/tck/cdi-tomee/pom.xml (original)
+++ openejb/trunk/openejb3/tck/cdi-tomee/pom.xml Sun Sep 18 00:58:10 2011
@@ -183,7 +183,6 @@
           </execution>
         </executions>
       </plugin>
-
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-failsafe-plugin</artifactId>