You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ge...@apache.org on 2010/08/15 22:25:32 UTC
svn commit: r985746 - in /openwebbeans/trunk:
webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/
webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/
webbeans-openejb/src/main/java/org/apache/webbeans/ejb/ webbeans-openejb/...
Author: gerdogdu
Date: Sun Aug 15 20:25:31 2010
New Revision: 985746
URL: http://svn.apache.org/viewvc?rev=985746&view=rev
Log:
[OWB-439] EjbPlugin session bean proxy creation thread safe problem
Modified:
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/BaseEjbBean.java
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbDefinitionUtility.java
openwebbeans/trunk/webbeans-openejb/src/main/java/org/apache/webbeans/ejb/EjbPlugin.java
openwebbeans/trunk/webbeans-openejb/src/main/java/org/apache/webbeans/ejb/component/OpenEjbBean.java
Modified: openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/BaseEjbBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/BaseEjbBean.java?rev=985746&r1=985745&r2=985746&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/BaseEjbBean.java (original)
+++ openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/BaseEjbBean.java Sun Aug 15 20:25:31 2010
@@ -40,10 +40,7 @@ import org.apache.webbeans.util.ClassUti
public abstract class BaseEjbBean<T> extends AbstractInjectionTargetBean<T> implements EnterpriseBeanMarker
{
/**Session bean type*/
- protected SessionBeanType ejbType;
-
- /**Injected reference local interface type*/
- protected Class<?> iface = null;
+ protected final SessionBeanType ejbType;
/** Map of proxy instances to the dependent SFSB they've acquired but not yet removed */
private Map<Object, Object> dependentSFSBToBeRemoved = new ConcurrentHashMap<Object, Object>();
@@ -52,28 +49,18 @@ public abstract class BaseEjbBean<T> ext
* Creates a new instance of the session bean.
* @param ejbClassType ebj class type
*/
- public BaseEjbBean(Class<T> ejbClassType)
+ public BaseEjbBean(Class<T> ejbClassType, SessionBeanType type)
{
super(WebBeansType.ENTERPRISE,ejbClassType);
-
+
+ //type of the ejb
+ this.ejbType = type;
+
//Setting inherited meta data instance
setInheritedMetaData();
}
- /**
- * Sets local interface type.
- * @param iface local interface type
- */
- public void setIface(Class<?> iface)
- {
- this.iface = iface;
- }
-
- public Class<?> getIface()
- {
- return this.iface;
- }
-
+
/**
* {@inheritDoc}
*/
@@ -157,15 +144,6 @@ public abstract class BaseEjbBean<T> ext
}
}
- /**
- * Sets session bean type.
- * @param type session bean type
- */
- public void setEjbType(SessionBeanType type)
- {
- this.ejbType = type;
-
- }
/**
* Subclasses can override this.
Modified: openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbDefinitionUtility.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbDefinitionUtility.java?rev=985746&r1=985745&r2=985746&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbDefinitionUtility.java (original)
+++ openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbDefinitionUtility.java Sun Aug 15 20:25:31 2010
@@ -47,14 +47,12 @@ public final class EjbDefinitionUtility
creator.defineApiType();
}
- @SuppressWarnings({"unchecked","deprecation"})
+ @SuppressWarnings({"unchecked"})
public static <T> T defineEjbBeanProxy(BaseEjbBean<T> bean, Class<?> iface, CreationalContext<?> creationalContext)
{
try
{
- T proxyInstance = null;
- bean.setIface(iface);
-
+ T proxyInstance = null;
Class<?> clazz = JavassistProxyFactory.getInstance().getEjbBeanProxyClass(bean);
if(clazz == null)
{
@@ -64,6 +62,7 @@ public final class EjbDefinitionUtility
}
proxyInstance = (T) ClassUtil.newInstance(clazz);
+
EjbBeanProxyHandler handler = new EjbBeanProxyHandler(bean, creationalContext);
((ProxyObject)proxyInstance).setHandler(handler);
Modified: openwebbeans/trunk/webbeans-openejb/src/main/java/org/apache/webbeans/ejb/EjbPlugin.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-openejb/src/main/java/org/apache/webbeans/ejb/EjbPlugin.java?rev=985746&r1=985745&r2=985746&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-openejb/src/main/java/org/apache/webbeans/ejb/EjbPlugin.java (original)
+++ openwebbeans/trunk/webbeans-openejb/src/main/java/org/apache/webbeans/ejb/EjbPlugin.java Sun Aug 15 20:25:31 2010
@@ -318,9 +318,8 @@ public class EjbPlugin extends AbstractO
throw new IllegalArgumentException("Illegal EJB type with class : " + clazz.getName());
}
- OpenEjbBean<T> bean = new OpenEjbBean<T>(clazz);
+ OpenEjbBean<T> bean = new OpenEjbBean<T>(clazz, type);
bean.setDeploymentInfo(info);
- bean.setEjbType(type);
EjbUtility.fireEvents(clazz, bean, processAnnotatedTypeEvent);
Modified: openwebbeans/trunk/webbeans-openejb/src/main/java/org/apache/webbeans/ejb/component/OpenEjbBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-openejb/src/main/java/org/apache/webbeans/ejb/component/OpenEjbBean.java?rev=985746&r1=985745&r2=985746&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-openejb/src/main/java/org/apache/webbeans/ejb/component/OpenEjbBean.java (original)
+++ openwebbeans/trunk/webbeans-openejb/src/main/java/org/apache/webbeans/ejb/component/OpenEjbBean.java Sun Aug 15 20:25:31 2010
@@ -24,14 +24,13 @@ import java.util.List;
import javax.ejb.Remove;
import javax.enterprise.context.spi.CreationalContext;
-import javax.naming.Context;
-import javax.naming.NamingException;
+import javax.enterprise.inject.spi.SessionBeanType;
import org.apache.openejb.DeploymentInfo;
import org.apache.openejb.InterfaceType;
-import org.apache.openejb.assembler.classic.JndiBuilder;
-import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.spi.ContainerSystem;
+import org.apache.openejb.DeploymentInfo.BusinessLocalHome;
+import org.apache.openejb.core.CoreDeploymentInfo;
+import org.apache.openejb.core.ivm.EjbHomeProxyHandler;
import org.apache.webbeans.ejb.common.component.BaseEjbBean;
/**
@@ -48,9 +47,9 @@ public class OpenEjbBean<T> extends Base
* Creates a new instance of the session bean.
* @param ejbClassType ebj class type
*/
- public OpenEjbBean(Class<T> ejbClassType)
+ public OpenEjbBean(Class<T> ejbClassType, SessionBeanType type)
{
- super(ejbClassType);
+ super(ejbClassType, type);
}
/**
@@ -78,36 +77,14 @@ public class OpenEjbBean<T> extends Base
@SuppressWarnings("unchecked")
protected T getInstance(CreationalContext<T> creationalContext)
{
- T instance = null;
-
- ContainerSystem containerSystem = SystemInstance.get().getComponent(ContainerSystem.class);
- Context jndiContext = containerSystem.getJNDIContext();
- DeploymentInfo deploymentInfo = this.getDeploymentInfo();
- try
+ List<Class> interfaces = new ArrayList<Class>();
+ for(Class clazz : getBusinessLocalInterfaces())
{
- if(iface != null)
- {
- InterfaceType type = deploymentInfo.getInterfaceType(iface);
- if(!type.equals(InterfaceType.BUSINESS_LOCAL))
- {
- throw new IllegalArgumentException("Interface type is not legal business local interface for session bean class : " + getReturnType().getName());
- }
- }
- else
- {
- iface = this.deploymentInfo.getBusinessLocalInterface();
- }
-
- String jndiName = "java:openejb/Deployment/" + JndiBuilder.format(deploymentInfo.getDeploymentID(), this.iface.getName());
- instance = (T)this.iface.cast(jndiContext.lookup(jndiName));
-
+ interfaces.add(clazz);
}
- catch(NamingException e)
- {
- throw new RuntimeException(e);
- }
-
- return instance;
+
+ BusinessLocalHome home = getBusinessLocalHome(interfaces);
+ return (T)home.create();
}
@@ -194,4 +171,29 @@ public class OpenEjbBean<T> extends Base
return toReturn;
}
+ @SuppressWarnings("unchecked")
+ private BusinessLocalHome getBusinessLocalHome(List<Class> interfaces)
+ {
+ if (getBusinessLocalInterfaces().size() == 0)
+ {
+ throw new IllegalStateException("This component has no business local interfaces: "
+ + ((CoreDeploymentInfo)this.deploymentInfo).getDeploymentID());
+ }
+
+ if (interfaces.size() == 0)
+ {
+ throw new IllegalArgumentException("No interface classes were specified");
+ }
+
+ for (Class<?> clazz : interfaces)
+ {
+ if (!getBusinessLocalInterfaces().contains(clazz))
+ {
+ throw new IllegalArgumentException("Not a business interface of this bean:" + clazz.getName());
+ }
+ }
+
+ return (BusinessLocalHome) EjbHomeProxyHandler.createHomeProxy(this.deploymentInfo, InterfaceType.BUSINESS_LOCAL_HOME, interfaces);
+ }
+
}
\ No newline at end of file