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);