You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by Romain Manni-Bucau <rm...@gmail.com> on 2012/07/05 14:37:46 UTC
Re: svn commit: r1357576 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb:
BeanContext.java core/singleton/SingletonContainer.java
Hi Andy,
any part of the spec?
@Lock is relevant only for singleton no? so why checking views?
- Romain
2012/7/5 <an...@apache.org>
> Author: andygumbrecht
> Date: Thu Jul 5 12:25:51 2012
> New Revision: 1357576
>
> URL: http://svn.apache.org/viewvc?rev=1357576&view=rev
> Log:
> Fix hard coded LockType.WRITE.
>
> If a @Singleton bean class or interface was defined as
> @Lock(LockType.READ) rather than @Lock(LockType.WRITE) then this was being
> ignored for methods of that class.
>
> Modified:
>
> openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
>
> openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
>
> Modified:
> openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1357576&r1=1357575&r2=1357576&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
> (original)
> +++
> openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
> Thu Jul 5 12:25:51 2012
> @@ -16,7 +16,6 @@
> */
> package org.apache.openejb;
>
> -import java.util.LinkedHashMap;
> import org.apache.openejb.assembler.classic.ProxyInterfaceResolver;
> import org.apache.openejb.cdi.CdiEjbBean;
> import org.apache.openejb.cdi.ConstructorInjectionBean;
> @@ -26,7 +25,6 @@ import org.apache.openejb.core.InstanceC
> import org.apache.openejb.core.Operation;
> import org.apache.openejb.core.ThreadContext;
> import org.apache.openejb.core.cmp.KeyGenerator;
> -import org.apache.openejb.core.interceptor.Interceptor;
> import org.apache.openejb.core.interceptor.InterceptorData;
> import org.apache.openejb.core.interceptor.InterceptorInstance;
> import org.apache.openejb.core.interceptor.InterceptorStack;
> @@ -37,7 +35,6 @@ import org.apache.openejb.core.transacti
> import org.apache.openejb.core.transaction.TransactionPolicyFactory;
> import org.apache.openejb.core.transaction.TransactionType;
> import org.apache.openejb.loader.SystemInstance;
> -import org.apache.openejb.monitoring.StatsInterceptor;
> import org.apache.openejb.util.Duration;
> import org.apache.openejb.util.Index;
> import org.apache.openejb.util.LogCategory;
> @@ -55,6 +52,7 @@ import javax.ejb.EJBHome;
> import javax.ejb.EJBLocalHome;
> import javax.ejb.EJBLocalObject;
> import javax.ejb.EJBObject;
> +import javax.ejb.Lock;
> import javax.ejb.LockType;
> import javax.ejb.MessageDrivenBean;
> import javax.ejb.TimedObject;
> @@ -67,21 +65,13 @@ import javax.persistence.EntityManagerFa
> import java.lang.reflect.InvocationHandler;
> import java.lang.reflect.Method;
> import java.lang.reflect.Modifier;
> -import java.util.ArrayList;
> -import java.util.HashMap;
> -import java.util.HashSet;
> -import java.util.Iterator;
> -import java.util.LinkedHashSet;
> -import java.util.List;
> -import java.util.Map;
> +import java.util.*;
> import java.util.Map.Entry;
> -import java.util.Set;
> -import java.util.TreeSet;
> import java.util.concurrent.Future;
>
>
> public class BeanContext extends DeploymentContext {
> - private Logger logger = Logger.getInstance(LogCategory.OPENEJB,
> BeanContext.class);
> + private static final Logger logger =
> Logger.getInstance(LogCategory.OPENEJB, BeanContext.class);
>
> public static final String USER_INTERCEPTOR_KEY =
> "org.apache.openejb.default.system.interceptors";
> public static final String USER_INTERCEPTOR_SEPARATOR = ",| |;";
> @@ -122,7 +112,7 @@ public class BeanContext extends Deploym
> return module + "." + Comp.class.getSimpleName();
> }
> }
> -
> +
> private final ModuleContext moduleContext;
> private final Context jndiContext;
> private Object containerData;
> @@ -132,7 +122,7 @@ public class BeanContext extends Deploym
> private Class remoteInterface;
> private Class localHomeInterface;
> private Class localInterface;
> - private Class beanClass;
> + private final Class beanClass;
> private Class pkClass;
> private final List<Class> businessLocals = new ArrayList<Class>();
> private final List<Class> businessRemotes = new ArrayList<Class>();
> @@ -164,12 +154,12 @@ public class BeanContext extends Deploym
> private boolean hidden = false;
>
> private final Map<Method, Method> postCreateMethodMap = new
> HashMap<Method, Method>();
> - private final Map<Method, TransactionType> methodTransactionType =
> new HashMap<Method, TransactionType>();
> + //private final Map<Method, TransactionType> methodTransactionType =
> new HashMap<Method, TransactionType>();
> private final Map<Method, Method> methodMap = new HashMap<Method,
> Method>();
> private final Map<Method, MethodContext> methodContextMap = new
> HashMap<Method, MethodContext>();
> private final Map<String, ViewContext> viewContextMap = new
> HashMap<String, ViewContext>();
>
> - private Index<EntityManagerFactory,Map>
> extendedEntityManagerFactories;
> + private Index<EntityManagerFactory, Map>
> extendedEntityManagerFactories;
>
> private TransactionPolicyFactory transactionPolicyFactory;
>
> @@ -187,36 +177,52 @@ public class BeanContext extends Deploym
> private Duration accessTimeout;
> private Duration statefulTimeout;
>
> - private Set<Class<?>> asynchronousClasses = new HashSet<Class<?>>();
> + private Set<Class<?>> asynchronousClasses = new HashSet<Class<?>>();
> private Set<String> asynchronousMethodSignatures = new
> HashSet<String>();
> private Class<?> proxyClass;
> + private LockType lockType = LockType.WRITE;
>
> public Class getInterface(InterfaceType interfaceType) {
> - switch(interfaceType){
> - case EJB_HOME: return getHomeInterface();
> - case EJB_OBJECT: return getRemoteInterface();
> - case EJB_LOCAL_HOME: return getLocalHomeInterface();
> - case EJB_LOCAL: return getLocalInterface();
> - case BUSINESS_LOCAL: return getBusinessLocalInterface();
> - case BUSINESS_REMOTE: return getBusinessRemoteInterface();
> - case TIMEOUT : return BeanContext.Timeout.class;
> - case BUSINESS_REMOTE_HOME: return
> BeanContext.BusinessRemoteHome.class;
> - case BUSINESS_LOCAL_HOME: return
> BeanContext.BusinessLocalHome.class;
> - case SERVICE_ENDPOINT: return getServiceEndpointInterface();
> - case LOCALBEAN: return getBeanClass();
> - case BUSINESS_LOCALBEAN_HOME: return
> BeanContext.BusinessLocalBeanHome.class;
> - default: throw new IllegalStateException("Unexpected enum
> constant: " + interfaceType);
> + switch (interfaceType) {
> + case EJB_HOME:
> + return getHomeInterface();
> + case EJB_OBJECT:
> + return getRemoteInterface();
> + case EJB_LOCAL_HOME:
> + return getLocalHomeInterface();
> + case EJB_LOCAL:
> + return getLocalInterface();
> + case BUSINESS_LOCAL:
> + return getBusinessLocalInterface();
> + case BUSINESS_REMOTE:
> + return getBusinessRemoteInterface();
> + case TIMEOUT:
> + return BeanContext.Timeout.class;
> + case BUSINESS_REMOTE_HOME:
> + return BeanContext.BusinessRemoteHome.class;
> + case BUSINESS_LOCAL_HOME:
> + return BeanContext.BusinessLocalHome.class;
> + case SERVICE_ENDPOINT:
> + return getServiceEndpointInterface();
> + case LOCALBEAN:
> + return getBeanClass();
> + case BUSINESS_LOCALBEAN_HOME:
> + return BeanContext.BusinessLocalBeanHome.class;
> + default:
> + throw new IllegalStateException("Unexpected enum
> constant: " + interfaceType);
> }
> }
>
> public List<Class> getInterfaces(InterfaceType interfaceType) {
> - switch(interfaceType){
> - case BUSINESS_REMOTE: return getBusinessRemoteInterfaces();
> - case BUSINESS_LOCAL: return getBusinessLocalInterfaces();
> + switch (interfaceType) {
> + case BUSINESS_REMOTE:
> + return getBusinessRemoteInterfaces();
> + case BUSINESS_LOCAL:
> + return getBusinessLocalInterfaces();
> default:
> - List<Class> interfaces = new ArrayList<Class>();
> - interfaces.add(getInterface(interfaceType));
> - return interfaces;
> + List<Class> interfaces = new ArrayList<Class>();
> + interfaces.add(getInterface(interfaceType));
> + return interfaces;
> }
> }
>
> @@ -235,12 +241,18 @@ public class BeanContext extends Deploym
> /**
> * load default interceptors configured in properties.
> */
> - private BeanContext(String id, Context jndiContext, ModuleContext
> moduleContext, BeanType componentType, boolean localBean) {
> + private BeanContext(String id, Context jndiContext, ModuleContext
> moduleContext, BeanType componentType, boolean localBean, final Class
> beanClass) {
> super(id, moduleContext.getOptions());
> +
> + if (beanClass == null) {
> + throw new NullPointerException("beanClass input parameter is
> null");
> + }
> +
> this.moduleContext = moduleContext;
> this.jndiContext = jndiContext;
> this.localbean = localBean;
> this.componentType = componentType;
> + this.beanClass = beanClass;
>
> String interceptors =
> SystemInstance.get().getProperties().getProperty(USER_INTERCEPTOR_KEY);
> if (interceptors != null) {
> @@ -263,33 +275,31 @@ public class BeanContext extends Deploym
> }
>
> public BeanContext(String id, Context jndiContext, ModuleContext
> moduleContext,
> - Class beanClass, Class homeInterface,
> - Class remoteInterface,
> - Class localHomeInterface,
> - Class localInterface,
> - Class proxy,
> - Class serviceEndpointInterface, List<Class>
> businessLocals, List<Class> businessRemotes, Class pkClass,
> - BeanType componentType,
> - boolean localBean) throws SystemException {
> - this(id, jndiContext, moduleContext, componentType, localBean);
> + Class beanClass, Class homeInterface,
> + Class remoteInterface,
> + Class localHomeInterface,
> + Class localInterface,
> + Class proxy,
> + Class serviceEndpointInterface, List<Class>
> businessLocals, List<Class> businessRemotes, Class pkClass,
> + BeanType componentType,
> + boolean localBean) throws SystemException {
> + this(id, jndiContext, moduleContext, componentType, localBean,
> beanClass);
> +
>
> - if (beanClass == null) throw new NullPointerException("beanClass
> input parameter is null");
> this.pkClass = pkClass;
>
> - proxyClass = proxy;
> + this.proxyClass = proxy;
>
> this.homeInterface = homeInterface;
> - this.remoteInterface = remoteInterface;
> this.localInterface = localInterface;
> this.localHomeInterface = localHomeInterface;
> - if (businessLocals != null){
> + if (businessLocals != null) {
> this.businessLocals.addAll(businessLocals);
> }
> if (businessRemotes != null) {
> this.businessRemotes.addAll(businessRemotes);
> }
> this.remoteInterface = remoteInterface;
> - this.beanClass = beanClass;
> this.pkClass = pkClass;
> this.serviceEndpointInterface = serviceEndpointInterface;
>
> @@ -337,6 +347,8 @@ public class BeanContext extends Deploym
> if (localBean) {
> addInterface(beanClass, InterfaceType.LOCALBEAN);
> }
> +
> + this.initDefaultLock();
> }
>
> /**
> @@ -346,7 +358,7 @@ public class BeanContext extends Deploym
> * @param interfce
> * @param type
> */
> - private void addInterface(Class interfce, InterfaceType type){
> + private void addInterface(Class interfce, InterfaceType type) {
> if (interfce == null) return;
> interfaces.put(interfce, type);
>
> @@ -407,8 +419,8 @@ public class BeanContext extends Deploym
> }
>
> public BeanContext(String id, Context jndiContext, ModuleContext
> moduleContext, Class beanClass, Class mdbInterface, Map<String, String>
> activationProperties) throws SystemException {
> - this(id, jndiContext, moduleContext, BeanType.MESSAGE_DRIVEN,
> false);
> - this.beanClass = beanClass;
> + this(id, jndiContext, moduleContext, BeanType.MESSAGE_DRIVEN,
> false, beanClass);
> +
> this.mdbInterface = mdbInterface;
> this.activationProperties.putAll(activationProperties);
>
> @@ -419,7 +431,47 @@ public class BeanContext extends Deploym
> throw new IllegalStateException(e);
> }
> }
> - createMethodMap();
> +
> + this.initDefaultLock();
> +
> + this.createMethodMap();
> + }
> +
> + private void initDefaultLock() {
> +
> + final ArrayList<Class> classes = new ArrayList<Class>();
> +
> + for (final Class local : businessRemotes) {
> + classes.add(local);
> + }
> +
> + for (final Class local : businessLocals) {
> + classes.add(local);
> + }
> +
> + classes.add(this.beanClass);
> +
> + for (final Class c : classes) {
> + Lock lock = null;
> + try {
> +
> + lock = (Lock) c.getAnnotation(Lock.class);
> + this.lockType = lock.value();
> +
> + if (logger.isDebugEnabled()) {
> + logger.debug("Declared Lock for " + c.getName() + "
> is " + this.lockType);
> + }
> +
> + } catch (NullPointerException e) {
> + //Ignore
> + } catch (Throwable e) {
> + logger.warning("Failed to determine from: " + lock);
> + }
> + }
> +
> + if (logger.isDebugEnabled()) {
> + logger.debug("Default Lock for " + this.beanClass.getName() +
> " is " + this.lockType);
> + }
> }
>
>
> @@ -455,7 +507,7 @@ public class BeanContext extends Deploym
> return injections;
> }
>
> - public Index<EntityManagerFactory,Map>
> getExtendedEntityManagerFactories() {
> + public Index<EntityManagerFactory, Map>
> getExtendedEntityManagerFactories() {
> return extendedEntityManagerFactories;
> }
>
> @@ -476,7 +528,7 @@ public class BeanContext extends Deploym
> }
>
> public LockType getLockType() {
> - return LockType.WRITE;
> + return this.lockType;
> }
>
> public TransactionType getTransactionType(Method method) {
> @@ -651,16 +703,16 @@ public class BeanContext extends Deploym
> List<Class> interfaces =
> ProxyInterfaceResolver.getInterfaces(this.getBeanClass(), mainInterface,
> localInterfaces);
> return this.getBusinessLocalHome(interfaces, mainInterface);
> }
> -
> +
> public BusinessLocalHome getBusinessLocalHome(List<Class> interfaces,
> Class mainInterface) {
> - if (getBusinessLocalInterfaces().size() == 0){
> + if (getBusinessLocalInterfaces().size() == 0) {
> throw new IllegalStateException("This component has no
> business local interfaces: " + getDeploymentID());
> }
> - if (interfaces.size() == 0){
> + if (interfaces.size() == 0) {
> throw new IllegalArgumentException("No interface classes were
> specified");
> }
> for (Class clazz : interfaces) {
> - if (!getBusinessLocalInterfaces().contains(clazz)){
> + if (!getBusinessLocalInterfaces().contains(clazz)) {
> throw new IllegalArgumentException("Not a business
> interface of this bean:" + clazz.getName());
> }
> }
> @@ -679,16 +731,16 @@ public class BeanContext extends Deploym
> List<Class> interfaces =
> ProxyInterfaceResolver.getInterfaces(this.getBeanClass(), mainInterface,
> remoteInterfaces);
> return this.getBusinessRemoteHome(interfaces, mainInterface);
> }
> -
> +
> public BusinessRemoteHome getBusinessRemoteHome(List<Class>
> interfaces, Class mainInterface) {
> - if (getBusinessRemoteInterfaces().size() == 0){
> + if (getBusinessRemoteInterfaces().size() == 0) {
> throw new IllegalStateException("This component has no
> business remote interfaces: " + getDeploymentID());
> }
> - if (interfaces.size() == 0){
> + if (interfaces.size() == 0) {
> throw new IllegalArgumentException("No interface classes were
> specified");
> }
> for (Class clazz : interfaces) {
> - if (!getBusinessRemoteInterfaces().contains(clazz)){
> + if (!getBusinessRemoteInterfaces().contains(clazz)) {
> throw new IllegalArgumentException("Not a business
> interface of this bean:" + clazz.getName());
> }
> }
> @@ -769,8 +821,6 @@ public class BeanContext extends Deploym
> initViewMethodContext(method,
> view).setTransactionType(transactionType);
> }
>
> - return;
> -
> // // Only the NOT_SUPPORTED and REQUIRED transaction attributes
> may be used for message-driven
> // // bean message listener methods. The use of the other
> transaction attributes is not meaningful
> // // for message-driven bean message listener methods because
> there is no pre-existing client transaction
> @@ -797,13 +847,13 @@ public class BeanContext extends Deploym
> /**
> * TODO: Move to MethodContext
> */
> - private final Map<Method, Boolean> removeExceptionPolicy = new
> HashMap<Method,Boolean>();
> + private final Map<Method, Boolean> removeExceptionPolicy = new
> HashMap<Method, Boolean>();
>
> /**
> * TODO: Move to MethodContext
> */
> - public void setRetainIfExeption(Method removeMethod, boolean retain){
> - if (getRemoveMethods().contains(removeMethod)){
> + public void setRetainIfExeption(Method removeMethod, boolean retain) {
> + if (getRemoveMethods().contains(removeMethod)) {
> removeExceptionPolicy.put(removeMethod, retain);
> }
> }
> @@ -811,7 +861,7 @@ public class BeanContext extends Deploym
> /**
> * TODO: Move to MethodContext
> */
> - public boolean retainIfExeption(Method removeMethod){
> + public boolean retainIfExeption(Method removeMethod) {
> Boolean retain = removeExceptionPolicy.get(removeMethod);
> return retain != null && retain;
> }
> @@ -820,7 +870,7 @@ public class BeanContext extends Deploym
> * When an instance of an EJB is instantiated, everything in this list
> * is also instatiated and tied to the bean instance. Per spec,
> interceptors
> * are supposed to have the same lifecycle as the bean they wrap.
> - *
> + * <p/>
> * OpenEJB has the concept of interceptors which do not share the
> same lifecycle
> * as the bean instance -- they may be instantiated elsewhere and
> simply applied
> * to the bean. The impact is that these interceptors must be
> multithreaded.
> @@ -941,13 +991,13 @@ public class BeanContext extends Deploym
> beanMethod =
> javax.ejb.SessionBean.class.getDeclaredMethod("ejbRemove");
> } else {
> for (Method method : getRemoveMethods()) {
> - if (method.getParameterTypes().length == 0){
> + if (method.getParameterTypes().length == 0) {
> beanMethod = method;
> break;
> }
> }
> - if (beanMethod == null && (homeInterface != null ||
> localHomeInterface != null)){
> - throw new IllegalStateException("Bean class has
> no @Remove methods to match EJBObject.remove() or EJBLocalObject.remove().
> A no-arg remove method must be added: beanClass="+beanClass.getName());
> + if (beanMethod == null && (homeInterface != null ||
> localHomeInterface != null)) {
> + throw new IllegalStateException("Bean class has
> no @Remove methods to match EJBObject.remove() or EJBLocalObject.remove().
> A no-arg remove method must be added: beanClass=" + beanClass.getName());
> }
> }
>
> @@ -980,7 +1030,7 @@ public class BeanContext extends Deploym
> }
>
> private void mapHomeInterface(Class intrface) {
> - Method [] homeMethods = intrface.getMethods();
> + Method[] homeMethods = intrface.getMethods();
> for (Method method : homeMethods) {
> Class owner = method.getDeclaringClass();
> if (owner == EJBHome.class || owner == EJBLocalHome.class) {
> @@ -1029,16 +1079,16 @@ public class BeanContext extends Deploym
> }
> }
>
> - public void mapMethods(Method interfaceMethod, Method beanMethod){
> + public void mapMethods(Method interfaceMethod, Method beanMethod) {
> methodMap.put(interfaceMethod, beanMethod);
> }
>
> private void mapObjectInterface(Class intrface) {
> - if (intrface == BusinessLocalHome.class || intrface ==
> BusinessRemoteHome.class || intrface == ServiceEndpoint.class){
> + if (intrface == BusinessLocalHome.class || intrface ==
> BusinessRemoteHome.class || intrface == ServiceEndpoint.class) {
> return;
> }
>
> - Method [] interfaceMethods = intrface.getMethods();
> + Method[] interfaceMethods = intrface.getMethods();
> for (Method method : interfaceMethods) {
> Class declaringClass = method.getDeclaringClass();
> if (declaringClass == EJBObject.class || declaringClass ==
> EJBLocalObject.class) {
> @@ -1053,21 +1103,21 @@ public class BeanContext extends Deploym
> }
> }
>
> - public List<Class> getObjectInterface(Class homeInterface){
> - if (BusinessLocalHome.class.isAssignableFrom(homeInterface)){
> + public List<Class> getObjectInterface(Class homeInterface) {
> + if (BusinessLocalHome.class.isAssignableFrom(homeInterface)) {
> return getBusinessLocalInterfaces();
> - } else if
> (BusinessRemoteHome.class.isAssignableFrom(homeInterface)){
> + } else if
> (BusinessRemoteHome.class.isAssignableFrom(homeInterface)) {
> return getBusinessRemoteInterfaces();
> - } else if (EJBLocalHome.class.isAssignableFrom(homeInterface)){
> + } else if (EJBLocalHome.class.isAssignableFrom(homeInterface)) {
> List<Class> classes = new ArrayList<Class>();
> classes.add(getLocalInterface());
> return classes;
> - } else if (EJBHome.class.isAssignableFrom(homeInterface)){
> + } else if (EJBHome.class.isAssignableFrom(homeInterface)) {
> List<Class> classes = new ArrayList<Class>();
> classes.add(getRemoteInterface());
> return classes;
> } else {
> - throw new IllegalArgumentException("Cannot determine object
> interface for "+homeInterface);
> + throw new IllegalArgumentException("Cannot determine object
> interface for " + homeInterface);
> }
> }
>
> @@ -1089,7 +1139,7 @@ public class BeanContext extends Deploym
> return true;
> }
> MethodContext methodContext =
> methodContextMap.get(matchingBeanMethod);
> - return methodContext == null ? false :
> methodContext.isAsynchronous();
> + return methodContext != null && methodContext.isAsynchronous();
> }
>
> //
> @@ -1175,10 +1225,10 @@ public class BeanContext extends Deploym
> public String getModuleID() {
> return getModuleContext().getModuleURI().toString();
> }
> -
> +
> public String getModuleName() {
> return getModuleContext().getId();
> - }
> + }
>
> public String getRunAs() {
> return runAs;
> @@ -1193,7 +1243,7 @@ public class BeanContext extends Deploym
> }
>
> public String toString() {
> - return "BeanContext(id="+getDeploymentID()+")";
> + return "BeanContext(id=" + getDeploymentID() + ")";
> }
>
> public boolean isLoadOnStartup() {
> @@ -1226,40 +1276,38 @@ public class BeanContext extends Deploym
> public Duration getAccessTimeout(Method beanMethod) {
> return getMethodContext(beanMethod).getAccessTimeout();
> }
> -
> - public Duration getAccessTimeout() {
> - return accessTimeout;
> - }
> -
> - public void setAccessTimeout(Duration accessTimeout) {
> - this.accessTimeout = accessTimeout;
> - }
> -
> - public Duration getStatefulTimeout() {
> - return statefulTimeout;
> - }
> -
> - public void setStatefulTimeout(Duration statefulTimeout) {
> - this.statefulTimeout = statefulTimeout;
> - }
> +
> + public Duration getAccessTimeout() {
> + return accessTimeout;
> + }
> +
> + public void setAccessTimeout(Duration accessTimeout) {
> + this.accessTimeout = accessTimeout;
> + }
> +
> + public Duration getStatefulTimeout() {
> + return statefulTimeout;
> + }
> +
> + public void setStatefulTimeout(Duration statefulTimeout) {
> + this.statefulTimeout = statefulTimeout;
> + }
>
>
> public Class<Object> getManagedClass() {
> if (isDynamicallyImplemented()) {
> return (Class<Object>) getProxyClass();
> }
> - return beanClass;
> + return this.beanClass;
> }
>
> + @SuppressWarnings("unchecked")
> public InstanceContext newInstance() throws Exception {
> ThreadContext callContext = new ThreadContext(this, null,
> Operation.INJECTION);
> ThreadContext oldContext = ThreadContext.enter(callContext);
>
> - WebBeansContext webBeansContext = null;
> - AbstractInjectionTargetBean<Object> beanDefinition = null;
> -
> - webBeansContext =
> getModuleContext().getAppContext().getWebBeansContext();
> - beanDefinition = get(CdiEjbBean.class);
> + final WebBeansContext webBeansContext =
> getModuleContext().getAppContext().getWebBeansContext();
> + AbstractInjectionTargetBean<Object> beanDefinition =
> get(CdiEjbBean.class);
>
> if (isDynamicallyImplemented()) {
> if
> (!InvocationHandler.class.isAssignableFrom(getProxyClass())) {
> @@ -1352,12 +1400,12 @@ public class BeanContext extends Deploym
> callContext.setCurrentOperation(Operation.POST_CONSTRUCT);
> final List<InterceptorData> callbackInterceptors =
> this.getCallbackInterceptors();
> final InterceptorStack postConstruct = new
> InterceptorStack(beanInstance, null, Operation.POST_CONSTRUCT,
> callbackInterceptors, interceptorInstances);
> -
> +
> //Transaction Demarcation for Singleton PostConstruct method
> TransactionType transactionType;
>
> if (getComponentType() == BeanType.SINGLETON) {
> - Set<Method> callbacks =
> callbackInterceptors.get(callbackInterceptors.size() -1).getPostConstruct();
> + Set<Method> callbacks =
> callbackInterceptors.get(callbackInterceptors.size() -
> 1).getPostConstruct();
> if (callbacks.isEmpty()) {
> transactionType = TransactionType.RequiresNew;
> } else {
> @@ -1367,30 +1415,30 @@ public class BeanContext extends Deploym
> }
> }
> } else {
> - transactionType = isBeanManagedTransaction()?
> TransactionType.BeanManaged: TransactionType.NotSupported;
> + transactionType = isBeanManagedTransaction() ?
> TransactionType.BeanManaged : TransactionType.NotSupported;
> }
> TransactionPolicy transactionPolicy =
> EjbTransactionUtil.createTransactionPolicy(transactionType, callContext);
> - try{
> + try {
> //Call the chain
> - postConstruct.invoke();
> - } catch(Throwable e) {
> + postConstruct.invoke();
> + } catch (Throwable e) {
> //RollBack Transaction
>
> EjbTransactionUtil.handleSystemException(transactionPolicy, e,
> callContext);
> - }
> - finally{
> + } finally {
> EjbTransactionUtil.afterInvoke(transactionPolicy,
> callContext);
> }
>
> return new InstanceContext(this, beanInstance,
> interceptorInstances, creationalContext);
> } finally {
> ThreadContext.exit(oldContext);
> - }
> + }
> }
>
> protected <X> X getBean(Class<X> clazz, Bean<?> bean) {
> return clazz.cast(bean);
> }
>
> + @SuppressWarnings("unchecked")
> public <T> void inject(T instance, CreationalContext<T> ctx) {
>
> WebBeansContext webBeansContext =
> getModuleContext().getAppContext().getWebBeansContext();
> @@ -1413,7 +1461,7 @@ public class BeanContext extends Deploym
> Contextual<?> contextual = null;
> if (ctx instanceof CreationalContextImpl) {
> contextual = ((CreationalContextImpl) ctx).getBean();
> - isInjectionToAnotherBean = contextual ==
> getBean(InjectionTargetBean.class, beanDefinition) ? false : true;
> + isInjectionToAnotherBean = contextual !=
> getBean(InjectionTargetBean.class, beanDefinition);
> }
>
> if (!isInjectionToAnotherBean) {
> @@ -1446,15 +1494,15 @@ public class BeanContext extends Deploym
> return asynchronousMethodSignatures;
> }
>
> - public void createAsynchronousMethodSet(){
> - for(Map.Entry<Method, MethodContext> entry :
> methodContextMap.entrySet()) {
> - if(entry.getValue().isAsynchronous()) {
> + public void createAsynchronousMethodSet() {
> + for (Map.Entry<Method, MethodContext> entry :
> methodContextMap.entrySet()) {
> + if (entry.getValue().isAsynchronous()) {
>
> asynchronousMethodSignatures.add(generateMethodSignature(entry.getKey()));
> }
> }
> - for(Class<?> cls : asynchronousClasses) {
> - for(Method method : cls.getDeclaredMethods()) {
> - if(Modifier.isPublic(method.getModifiers())) {
> + for (Class<?> cls : asynchronousClasses) {
> + for (Method method : cls.getDeclaredMethods()) {
> + if (Modifier.isPublic(method.getModifiers())) {
>
> asynchronousMethodSignatures.add(generateMethodSignature(method));
> }
> }
> @@ -1463,7 +1511,7 @@ public class BeanContext extends Deploym
>
> private String generateMethodSignature(Method method) {
> StringBuilder buffer = new StringBuilder(method.getName());
> - for(Class<?> parameterType : method.getParameterTypes()) {
> + for (Class<?> parameterType : method.getParameterTypes()) {
> buffer.append(parameterType.getName());
> }
> return buffer.toString();
>
> Modified:
> openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java?rev=1357576&r1=1357575&r2=1357576&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
> (original)
> +++
> openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
> Thu Jul 5 12:25:51 2012
> @@ -33,6 +33,8 @@ import org.apache.openejb.core.webservic
> import org.apache.openejb.core.webservices.NoAddressingSupport;
> import org.apache.openejb.spi.SecurityService;
> import org.apache.openejb.util.Duration;
> +import org.apache.openejb.util.LogCategory;
> +import org.apache.openejb.util.Logger;
> import org.apache.xbean.finder.ClassFinder;
>
> import javax.ejb.ConcurrentAccessTimeoutException;
> @@ -49,10 +51,7 @@ import java.util.List;
> import java.util.Map;
> import java.util.concurrent.locks.Lock;
>
> -import static
> org.apache.openejb.core.transaction.EjbTransactionUtil.afterInvoke;
> -import static
> org.apache.openejb.core.transaction.EjbTransactionUtil.createTransactionPolicy;
> -import static
> org.apache.openejb.core.transaction.EjbTransactionUtil.handleApplicationException;
> -import static
> org.apache.openejb.core.transaction.EjbTransactionUtil.handleSystemException;
> +import static org.apache.openejb.core.transaction.EjbTransactionUtil.*;
>
> /**
> * @org.apache.xbean.XBean element="statelessContainer"
> @@ -78,27 +77,32 @@ public class SingletonContainer implemen
> }
> }
>
> - public void setAccessTimeout(Duration duration){
> + public void setAccessTimeout(Duration duration) {
> this.accessTimeout = duration;
> }
>
> + @Override
> public synchronized BeanContext[] getBeanContexts() {
> return deploymentRegistry.values().toArray(new
> BeanContext[deploymentRegistry.size()]);
> }
>
> + @Override
> public synchronized BeanContext getBeanContext(Object deploymentID) {
> String id = (String) deploymentID;
> return deploymentRegistry.get(id);
> }
>
> + @Override
> public ContainerType getContainerType() {
> return ContainerType.SINGLETON;
> }
>
> + @Override
> public Object getContainerID() {
> return containerID;
> }
>
> + @Override
> public void deploy(BeanContext beanContext) throws OpenEJBException {
> instanceManager.deploy(beanContext);
> String id = (String) beanContext.getDeploymentID();
> @@ -111,32 +115,35 @@ public class SingletonContainer implemen
> if (timerService != null) {
> timerService.start();
> }
> -
> +
> }
> -
> +
> + @Override
> public void start(BeanContext info) throws OpenEJBException {
> instanceManager.start(info);
> }
> -
> +
> + @Override
> public void stop(BeanContext info) throws OpenEJBException {
> }
> -
> +
> + @Override
> public void undeploy(BeanContext beanContext) {
> ThreadContext threadContext = new ThreadContext(beanContext,
> null);
> ThreadContext old = ThreadContext.enter(threadContext);
> try {
> instanceManager.freeInstance(threadContext);
> - } finally{
> + } finally {
> ThreadContext.exit(old);
> }
> -
> +
> EjbTimerService timerService = beanContext.getEjbTimerService();
> if (timerService != null) {
> timerService.stop();
> }
> -
> +
> instanceManager.undeploy(beanContext);
> -
> +
> synchronized (this) {
> String id = (String) beanContext.getDeploymentID();
> beanContext.setContainer(null);
> @@ -148,18 +155,22 @@ public class SingletonContainer implemen
> /**
> * @deprecated use invoke signature without 'securityIdentity'
> argument.
> */
> + @Deprecated
> + @Override
> public Object invoke(Object deployID, Method callMethod, Object[]
> args, Object primKey, Object securityIdentity) throws OpenEJBException {
> return invoke(deployID, null, callMethod.getDeclaringClass(),
> callMethod, args, primKey);
> }
>
> + @Override
> public Object invoke(Object deployID, Class callInterface, Method
> callMethod, Object[] args, Object primKey) throws OpenEJBException {
> return invoke(deployID, null, callInterface, callMethod, args,
> primKey);
> }
>
> + @Override
> public Object invoke(Object deployID, InterfaceType type, Class
> callInterface, Method callMethod, Object[] args, Object primKey) throws
> OpenEJBException {
> BeanContext beanContext = this.getBeanContext(deployID);
>
> - if (beanContext == null) throw new OpenEJBException("Deployment
> does not exist in this container. Deployment(id='"+deployID+"'),
> Container(id='"+containerID+"')");
> + if (beanContext == null) throw new OpenEJBException("Deployment
> does not exist in this container. Deployment(id='" + deployID + "'),
> Container(id='" + containerID + "')");
>
> // Use the backup way to determine call type if null was supplied.
> if (type == null) type =
> beanContext.getInterfaceType(callInterface);
> @@ -190,9 +201,7 @@ public class SingletonContainer implemen
> callContext.set(Method.class, runMethod);
> callContext.setInvokedInterface(callInterface);
>
> - Object retValue = _invoke(callMethod, runMethod, args,
> instance, callContext, type);
> -
> - return retValue;
> + return _invoke(callMethod, runMethod, args, instance,
> callContext, type);
>
> } finally {
> ThreadContext.exit(oldCallContext);
> @@ -205,14 +214,15 @@ public class SingletonContainer implemen
>
> protected Object _invoke(Method callMethod, Method runMethod,
> Object[] args, Instance instance, ThreadContext callContext, InterfaceType
> callType) throws OpenEJBException {
> BeanContext beanContext = callContext.getBeanContext();
> -
> +
> Duration accessTimeout = getAccessTimeout(beanContext, runMethod);
> boolean read =
> javax.ejb.LockType.READ.equals(beanContext.getConcurrencyAttribute(runMethod));
> -
> +
> final Lock lock = aquireLock(read, accessTimeout, instance,
> runMethod);
>
> Object returnValue;
> try {
> +
> TransactionPolicy txPolicy =
> createTransactionPolicy(beanContext.getTransactionType(callMethod,
> callType), callContext);
>
> returnValue = null;
> @@ -339,7 +349,7 @@ public class SingletonContainer implemen
> AddressingSupport wsaSupport = NoAddressingSupport.INSTANCE;
> for (int i = 2; i < args.length; i++) {
> if (args[i] instanceof AddressingSupport) {
> - wsaSupport = (AddressingSupport)args[i];
> + wsaSupport = (AddressingSupport) args[i];
> }
> }
> ThreadContext.getThreadContext().set(AddressingSupport.class,
> wsaSupport);
>
>
>
Re: svn commit: r1357576 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb:
BeanContext.java core/singleton/SingletonContainer.java
Posted by Romain Manni-Bucau <rm...@gmail.com>.
weird i always got the right lock and never defined it at method level
but i never put lock on the interface
- Romain
2012/7/5 AndyG <an...@orprovision.com>
> Only handled at method level if there was an 'explicitly defined @Lock' on
> the method else...
>
> org.apache.openejb.MethodContext#getLockType
>
> public LockType getLockType() {
> return lockType != null? lockType: beanContext.getLockType();
> }
>
> ...beanContext.getLockType() <-- Was LockType.WRITE (wrong), and is now
> 'this.lockType' (correct)
>
> --
> View this message in context:
> http://openejb.979440.n4.nabble.com/Re-svn-commit-r1357576-in-openejb-trunk-openejb-container-openejb-core-src-main-java-org-apache-opena-tp4656048p4656061.html
> Sent from the OpenEJB Dev mailing list archive at Nabble.com.
>
Re: svn commit: r1357576 - in
/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb:
BeanContext.java core/singleton/SingletonContainer.java
Posted by AndyG <an...@orprovision.com>.
Only handled at method level if there was an 'explicitly defined @Lock' on
the method else...
org.apache.openejb.MethodContext#getLockType
public LockType getLockType() {
return lockType != null? lockType: beanContext.getLockType();
}
...beanContext.getLockType() <-- Was LockType.WRITE (wrong), and is now
'this.lockType' (correct)
--
View this message in context: http://openejb.979440.n4.nabble.com/Re-svn-commit-r1357576-in-openejb-trunk-openejb-container-openejb-core-src-main-java-org-apache-opena-tp4656048p4656061.html
Sent from the OpenEJB Dev mailing list archive at Nabble.com.
Re: svn commit: r1357576 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb:
BeanContext.java core/singleton/SingletonContainer.java
Posted by Romain Manni-Bucau <rm...@gmail.com>.
no since it was handled at method level not class level.
- Romain
2012/7/5 AndyG <an...@orprovision.com>
>
> Romain Manni-Bucau wrote
> >
> > weird since it was fine for me
> >
>
> I don't see how?
>
> beanContext.*getConcurrencyAttribute*(runMethod) /always/ propagated to the
> hard coded WRITE if methods were not explicitly annotated - This has to be
> wrong if the class or interface is READ?
>
>
> --
> View this message in context:
> http://openejb.979440.n4.nabble.com/Re-svn-commit-r1357576-in-openejb-trunk-openejb-container-openejb-core-src-main-java-org-apache-opena-tp4656048p4656058.html
> Sent from the OpenEJB Dev mailing list archive at Nabble.com.
>
Re: svn commit: r1357576 - in
/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb:
BeanContext.java core/singleton/SingletonContainer.java
Posted by AndyG <an...@orprovision.com>.
Romain Manni-Bucau wrote
>
> weird since it was fine for me
>
I don't see how?
beanContext.*getConcurrencyAttribute*(runMethod) /always/ propagated to the
hard coded WRITE if methods were not explicitly annotated - This has to be
wrong if the class or interface is READ?
--
View this message in context: http://openejb.979440.n4.nabble.com/Re-svn-commit-r1357576-in-openejb-trunk-openejb-container-openejb-core-src-main-java-org-apache-opena-tp4656048p4656058.html
Sent from the OpenEJB Dev mailing list archive at Nabble.com.
Re: svn commit: r1357576 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb:
BeanContext.java core/singleton/SingletonContainer.java
Posted by Romain Manni-Bucau <rm...@gmail.com>.
weird since it was fine for me
but i know parent methods of a singleton are by default WRITE even if the
child is READ and i guess that's the same for intrefaces so i'm not sure of
the fix
- Romain
2012/7/5 AndyG <an...@orprovision.com>
> I have changed BeanContext to perform the check only for a singleton.
>
> The BeanContext is used here:
> org.apache.openejb.core.singleton.SingletonContainer#_invoke
>
> boolean read =
>
> javax.ejb.LockType.READ.equals(beanContext.*getConcurrencyAttribute*(runMethod));
>
> This result was wrong for a singleton where the class or interface is
> defined with javax.ejb.LockType.READ (i.e, NOT the default) - Methods that
> are not explicitly @Lock annotated should/must inherit the class/interface
> definition for @Lock. They were not, as it was hard coded
> javax.ejb.LockType.WRITE
>
> The org.apache.openejb.BeanContext#initDefaultLock checks for the default -
> You probably know a better way to do this, but the result is required for
> the variable 'this.lockType' - Please improve it, but I assure you this
> variable must be dynamic for a singleton and not hard coded.
>
> The example: http://openejb.apache.org/examples-trunk/simple-singleton/was
> not working as described...
>
> @Singleton
> @Lock(READ)
> public class ComponentRegistry {
>
> public Collection<?> getComponents() {... <-- Was NOT inheriting
> @Lock(READ)
> it was @Lock(WRITE)
>
>
> This was causing issues for me where a WRITE lock was blocking a concurrent
> READ, which it should not.
>
> Andy.
>
> --
> View this message in context:
> http://openejb.979440.n4.nabble.com/Re-svn-commit-r1357576-in-openejb-trunk-openejb-container-openejb-core-src-main-java-org-apache-opena-tp4656048p4656053.html
> Sent from the OpenEJB Dev mailing list archive at Nabble.com.
>
Re: svn commit: r1357576 - in
/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb:
BeanContext.java core/singleton/SingletonContainer.java
Posted by AndyG <an...@orprovision.com>.
I have changed BeanContext to perform the check only for a singleton.
The BeanContext is used here:
org.apache.openejb.core.singleton.SingletonContainer#_invoke
boolean read =
javax.ejb.LockType.READ.equals(beanContext.*getConcurrencyAttribute*(runMethod));
This result was wrong for a singleton where the class or interface is
defined with javax.ejb.LockType.READ (i.e, NOT the default) - Methods that
are not explicitly @Lock annotated should/must inherit the class/interface
definition for @Lock. They were not, as it was hard coded
javax.ejb.LockType.WRITE
The org.apache.openejb.BeanContext#initDefaultLock checks for the default -
You probably know a better way to do this, but the result is required for
the variable 'this.lockType' - Please improve it, but I assure you this
variable must be dynamic for a singleton and not hard coded.
The example: http://openejb.apache.org/examples-trunk/simple-singleton/ was
not working as described...
@Singleton
@Lock(READ)
public class ComponentRegistry {
public Collection<?> getComponents() {... <-- Was NOT inheriting @Lock(READ)
it was @Lock(WRITE)
This was causing issues for me where a WRITE lock was blocking a concurrent
READ, which it should not.
Andy.
--
View this message in context: http://openejb.979440.n4.nabble.com/Re-svn-commit-r1357576-in-openejb-trunk-openejb-container-openejb-core-src-main-java-org-apache-opena-tp4656048p4656053.html
Sent from the OpenEJB Dev mailing list archive at Nabble.com.
Re: svn commit: r1357576 - in
/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb:
BeanContext.java core/singleton/SingletonContainer.java
Posted by AndyG <an...@orprovision.com>.
I think the @Lock should /always/ be visible on the *public* contract
(interfaces), so that API users understand that there is one.
The implementation is *private* nö? The implementation should be able to
override the contract is it sees fit to do so, which is why I chose the
order @Remote, @Local then Class.
Romain Manni-Bucau wrote
>
> i tend to think so since intrefaces are kind of parent but i didnt find
> (maybe miss) sthg clear in the spec
>
> the lock is for me linked to impl not the contract
>
> wdyt?
>
> - Romain
>
>
> 2012/7/5 AndyG <andy.gumbrecht@>
>
>> I also believe this is legal right?
>>
>> @Local
>> @Lock(LockType.READ)
>> public interface *Deployer *{
>>
>> @Remote
>> public interface DeployerRemote extends *Deployer *{
>>
>> @Singleton
>> @TransactionManagement(TransactionManagementType.BEAN)
>> @AccessTimeout(value = 60, unit = TimeUnit.SECONDS)
>> public class DeployerImpl extends AbstractDeployer implements *Deployer*,
>> DeployerRemote {
>>
>> Or does @Lock(LockType.READ) only belong on the implementation?
>>
>>
>>
>> --
>> View this message in context:
>> http://openejb.979440.n4.nabble.com/Re-svn-commit-r1357576-in-openejb-trunk-openejb-container-openejb-core-src-main-java-org-apache-opena-tp4656048p4656055.html
>> Sent from the OpenEJB Dev mailing list archive at Nabble.com.
>>
>
--
View this message in context: http://openejb.979440.n4.nabble.com/Re-svn-commit-r1357576-in-openejb-trunk-openejb-container-openejb-core-src-main-java-org-apache-opena-tp4656048p4656060.html
Sent from the OpenEJB Dev mailing list archive at Nabble.com.
Re: svn commit: r1357576 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb:
BeanContext.java core/singleton/SingletonContainer.java
Posted by Romain Manni-Bucau <rm...@gmail.com>.
i tend to think so since intrefaces are kind of parent but i didnt find
(maybe miss) sthg clear in the spec
the lock is for me linked to impl not the contract
wdyt?
- Romain
2012/7/5 AndyG <an...@orprovision.com>
> I also believe this is legal right?
>
> @Local
> @Lock(LockType.READ)
> public interface *Deployer *{
>
> @Remote
> public interface DeployerRemote extends *Deployer *{
>
> @Singleton
> @TransactionManagement(TransactionManagementType.BEAN)
> @AccessTimeout(value = 60, unit = TimeUnit.SECONDS)
> public class DeployerImpl extends AbstractDeployer implements *Deployer*,
> DeployerRemote {
>
> Or does @Lock(LockType.READ) only belong on the implementation?
>
>
>
> --
> View this message in context:
> http://openejb.979440.n4.nabble.com/Re-svn-commit-r1357576-in-openejb-trunk-openejb-container-openejb-core-src-main-java-org-apache-opena-tp4656048p4656055.html
> Sent from the OpenEJB Dev mailing list archive at Nabble.com.
>
Re: svn commit: r1357576 - in
/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb:
BeanContext.java core/singleton/SingletonContainer.java
Posted by AndyG <an...@orprovision.com>.
I also believe this is legal right?
@Local
@Lock(LockType.READ)
public interface *Deployer *{
@Remote
public interface DeployerRemote extends *Deployer *{
@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
@AccessTimeout(value = 60, unit = TimeUnit.SECONDS)
public class DeployerImpl extends AbstractDeployer implements *Deployer*,
DeployerRemote {
Or does @Lock(LockType.READ) only belong on the implementation?
--
View this message in context: http://openejb.979440.n4.nabble.com/Re-svn-commit-r1357576-in-openejb-trunk-openejb-container-openejb-core-src-main-java-org-apache-opena-tp4656048p4656055.html
Sent from the OpenEJB Dev mailing list archive at Nabble.com.