You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/12/19 19:02:29 UTC

[1/3] tomee git commit: supporting passivation-capable

Repository: tomee
Updated Branches:
  refs/heads/develop d57528671 -> 04eefb021


supporting passivation-capable


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/9451f5e0
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/9451f5e0
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/9451f5e0

Branch: refs/heads/develop
Commit: 9451f5e0fc62e2e9394fee480865dc572e28cd84
Parents: d575286
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Fri Dec 19 17:11:45 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Fri Dec 19 17:11:45 2014 +0100

----------------------------------------------------------------------
 .../src/main/java/org/apache/openejb/jee/SessionBean$JAXB.java   | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/9451f5e0/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SessionBean$JAXB.java
----------------------------------------------------------------------
diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SessionBean$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SessionBean$JAXB.java
index dbb092b..607a75a 100644
--- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SessionBean$JAXB.java
+++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SessionBean$JAXB.java
@@ -693,8 +693,10 @@ public class SessionBean$JAXB
                 // ELEMENT: securityIdentity
                 final SecurityIdentity securityIdentity = readSecurityIdentity(elementReader, context);
                 sessionBean.securityIdentity = securityIdentity;
+            } else if (("passivation-capable" == elementReader.getLocalName()) && ("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) {
+                sessionBean.setPassivationCapable(Boolean.parseBoolean(elementReader.getElementAsString()));
             } else {
-                context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("ht
 tp://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke
 "), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new
  QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"));
+                context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QN
 ame("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-
 method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"
 ), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"));
             }
         }
         if (descriptions != null) {


[3/3] tomee git commit: EJB CDI 1.1 discovery mode

Posted by rm...@apache.org.
EJB CDI 1.1 discovery mode


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/04eefb02
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/04eefb02
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/04eefb02

Branch: refs/heads/develop
Commit: 04eefb021198de30a0a64c2193c8b1fe6a13131e
Parents: 8adfb17
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Fri Dec 19 19:02:09 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Fri Dec 19 19:02:09 2014 +0100

----------------------------------------------------------------------
 .../openejb/OpenEJBArchiveProcessor.java        | 34 +++++---
 .../openejb/OpenEJBDeployableContainer.java     | 19 +++++
 .../arquillian/openejb/SWClassLoader.java       | 85 +++++++++++++-------
 .../ArchiveResourceIteratorFactory.java         | 24 +++---
 .../openejb/assembler/classic/BeansInfo.java    |  3 +-
 .../java/org/apache/openejb/cdi/CdiScanner.java | 35 ++++++--
 .../openejb/config/AnnotationDeployer.java      | 37 ++++++++-
 .../apache/openejb/config/DeploymentLoader.java | 26 +++---
 .../openejb/web/LightweightWebAppBuilder.java   | 18 ++++-
 tck/cdi-embedded/pom.xml                        |  3 +
 tck/cdi-embedded/src/test/resources/failing.xml |  2 +-
 11 files changed, 214 insertions(+), 72 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
index 9e65369..acbbf8f 100644
--- a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
+++ b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
@@ -19,10 +19,10 @@ package org.apache.openejb.arquillian.openejb;
 import org.apache.openejb.ClassLoaderUtil;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.cdi.CompositeBeans;
 import org.apache.openejb.config.AppModule;
 import org.apache.openejb.config.DeploymentLoader;
 import org.apache.openejb.config.EjbModule;
-import org.apache.openejb.config.EmptyEjbJar;
 import org.apache.openejb.config.FinderFactory;
 import org.apache.openejb.config.ReadDescriptors;
 import org.apache.openejb.config.WebModule;
@@ -111,6 +111,8 @@ public class OpenEJBArchiveProcessor {
         final List<AssetSource> beansXmlMerged = new ArrayList<>();
         CompositeArchive earArchive = null;
         Map<URL, List<String>> earMap = null;
+        final List<Archive> earLibsArchives = new ArrayList<>();
+        final CompositeBeans earBeans = new CompositeBeans();
 
         final String prefix;
         final boolean isEar = EnterpriseArchive.class.isInstance(archive);
@@ -129,6 +131,7 @@ public class OpenEJBArchiveProcessor {
                     if (ArchiveAsset.class.isInstance(asset)) {
                         final Archive<?> libArchive = ArchiveAsset.class.cast(asset).getArchive();
                         if (!isExcluded(libArchive.getName())) {
+                            earLibsArchives.add(libArchive);
                             final List<Class<?>> earClasses = new ArrayList<>();
                             final List<String> earClassNames = new ArrayList<>();
                             final Map<ArchivePath, Node> content = libArchive.getContent(new IncludeRegExpPaths(".*.class"));
@@ -144,7 +147,16 @@ public class OpenEJBArchiveProcessor {
                                 }
                             }
                             try { // ends with !/META-INF/beans.xml to force it to be used as a cdi module *with bda*
-                                earMap.put(new URL("jar:file://!/lib/" + libArchive.getName() + (libArchive.get(META_INF + BEANS_XML) != null ? "!/META-INF/beans.xml" : "")), earClassNames);
+                                final Node beansNode = libArchive.get(META_INF + BEANS_XML);
+                                final URL arUrl = new URL("jar:file://!/lib/" + libArchive.getName() + (beansNode != null ? "!/META-INF/beans.xml" : ""));
+                                if (beansNode != null) {
+                                    try {
+                                        DeploymentLoader.doMerge(arUrl, earBeans, ReadDescriptors.readBeans(beansNode.getAsset().openStream()));
+                                    } catch (final OpenEJBException e) {
+                                        throw new IllegalArgumentException(e);
+                                    }
+                                }
+                                earMap.put(arUrl, earClassNames);
                             } catch (final MalformedURLException e) {
                                 // no-op
                             }
@@ -160,14 +172,16 @@ public class OpenEJBArchiveProcessor {
 
         final URL[] urls = additionalPaths.toArray(new URL[additionalPaths.size()]);
 
+        final URLClassLoaderFirst swParent = new URLClassLoaderFirst(urls, parent);
+        closeables.add(swParent);
+
         final SWClassLoader loader;
         if (!WEB_INF.equals(prefix)) {
-            final URLClassLoader swParent = new URLClassLoader(urls, parent);
-            closeables.add(swParent);
-            loader = new SWClassLoader("", swParent, archive);
+            if (!isEar) {
+                earLibsArchives.add(archive);
+            }
+            loader = new SWClassLoader("", swParent, earLibsArchives.toArray(new Archive<?>[earLibsArchives.size()]));
         } else {
-            final URLClassLoaderFirst swParent = new URLClassLoaderFirst(urls, parent);
-            closeables.add(swParent);
             loader = new SWClassLoader(WEB_INF_CLASSES, swParent, archive);
         }
         closeables.add(loader);
@@ -187,9 +201,9 @@ public class OpenEJBArchiveProcessor {
             appModule.setEarLibFinder(earLibFinder);
 
             final EjbModule earCdiModule = new EjbModule(appModule.getClassLoader(), DeploymentLoader.EAR_SCOPED_CDI_BEANS + appModule.getModuleId(), new EjbJar(), new OpenejbJar());
-            earCdiModule.setBeans(new Beans());
+            earCdiModule.setBeans(earBeans);
             earCdiModule.setFinder(earLibFinder);
-            earCdiModule.setEjbJar(new EmptyEjbJar());
+            earCdiModule.setEjbJar(new EjbJar()); // EmptyEjbJar would prevent to add scanned EJBs but this is *here* an aggregator so we need to be able to do so
             appModule.getEjbModules().add(earCdiModule);
 
             for (final Map.Entry<ArchivePath, Node> node : archive.getContent(new IncludeRegExpPaths("/.*\\.war")).entrySet()) {
@@ -211,7 +225,7 @@ public class OpenEJBArchiveProcessor {
                         final FinderFactory.OpenEJBAnnotationFinder finder = new FinderFactory.OpenEJBAnnotationFinder(
                                 finderArchive(beansXml, webArchive, webLoader, webappAdditionalPaths));
 
-                        final WebModule webModule = new WebModule(new WebApp(), contextRoot(webArchive.getName()), loader, "", appModule.getModuleId());
+                        final WebModule webModule = new WebModule(new WebApp(), contextRoot(webArchive.getName()), webLoader, "", appModule.getModuleId());
                         webModule.setUrls(Collections.<URL>emptyList());
                         webModule.setScannableUrls(Collections.<URL>emptyList());
                         webModule.setFinder(finder);

http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
index 14cf79e..2c21c58 100644
--- a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
+++ b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
@@ -26,9 +26,11 @@ import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.assembler.classic.OpenEjbConfigurationFactory;
 import org.apache.openejb.assembler.classic.WebAppBuilder;
+import org.apache.openejb.assembler.classic.WebAppInfo;
 import org.apache.openejb.config.AppModule;
 import org.apache.openejb.config.ConfigurationFactory;
 import org.apache.openejb.config.DeploymentFilterable;
+import org.apache.openejb.config.WebModule;
 import org.apache.openejb.core.LocalInitialContext;
 import org.apache.openejb.core.LocalInitialContextFactory;
 import org.apache.openejb.loader.IO;
@@ -56,6 +58,7 @@ import javax.naming.NamingException;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpSession;
 import java.io.ByteArrayInputStream;
+import java.io.Closeable;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Map;
@@ -238,6 +241,22 @@ public class OpenEJBDeployableContainer implements DeployableContainer<OpenEJBCo
             try {
                 final AppModule module = OpenEJBArchiveProcessor.createModule(archive, testClass, cls);
                 final AppInfo appInfo = configurationFactory.configureApplication(module);
+
+                final WebAppBuilder webAppBuilder = SystemInstance.get().getComponent(WebAppBuilder.class);
+                if (webAppBuilder != null && LightweightWebAppBuilder.class.isInstance(webAppBuilder)) {
+                    // for now we keep the same classloader, open to discussion if we should recreate it, not sure it does worth it
+                    final LightweightWebAppBuilder lightweightWebAppBuilder = LightweightWebAppBuilder.class.cast(webAppBuilder);
+                    for (final WebModule w : module.getWebModules()) {
+                        final String moduleId = w.getModuleId();
+                        lightweightWebAppBuilder.setClassLoader(moduleId, w.getClassLoader());
+                        cls.add(new Closeable() {
+                            @Override
+                            public void close() throws IOException {
+                                lightweightWebAppBuilder.removeClassLoader(moduleId);
+                            }
+                        });
+                    }
+                }
                 final AppContext appCtx = assembler.createApplication(appInfo, module.getClassLoader());
 
                 final ServletContext appServletContext = new MockServletContext();

http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
index 4f35da8..43e0351 100644
--- a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
+++ b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
@@ -16,6 +16,7 @@
  */
 package org.apache.openejb.arquillian.openejb;
 
+import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.Enumerator;
 import org.apache.openejb.util.reflection.Reflections;
 import org.jboss.shrinkwrap.api.Archive;
@@ -27,6 +28,7 @@ import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset;
 import org.jboss.shrinkwrap.api.asset.FileAsset;
 import org.jboss.shrinkwrap.api.asset.UrlAsset;
 
+import javax.enterprise.inject.spi.Extension;
 import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
@@ -37,11 +39,13 @@ import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLStreamHandler;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 
 public class SWClassLoader extends ClassLoader implements Closeable {
@@ -55,23 +59,36 @@ public class SWClassLoader extends ClassLoader implements Closeable {
         }
     }
 
-    private final Archive<?> archive;
+    private final Archive<?>[] archives;
     private final String prefix;
     private final Collection<Closeable> closeables = new ArrayList<Closeable>();
 
-    public SWClassLoader(final String prefix, final ClassLoader parent, final Archive<?> ar) {
+    public SWClassLoader(final String prefix, final ClassLoader parent, final Archive<?>... ar) {
         super(parent);
         this.prefix = prefix;
-        this.archive = ar;
-        ArchiveStreamHandler.set(ar, prefix, closeables);
+        this.archives = ar;
+        for (final Archive<?> a : ar) {
+            ArchiveStreamHandler.set(a, prefix, closeables);
+        }
     }
 
     @Override
     public Enumeration<URL> getResources(final String name) throws IOException {
-        if (name != null && !name.contains("META-INF/services/javax")) { // we want to avoid duplicates but we need container stuff, see bval tcks
-            final Node node = findNode(name);
-            if (node != null) {
-                return enumerator(new URL(null, "archive:" + archive.getName() + "/" + name, new ArchiveStreamHandler()));
+        if (name == null) {
+            return super.getResources(name);
+        }
+        final boolean cdiExtensions = name.startsWith("META-INF/services/" + Extension.class.getName());
+        if (cdiExtensions || !name.contains("META-INF/services/javax")) {
+            final List<Archive<?>> node = findNodes(name);
+            if (!node.isEmpty()) {
+                final List<URL> urls = new ArrayList<>();
+                for (final Archive<?> i : node) {
+                    urls.add(new URL(null, "archive:" + i.getName() + "/" + name, new ArchiveStreamHandler()));
+                }
+                return enumerator(urls);
+            }
+            if (cdiExtensions && "true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.arquillian.cdi.extension.skip-externals", "true"))) {
+                return enumerator(Collections.<URL>emptyList());
             }
         }
         return super.getResources(name);
@@ -79,37 +96,45 @@ public class SWClassLoader extends ClassLoader implements Closeable {
 
     @Override
     protected Enumeration<URL> findResources(final String name) throws IOException {
-        final Node node = findNode(name);
-        if (node != null) {
-            return enumerator(new URL(null, "archive:" + archive.getName() + "/" + name, new ArchiveStreamHandler()));
+        final List<Archive<?>> node = findNodes(name);
+        if (!node.isEmpty()) {
+            final List<URL> urls = new ArrayList<>();
+            for (final Archive<?> i : node) {
+                urls.add(new URL(null, "archive:" + i.getName() + "/" + name, new ArchiveStreamHandler()));
+            }
+            return enumerator(urls);
         }
         return super.findResources(name);
     }
 
-    private Node findNode(final String name) {
+    private LinkedList<Archive<?>> findNodes(final String name) {
         ArchivePath path = ArchivePaths.create(prefix + name);
-        Node node = archive.get(path);
-        if (node == null) {
-            path = ArchivePaths.create(name);
-            node = archive.get(path);
-
-
+        final LinkedList<Archive<?>> items = new LinkedList<>();
+        for (final Archive<?> a : archives) {
+            Node node = a.get(path);
+            if (node == null) {
+                node = a.get(ArchivePaths.create(name));
+            }
+            if (node != null) {
+                items.add(a);
+            }
         }
-        return node;
+        return items;
     }
 
-    private static Enumeration<URL> enumerator(final URL url) {
-        return new Enumerator(Arrays.asList(url));
+    private static Enumeration<URL> enumerator(final List<URL> urls) {
+        return new Enumerator(urls);
     }
 
     @Override
     protected URL findResource(final String name) {
-        final Node node = findNode(name);
-        if (node != null) {
+        final LinkedList<Archive<?>> node = findNodes(name);
+        if (!node.isEmpty()) {
+            final Archive<?> i = node.getLast();
             try {
-                return new URL(null, "archive:" + archive.getName() + "/" + name, new ArchiveStreamHandler());
+                return new URL(null, "archive:" + i.getName() + "/" + name, new ArchiveStreamHandler());
             } catch (final MalformedURLException e) {
-                // no-op: let reuse parent method
+                throw new IllegalArgumentException(e);
             }
         }
         return super.findResource(name);
@@ -199,7 +224,9 @@ public class SWClassLoader extends ClassLoader implements Closeable {
 
     @Override
     public void close() throws IOException {
-        ArchiveStreamHandler.reset(archive.getName());
+        for (final Archive<?> a : archives) {
+            ArchiveStreamHandler.reset(a.getName());
+        }
         for (final Closeable cl : closeables) {
             try {
                 cl.close();
@@ -210,7 +237,7 @@ public class SWClassLoader extends ClassLoader implements Closeable {
     }
 
     // to let frameworks using TCCL use the archive directly
-    public Archive<?> getArchive() {
-        return archive;
+    public Archive<?>[] getArchives() {
+        return archives;
     }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/cucumber/ArchiveResourceIteratorFactory.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/cucumber/ArchiveResourceIteratorFactory.java b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/cucumber/ArchiveResourceIteratorFactory.java
index b3825bd..a3d1e76 100644
--- a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/cucumber/ArchiveResourceIteratorFactory.java
+++ b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/cucumber/ArchiveResourceIteratorFactory.java
@@ -47,21 +47,23 @@ public class ArchiveResourceIteratorFactory implements ResourceIteratorFactory {
         final ClassLoader loader = Thread.currentThread().getContextClassLoader();
         final Collection<Resource> resources = new ArrayList<Resource>();
         if (SWClassLoader.class.isInstance(loader)) {
-            final Archive<?> archive = SWClassLoader.class.cast(loader).getArchive();
+            final Archive<?>[] archives = SWClassLoader.class.cast(loader).getArchives();
             final ClassLoader parent = loader.getParent();
-            final Map<ArchivePath, Node> content = archive.getContent(new Filter<ArchivePath>() {
-                @Override
-                public boolean include(final ArchivePath object) {
-                    final String currentPath = classloaderPath(object);
+            for (final Archive<?> archive : archives) {
+                final Map<ArchivePath, Node> content = archive.getContent(new Filter<ArchivePath>() {
+                    @Override
+                    public boolean include(final ArchivePath object) {
+                        final String currentPath = classloaderPath(object);
 
-                    return !(parent != null && parent.getResource(currentPath) != null)
-                            && currentPath.startsWith('/' + path) && currentPath.endsWith(suffix);
+                        return !(parent != null && parent.getResource(currentPath) != null)
+                                && currentPath.startsWith('/' + path) && currentPath.endsWith(suffix);
 
-                }
-            });
+                    }
+                });
 
-            for (final Map.Entry<ArchivePath, Node> entry : content.entrySet()) {
-                resources.add(new SWResource(entry.getKey(), entry.getValue()));
+                for (final Map.Entry<ArchivePath, Node> entry : content.entrySet()) {
+                    resources.add(new SWResource(entry.getKey(), entry.getValue()));
+                }
             }
         }
         return resources;

http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BeansInfo.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BeansInfo.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BeansInfo.java
index 0a9c532..7f9c18d 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BeansInfo.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BeansInfo.java
@@ -53,8 +53,9 @@ public class BeansInfo extends InfoObject {
     }
 
     public static class BDAInfo extends InfoObject {
-        public final List<String> managedClasses = new ArrayList<>();
+        public final Set<String> managedClasses = new HashSet<>();
         public String discoveryMode;
         public URI uri;
+        public boolean noBeansXmlButExtension;
     }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
index a15830e..5b30f29 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
@@ -35,6 +35,7 @@ import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.PropertyPlaceHolderHelper;
 import org.apache.openejb.util.classloader.ClassLoaderComparator;
 import org.apache.openejb.util.classloader.DefaultClassLoaderComparator;
+import org.apache.openejb.util.reflection.Reflections;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.decorator.DecoratorsManager;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
@@ -50,8 +51,10 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import static java.util.Arrays.asList;
@@ -192,23 +195,41 @@ public class CdiScanner implements ScannerService {
             final BeanArchiveService beanArchiveService = webBeansContext.getBeanArchiveService();
             final boolean openejb = OpenEJBBeanInfoService.class.isInstance(beanArchiveService);
 
+            final Map<BeansInfo.BDAInfo, BeanArchiveService.BeanArchiveInformation> infoByBda = new HashMap<>();
             for (final BeansInfo.BDAInfo bda : beans.bdas) {
-                handleBda(startupObject, classLoader, comparator, beans, scl, filterByClassLoader, beanArchiveService, openejb, bda);
+                infoByBda.put(bda, handleBda(startupObject, classLoader, comparator, beans, scl, filterByClassLoader, beanArchiveService, openejb, bda));
             }
             for (final BeansInfo.BDAInfo bda : beans.noDescriptorBdas) {
+                // infoByBda.put() not needed since we know it means annotated
                 handleBda(startupObject, classLoader, comparator, beans, scl, filterByClassLoader, beanArchiveService, openejb, bda);
             }
 
-            if (startupObject.getBeanContexts() != null) { // ensure ejbs are in managed beans otherwise they will not be deployed in CDI
+            if (startupObject.getBeanContexts() != null) {
                 for (final BeanContext bc : startupObject.getBeanContexts()) {
                     final String name = bc.getBeanClass().getName();
                     if (BeanContext.Comp.class.getName().equals(name)) {
                         continue;
                     }
 
-                    final Class<?> load = load(name, classLoader);
-                    if (load != null && !classes.contains(load)) {
-                        classes.add(load);
+                    boolean cdi = false;
+                    for (final BeansInfo.BDAInfo bda : beans.bdas) {
+                        final BeanArchiveService.BeanArchiveInformation info = infoByBda.get(bda);
+                        if (info.getBeanDiscoveryMode() == BeanArchiveService.BeanDiscoveryMode.NONE) {
+                            continue;
+                        }
+                        if (bda.managedClasses.contains(name)) {
+                            classes.add(load(name, classLoader));
+                            cdi = true;
+                            break;
+                        }
+                    }
+                    if (!cdi) {
+                        for (final BeansInfo.BDAInfo bda : beans.noDescriptorBdas) {
+                            if (bda.managedClasses.contains(name)) {
+                                classes.add(load(name, classLoader));
+                                break;
+                            }
+                        }
                     }
                 }
             }
@@ -228,7 +249,7 @@ public class CdiScanner implements ScannerService {
         }
     }
 
-    private void handleBda(final StartupObject startupObject, final ClassLoader classLoader, final ClassLoaderComparator comparator,
+    private BeanArchiveService.BeanArchiveInformation handleBda(final StartupObject startupObject, final ClassLoader classLoader, final ClassLoaderComparator comparator,
                            final BeansInfo beans, final ClassLoader scl, final boolean filterByClassLoader,
                            final BeanArchiveService beanArchiveService, final boolean openejb,
                            final BeansInfo.BDAInfo bda) {
@@ -298,6 +319,8 @@ public class CdiScanner implements ScannerService {
                 }
             }
         }
+
+        return information;
     }
 
     // TODO: reusing our finder would be a good idea to avoid reflection we already did!

http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java b/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
index b8a6983..458f513 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
@@ -186,6 +186,7 @@ import javax.ejb.TransactionManagement;
 import javax.ejb.TransactionManagementType;
 import javax.enterprise.context.NormalScope;
 import javax.enterprise.inject.Stereotype;
+import javax.enterprise.inject.spi.Extension;
 import javax.inject.Scope;
 import javax.interceptor.ExcludeClassInterceptors;
 import javax.interceptor.ExcludeDefaultInterceptors;
@@ -1667,10 +1668,44 @@ public class AnnotationDeployer implements DynamicDeployer {
                                 if (c.isAnnotation()) {
                                     newMarkers.add(c);
                                 }
-                                potentialClasses.add(c.getName());
+                                if (value.contains(c.getName())) {
+                                    potentialClasses.add(c.getName());
+                                }
                             }
                         }
                     } while (!newMarkers.isEmpty());
+
+                    newMarkers.clear();
+                    newMarkers.add(Stateful.class);
+                    newMarkers.add(Singleton.class);
+                    newMarkers.add(Stateless.class);
+                    newMarkers.add(MessageDriven.class);
+
+                    boolean ejb = false;
+                    for (final Class<?> marker : newMarkers) {
+                        final List<Class<?>> found = finder.findAnnotatedClasses(Class.class.cast(marker));
+                        for (final Class<?> c : found) {
+                            if (value.contains(c.getName())) {
+                                potentialClasses.add(c.getName());
+                                ejb = true;
+                            }
+                        }
+                    }
+                    if (ejb) {
+                        final List<Class<? extends Extension>> extensions = finder.findImplementations(Extension.class);
+                        boolean skip = false;
+                        for (final Class<?> c : extensions) {
+                            if (value.contains(c.getName())) {
+                                // legacy mode, we should check META-INF/services/... but this mode + having an Extension should be enough
+                                skip = true;
+                                continue;
+                            }
+                        }
+                        if (skip) {
+                            continue;
+                        }
+                    }
+
                     if (potentialClasses.isEmpty()) {
                         continue;
                     }

http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java b/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
index 639bcc3..5466034 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
@@ -1125,23 +1125,27 @@ public class DeploymentLoader implements DeploymentFilterable {
                 return current;
             }
 
-            current.getAlternativeClasses().addAll(beans.getAlternativeClasses());
-            current.getAlternativeStereotypes().addAll(beans.getAlternativeStereotypes());
-            current.getDecorators().addAll(beans.getDecorators());
-            current.getInterceptors().addAll(beans.getInterceptors());
-            current.getScan().getExclude().addAll(beans.getScan().getExclude());
-
-            // check is done here since later we lost the data of the origin
-            ReadDescriptors.checkDuplicatedByBeansXml(beans, current);
-
-            final String beanDiscoveryMode = beans.getBeanDiscoveryMode();
-            current.getDiscoveryByUrl().put(url, beanDiscoveryMode == null ? "ALL" : beanDiscoveryMode);
+            doMerge(url, current, beans);
         } catch (final OpenEJBException e) {
             logger.error("Unable to read beans.xml from: " + url.toExternalForm(), e);
         }
         return current;
     }
 
+    public static void doMerge(final URL url, final CompositeBeans current, final Beans beans) {
+        current.getAlternativeClasses().addAll(beans.getAlternativeClasses());
+        current.getAlternativeStereotypes().addAll(beans.getAlternativeStereotypes());
+        current.getDecorators().addAll(beans.getDecorators());
+        current.getInterceptors().addAll(beans.getInterceptors());
+        current.getScan().getExclude().addAll(beans.getScan().getExclude());
+
+        // check is done here since later we lost the data of the origin
+        ReadDescriptors.checkDuplicatedByBeansXml(beans, current);
+
+        final String beanDiscoveryMode = beans.getBeanDiscoveryMode();
+        current.getDiscoveryByUrl().put(url, beanDiscoveryMode == null ? "ALL" : beanDiscoveryMode);
+    }
+
     private void addBeansXmls(final AppModule appModule) {
         final List<URL> urls = appModule.getAdditionalLibraries();
         final URLClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls.size()]));

http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java b/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
index 9a8d0e9..e20943a 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
@@ -96,9 +96,18 @@ public class LightweightWebAppBuilder implements WebAppBuilder {
     private final Map<WebAppInfo, DeployedWebObjects> servletDeploymentInfo = new HashMap<WebAppInfo, DeployedWebObjects>();
     private final Map<WebAppInfo, List<Object>> listeners = new HashMap<WebAppInfo, List<Object>>();
     private final Map<WebAppInfo, ServletContextEvent> servletContextEvents = new HashMap<WebAppInfo, ServletContextEvent>();
+    private final Map<String, ClassLoader> loaderByWebContext = new HashMap<String, ClassLoader>();
+
+    public void setClassLoader(final String id, final ClassLoader loader) {
+        loaderByWebContext.put(id, loader);
+    }
+
+    public void removeClassLoader(final String id) {
+        loaderByWebContext.remove(id);
+    }
 
     @Override
-    public void deployWebApps(final AppInfo appInfo, final ClassLoader classLoader) throws Exception {
+    public void deployWebApps(final AppInfo appInfo, final ClassLoader appClassLoader) throws Exception {
 
         final CoreContainerSystem cs = (CoreContainerSystem) SystemInstance.get().getComponent(ContainerSystem.class);
         final AppContext appContext = cs.getAppContext(appInfo.appId);
@@ -107,6 +116,11 @@ public class LightweightWebAppBuilder implements WebAppBuilder {
         }
 
         for (final WebAppInfo webAppInfo : appInfo.webApps) {
+            ClassLoader classLoader = loaderByWebContext.get(webAppInfo.moduleId);
+            if (classLoader == null) {
+                classLoader = appClassLoader;
+            }
+
             final Set<Injection> injections = new HashSet<Injection>(appContext.getInjections());
             injections.addAll(new InjectionBuilder(classLoader).buildInjections(webAppInfo.jndiEnc));
 
@@ -132,7 +146,7 @@ public class LightweightWebAppBuilder implements WebAppBuilder {
                 final Assembler assembler = SystemInstance.get().getComponent(Assembler.class);
                 final List<BeanContext> beanContexts = assembler.initEjbs(classLoader, appInfo, appContext, injections, new ArrayList<BeanContext>(), webAppInfo.moduleId);
                 appContext.getBeanContexts().addAll(beanContexts);
-                new CdiBuilder().build(appInfo, appContext, appContext.getBeanContexts(), webContext);
+                new CdiBuilder().build(appInfo, appContext, beanContexts, webContext);
                 assembler.startEjbs(true, beanContexts);
             }
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/tck/cdi-embedded/pom.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/pom.xml b/tck/cdi-embedded/pom.xml
index 56acf38..d7b2a8f 100644
--- a/tck/cdi-embedded/pom.xml
+++ b/tck/cdi-embedded/pom.xml
@@ -128,7 +128,10 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
+        <version>2.17</version>
         <configuration>
+          <reuseForks>true</reuseForks>
+          <forkCount>1</forkCount>
           <argLine>-Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled</argLine>
           <useFile>false</useFile>
           <disableXmlReport>true</disableXmlReport>

http://git-wip-us.apache.org/repos/asf/tomee/blob/04eefb02/tck/cdi-embedded/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/src/test/resources/failing.xml b/tck/cdi-embedded/src/test/resources/failing.xml
index 94dd15b..00b611a 100644
--- a/tck/cdi-embedded/src/test/resources/failing.xml
+++ b/tck/cdi-embedded/src/test/resources/failing.xml
@@ -18,7 +18,7 @@
 <suite name="CDI TCK" verbose="0">
   <test name="CDI TCK">
     <classes>
-      <class name="org.jboss.cdi.tck.tests.context.passivating.enterprise.invalid.StatefulSessionBeanXmlDescriptorTest" />
+      <class name="org.jboss.cdi.tck.tests.deployment.discovery.enterprise.EnterpriseBeanDiscoveryTest" />
     </classes>
   </test>
 </suite>


[2/3] tomee git commit: validating passivation-capable for stateful

Posted by rm...@apache.org.
validating passivation-capable for stateful


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/8adfb17b
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/8adfb17b
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/8adfb17b

Branch: refs/heads/develop
Commit: 8adfb17b9d6c47e113b0e0589191e9b794053e51
Parents: 9451f5e
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Fri Dec 19 17:19:05 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Fri Dec 19 17:19:05 2014 +0100

----------------------------------------------------------------------
 .../java/org/apache/openejb/cdi/CdiEjbBean.java | 21 ++++++++++++++++----
 tck/cdi-embedded/pom.xml                        |  8 +++-----
 tck/cdi-embedded/src/test/resources/failing.xml |  2 +-
 3 files changed, 21 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/8adfb17b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java
index 001de33..346ca8f 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java
@@ -43,6 +43,7 @@ import javax.enterprise.inject.Typed;
 import javax.enterprise.inject.spi.AnnotatedMethod;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.DefinitionException;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.InjectionTarget;
 import javax.enterprise.inject.spi.SessionBeanType;
@@ -67,7 +68,7 @@ public class CdiEjbBean<T> extends BaseEjbBean<T> implements InterceptedMarker,
 
     private final BeanContext beanContext;
     private final boolean isDependentAndStateful;
-    private final boolean scopeNeedsPassivation;
+    private final boolean passivable;
 
     // initialized a bit later in the lifecycle but could be final otherwise
     private BeanContext.BusinessLocalBeanHome homeLocalBean;
@@ -84,8 +85,20 @@ public class CdiEjbBean<T> extends BaseEjbBean<T> implements InterceptedMarker,
         this.beanContext = beanContext;
         beanContext.set(Bean.class, this);
         passivatingId = beanContext.getDeploymentID() + getReturnType().getName();
-        isDependentAndStateful = getScope().equals(Dependent.class) && BeanType.STATEFUL.equals(beanContext.getComponentType());
-        scopeNeedsPassivation = webBeansContext.getBeanManagerImpl().isPassivatingScope(getScope()) && BeanType.STATEFUL.equals(beanContext.getComponentType());
+
+        final boolean stateful = BeanType.STATEFUL.equals(beanContext.getComponentType());
+        isDependentAndStateful = getScope().equals(Dependent.class) && stateful;
+        if (webBeansContext.getBeanManagerImpl().isPassivatingScope(getScope()) && stateful) {
+            if (!getBeanContext().isPassivable()) {
+                throw new DefinitionException(
+                        getBeanContext().getBeanClass()
+                                + " is a not apssivation-capable @Stateful with a scope "
+                                + getScope().getSimpleName() + " which need passivation");
+            }
+            passivable = true;
+        } else {
+            passivable = false;
+        }
     }
 
     @Override
@@ -95,7 +108,7 @@ public class CdiEjbBean<T> extends BaseEjbBean<T> implements InterceptedMarker,
 
     @Override
     public boolean isPassivationCapable() {
-        return getBeanContext().isPassivable() && scopeNeedsPassivation /* for TCKs mainly */;
+        return passivable;
     }
 
     public BeanContext getBeanContext() {

http://git-wip-us.apache.org/repos/asf/tomee/blob/8adfb17b/tck/cdi-embedded/pom.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/pom.xml b/tck/cdi-embedded/pom.xml
index 1f444bf..56acf38 100644
--- a/tck/cdi-embedded/pom.xml
+++ b/tck/cdi-embedded/pom.xml
@@ -151,14 +151,12 @@
             <ejbd.disabled>true</ejbd.disabled>
             <ejbds.disabled>true</ejbds.disabled>
 
-            <!-- this is a nice perf optimization to have by default but TCKs play with it -->
             <openejb.cdi.applicationScope.cached>false</openejb.cdi.applicationScope.cached>
-            <!-- not supported by the spec -->
             <openejb.cdi.producer.interception>false</openejb.cdi.producer.interception>
-            <!-- for ear we need WebAppDeployer -->
-            <org.apache.openejb.assembler.classic.WebAppBuilder>org.apache.openejb.web.LightweightWebAppBuilder</org.apache.openejb.assembler.classic.WebAppBuilder>
-            <!-- archives are well formed and all classes are in app loader -->
             <openejb.cdi.filter.classloader>false</openejb.cdi.filter.classloader>
+
+            <openejb.deploymentId.format>{appId}/{ejbJarId}/{ejbName}</openejb.deploymentId.format>
+            <org.apache.openejb.assembler.classic.WebAppBuilder>org.apache.openejb.web.LightweightWebAppBuilder</org.apache.openejb.assembler.classic.WebAppBuilder>
           </systemPropertyVariables>
         </configuration>
       </plugin>

http://git-wip-us.apache.org/repos/asf/tomee/blob/8adfb17b/tck/cdi-embedded/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/src/test/resources/failing.xml b/tck/cdi-embedded/src/test/resources/failing.xml
index 3f5a642..94dd15b 100644
--- a/tck/cdi-embedded/src/test/resources/failing.xml
+++ b/tck/cdi-embedded/src/test/resources/failing.xml
@@ -18,7 +18,7 @@
 <suite name="CDI TCK" verbose="0">
   <test name="CDI TCK">
     <classes>
-      <class name="org.jboss.cdi.tck.interceptors.tests.bindings.aroundConstruct.ejb.SessionBeanConstructorInterceptionTest" />
+      <class name="org.jboss.cdi.tck.tests.context.passivating.enterprise.invalid.StatefulSessionBeanXmlDescriptorTest" />
     </classes>
   </test>
 </suite>