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/22 15:31:26 UTC

tomee git commit: fallback to OWB API - otherwise we need to take some logic on out side which will not be possible soon. Can break some AppComposer tests but we were really broken anyway and in all cases.

Repository: tomee
Updated Branches:
  refs/heads/develop fb7a41b70 -> 008b375b9


fallback to OWB API - otherwise we need to take some logic on out side which will not be possible soon. Can break some AppComposer tests but we were really broken anyway and in all cases.


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

Branch: refs/heads/develop
Commit: 008b375b9815dbd2826ddb9d0eeda0b2ff03689f
Parents: fb7a41b
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Mon Dec 22 15:30:51 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Mon Dec 22 15:30:51 2014 +0100

----------------------------------------------------------------------
 .../openejb/assembler/classic/BeansInfo.java    |  13 +--
 .../java/org/apache/openejb/cdi/CdiScanner.java | 102 ++-----------------
 .../org/apache/openejb/cdi/CompositeBeans.java  |  43 ++++++++
 .../openejb/cdi/OpenEJBBeanInfoService.java     |  18 ++--
 .../apache/openejb/config/DeploymentLoader.java |   5 +-
 .../openejb/config/EjbJarInfoBuilder.java       |  88 ++++++++++------
 .../apache/openejb/config/ReadDescriptors.java  |   9 +-
 tck/cdi-embedded/src/test/resources/failing.xml |   2 +-
 8 files changed, 129 insertions(+), 151 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/008b375b/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 98f1f2a..b3f9dea 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
@@ -24,16 +24,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
-/**
- * @version $Rev$ $Date$
- */
 public class BeansInfo extends InfoObject {
-
-    public final List<String> interceptors = new ArrayList<>();
-    public final List<String> decorators = new ArrayList<>();
-    public final List<String> alternativeClasses = new ArrayList<>();
-    public final List<String> alternativeStereotypes = new ArrayList<>();
-
     public final List<String> duplicatedInterceptors = new ArrayList<>();
     public final List<String> duplicatedDecorators = new ArrayList<>();
     public final List<String> duplicatedAlternativeClasses = new ArrayList<>();
@@ -54,6 +45,10 @@ public class BeansInfo extends InfoObject {
 
     public static class BDAInfo extends InfoObject {
         public final Set<String> managedClasses = new HashSet<>();
+        public final List<String> interceptors = new LinkedList<>();
+        public final List<String> decorators = new LinkedList<>();
+        public final List<String> alternatives = new LinkedList<>();
+        public final List<String> stereotypeAlternatives = new LinkedList<>();
         public String discoveryMode;
         public URI uri;
     }

http://git-wip-us.apache.org/repos/asf/tomee/blob/008b375b/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 5b30f29..095f7ba 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
@@ -32,14 +32,9 @@ import org.apache.openejb.core.ParentClassLoaderFinder;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.LogCategory;
 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;
-import org.apache.webbeans.inject.AlternativesManager;
 import org.apache.webbeans.intercept.InterceptorsManager;
 import org.apache.webbeans.spi.BDABeansXmlScanner;
 import org.apache.webbeans.spi.BeanArchiveService;
@@ -49,7 +44,6 @@ import java.lang.annotation.Annotation;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -72,6 +66,7 @@ public class CdiScanner implements ScannerService {
 
     private final Set<Class<?>> classes = new HashSet<>();
     private final Set<Class<?>> startupClasses = new HashSet<>();
+    private final Set<URL> beansXml = new HashSet<>();
 
     private WebBeansContext webBeansContext;
     private ClassLoader containerLoader;
@@ -98,8 +93,6 @@ public class CdiScanner implements ScannerService {
         }
 
         final WebBeansContext webBeansContext = startupObject.getWebBeansContext();
-        final AlternativesManager alternativesManager = webBeansContext.getAlternativesManager();
-        final DecoratorsManager decoratorsManager = webBeansContext.getDecoratorsManager();
         final InterceptorsManager interceptorsManager = webBeansContext.getInterceptorsManager();
 
         // "manual" extension to avoid to add it through SPI mecanism
@@ -124,68 +117,6 @@ public class CdiScanner implements ScannerService {
                 continue;
             }
 
-            // fail fast
-            final StringBuilder errors = new StringBuilder("You must not declare the same class multiple times in the beans.xml: ");
-            if (addErrors(errors, "alternative classes", beans.duplicatedAlternativeClasses)
-                || addErrors(errors, "alternative stereotypes", beans.duplicatedAlternativeStereotypes)
-                || addErrors(errors, "decorators", beans.duplicatedDecorators)
-                || addErrors(errors, "interceptors", beans.duplicatedInterceptors)) {
-                throw new WebBeansConfigurationException(errors.toString());
-            }
-            // no more need of errors so clear them
-            beans.duplicatedAlternativeStereotypes.clear();
-            beans.duplicatedAlternativeClasses.clear();
-            beans.duplicatedDecorators.clear();
-            beans.duplicatedInterceptors.clear();
-
-            for (final String className : beans.interceptors) {
-                final Class<?> clazz = load(PropertyPlaceHolderHelper.simpleValue(className), classLoader);
-
-                if (clazz != null) {
-                    if (!interceptorsManager.isInterceptorClassEnabled(clazz)) {
-                        interceptorsManager.addEnabledInterceptorClass(clazz);
-                        classes.add(clazz);
-                    } /* else { don't do it, check is done when we know the beans.xml path --> org.apache.openejb.config.DeploymentLoader.addBeansXmls
-                        throw new WebBeansConfigurationException("Interceptor class : " + clazz.getName() + " is already defined");
-                    }*/
-                } else if (shouldThrowCouldNotLoadException(startupObject)) {
-                    throw new WebBeansConfigurationException("Could not load interceptor class: " + className);
-                }
-            }
-
-            for (final String className : beans.decorators) {
-                final Class<?> clazz = load(PropertyPlaceHolderHelper.simpleValue(className), classLoader);
-                if (clazz != null) {
-                    if (!decoratorsManager.isDecoratorEnabled(clazz)) {
-                        decoratorsManager.addEnabledDecorator(clazz);
-                        classes.add(clazz);
-                    } // same than interceptors regarding throw new WebBeansConfigurationException("Decorator class : " + clazz.getName() + " is already defined");
-                } else if (shouldThrowCouldNotLoadException(startupObject)) {
-                    throw new WebBeansConfigurationException("Could not load decorator class: " + className);
-                }
-            }
-
-
-            for (final String className : beans.alternativeStereotypes) {
-                final Class<?> clazz = load(PropertyPlaceHolderHelper.simpleValue(className), classLoader);
-                if (clazz != null) {
-                    alternativesManager.addXmlStereoTypeAlternative(clazz);
-                    classes.add(clazz);
-                } else if (shouldThrowCouldNotLoadException(startupObject)) {
-                    throw new WebBeansConfigurationException("Could not load alternativeStereotype class: " + className);
-                }
-            }
-
-            for (final String className : beans.alternativeClasses) {
-                final Class<?> clazz = load(PropertyPlaceHolderHelper.simpleValue(className), classLoader);
-                if (clazz != null) {
-                    alternativesManager.addXmlClazzAlternative(clazz);
-                    classes.add(clazz);
-                } else if (shouldThrowCouldNotLoadException(startupObject)) {
-                    throw new WebBeansConfigurationException("Could not load alternative class: " + className);
-                }
-            }
-
             // here for ears we need to skip classes in the parent classloader
             final ClassLoader scl = ClassLoader.getSystemClassLoader();
             final boolean filterByClassLoader = "true".equals(
@@ -197,6 +128,13 @@ public class CdiScanner implements ScannerService {
 
             final Map<BeansInfo.BDAInfo, BeanArchiveService.BeanArchiveInformation> infoByBda = new HashMap<>();
             for (final BeansInfo.BDAInfo bda : beans.bdas) {
+                if (bda.uri != null) {
+                    try {
+                        beansXml.add(bda.uri.toURL());
+                    } catch (final MalformedURLException e) {
+                        // no-op
+                    }
+                }
                 infoByBda.put(bda, handleBda(startupObject, classLoader, comparator, beans, scl, filterByClassLoader, beanArchiveService, openejb, bda));
             }
             for (final BeansInfo.BDAInfo bda : beans.noDescriptorBdas) {
@@ -256,7 +194,7 @@ public class CdiScanner implements ScannerService {
         BeanArchiveService.BeanArchiveInformation information;
         if (openejb) {
             final OpenEJBBeanInfoService beanInfoService = OpenEJBBeanInfoService.class.cast(beanArchiveService);
-            information = beanInfoService.createBeanArchiveInformation(beans, classLoader, bda.discoveryMode == null? "ALL" : bda.discoveryMode); // this fallback is 100% for tests, TODO: get rid of it (AppComposer)
+            information = beanInfoService.createBeanArchiveInformation(bda, beans, classLoader);
             // TODO: log a warn is discoveryModes.get(key) == null
             try {
                 beanInfoService.getBeanArchiveInfo().put(bda.uri == null ? null : bda.uri.toURL(), information);
@@ -276,7 +214,7 @@ public class CdiScanner implements ScannerService {
         final boolean isNotEarWebApp = startupObject.getWebContext() == null;
 
         if (!noScan) {
-            if (scanModeAnnotated /* && bda.managedClasses.size() > 50 */) {
+            if (scanModeAnnotated) {
                 try {
                     Logger.getInstance(LogCategory.OPENEJB, CdiScanner.class.getName())
                             .info("No beans.xml in " + bda.uri.toASCIIString()
@@ -340,24 +278,6 @@ public class CdiScanner implements ScannerService {
         return false;
     }
 
-    private static boolean shouldThrowCouldNotLoadException(final StartupObject startupObject) {
-        final AppInfo appInfo = startupObject.getAppInfo();
-        return appInfo.webAppAlone || appInfo.webApps.size() == 0 || startupObject.isFromWebApp();
-    }
-
-    private boolean addErrors(final StringBuilder errors, final String msg, final List<String> list) {
-        if (!list.isEmpty()) {
-            errors.append("[ ").append(msg).append(" --> ");
-            for (final String s : list) {
-                errors.append(s).append(" ");
-            }
-            errors.append("]");
-            return true;
-        } else {
-            return false;
-        }
-    }
-
     public boolean isBDABeansXmlScanningEnabled() {
         return false;
     }
@@ -388,7 +308,7 @@ public class CdiScanner implements ScannerService {
 
     @Override
     public Set<URL> getBeanXmls() {
-        return Collections.emptySet(); // Unused
+        return beansXml;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tomee/blob/008b375b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CompositeBeans.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CompositeBeans.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CompositeBeans.java
index cad718e..61a9ef1 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CompositeBeans.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CompositeBeans.java
@@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlTransient;
 import java.net.URL;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -30,7 +31,49 @@ public class CompositeBeans extends Beans {
     @XmlTransient
     private final Map<URL, String> discoveryByUrl = new HashMap<>();
 
+    @XmlTransient
+    private final Map<URL, Collection<String>> interceptorsByUrl = new HashMap<>();
+
+    @XmlTransient
+    private final Map<URL, Collection<String>> decoratorsByUrl = new HashMap<>();
+
+    @XmlTransient
+    private final Map<URL, Collection<String>> alternativesByUrl = new HashMap<>();
+
+    @XmlTransient
+    private final Map<URL, Collection<String>> alternativeStereotypesByUrl = new HashMap<>();
+
     public Map<URL, String> getDiscoveryByUrl() {
         return discoveryByUrl;
     }
+
+    public void mergeClasses(final URL url, final Beans beans) {
+        // just for jaxb tree
+        getAlternativeClasses().addAll(beans.getAlternativeClasses());
+        getAlternativeStereotypes().addAll(beans.getAlternativeStereotypes());
+        getDecorators().addAll(beans.getDecorators());
+        getInterceptors().addAll(beans.getInterceptors());
+
+        // for runtime
+        interceptorsByUrl.put(url, beans.getInterceptors());
+        decoratorsByUrl.put(url, beans.getDecorators());
+        alternativesByUrl.put(url, beans.getAlternativeClasses());
+        alternativeStereotypesByUrl.put(url, beans.getAlternativeStereotypes());
+    }
+
+    public Map<URL, Collection<String>> getInterceptorsByUrl() {
+        return interceptorsByUrl;
+    }
+
+    public Map<URL, Collection<String>> getDecoratorsByUrl() {
+        return decoratorsByUrl;
+    }
+
+    public Map<URL, Collection<String>> getAlternativesByUrl() {
+        return alternativesByUrl;
+    }
+
+    public Map<URL, Collection<String>> getAlternativeStereotypesByUrl() {
+        return alternativeStereotypesByUrl;
+    }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/008b375b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBBeanInfoService.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBBeanInfoService.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBBeanInfoService.java
index eb414d8..1b92e55 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBBeanInfoService.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBBeanInfoService.java
@@ -32,28 +32,24 @@ import java.util.Set;
 public class OpenEJBBeanInfoService implements BeanArchiveService {
     private Map<URL, BeanArchiveInformation> beanArchiveInfo = new HashMap<>();
 
-    public void register(final URL url, final BeansInfo info, final ClassLoader loader, final String mode) {
-        final DefaultBeanArchiveInformation information = createBeanArchiveInformation(info, loader, mode);
-        beanArchiveInfo.put(url, information);
-    }
-
     public Map<URL, BeanArchiveInformation> getBeanArchiveInfo() {
         return beanArchiveInfo;
     }
 
-    public DefaultBeanArchiveInformation createBeanArchiveInformation(final BeansInfo info, final ClassLoader loader, final String mode) {
+    public DefaultBeanArchiveInformation createBeanArchiveInformation(final BeansInfo.BDAInfo bda, final BeansInfo info, final ClassLoader loader) {
+        final String mode = bda.discoveryMode == null? "ALL" : bda.discoveryMode;
         if (info != null && info.version != null && !"1.0".equals(info.version) && info.discoveryMode == null) {
             throw new WebBeansConfigurationException("beans.xml with version 1.1 and higher must declare a bean-discovery-mode!");
         }
 
         final DefaultBeanArchiveInformation information = new DefaultBeanArchiveInformation();
         information.setVersion(info == null ? "1.1" : info.version);
-        information.setBeanDiscoveryMode(mode == null ? BeanDiscoveryMode.ANNOTATED : BeanDiscoveryMode.valueOf(mode.trim().toUpperCase(Locale.ENGLISH)));
-        information.setDecorators(info == null ? Collections.<String>emptyList() : info.decorators);
-        information.setInterceptors(info == null ? Collections.<String>emptyList() : info.interceptors);
+        information.setBeanDiscoveryMode(BeanDiscoveryMode.valueOf(mode.trim().toUpperCase(Locale.ENGLISH)));
+        information.setDecorators(bda.decorators);
+        information.setInterceptors(bda.interceptors);
         if (info != null) {
-            information.getAlternativeClasses().addAll(info.alternativeClasses);
-            information.getAlternativeStereotypes().addAll(info.alternativeStereotypes);
+            information.getAlternativeClasses().addAll(bda.alternatives);
+            information.getAlternativeStereotypes().addAll(bda.stereotypeAlternatives);
 
             for (final BeansInfo.ExclusionEntryInfo exclusionInfo : info.excludes) {
                 boolean skip = false;

http://git-wip-us.apache.org/repos/asf/tomee/blob/008b375b/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 5466034..a524dfc 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
@@ -1133,10 +1133,7 @@ public class DeploymentLoader implements DeploymentFilterable {
     }
 
     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.mergeClasses(url, beans);
         current.getScan().getExclude().addAll(beans.getScan().getExclude());
 
         // check is done here since later we lost the data of the origin

http://git-wip-us.apache.org/repos/asf/tomee/blob/008b375b/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java b/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
index 9ee4b26..1d00824 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
@@ -101,6 +101,7 @@ import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.Messages;
 import org.apache.webbeans.spi.BeanArchiveService;
 
+import java.net.MalformedURLException;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -115,6 +116,14 @@ import java.util.Map;
  * @version $Revision$ $Date$
  */
 public class EjbJarInfoBuilder {
+    private static final URL DEFAULT_BEANS_XML_KEY;
+    static {
+        try {
+            DEFAULT_BEANS_XML_KEY = new URL("jar:file://!/META-INF/beans.xml");
+        } catch (final MalformedURLException e) {
+            throw new IllegalStateException(e);
+        }
+    }
 
     public static Messages messages = new Messages("org.apache.openejb.util.resources");
     public static Logger logger = Logger.getInstance(LogCategory.OPENEJB, "org.apache.openejb.util.resources");
@@ -144,8 +153,8 @@ public class EjbJarInfoBuilder {
             throw new OpenEJBException(message);
         }
 
-        final Map<String, EnterpriseBeanInfo> infos = new HashMap<String, EnterpriseBeanInfo>();
-        final Map<String, EnterpriseBean> items = new HashMap<String, EnterpriseBean>();
+        final Map<String, EnterpriseBeanInfo> infos = new HashMap<>();
+        final Map<String, EnterpriseBean> items = new HashMap<>();
 
         final EjbJarInfo ejbJar = new EjbJarInfo();
         ejbJar.path = jar.getJarLocation();
@@ -254,11 +263,6 @@ public class EjbJarInfoBuilder {
                 }
             }
 
-            ejbJar.beans.interceptors.addAll(beans.getInterceptors());
-            ejbJar.beans.decorators.addAll(beans.getDecorators());
-            ejbJar.beans.alternativeClasses.addAll(beans.getAlternativeClasses());
-            ejbJar.beans.alternativeStereotypes.addAll(beans.getAlternativeStereotypes());
-
             ejbJar.beans.duplicatedAlternativeClasses.addAll(beans.getDuplicatedAlternatives().getClasses());
             ejbJar.beans.duplicatedAlternativeStereotypes.addAll(beans.getDuplicatedAlternatives().getStereotypes());
             ejbJar.beans.duplicatedInterceptors.addAll(beans.getDuplicatedInterceptors());
@@ -267,42 +271,71 @@ public class EjbJarInfoBuilder {
             ejbJar.beans.startupClasses.addAll(beans.getStartupBeans());
 
             final Map<URL, String> discoveryModeByUrl = new HashMap<>();
+            final CompositeBeans composite;
             if (CompositeBeans.class.isInstance(beans)) {
-                discoveryModeByUrl.putAll(CompositeBeans.class.cast(beans).getDiscoveryByUrl());
+                composite = CompositeBeans.class.cast(beans);
+                discoveryModeByUrl.putAll(composite.getDiscoveryByUrl());
             } else {
-                discoveryModeByUrl.put(null, beans.getBeanDiscoveryMode());
+                composite = null;
+                discoveryModeByUrl.put(DEFAULT_BEANS_XML_KEY, beans.getBeanDiscoveryMode());
             }
             for (final Map.Entry<URL, List<String>> next : beans.getManagedClasses().entrySet()) {
                 final URL key = next.getKey();
 
                 final BeansInfo.BDAInfo bdaInfo = new BeansInfo.BDAInfo();
-                bdaInfo.managedClasses.addAll(next.getValue());
                 bdaInfo.discoveryMode = discoveryModeByUrl.get(key);
-                try {
-                    bdaInfo.uri = key == null ? null : key.toURI();
-                } catch (final URISyntaxException e) {
-                    bdaInfo.uri = null;
-                }
+                merge(composite, key == null ? DEFAULT_BEANS_XML_KEY : key, bdaInfo, next.getValue());
                 ejbJar.beans.bdas.add(bdaInfo);
             }
             for (final Map.Entry<URL, List<String>> next : beans.getNotManagedClasses().entrySet()) {
                 final URL key = next.getKey();
 
                 final BeansInfo.BDAInfo bdaInfo = new BeansInfo.BDAInfo();
-                bdaInfo.managedClasses.addAll(next.getValue());
                 bdaInfo.discoveryMode = BeanArchiveService.BeanDiscoveryMode.ANNOTATED.name();
-                try {
-                    bdaInfo.uri = key == null ? null : key.toURI();
-                } catch (final URISyntaxException e) {
-                    bdaInfo.uri = null;
-                }
+                merge(composite, key == null ? DEFAULT_BEANS_XML_KEY : key, bdaInfo, next.getValue());
                 ejbJar.beans.noDescriptorBdas.add(bdaInfo);
             }
+
+            // app composer case mainly,we should really not use it anywhere else
+            if (composite == null && ejbJar.beans.bdas.size() == 1) {
+                final BeansInfo.BDAInfo bda = ejbJar.beans.bdas.iterator().next();
+                bda.alternatives.addAll(beans.getAlternativeClasses());
+                bda.interceptors.addAll(beans.getInterceptors());
+                bda.decorators.addAll(beans.getDecorators());
+                bda.stereotypeAlternatives.addAll(beans.getAlternativeStereotypes());
+            }
         }
 
         return ejbJar;
     }
 
+    private void merge(final CompositeBeans composite, final URL key, final BeansInfo.BDAInfo bdaInfo, final List<String> managedClasses) {
+        bdaInfo.managedClasses.addAll(managedClasses);
+        try {
+            bdaInfo.uri = key == null ? null : key.toURI();
+        } catch (final URISyntaxException e) {
+            bdaInfo.uri = null;
+        }
+        if (composite != null) {
+            final Collection<String> interceptors = composite.getInterceptorsByUrl().get(key);
+            if (interceptors != null) {
+                bdaInfo.interceptors.addAll(interceptors);
+            }
+            final Collection<String> decorators = composite.getDecoratorsByUrl().get(key);
+            if (decorators != null) {
+                bdaInfo.decorators.addAll(decorators);
+            }
+            final Collection<String> alternatives = composite.getAlternativesByUrl().get(key);
+            if (alternatives != null) {
+                bdaInfo.alternatives.addAll(alternatives);
+            }
+            final Collection<String> alternativeStereotypes = composite.getAlternativeStereotypesByUrl().get(key);
+            if (alternativeStereotypes != null) {
+                bdaInfo.stereotypeAlternatives.addAll(alternativeStereotypes);
+            }
+        }
+    }
+
     private void initJndiNames(final Map<String, EjbDeployment> ejbds, final EnterpriseBeanInfo info) {
         final EjbDeployment deployment = ejbds.get(info.ejbName);
         if (deployment != null) {
@@ -483,7 +516,7 @@ public class EjbJarInfoBuilder {
     }
 
     private void copySchedules(final List<Timer> timers, final List<MethodScheduleInfo> scheduleInfos) {
-        final Map<NamedMethod, MethodScheduleInfo> methodScheduleInfoMap = new HashMap<NamedMethod, MethodScheduleInfo>();
+        final Map<NamedMethod, MethodScheduleInfo> methodScheduleInfoMap = new HashMap<>();
         for (final Timer timer : timers) {
             final NamedMethod timeoutMethod = timer.getTimeoutMethod();
             MethodScheduleInfo methodScheduleInfo = methodScheduleInfoMap.get(timer.getTimeoutMethod());
@@ -604,7 +637,7 @@ public class EjbJarInfoBuilder {
             return Collections.emptyList();
         }
 
-        final List<MethodInfo> mi = new ArrayList<MethodInfo>(ms.size());
+        final List<MethodInfo> mi = new ArrayList<>(ms.size());
         for (final Method method : ms) {
             final MethodInfo methodInfo = getMethodInfo(method, ejbds);
             mi.add(methodInfo);
@@ -639,7 +672,7 @@ public class EjbJarInfoBuilder {
     }
 
     private EnterpriseBeanInfo initSessionBean(final SessionBean s, final EjbJarInfo ejbJar, final Map m) throws OpenEJBException {
-        EnterpriseBeanInfo bean = null;
+        EnterpriseBeanInfo bean;
 
         if (s.getSessionType() == SessionType.STATEFUL) {
             bean = new StatefulBeanInfo();
@@ -672,11 +705,8 @@ public class EjbJarInfoBuilder {
         } else if (s.getSessionType() == SessionType.MANAGED) {
             bean = new ManagedBeanInfo();
             final ManagedBeanInfo managed = (ManagedBeanInfo) bean;
-            if (s instanceof ManagedBean) { // this way we support managed beans in ejb-jar.xml (not in the spec but can be useful)
-                managed.hidden = ((ManagedBean) s).isHidden();
-            } else {
-                managed.hidden = true;
-            }
+            // this way we support managed beans in ejb-jar.xml (not in the spec but can be useful)
+            managed.hidden = !(s instanceof ManagedBean) || ((ManagedBean) s).isHidden();
 
             copyCallbacks(s.getPostActivate(), managed.postActivate);
             copyCallbacks(s.getPrePassivate(), managed.prePassivate);

http://git-wip-us.apache.org/repos/asf/tomee/blob/008b375b/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java b/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
index 9b60abe..456a2f9 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
@@ -278,7 +278,7 @@ public class ReadDescriptors implements DynamicDeployer {
         final Source value = getSource(module.getAltDDs().get("validation.xml"));
         if (value != null) {
             try {
-                final ValidationConfigType validationConfigType = JaxbOpenejb.unmarshal(ValidationConfigType.class, ((Source) value).get(), false);
+                final ValidationConfigType validationConfigType = JaxbOpenejb.unmarshal(ValidationConfigType.class, value.get(), false);
                 module.setValidationConfig(validationConfigType);
             } catch (final Exception e) {
                 logger.warning("can't read validation.xml to construct a validation factory, it will be ignored");
@@ -335,7 +335,7 @@ public class ReadDescriptors implements DynamicDeployer {
 
                     String filePath = "<error: could not be written>";
                     try {
-                        File tempFile = null;
+                        File tempFile;
                         try {
                             tempFile = File.createTempFile("openejb-jar-", ".xml");
                         } catch (final Throwable e) {
@@ -491,10 +491,7 @@ public class ReadDescriptors implements DynamicDeployer {
     }
 
     private static Beans mergeBeansXml(final CompositeBeans current, final Beans beans, final URL url) {
-        current.getAlternativeClasses().addAll(beans.getAlternativeClasses());
-        current.getAlternativeStereotypes().addAll(beans.getAlternativeStereotypes());
-        current.getDecorators().addAll(beans.getDecorators());
-        current.getInterceptors().addAll(beans.getInterceptors());
+        current.mergeClasses(url, beans);
         current.getScan().getExclude().addAll(beans.getScan().getExclude());
 
         // check is done here since later we lost the data of the origin

http://git-wip-us.apache.org/repos/asf/tomee/blob/008b375b/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 24e4602..f242a87 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.extensions.lifecycle.events.ContainerLifeCycleEventRuntimeInvocationTest" />
+      <class name="org.jboss.cdi.tck.tests.extensions.lifecycle.processBeanAttributes.specialization.VetoTest" />
     </classes>
   </test>
 </suite>