Author: rmannibucau
Date: Thu May 10 17:41:19 2012
New Revision: 1336812

URL: http://svn.apache.org/viewvc?rev=1336812&view=rev
Log:
TOMEE-189 separate beanmanager of 'common classloader of ear' and the 'web 
classloader of ear'

Added:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebAppElResolver.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappWebBeansContext.java
Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CustomELAdapter.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java
    openejb/trunk/openejb/tck/cdi-tomee-embedded/src/test/resources/passing.xml
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java?rev=1336812&r1=1336811&r2=1336812&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
 Thu May 10 17:41:19 2012
@@ -142,10 +142,17 @@ public class CdiScanner implements Scann
                 }
             }
 
+            // here for ears we need to skip classes in the parent classloader
+            final ClassLoader scl = ClassLoader.getSystemClassLoader();
             for (String className : beans.managedClasses) {
                 if (ejbClasses.contains(className)) continue;
                 final Class clazz = load(className, classLoader);
-                if (clazz != null) { // can happen in standalone
+                if (clazz == null) {
+                    continue;
+                }
+
+                final ClassLoader cl = clazz.getClassLoader();
+                if (classLoader.equals(cl) || cl.equals(scl)) {
                     classes.add(clazz);
                 }
             }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CustomELAdapter.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CustomELAdapter.java?rev=1336812&r1=1336811&r2=1336812&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CustomELAdapter.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CustomELAdapter.java
 Thu May 10 17:41:19 2012
@@ -17,6 +17,7 @@
 package org.apache.openejb.cdi;
 
 import org.apache.openejb.AppContext;
+import org.apache.openejb.core.WebContext;
 import org.apache.webbeans.el.WebBeansELResolver;
 import org.apache.webbeans.el.WrappedExpressionFactory;
 import org.apache.webbeans.spi.adaptor.ELAdaptor;
@@ -30,10 +31,15 @@ import javax.el.ExpressionFactory;
 public class CustomELAdapter implements ELAdaptor {
 
     private final AppContext appContext;
+    private final WebContext webContext;
 
     public CustomELAdapter(AppContext appContext) {
-        this.appContext = appContext;
+        this(appContext, null);
+    }
 
+    public CustomELAdapter(AppContext appContext, WebContext webContext) {
+        this.appContext = appContext;
+        this.webContext = webContext;
     }
 
     @Override

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java?rev=1336812&r1=1336811&r2=1336812&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
 Thu May 10 17:41:19 2012
@@ -226,53 +226,57 @@ public class OpenEJBLifecycle implements
             //Discover classpath classes
             deployManagedBeans(scannerService.getBeanClasses(), 
stuff.getBeanContexts());
 
-            for (BeanContext beanContext : stuff.getBeanContexts()) {
-                if (!beanContext.getComponentType().isCdiCompatible()) 
continue;
+            boolean deployEjb = stuff.getWebContext() == null;
 
-                final Class implClass = beanContext.getManagedClass();
+            if (deployEjb) {
+                for (BeanContext beanContext : stuff.getBeanContexts()) {
+                    if (!beanContext.getComponentType().isCdiCompatible()) 
continue;
 
-                //Define annotation type
-                AnnotatedType<?> annotatedType = 
webBeansContext.getAnnotatedElementFactory().newAnnotatedType(implClass);
+                    final Class implClass = beanContext.getManagedClass();
 
-                //Fires ProcessAnnotatedType
-                ProcessAnnotatedTypeImpl<?> processAnnotatedEvent = 
webBeansContext.getWebBeansUtil().fireProcessAnnotatedTypeEvent(annotatedType);
+                    //Define annotation type
+                    AnnotatedType<?> annotatedType = 
webBeansContext.getAnnotatedElementFactory().newAnnotatedType(implClass);
 
-                // TODO Can you really veto an EJB?
-                //if veto() is called
-                if (processAnnotatedEvent.isVeto()) {
-                    continue;
-                }
+                    //Fires ProcessAnnotatedType
+                    ProcessAnnotatedTypeImpl<?> processAnnotatedEvent = 
webBeansContext.getWebBeansUtil().fireProcessAnnotatedTypeEvent(annotatedType);
+
+                    // TODO Can you really veto an EJB?
+                    //if veto() is called
+                    if (processAnnotatedEvent.isVeto()) {
+                        continue;
+                    }
 
-                CdiEjbBean<Object> bean = new CdiEjbBean<Object>(beanContext, 
webBeansContext);
+                    CdiEjbBean<Object> bean = new 
CdiEjbBean<Object>(beanContext, webBeansContext);
 
-                beanContext.set(CdiEjbBean.class, bean);
-                beanContext.set(CurrentCreationalContext.class, new 
CurrentCreationalContext());
-                beanContext.addSystemInterceptor(new CdiInterceptor(bean, 
beanManager, cdiPlugin.getContexsServices()));
+                    beanContext.set(CdiEjbBean.class, bean);
+                    beanContext.set(CurrentCreationalContext.class, new 
CurrentCreationalContext());
+                    beanContext.addSystemInterceptor(new CdiInterceptor(bean, 
beanManager, cdiPlugin.getContexsServices()));
 
-                EjbUtility.fireEvents((Class<Object>) implClass, bean, 
(ProcessAnnotatedTypeImpl<Object>) processAnnotatedEvent);
+                    EjbUtility.fireEvents((Class<Object>) implClass, bean, 
(ProcessAnnotatedTypeImpl<Object>) processAnnotatedEvent);
 
-                
webBeansContext.getWebBeansUtil().setInjectionTargetBeanEnableFlag(bean);
+                    
webBeansContext.getWebBeansUtil().setInjectionTargetBeanEnableFlag(bean);
 
-                Class clazz = beanContext.getBeanClass();
-                while (clazz.isAnnotationPresent(Specializes.class)) {
-                    clazz = clazz.getSuperclass();
+                    Class clazz = beanContext.getBeanClass();
+                    while (clazz.isAnnotationPresent(Specializes.class)) {
+                        clazz = clazz.getSuperclass();
 
-                    if (clazz == null || Object.class.equals(clazz)) break;
+                        if (clazz == null || Object.class.equals(clazz)) break;
 
-                    final CdiEjbBean<Object> superBean = new 
CdiEjbBean<Object>(beanContext, webBeansContext, clazz);
+                        final CdiEjbBean<Object> superBean = new 
CdiEjbBean<Object>(beanContext, webBeansContext, clazz);
 
-                    EjbBeanCreatorImpl<?> ejbBeanCreator = new 
EjbBeanCreatorImpl(superBean);
+                        EjbBeanCreatorImpl<?> ejbBeanCreator = new 
EjbBeanCreatorImpl(superBean);
 
-                    //Define meta-data
-                    ejbBeanCreator.defineSerializable();
-                    ejbBeanCreator.defineStereoTypes();
-                    ejbBeanCreator.defineScopeType("Session Bean 
implementation class : " + clazz.getName() + " stereotypes must declare same 
@ScopeType annotations", false);
-                    ejbBeanCreator.defineQualifier();
-                    
ejbBeanCreator.defineName(WebBeansUtil.getManagedBeanDefaultName(clazz.getSimpleName()));
+                        //Define meta-data
+                        ejbBeanCreator.defineSerializable();
+                        ejbBeanCreator.defineStereoTypes();
+                        ejbBeanCreator.defineScopeType("Session Bean 
implementation class : " + clazz.getName() + " stereotypes must declare same 
@ScopeType annotations", false);
+                        ejbBeanCreator.defineQualifier();
+                        
ejbBeanCreator.defineName(WebBeansUtil.getManagedBeanDefaultName(clazz.getSimpleName()));
 
-                    bean.specialize(superBean);
+                        bean.specialize(superBean);
 
-                    EjbUtility.defineSpecializedData(clazz, bean);
+                        EjbUtility.defineSpecializedData(clazz, bean);
+                    }
                 }
             }
 
@@ -285,39 +289,43 @@ public class OpenEJBLifecycle implements
             //Validate injection Points
             deployer.validateInjectionPoints();
 
-            for (BeanContext beanContext : stuff.getBeanContexts()) {
-                if (!beanContext.getComponentType().isSession() || 
beanContext.isDynamicallyImplemented()) continue;
-                final CdiEjbBean bean = beanContext.get(CdiEjbBean.class);
-
-                // The interceptor stack is empty until 
validateInjectionPoints is called as it does more than validate.
-                final List<InterceptorData> datas = bean.getInterceptorStack();
-
-                final 
List<org.apache.openejb.core.interceptor.InterceptorData> converted = new 
ArrayList<org.apache.openejb.core.interceptor.InterceptorData>();
-                for (InterceptorData data : datas) {
-                    // todo this needs to use the code in 
InterceptorBindingBuilder that respects override rules and private methods
-                    final org.apache.openejb.core.interceptor.InterceptorData 
openejbData = 
org.apache.openejb.core.interceptor.InterceptorData.scan(data.getInterceptorClass());
-                    if (data.isDefinedInMethod()) {
-                        final Method method = 
data.getInterceptorBindingMethod();
-                        beanContext.addCdiMethodInterceptor(method, 
openejbData);
-                    } else {
-                        converted.add(openejbData);
+            if (deployEjb) {
+                for (BeanContext beanContext : stuff.getBeanContexts()) {
+                    if (!beanContext.getComponentType().isSession() || 
beanContext.isDynamicallyImplemented()) continue;
+                    final CdiEjbBean bean = beanContext.get(CdiEjbBean.class);
+
+                    // The interceptor stack is empty until 
validateInjectionPoints is called as it does more than validate.
+                    final List<InterceptorData> datas = 
bean.getInterceptorStack();
+
+                    final 
List<org.apache.openejb.core.interceptor.InterceptorData> converted = new 
ArrayList<org.apache.openejb.core.interceptor.InterceptorData>();
+                    for (InterceptorData data : datas) {
+                        // todo this needs to use the code in 
InterceptorBindingBuilder that respects override rules and private methods
+                        final 
org.apache.openejb.core.interceptor.InterceptorData openejbData = 
org.apache.openejb.core.interceptor.InterceptorData.scan(data.getInterceptorClass());
+                        if (data.isDefinedInMethod()) {
+                            final Method method = 
data.getInterceptorBindingMethod();
+                            beanContext.addCdiMethodInterceptor(method, 
openejbData);
+                        } else {
+                            converted.add(openejbData);
+                        }
                     }
-                }
 
-                beanContext.setCdiInterceptors(converted);
+                    beanContext.setCdiInterceptors(converted);
+                }
             }
 
             //Fire Event
             deployer.fireAfterDeploymentValidationEvent();
 
-            for (BeanContext beanContext : stuff.getBeanContexts()) {
+            if (deployEjb) {
+                for (BeanContext beanContext : stuff.getBeanContexts()) {
 
-                final CdiEjbBean<Object> bean = 
beanContext.get(CdiEjbBean.class);;
+                    final CdiEjbBean<Object> bean = 
beanContext.get(CdiEjbBean.class);;
 
-                if (bean == null) continue;
+                    if (bean == null) continue;
 
-                final BeanManagerImpl manager = 
webBeansContext.getBeanManagerImpl();
-                manager.addBean(new NewCdiEjbBean<Object>(bean));
+                    final BeanManagerImpl manager = 
webBeansContext.getBeanManagerImpl();
+                    manager.addBean(new NewCdiEjbBean<Object>(bean));
+                }
             }
 
         } catch (Exception e1) {

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java?rev=1336812&r1=1336811&r2=1336812&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
 Thu May 10 17:41:19 2012
@@ -81,7 +81,11 @@ public class ThreadSingletonServiceImpl 
 
         services.put(AppContext.class, appContext);
         services.put(TransactionService.class, new 
OpenEJBTransactionService());
-        services.put(ELAdaptor.class,new CustomELAdapter(appContext));
+        if (startupObject.getWebContext() == null) {
+            services.put(ELAdaptor.class,new CustomELAdapter(appContext));
+        } else {
+            services.put(ELAdaptor.class,new CustomELAdapter(appContext, 
startupObject.getWebContext()));
+        }
         services.put(ContextsService.class, new CdiAppContextsService(true));
         services.put(ResourceInjectionService.class, new 
CdiResourceInjectionService());
         services.put(ScannerService.class, new CdiScanner());
@@ -100,8 +104,14 @@ public class ThreadSingletonServiceImpl 
         WebBeansContext webBeansContext;
         Object old = null;
         try {
-            webBeansContext = new WebBeansContext(services, properties);
-            appContext.set(WebBeansContext.class, webBeansContext);
+            if (startupObject.getWebContext() == null) {
+                webBeansContext = new WebBeansContext(services, properties);
+                appContext.set(WebBeansContext.class, webBeansContext);
+            } else {
+                webBeansContext = new WebappWebBeansContext(services, 
properties, appContext.getWebBeansContext());
+                
startupObject.getWebContext().setWebbeansContext(webBeansContext);
+            }
+
             old = contextEntered(webBeansContext);
             setConfiguration(webBeansContext.getOpenWebBeansConfiguration());
             try {

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebAppElResolver.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebAppElResolver.java?rev=1336812&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebAppElResolver.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebAppElResolver.java
 Thu May 10 17:41:19 2012
@@ -0,0 +1,57 @@
+package org.apache.openejb.cdi;
+
+import java.beans.FeatureDescriptor;
+import java.util.Iterator;
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.ELResolver;
+import javax.el.PropertyNotFoundException;
+import javax.el.PropertyNotWritableException;
+
+public class WebAppElResolver extends ELResolver {
+    private final ELResolver parent;
+    private final ELResolver resolver;
+
+    public WebAppElResolver(ELResolver elResolver, ELResolver elResolver1) {
+        resolver = elResolver;
+        parent = elResolver1;
+    }
+
+    @Override
+    public Object getValue(ELContext context, Object base, Object property) 
throws NullPointerException, PropertyNotFoundException, ELException {
+        Object value = resolver.getValue(context, base, property);
+        if (value == null) {
+            value = parent.getValue(context, base, property);
+        }
+        return value;
+    }
+
+    @Override
+    public Class<?> getType(ELContext context, Object base, Object property) 
throws NullPointerException, PropertyNotFoundException, ELException {
+        Class<?> value = resolver.getType(context, base, property);
+        if (value == null) {
+            value = parent.getType(context, base, property);
+        }
+        return value;
+    }
+
+    @Override
+    public void setValue(ELContext context, Object base, Object property, 
Object value) throws NullPointerException, PropertyNotFoundException, 
PropertyNotWritableException, ELException {
+        // no-op
+    }
+
+    @Override
+    public boolean isReadOnly(ELContext context, Object base, Object property) 
throws NullPointerException, PropertyNotFoundException, ELException {
+        return false;
+    }
+
+    @Override
+    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext 
context, Object base) {
+        return null;
+    }
+
+    @Override
+    public Class<?> getCommonPropertyType(ELContext context, Object base) {
+        return null;
+    }
+}

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java?rev=1336812&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
 Thu May 10 17:41:19 2012
@@ -0,0 +1,317 @@
+package org.apache.openejb.cdi;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.el.ELResolver;
+import javax.el.ExpressionFactory;
+import javax.enterprise.context.spi.Context;
+import javax.enterprise.context.spi.Contextual;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.Decorator;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.InjectionTarget;
+import javax.enterprise.inject.spi.InterceptionType;
+import javax.enterprise.inject.spi.Interceptor;
+import javax.enterprise.inject.spi.ObserverMethod;
+import org.apache.webbeans.container.BeanManagerImpl;
+
+public class WebappBeanManager extends BeanManagerImpl {
+    private final WebappWebBeansContext webappCtx;
+
+    public WebappBeanManager(WebappWebBeansContext ctx) {
+        super(ctx);
+        webappCtx = ctx;
+    }
+
+    @Override
+    public Object getReference(Bean<?> bean, Type beanType, 
CreationalContext<?> ctx) {
+        try {
+            return super.getReference(bean, beanType, ctx);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().getReference(bean, beanType, ctx);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public Object getInjectableReference(InjectionPoint injectionPoint, 
CreationalContext<?> ctx) {
+        try {
+            return super.getInjectableReference(injectionPoint, ctx);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().getInjectableReference(injectionPoint, 
ctx);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public <T> CreationalContext<T> createCreationalContext(Contextual<T> 
contextual) {
+        try {
+            return super.createCreationalContext(contextual);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().createCreationalContext(contextual);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public Set<Bean<?>> getBeans(Type beanType, Annotation... qualifiers) {
+        final Set<Bean<?>> beans = new HashSet<Bean<?>>();
+        beans.addAll(super.getBeans(beanType, qualifiers));
+        beans.addAll(getParentBm().getBeans(beanType, qualifiers));
+        return beans;
+    }
+
+    @Override
+    public Set<Bean<?>> getBeans(String name) {
+        final Set<Bean<?>> beans = new HashSet<Bean<?>>();
+        beans.addAll(super.getBeans(name));
+        beans.addAll(getParentBm().getBeans(name));
+        return beans;
+    }
+
+    @Override
+    public Bean<?> getPassivationCapableBean(String id) {
+        try {
+            return super.getPassivationCapableBean(id);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().getPassivationCapableBean(id);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public <X> Bean<? extends X> resolve(Set<Bean<? extends X>> beans) {
+        try {
+            return super.resolve(beans);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().resolve(beans);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public void fireEvent(Object event, Annotation... qualifiers) {
+        try {
+            super.fireEvent(event, qualifiers);
+        } catch (RuntimeException e) {
+            try {
+                getParentBm().fireEvent(event, qualifiers);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, 
Annotation... qualifiers) {
+        final Set<ObserverMethod<? super T>> mtds = new 
HashSet<ObserverMethod<? super T>>();
+        mtds.addAll(super.resolveObserverMethods(event, qualifiers));
+        mtds.addAll(getParentBm().resolveObserverMethods(event, qualifiers));
+        return mtds;
+    }
+
+    @Override
+    public List<Decorator<?>> resolveDecorators(Set<Type> types, Annotation... 
qualifiers) {
+        final List<Decorator<?>> decorators = new ArrayList<Decorator<?>>();
+        decorators.addAll(super.resolveDecorators(types, qualifiers));
+        decorators.addAll(getParentBm().resolveDecorators(types, qualifiers));
+        return decorators;
+    }
+
+    @Override
+    public List<Interceptor<?>> resolveInterceptors(InterceptionType type, 
Annotation... qualifiers) {
+        final List<Interceptor<?>> interceptors = new 
ArrayList<Interceptor<?>>();
+        interceptors.addAll(super.resolveInterceptors(type, qualifiers));
+        interceptors.addAll(getParentBm().resolveInterceptors(type, 
qualifiers));
+        return interceptors;
+    }
+
+    @Override
+    public void validate(InjectionPoint injectionPoint) {
+        try {
+            super.validate(injectionPoint);
+        } catch (RuntimeException e) {
+            try {
+                getParentBm().validate(injectionPoint);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public boolean isScope(Class<? extends Annotation> annotationType) {
+        try {
+            return super.isScope(annotationType);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().isScope(annotationType);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public boolean isNormalScope(Class<? extends Annotation> annotationType) {
+        try {
+            return super.isNormalScope(annotationType);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().isNormalScope(annotationType);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public boolean isPassivatingScope(Class<? extends Annotation> 
annotationType) {
+        try {
+            return super.isPassivatingScope(annotationType);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().isPassivatingScope(annotationType);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+
+    @Override
+    public boolean isQualifier(Class<? extends Annotation> annotationType) {
+        try {
+            return super.isQualifier(annotationType);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().isQualifier(annotationType);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public boolean isInterceptorBinding(Class<? extends Annotation> 
annotationType) {
+        try {
+            return super.isInterceptorBinding(annotationType);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().isInterceptorBinding(annotationType);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+
+    @Override
+    public boolean isStereotype(Class<? extends Annotation> annotationType) {
+        try {
+            return super.isStereotype(annotationType);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().isStereotype(annotationType);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public Set<Annotation> getInterceptorBindingDefinition(Class<? extends 
Annotation> qualifier) {
+        try {
+            return super.getInterceptorBindingDefinition(qualifier);
+        } catch (RuntimeException e) {
+            try {
+                return 
getParentBm().getInterceptorBindingDefinition(qualifier);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public Set<Annotation> getStereotypeDefinition(Class<? extends Annotation> 
stereotype) {
+        final Set<Annotation> mtds = new HashSet<Annotation>();
+        mtds.addAll(super.getStereotypeDefinition(stereotype));
+        mtds.addAll(getParentBm().getStereotypeDefinition(stereotype));
+        return mtds;
+    }
+
+    @Override
+    public Context getContext(Class<? extends Annotation> scope) {
+        try {
+            return super.getContext(scope);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().getContext(scope);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public ELResolver getELResolver() {
+        return new WebAppElResolver(super.getELResolver(), 
getParentBm().getELResolver());
+    }
+
+    @Override
+    public <T> AnnotatedType<T> createAnnotatedType(Class<T> type) {
+        try {
+            return super.createAnnotatedType(type);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().createAnnotatedType(type);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public <T> InjectionTarget<T> createInjectionTarget(AnnotatedType<T> type) 
{
+        try {
+            return super.createInjectionTarget(type);
+        } catch (RuntimeException e) {
+            try {
+                return getParentBm().createInjectionTarget(type);
+            } catch (RuntimeException ignored) {
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public ExpressionFactory wrapExpressionFactory(javax.el.ExpressionFactory 
expressionFactory) {
+        return 
super.wrapExpressionFactory(getParentBm().wrapExpressionFactory(expressionFactory));
+    }
+
+    public BeanManager getParentBm() {
+        return webappCtx.getParent().getBeanManagerImpl();
+    }
+}

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappWebBeansContext.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappWebBeansContext.java?rev=1336812&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappWebBeansContext.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappWebBeansContext.java
 Thu May 10 17:41:19 2012
@@ -0,0 +1,28 @@
+package org.apache.openejb.cdi;
+
+import java.util.Map;
+import java.util.Properties;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.container.BeanManagerImpl;
+
+public class WebappWebBeansContext extends WebBeansContext {
+    private WebBeansContext parent;
+    private BeanManagerImpl bm;
+
+    public WebappWebBeansContext(Map<Class<?>, Object> services, Properties 
properties, WebBeansContext webBeansContext) {
+        super(services, properties);
+        parent = webBeansContext;
+    }
+
+    @Override
+    public BeanManagerImpl getBeanManagerImpl() {
+        if (bm == null) { // should be done in the constructor
+            bm = new WebappBeanManager(this);
+        }
+        return bm;
+    }
+
+    public WebBeansContext getParent() {
+        return parent;
+    }
+}

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java?rev=1336812&r1=1336811&r2=1336812&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java
 Thu May 10 17:41:19 2012
@@ -39,6 +39,7 @@ public class WebContext {
     private Context jndiEnc;
     private final AppContext appContext;
     private Map<String,Object> bindings;
+    private WebBeansContext webbeansContext;
 
     public Context getInitialContext() {
         if (initialContext != null) return initialContext;
@@ -175,4 +176,12 @@ public class WebContext {
     public Map<String, Object> getBindings() {
         return bindings;
     }
+
+    public void setWebbeansContext(WebBeansContext webbeansContext) {
+        this.webbeansContext = webbeansContext;
+    }
+
+    public WebBeansContext getWebbeansContext() {
+        return webbeansContext;
+    }
 }

Modified: 
openejb/trunk/openejb/tck/cdi-tomee-embedded/src/test/resources/passing.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tck/cdi-tomee-embedded/src/test/resources/passing.xml?rev=1336812&r1=1336811&r2=1336812&view=diff
==============================================================================
--- openejb/trunk/openejb/tck/cdi-tomee-embedded/src/test/resources/passing.xml 
(original)
+++ openejb/trunk/openejb/tck/cdi-tomee-embedded/src/test/resources/passing.xml 
Thu May 10 17:41:19 2012
@@ -18,7 +18,11 @@
 <suite name="CDI TCK" verbose="0">
   <test name="CDI TCK">
     <classes>
+      <class 
name="org.jboss.jsr299.tck.tests.extensions.container.event.ContainerEventTest" 
/>
+      <!--
       <class 
name="org.jboss.jsr299.tck.tests.deployment.packaging.bundledLibrary.LibraryInEarTest"/>
+      <class 
name="org.jboss.jsr299.tck.tests.context.application.ejb.ApplicationContextSharedTest"
 />
+      -->
     </classes>
   </test>
 </suite>

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1336812&r1=1336811&r2=1336812&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 Thu May 10 17:41:19 2012
@@ -902,10 +902,17 @@ public class TomcatWebAppBuilder impleme
 
         if (appContext == null) return null;
 
-        final WebBeansContext webBeansContext = 
appContext.getWebBeansContext();
+        WebBeansContext webBeansContext = appContext.getWebBeansContext();
 
         if (webBeansContext == null) return null;
 
+        for (WebContext web : appContext.getWebContexts()) {
+            if (contextInfo.standardContext.getName().equals(web.getId())) {
+                webBeansContext = web.getWebbeansContext();
+                break;
+            }
+        }
+
         return new WebBeansListener(webBeansContext);
     }
 


Reply via email to