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 &lt;andy.gumbrecht@&gt;
> 
>> 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.