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/20 14:22:27 UTC

svn commit: r1173108 - in /openejb/trunk/openejb3: assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/ assembly/openejb-tomcat/tomee-embedded/ container/openejb-core/src/main/java/org/apache/openejb/ contai...

Author: dblevins
Date: Tue Sep 20 12:22:27 2011
New Revision: 1173108

URL: http://svn.apache.org/viewvc?rev=1173108&view=rev
Log:
For any EjbModules that have CDI enabled, create a 'Comp' ManagedMean to hold all the java:comp level bindings created by CDI beans
 Allows for a consistent "shared module" scope feel for CDI even when in or out of the embedded container or a webapp
 As well injection and lookup can now more accurately take place against this larger namespace (as a fallback)
 A bunch of the old code still pending delete

Better scanning for META-INF/beans.xml files. 
Stronger error detection for LinkageErrorProtection

Modified:
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/LinkageErrorProtection.java
    openejb/trunk/openejb3/assembly/openejb-tomcat/tomee-embedded/pom.xml
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.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/cdi/CdiResourceInjectionService.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.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/DeploymentLoader.java
    openejb/trunk/openejb3/tck/cdi-tomee-embedded/src/test/resources/passing.xml
    openejb/trunk/openejb3/tck/cdi-tomee/src/test/resources/passing.xml

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/LinkageErrorProtection.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/LinkageErrorProtection.java?rev=1173108&r1=1173107&r2=1173108&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/LinkageErrorProtection.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/LinkageErrorProtection.java Tue Sep 20 12:22:27 2011
@@ -89,9 +89,12 @@ public class LinkageErrorProtection {
             };
 
             for (String className : classNames) {
-                load(className, standardContext);
+                try {
+                    load(className, standardContext);
+                } catch (Throwable e) {
+                }
             }
-        } catch (Exception e) {
+        } catch (Throwable e) {
             // not critical, this is only to avoid possible jsp LinkageError in Oracle JDK 1.6
         }
     }
@@ -101,6 +104,7 @@ public class LinkageErrorProtection {
         try {
             classLoader.loadClass(className);
         } catch (ClassNotFoundException e) {
+        } catch (LinkageError e) {
             try {
                 classLoader.loadClass(className);
             } catch (ClassNotFoundException e2) {

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/tomee-embedded/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/tomee-embedded/pom.xml?rev=1173108&r1=1173107&r2=1173108&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/tomee-embedded/pom.xml (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/tomee-embedded/pom.xml Tue Sep 20 12:22:27 2011
@@ -75,39 +75,53 @@
     <dependency>
       <groupId>org.apache.openwebbeans</groupId>
       <artifactId>openwebbeans-jsf</artifactId>
+      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.myfaces.core</groupId>
       <artifactId>myfaces-impl</artifactId>
       <version>2.1.2</version>
+      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.myfaces.core</groupId>
       <artifactId>myfaces-api</artifactId>
       <version>2.1.2</version>
+      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>jstl</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
+      <scope>compile</scope>
     </dependency>
 
     <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-catalina</artifactId>
       <version>${tomcat.version}</version>
+      <scope>compile</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.tomcat</groupId>
+      <artifactId>tomcat-catalina-ha</artifactId>
+      <version>${tomcat.version}</version>
+      <scope>compile</scope>
     </dependency>
 
     <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-coyote</artifactId>
        <version>${tomcat.version}</version>
+       <scope>compile</scope>
     </dependency>
 
     <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper</artifactId>
        <version>${tomcat.version}</version>
+      <scope>compile</scope>
        <exclusions>
          <exclusion>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
@@ -142,11 +156,13 @@
       <artifactId>ecj</artifactId>
       <version>3.5.1</version>
       <type>jar</type>
+      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.openejb</groupId>
       <artifactId>javaee-api</artifactId>
       <version>6.0-1</version>
+      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.velocity</groupId>

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1173108&r1=1173107&r2=1173108&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java Tue Sep 20 12:22:27 2011
@@ -48,6 +48,7 @@ import org.apache.webbeans.context.creat
 import org.apache.webbeans.inject.AbstractInjectable;
 import org.apache.xbean.recipe.ConstructionException;
 
+import javax.annotation.ManagedBean;
 import javax.ejb.EJBHome;
 import javax.ejb.EJBLocalHome;
 import javax.ejb.EJBLocalObject;
@@ -107,6 +108,15 @@ public class BeanContext extends Deploym
 
     public interface Timeout {
     }
+
+    /**
+     * This ManagedBean is added to all EjbModules to effectively
+     * create a sharable "comp" namespace which can be used in
+     * for components with undefined namespace such as CDI
+     */
+    public static class Comp {
+
+    }
     
     private final ModuleContext moduleContext;
     private final Context jndiContext;

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=1173108&r1=1173107&r2=1173108&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 Tue Sep 20 12:22:27 2011
@@ -728,6 +728,8 @@ public class Assembler extends Assembler
 
             allDeployments = sort(allDeployments);
 
+            appContext.getBeanContexts().addAll(allDeployments);
+
             new CdiBuilder().build(appInfo, appContext, allDeployments);
 
             ensureWebBeansContext(appContext);
@@ -826,8 +828,6 @@ public class Assembler extends Assembler
             deployedApplications.put(appInfo.path, appInfo);
             fireAfterApplicationCreated(appInfo);
 
-            appContext.getBeanContexts().addAll(allDeployments);
-
             return appContext;
         } catch (ValidationException ve) {
             throw ve;

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiResourceInjectionService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiResourceInjectionService.java?rev=1173108&r1=1173107&r2=1173108&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiResourceInjectionService.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiResourceInjectionService.java Tue Sep 20 12:22:27 2011
@@ -25,196 +25,137 @@ import java.lang.annotation.Annotation;
 import javax.enterprise.inject.spi.Bean;
 
 
+import org.apache.openejb.AppContext;
+import org.apache.openejb.BeanContext;
 import org.apache.openejb.Injection;
 import org.apache.openejb.InjectionProcessor;
-import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.assembler.classic.AppInfo;
-import org.apache.openejb.assembler.classic.InjectionBuilder;
-import org.apache.openejb.assembler.classic.JndiEncBuilder;
-import org.apache.openejb.assembler.classic.JndiEncInfo;
-import org.apache.openejb.config.AnnotationDeployer;
-import org.apache.openejb.config.JndiEncInfoBuilder;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.PassthroughFactory;
 import org.apache.webbeans.component.ResourceBean;
-import org.apache.webbeans.exception.WebBeansException;
 import org.apache.webbeans.spi.ResourceInjectionService;
 import org.apache.webbeans.spi.api.ResourceReference;
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.Option;
 
-import javax.enterprise.inject.spi.Bean;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.lang.annotation.Annotation;
-import java.util.HashMap;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Set;
 
 public class CdiResourceInjectionService implements ResourceInjectionService {
 
     private Logger logger = Logger.getInstance(LogCategory.OPENEJB.createChild("cdi"), CdiResourceInjectionService.class);
-    private ClassLoader classLoader;
-    private AppInfo appModule;
-    private final Map<CdiBeanInfo, Context> contexts = new HashMap<CdiBeanInfo, Context>();
+    private final List<BeanContext> compContexts = new ArrayList<BeanContext>();
 
     public CdiResourceInjectionService() {
-
     }
 
-    public void setClassLoader(ClassLoader classLoader) {
-        this.classLoader = classLoader;
-    }
-
-    public void setAppModule(AppInfo appModule) {
-        this.appModule = appModule;
-    }
-
-    public void buildInjections(Set<Class<?>> managedBeanClasses) throws OpenEJBException {
-        AnnotationDeployer deployer = new AnnotationDeployer();
-
-        for (Class<?> clazz : managedBeanClasses) {
-
-            CdiBeanInfo cdiInfo = new CdiBeanInfo();
-            cdiInfo.setClassLoader(classLoader);
-            cdiInfo.setBeanName(clazz.getName());
-            cdiInfo.setBeanClass(clazz);
-            deployer.deploy(cdiInfo);
-
-            JndiEncInfoBuilder infoBuilder = new JndiEncInfoBuilder(appModule);
-            JndiEncInfo moduleJndiEnc = new JndiEncInfo();
-            JndiEncInfo jndiEnc = new JndiEncInfo();
-            infoBuilder.build(cdiInfo, cdiInfo.getBeanName(), appModule.appId, null, moduleJndiEnc, jndiEnc);
-
-            InjectionBuilder builder = new InjectionBuilder(classLoader);
-            List<Injection> injections = builder.buildInjections(jndiEnc);
-
-            cdiInfo.setInjections(injections);
-            // TODO: handle app/global/module namespaces?
-            JndiEncBuilder encBuilder = new JndiEncBuilder(jndiEnc, injections, appModule.appId, null, appModule.appId, classLoader);
-            this.contexts.put(cdiInfo, encBuilder.build(JndiEncBuilder.JndiScope.comp));
+    public void setAppContext(AppContext appModule) {
+        for (BeanContext beanContext : appModule.getBeanContexts()) {
+            if (beanContext.getBeanClass().equals(BeanContext.Comp.class)) {
+                compContexts.add(beanContext);
+            }
         }
     }
 
-
     @Override
     public <X, T extends Annotation> X getResourceReference(ResourceReference<X, T> resourceReference) {
+        final Class<X> type = resourceReference.getResourceType();
+        final String name = resourceReference.getJndiName();
+
         try {
-            return resourceReference.getResourceType().cast(new InitialContext().lookup(resourceReference.getJndiName()));
+            return type.cast(new InitialContext().lookup(name));
         } catch (NamingException e) {
-            for (Entry<CdiBeanInfo, Context> entry : this.contexts.entrySet()) {
-                if (entry.getKey().getBeanClass() == resourceReference.getOwnerClass()) {
-                    List<Injection> injections = entry.getKey().getInjections();
-                    for (Injection injection : injections) {
-                        if (injection.getTarget() == resourceReference.getOwnerClass() &&
-                                injection.getName().equals(resourceReference.getName())) {
-                            Context context = InjectionProcessor.unwrap(entry.getValue());
-                            try {
-                                return resourceReference.getResourceType().cast(context.lookup(injection.getJndiName()));
-                            } catch (NamingException e2) {
-                                logger.warning("Injection data not found in JNDI context: jndiName='" + injection.getJndiName() + "', target=" + injection.getTarget().getName() + "/" + injection.getName(), e2);
-                                return null;
-                            }
 
-                        }
-                    }
+            for (BeanContext beanContext : compContexts) {
+                try {
+                    String relativeName = name.replace("java:", "");
+                    return type.cast(beanContext.getJndiContext().lookup(relativeName));
+                } catch (NamingException e1) {
+                    // fine for now
                 }
             }
-            return null;
 //            throw new WebBeansException("Could not look up resource at " + resourceReference.getJndiName(), e);
        }
+        return null;
     }
 
     @Override
-    public void injectJavaEEResources(Object managedBeanInstance)
-            {
+    public void injectJavaEEResources(Object managedBeanInstance) {
 
-        for (Entry<CdiBeanInfo, Context> entry : this.contexts.entrySet()) {
-            if (entry.getKey().getBeanClass() == managedBeanInstance.getClass()) {
-                ObjectRecipe receipe = PassthroughFactory.recipe(managedBeanInstance);
-                receipe.allow(Option.FIELD_INJECTION);
-                receipe.allow(Option.PRIVATE_PROPERTIES);
-                receipe.allow(Option.IGNORE_MISSING_PROPERTIES);
-                receipe.allow(Option.NAMED_PARAMETERS);
-
-                fillInjectionProperties(receipe, entry.getKey().getInjections(), managedBeanInstance.getClass(), entry.getValue());
-                receipe.create();
-                return;
-            }
-        }
-    }
+        ObjectRecipe receipe = PassthroughFactory.recipe(managedBeanInstance);
+        receipe.allow(Option.FIELD_INJECTION);
+        receipe.allow(Option.PRIVATE_PROPERTIES);
+        receipe.allow(Option.IGNORE_MISSING_PROPERTIES);
+        receipe.allow(Option.NAMED_PARAMETERS);
 
-    @SuppressWarnings("unchecked")
-    private void fillInjectionProperties(ObjectRecipe objectRecipe, List<Injection> injections, Class<?> beanClass, Context context) {
-        if (injections == null) return;
+        fillInjectionProperties(receipe, managedBeanInstance);
 
-        boolean usePrefix = true;
-        try {
-            if (beanClass != null) beanClass.getConstructor();
-        } catch (NoSuchMethodException e) {
-            // Using constructor injection
-            // xbean can't handle the prefix yet
-            usePrefix = false;
-        }
+        receipe.create();
+    }
 
-        Class<?> clazz = beanClass;
+    @SuppressWarnings("unchecked")
+    private void fillInjectionProperties(ObjectRecipe objectRecipe, Object managedBeanInstance) {
 
-        for (Injection injection : injections) {
-            if (!injection.getTarget().isAssignableFrom(clazz)) continue;
-            try {
-                String jndiName = injection.getJndiName();
+        final boolean usePrefix = true;
+        final Class<?> clazz = managedBeanInstance.getClass();
 
-                if (!jndiName.startsWith("java:")) {
-                    jndiName = "java:" + jndiName;
-                }
+        for (BeanContext beanContext : compContexts) {
 
-                Object value;
+            for (Injection injection : beanContext.getInjections()) {
+                if (!injection.getTarget().isAssignableFrom(clazz)) continue;
                 try {
-                    value = InjectionProcessor.unwrap(context).lookup(jndiName);
-                } catch (NamingException e) {
-                    // Fallback and try the Context on the current thread
-                    //
-                    // We attempt to create a Context instance for each
-                    // individual CDI bean.  This isn't really accurate
-                    // however, and in a webapp all the beans will share
-                    // the same JNDI Context.  This fallback will cover
-                    // the situation where we did not accurately create
-                    // a Context for each bean and instead the Context
-                    // on the thread (the webapp context) has the data
-                    // we need to lookup.
+                    String jndiName = injection.getJndiName();
+
+                    if (!jndiName.startsWith("java:")) {
+                        jndiName = "java:" + jndiName;
+                    }
 
+                    Object value;
                     try {
-                        value = new InitialContext().lookup(jndiName);
-                    } catch (NamingException e1) {
-                        throw e;
+                        value = InjectionProcessor.unwrap(beanContext.getJndiContext()).lookup(jndiName);
+                    } catch (NamingException e) {
+                        // Fallback and try the Context on the current thread
+                        //
+                        // We attempt to create a Context instance for each
+                        // individual CDI bean.  This isn't really accurate
+                        // however, and in a webapp all the beans will share
+                        // the same JNDI Context.  This fallback will cover
+                        // the situation where we did not accurately create
+                        // a Context for each bean and instead the Context
+                        // on the thread (the webapp context) has the data
+                        // we need to lookup.
+
+                        try {
+                            value = new InitialContext().lookup(jndiName);
+                        } catch (NamingException e1) {
+                            throw e;
+                        }
+                    }
+
+                    String prefix;
+                    if (usePrefix) {
+                        prefix = injection.getTarget().getName() + "/";
+                    } else {
+                        prefix = "";
                     }
-                }
 
-                String prefix;
-                if (usePrefix) {
-                    prefix = injection.getTarget().getName() + "/";
-                } else {
-                    prefix = "";
+                    objectRecipe.setProperty(prefix + injection.getName(), value);
+                } catch (NamingException e) {
+                    logger.warning("Injection data not found in JNDI context: jndiName='" + injection.getJndiName() + "', target=" + injection.getTarget().getName() + "/" + injection.getName());
                 }
 
-                objectRecipe.setProperty(prefix + injection.getName(), value);
-            } catch (NamingException e) {
-                logger.warning("Injection data not found in JNDI context: jndiName='" + injection.getJndiName() + "', target=" + injection.getTarget().getName() + "/" + injection.getName());
             }
         }
     }
 
     @Override
     public void clear() {
-        this.contexts.clear();
+        compContexts.clear();
     }
 
     /**

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java?rev=1173108&r1=1173107&r2=1173108&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java Tue Sep 20 12:22:27 2011
@@ -24,7 +24,6 @@ import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Properties;
@@ -38,7 +37,6 @@ import javax.el.ELResolver;
 import javax.enterprise.inject.Specializes;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.inject.spi.Extension;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.jsp.JspApplicationContext;
@@ -182,8 +180,7 @@ public class OpenEJBLifecycle implements
 
         //Resournce Injection Service
         CdiResourceInjectionService injectionService = (CdiResourceInjectionService) webBeansContext.getService(ResourceInjectionService.class);
-        injectionService.setAppModule(stuff.getAppInfo());
-        injectionService.setClassLoader(appContext.getClassLoader());
+        injectionService.setAppContext(stuff.getAppContext());
 
         //Deploy the beans
         try {
@@ -210,14 +207,6 @@ public class OpenEJBLifecycle implements
             this.scannerService.scan();
 
             //Deploy bean from XML. Also configures deployments, interceptors, decorators.
-
-//            final CdiScanner cdiScanner = buildScanner();
-
-            //Build injections for managed beans
-            // TODO Maybe we should build injections after the bean discovery
-            injectionService.buildInjections(scannerService.getBeanClasses());
-
-            //Deploy bean from XML. Also configures deployments, interceptors, decorators.
             deployer.deployFromXML(scannerService);
 
             //Checking stereotype conditions

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=1173108&r1=1173107&r2=1173108&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 Tue Sep 20 12:22:27 2011
@@ -1059,6 +1059,11 @@ public class AnnotationDeployer implemen
 
                         }
                     }
+
+                    final String name = ejbModule.getModuleId() + "." + BeanContext.Comp.class.getSimpleName();
+                    final org.apache.openejb.jee.ManagedBean managedBean = new org.apache.openejb.jee.ManagedBean(name, BeanContext.Comp.class);
+                    managedBean.setTransactionType(TransactionType.BEAN);
+                    ejbModule.getEjbJar().addEnterpriseBean(managedBean);
                 } else {
                     managedClasses = new ArrayList<String>();
                 }
@@ -1314,10 +1319,19 @@ public class AnnotationDeployer implemen
             if (url.getPath().endsWith("WEB-INF/classes/")) return true;
             try {
                 final URLClassLoader loader = new URLClassLoader(new URL[]{url});
-                return loader.findResource("/WEB-INF/beans.xml") != null || loader.findResource("/META-INF/beans.xml") != null;
+                String[] paths = {
+                        "META-INF/beans.xml",
+                        "WEB-INF/beans.xml",
+                        "/WEB-INF/beans.xml",
+                        "/META-INF/beans.xml",
+                };
+
+                for (String path : paths) {
+                    if (loader.findResource(path) != null) return true;
+                }
             } catch (Exception e) {
-                return false;
             }
+            return false;
         }
 
         private String getEjbName(MessageDriven mdb, Class<?> beanClass) {
@@ -2233,6 +2247,14 @@ public class AnnotationDeployer implemen
                 processWebServiceHandlers(ejbModule, bean);
 
                 processWebServiceClientHandlers(bean, classLoader);
+
+                try {
+                    if (BeanContext.Comp.class.getName().equals(bean.getEjbClass())) {
+                        buildAnnotatedRefs(bean, ejbModule.getFinder(), classLoader);
+                    }
+                } catch (OpenEJBException e) {
+                    logger.error("Processing of @Resource, @EJB, and other references failed for CDI managed beans", e);
+                }
             }
 
             for (Interceptor interceptor : ejbModule.getEjbJar().getInterceptors()) {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1173108&r1=1173107&r2=1173108&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java Tue Sep 20 12:22:27 2011
@@ -23,6 +23,7 @@ import org.apache.openejb.api.LocalClien
 import org.apache.openejb.api.RemoteClient;
 import org.apache.openejb.jee.Application;
 import org.apache.openejb.jee.ApplicationClient;
+import org.apache.openejb.jee.Beans;
 import org.apache.openejb.jee.Connector;
 import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.FacesConfig;
@@ -55,6 +56,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLClassLoader;
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -605,6 +607,27 @@ public class DeploymentLoader implements
             appModule.getAdditionalLibraries().addAll(webModule.getUrls());
         }
 
+        {
+            List<URL> persistenceXmls = (List<URL>) appModule.getAltDDs().get("persistence.xml");
+            if (persistenceXmls == null) {
+                persistenceXmls = new ArrayList<URL>();
+                appModule.getAltDDs().put("persistence.xml", persistenceXmls);
+            }
+
+            final Object o = webModule.getAltDDs().get("persistence.xml");
+
+            if (o instanceof URL) {
+                URL url = (URL) o;
+                persistenceXmls.add(url);
+            }
+
+            if (o instanceof List) {
+                List<URL> urls = (List<URL>) o;
+                persistenceXmls.addAll(urls);
+            }
+        }
+
+
         // Per the Spec version of the Collapsed EAR there
         // aren't individual EjbModules inside a war.
         // The war itself is one big EjbModule if certain
@@ -677,9 +700,47 @@ public class DeploymentLoader implements
 
         // load faces configuration files
         addFacesConfigs(webModule);
+
+        addBeansXmls(webModule);
+
         return webModule;
     }
 
+    private void addBeansXmls(WebModule webModule) {
+        final List<URL> urls = webModule.getUrls();
+        final URLClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls.size()]));
+
+        final ArrayList<URL> xmls;
+        try {
+            xmls = Collections.list(loader.getResources("META-INF/beans.xml"));
+            xmls.add((URL) webModule.getAltDDs().get("beans.xml"));
+        } catch (IOException e) {
+
+            return;
+        }
+
+        Beans complete = null;
+        for (URL url : xmls) {
+            if (url == null) continue;
+            try {
+                final Beans beans = ReadDescriptors.readBeans(url);
+
+                if (complete == null) {
+                    complete = beans;
+                } else {
+                    complete.getAlternativeClasses().addAll(beans.getAlternativeClasses());
+                    complete.getAlternativeStereotypes().addAll(beans.getAlternativeStereotypes());
+                    complete.getDecorators().addAll(beans.getDecorators());
+                    complete.getInterceptors().addAll(beans.getInterceptors());
+                }
+            } catch (OpenEJBException e) {
+                logger.error("Unable to read beans.xml from :"+ url.toExternalForm());
+            }
+        }
+
+        webModule.getAltDDs().put("beans.xml", complete);
+    }
+
     protected String getContextRoot() {
         return null;
     }

Modified: openejb/trunk/openejb3/tck/cdi-tomee-embedded/src/test/resources/passing.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/tck/cdi-tomee-embedded/src/test/resources/passing.xml?rev=1173108&r1=1173107&r2=1173108&view=diff
==============================================================================
--- openejb/trunk/openejb3/tck/cdi-tomee-embedded/src/test/resources/passing.xml (original)
+++ openejb/trunk/openejb3/tck/cdi-tomee-embedded/src/test/resources/passing.xml Tue Sep 20 12:22:27 2011
@@ -19,11 +19,7 @@
 <suite name="CDI TCK" verbose="0">
   <test name="CDI TCK">
     <classes>
-      <class name="org.jboss.jsr299.tck.tests.lookup.injection.non.contextual.InjectionIntoNonContextualComponentTest">
-        <methods>
-          <include name="testInjectionIntoJSFManagedBean"/>
-        </methods>
-      </class>
+      <class name="org.jboss.jsr299.tck.tests.deployment.packaging.bundledLibrary.LibraryInWarTest"/>
     </classes>
   </test>
 </suite>

Modified: openejb/trunk/openejb3/tck/cdi-tomee/src/test/resources/passing.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/tck/cdi-tomee/src/test/resources/passing.xml?rev=1173108&r1=1173107&r2=1173108&view=diff
==============================================================================
--- openejb/trunk/openejb3/tck/cdi-tomee/src/test/resources/passing.xml (original)
+++ openejb/trunk/openejb3/tck/cdi-tomee/src/test/resources/passing.xml Tue Sep 20 12:22:27 2011
@@ -43,26 +43,12 @@
           <exclude name="test"/>
         </methods>
       </class>
-      <class name="org.jboss.jsr299.tck.tests.deployment.packaging.bundledLibrary.LibraryInWarTest">
-        <methods>
-          <exclude name="test"/>
-        </methods>
-      </class>
       <class name="org.jboss.jsr299.tck.tests.implementation.enterprise.lifecycle.EnterpriseBeanLifecycleTest">
         <methods>
           <exclude name="testCreateSFSB"/>
           <exclude name="testSerializeSFSB"/>
         </methods>
       </class>
-      <class name="org.jboss.jsr299.tck.tests.implementation.simple.resource.persistenceContext.PersistenceContextInjectionTest">
-        <methods>
-          <exclude name="testBeanTypesAndBindingTypesOfPersistenceContext"/>
-          <exclude name="testInjectionOfPersistenceContext"/>
-          <exclude name="testInjectionOfPersistenceUnit"/>
-          <exclude name="testPassivationOfPersistenceContext"/>
-          <exclude name="testPassivationOfPersistenceUnit"/>
-        </methods>
-      </class>
       <class name="org.jboss.jsr299.tck.tests.interceptors.definition.enterprise.nonContextualReference.SessionBeanInterceptorOnNonContextualEjbReferenceTest">
         <methods>
           <exclude name="testNonContextualSessionBeanReferenceIsIntercepted"/>