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 2012/12/20 02:34:59 UTC

svn commit: r1424262 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb: cdi/ core/ core/ivm/

Author: rmannibucau
Date: Thu Dec 20 01:34:58 2012
New Revision: 1424262

URL: http://svn.apache.org/viewvc?rev=1424262&view=rev
Log:
TOMEE-672 TOMEE-673 reworking cdi + ejb integration

Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.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/OptimizedLoaderService.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/BaseSessionContext.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java?rev=1424262&r1=1424261&r2=1424262&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java Thu Dec 20 01:34:58 2012
@@ -20,8 +20,6 @@ import org.apache.openejb.BeanContext;
 import org.apache.openejb.BeanType;
 import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.assembler.classic.ProxyInterfaceResolver;
-import org.apache.webbeans.component.OwbBean;
-import org.apache.webbeans.component.WebBeansType;
 import org.apache.webbeans.config.OWBLogConst;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.decorator.WebBeansDecorator;
@@ -34,7 +32,6 @@ import org.apache.webbeans.logger.WebBea
 import javax.ejb.NoSuchEJBException;
 import javax.ejb.Remove;
 import javax.enterprise.context.Dependent;
-import javax.enterprise.context.spi.Context;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.Disposes;
 import javax.enterprise.inject.Typed;
@@ -44,15 +41,12 @@ import javax.enterprise.inject.spi.Injec
 import javax.enterprise.inject.spi.SessionBeanType;
 import javax.persistence.EntityManager;
 import java.io.Serializable;
-import java.lang.annotation.Annotation;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
-import java.lang.reflect.Type;
 import java.lang.reflect.UndeclaredThrowableException;
 import java.rmi.NoSuchObjectException;
 import java.text.MessageFormat;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -200,6 +194,10 @@ public class CdiEjbBean<T> extends BaseE
             }
         }
 
+        if (!clazzes.contains(Serializable.class)) {
+            clazzes.add(Serializable.class);
+        }
+
         return clazzes;
     }
 
@@ -217,10 +215,13 @@ public class CdiEjbBean<T> extends BaseE
     @Override
     @SuppressWarnings("unchecked")
     protected T getInstance(final CreationalContext<T> creationalContext) {
+        return createEjb(creationalContext);
+
+        /*
         final T instance;
         if (scopeClass == null || Dependent.class == scopeClass) { // no need to add any layer, null = @New
             instance = createEjb(creationalContext);
-        } else {
+        } else { // only stateful normally
             final InstanceBean<T> bean = new InstanceBean<T>(this);
             if (webBeansContext.getBeanManagerImpl().isScopeTypeNormal(scopeClass)) {
                 instance = (T) webBeansContext.getProxyFactory().createNormalScopedBeanProxy(bean, creationalContext);
@@ -231,6 +232,7 @@ public class CdiEjbBean<T> extends BaseE
             bean.setOWBProxy(instance);
         }
         return instance;
+        */
     }
 
     @Override
@@ -342,7 +344,7 @@ public class CdiEjbBean<T> extends BaseE
         return toReturn;
     }
 
-    private T createEjb(final CreationalContext<T> creationalContext) {
+    protected T createEjb(final CreationalContext<T> creationalContext) {
         final List<Class> classes = beanContext.getBusinessLocalInterfaces();
         final CurrentCreationalContext currentCreationalContext = beanContext.get(CurrentCreationalContext.class);
         final CreationalContext existing = currentCreationalContext.get();
@@ -378,201 +380,7 @@ public class CdiEjbBean<T> extends BaseE
         }
     }
 
-    // does pretty much nothing
-    // used only to get a layer between our EJB proxies and OWB proxies to let them manage the scope
-    private static class InstanceBean<T> implements OwbBean<T> {
-        private final CdiEjbBean<T> bean;
-        private T OWBProxy;
-
-        public InstanceBean(final CdiEjbBean<T> tCdiEjbBean) {
-            bean = tCdiEjbBean;
-        }
-
-        @Override
-        public T createNewInstance(final CreationalContext<T> creationalContext) {
-            return create(creationalContext);
-        }
-
-        @Override
-        public void destroyCreatedInstance(final T instance, final CreationalContext<T> creationalContext) {
-            bean.destroyComponentInstance(instance, creationalContext);
-        }
-
-        @Override
-        public Set<Type> getTypes() {
-            return bean.getTypes();
-        }
-
-        @Override
-        public Set<Annotation> getQualifiers() {
-            return bean.getQualifiers();
-        }
-
-        @Override
-        public Class<? extends Annotation> getScope() {
-            return bean.getScope();
-        }
-
-        @Override
-        public String getName() {
-            return bean.getName();
-        }
-
-        @Override
-        public boolean isNullable() {
-            return bean.isNullable();
-        }
-
-        @Override
-        public Set<InjectionPoint> getInjectionPoints() {
-            return Collections.emptySet();
-        }
-
-        @Override
-        public Class<?> getBeanClass() {
-            return bean.getBeanClass();
-        }
-
-        @Override
-        public Set<Class<? extends Annotation>> getStereotypes() {
-            return bean.getStereotypes();
-        }
-
-        @Override
-        public boolean isAlternative() {
-            return bean.isAlternative();
-        }
-
-        @Override
-        public T create(final CreationalContext<T> creationalContext) {
-            final T instance = bean.createEjb(creationalContext);
-            if (OWBProxy != null && SessionBeanType.STATEFUL.equals(bean.getEjbType())) { // we need to be able to remove OWB proxy to remove (statefuls for instance)
-                bean.dependentSFSBToBeRemoved.put(System.identityHashCode(OWBProxy), instance);
-            }
-            return instance;
-        }
-
-        @Override
-        public void destroy(final T instance, final CreationalContext<T> cc) {
-            if (!SessionBeanType.STATEFUL.equals(bean.getEjbType())) {
-                return;
-            }
-
-            bean.destroy(instance, cc);
-        }
-
-        @Override
-        public void setImplScopeType(final Annotation scopeType) {
-            // no-op
-        }
-
-        @Override
-        public WebBeansType getWebBeansType() {
-            return bean.getWebBeansType();
-        }
-
-        @Override
-        public void addQualifier(final Annotation qualifier) {
-            // no-op
-        }
-
-        @Override
-        public boolean isSerializable() {
-            return bean.isSerializable();
-        }
-
-        @Override
-        public void addStereoType(final Annotation stereoType) {
-            // no-op
-        }
-
-        @Override
-        public void addApiType(final Class<?> apiType) {
-            // no-op
-        }
-
-        @Override
-        public void addInjectionPoint(final InjectionPoint injectionPoint) {
-            // no-op
-        }
-
-        @Override
-        public Set<Annotation> getOwbStereotypes() {
-            return bean.getOwbStereotypes();
-        }
-
-        @Override
-        public void setName(final String name) {
-            // no-op
-        }
-
-        @Override
-        public List<InjectionPoint> getInjectionPoint(final Member member) {
-            return Collections.emptyList();
-        }
-
-        @Override
-        public Class<T> getReturnType() {
-            return bean.getReturnType();
-        }
-
-        @Override
-        public void setSerializable(final boolean serializable) {
-            // no-op
-        }
-
-        @Override
-        public void setNullable(final boolean nullable) {
-            // no-op
-        }
-
-        @Override
-        public void setSpecializedBean(boolean specialized) {
-            // no-op
-        }
-
-        @Override
-        public boolean isSpecializedBean() {
-            return bean.isSpecializedBean();
-        }
-
-        @Override
-        public void setEnabled(boolean enabled) {
-            // no-op
-        }
-
-        @Override
-        public boolean isEnabled() {
-            return bean.isEnabled();
-        }
-
-        @Override
-        public String getId() {
-            return bean.getId();
-        }
-
-        @Override
-        public boolean isPassivationCapable() {
-            return bean.isPassivationCapable();
-        }
-
-        @Override
-        public boolean isDependent() {
-            return bean.isDependent();
-        }
-
-        @Override
-        public void validatePassivationDependencies() {
-            bean.validatePassivationDependencies();
-        }
-
-        @Override
-        public WebBeansContext getWebBeansContext() {
-            return bean.getWebBeansContext();
-        }
-
-        public void setOWBProxy(final T OWBProxy) {
-            this.OWBProxy = OWBProxy;
-        }
+    public void storeStatefulInstance(final Object proxy, final T instance) {
+        dependentSFSBToBeRemoved.put(System.identityHashCode(proxy), instance);
     }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java?rev=1424262&r1=1424261&r2=1424262&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java Thu Dec 20 01:34:58 2012
@@ -18,6 +18,8 @@ package org.apache.openejb.cdi;
 
 import org.apache.openejb.BeanContext;
 import org.apache.openejb.OpenEJBException;
+import org.apache.webbeans.component.OwbBean;
+import org.apache.webbeans.component.WebBeansType;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.config.WebBeansFinder;
 import org.apache.webbeans.portable.events.discovery.BeforeShutdownImpl;
@@ -30,15 +32,25 @@ import org.apache.webbeans.spi.plugins.O
 import org.apache.webbeans.util.WebBeansUtil;
 
 import javax.ejb.Stateful;
+import javax.enterprise.context.Dependent;
 import javax.enterprise.context.spi.Context;
 import javax.enterprise.context.spi.Contextual;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.PassivationCapable;
 import javax.enterprise.inject.spi.ProcessAnnotatedType;
+import javax.enterprise.inject.spi.SessionBeanType;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Member;
 import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
 
 
 public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPlugin, OpenWebBeansEjbPlugin {
@@ -49,6 +61,8 @@ public class CdiPlugin extends AbstractO
     private CdiAppContextsService contexsServices;
     private ClassLoader classLoader;
 
+    private final Map<Contextual<?>, Object> cacheProxies = new ConcurrentHashMap<Contextual<?>, Object>();
+
     public void setWebBeansContext(WebBeansContext webBeansContext) {
         this.webBeansContext = webBeansContext;
     }
@@ -141,14 +155,31 @@ public class CdiPlugin extends AbstractO
     }
 
     @Override
-    public Object getSessionBeanProxy(Bean<?> bean, Class<?> interfce, CreationalContext<?> creationalContext) {
-
-        final Context context = webBeansContext.getBeanManagerImpl().getContext(bean.getScope());
+    public Object getSessionBeanProxy(Bean<?> inBean, Class<?> interfce, CreationalContext<?> creationalContext) {
+        Object instance = cacheProxies.get(inBean);
+        if (instance != null) {
+            return instance;
+        }
 
+        final Class<? extends Annotation> scopeClass = inBean.getScope();
+        final CdiEjbBean<Object> cdiEjbBean = (CdiEjbBean<Object>) inBean;
         final CreationalContext<Object> cc = (CreationalContext<Object>) creationalContext;
-        final Contextual<Object> component = (Contextual<Object>) bean;
 
-        return context.get(component, cc);
+        if (scopeClass == null || Dependent.class == scopeClass) { // no need to add any layer, null = @New
+            return cdiEjbBean.createEjb(cc);
+        }
+
+        // only stateful normally
+        final InstanceBean<Object> bean = new InstanceBean<Object>(cdiEjbBean);
+        if (webBeansContext.getBeanManagerImpl().isScopeTypeNormal(scopeClass)) {
+            instance = webBeansContext.getProxyFactory().createNormalScopedBeanProxy(bean, creationalContext);
+            cacheProxies.put(inBean, instance);
+        } else {
+            final Context context = webBeansContext.getBeanManagerImpl().getContext(scopeClass);
+            instance = context.get(bean, cc);
+        }
+        bean.setOWBProxy(instance);
+        return instance;
     }
 
     @Override
@@ -209,4 +240,216 @@ public class CdiPlugin extends AbstractO
             return declaredMethod;
         }
     }
+
+    public void clearProxies() {
+        cacheProxies.clear();
+    }
+
+    // does pretty much nothing
+    // used only to get a layer between our EJB proxies and OWB proxies to let them manage the scope
+    private static class InstanceBean<T> implements OwbBean<T>, PassivationCapable {
+        private final CdiEjbBean<T> bean;
+        private T OWBProxy;
+
+        public InstanceBean(final CdiEjbBean<T> tCdiEjbBean) {
+            bean = tCdiEjbBean;
+        }
+
+        @Override
+        public T createNewInstance(final CreationalContext<T> creationalContext) {
+            return create(creationalContext);
+        }
+
+        @Override
+        public void destroyCreatedInstance(final T instance, final CreationalContext<T> creationalContext) {
+            bean.destroyComponentInstance(instance, creationalContext);
+        }
+
+        @Override
+        public Set<Type> getTypes() {
+            return bean.getTypes();
+        }
+
+        @Override
+        public Set<Annotation> getQualifiers() {
+            return bean.getQualifiers();
+        }
+
+        @Override
+        public Class<? extends Annotation> getScope() {
+            return bean.getScope();
+        }
+
+        @Override
+        public String getName() {
+            return bean.getName();
+        }
+
+        @Override
+        public boolean isNullable() {
+            return bean.isNullable();
+        }
+
+        @Override
+        public Set<InjectionPoint> getInjectionPoints() {
+            return Collections.emptySet();
+        }
+
+        @Override
+        public Class<?> getBeanClass() {
+            return bean.getBeanClass();
+        }
+
+        @Override
+        public Set<Class<? extends Annotation>> getStereotypes() {
+            return bean.getStereotypes();
+        }
+
+        @Override
+        public boolean isAlternative() {
+            return bean.isAlternative();
+        }
+
+        @Override
+        public T create(final CreationalContext<T> creationalContext) {
+            final T instance = bean.createEjb(creationalContext);
+            if (OWBProxy != null && SessionBeanType.STATEFUL.equals(bean.getEjbType())) { // we need to be able to remove OWB proxy to remove (statefuls for instance)
+                bean.storeStatefulInstance(OWBProxy, instance);
+            }
+            return instance;
+        }
+
+        @Override
+        public void destroy(final T instance, final CreationalContext<T> cc) {
+            if (!SessionBeanType.STATEFUL.equals(bean.getEjbType())) {
+                return;
+            }
+
+            bean.destroy(instance, cc);
+        }
+
+        @Override
+        public void setImplScopeType(final Annotation scopeType) {
+            // no-op
+        }
+
+        @Override
+        public WebBeansType getWebBeansType() {
+            return bean.getWebBeansType();
+        }
+
+        @Override
+        public void addQualifier(final Annotation qualifier) {
+            // no-op
+        }
+
+        @Override
+        public boolean isSerializable() {
+            return bean.isSerializable();
+        }
+
+        @Override
+        public void addStereoType(final Annotation stereoType) {
+            // no-op
+        }
+
+        @Override
+        public void addApiType(final Class<?> apiType) {
+            // no-op
+        }
+
+        @Override
+        public void addInjectionPoint(final InjectionPoint injectionPoint) {
+            // no-op
+        }
+
+        @Override
+        public Set<Annotation> getOwbStereotypes() {
+            return bean.getOwbStereotypes();
+        }
+
+        @Override
+        public void setName(final String name) {
+            // no-op
+        }
+
+        @Override
+        public List<InjectionPoint> getInjectionPoint(final Member member) {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public Class<T> getReturnType() {
+            return bean.getReturnType();
+        }
+
+        @Override
+        public void setSerializable(final boolean serializable) {
+            // no-op
+        }
+
+        @Override
+        public void setNullable(final boolean nullable) {
+            // no-op
+        }
+
+        @Override
+        public void setSpecializedBean(boolean specialized) {
+            // no-op
+        }
+
+        @Override
+        public boolean isSpecializedBean() {
+            return bean.isSpecializedBean();
+        }
+
+        @Override
+        public void setEnabled(boolean enabled) {
+            // no-op
+        }
+
+        @Override
+        public boolean isEnabled() {
+            return bean.isEnabled();
+        }
+
+        @Override
+        public String getId() {
+            return bean.getId();
+        }
+
+        @Override
+        public boolean isPassivationCapable() {
+            return bean.isPassivationCapable();
+        }
+
+        @Override
+        public boolean isDependent() {
+            return bean.isDependent();
+        }
+
+        @Override
+        public void validatePassivationDependencies() {
+            bean.validatePassivationDependencies();
+        }
+
+        @Override
+        public WebBeansContext getWebBeansContext() {
+            return bean.getWebBeansContext();
+        }
+
+        public void setOWBProxy(final T OWBProxy) {
+            this.OWBProxy = OWBProxy;
+        }
+
+        @Override
+        public boolean equals(final Object o) {
+            return this == o || bean == o;
+        }
+
+        @Override
+        public int hashCode() {
+            return bean.hashCode();
+        }
+    }
 }

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=1424262&r1=1424261&r2=1424262&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 Dec 20 01:34:58 2012
@@ -449,6 +449,7 @@ public class OpenEJBLifecycle implements
             }
 
             //Free all plugin resources
+            ((CdiPlugin) webBeansContext.getPluginLoader().getEjbPlugin()).clearProxies();
             webBeansContext.getPluginLoader().shutDown();
 
             //Clear extensions

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java?rev=1424262&r1=1424261&r2=1424262&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java Thu Dec 20 01:34:58 2012
@@ -54,7 +54,7 @@ public class OptimizedLoaderService impl
     @Override
     public <T> List<T> load(Class<T> serviceType, ClassLoader classLoader) {
         // ServiceLoader is expensive (can take up to a half second).  This is an optimization
-        if (OpenWebBeansPlugin.class.equals(serviceType)) return loadWebBeansPlugins(OptimizedLoaderService.class.getClassLoader());
+        if (OpenWebBeansPlugin.class.equals(serviceType)) return loadWebBeansPlugins(classLoader);
 
         // As far as we know, this only is reached for CDI Extension discovery
         final List<T> list = loaderService.load(serviceType, classLoader);

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/BaseSessionContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/BaseSessionContext.java?rev=1424262&r1=1424261&r2=1424262&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/BaseSessionContext.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/BaseSessionContext.java Thu Dec 20 01:34:58 2012
@@ -144,6 +144,7 @@ public abstract class BaseSessionContext
             } else {
                 List<Class> interfaces = new ArrayList<Class>();
                 interfaces.addAll(di.getInterfaces(interfaceType));
+                interfaces.add(Serializable.class);
                 interfaces.add(IntraVmProxy.class);
                 if (BeanType.STATEFUL.equals(type) || BeanType.MANAGED.equals(type)) {
                     interfaces.add(BeanContext.Removable.class);

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java?rev=1424262&r1=1424261&r2=1424262&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java Thu Dec 20 01:34:58 2012
@@ -147,8 +147,9 @@ public abstract class EjbHomeProxyHandle
                 }
                 return LocalBeanProxyFactory.newProxyInstance(handler.getBeanContext().getClassLoader(), handler, handler.getBeanContext().getBeanClass(), interfaces.toArray(new Class<?>[interfaces.size()]));
             } else {
-                List<Class> proxyInterfaces = new ArrayList<Class>(handler.getInterfaces().size() + 1);
+                List<Class> proxyInterfaces = new ArrayList<Class>(handler.getInterfaces().size() + 2);
                 proxyInterfaces.addAll(handler.getInterfaces());
+                proxyInterfaces.add(Serializable.class);
                 proxyInterfaces.add(IntraVmProxy.class);
                 if (BeanType.STATEFUL.equals(type) || BeanType.MANAGED.equals(type)) {
                     proxyInterfaces.add(BeanContext.Removable.class);