[jboss-cvs] JBossAS SVN: r70409 - in projects/ejb3/trunk/core: src/main/java/org/jboss/ejb3 and 21 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Mar 5 04:17:20 EST 2008


Author: wolfc
Date: 2008-03-05 04:17:19 -0500 (Wed, 05 Mar 2008)
New Revision: 70409

Added:
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/AbstractInterceptor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/ExtendedManagedObjectAdvisor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/LifeCycleInvocation.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/metadata/
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/metadata/ClusteredMetaDataBridge.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/ClassProxyHack.java
Removed:
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/AbstractInterceptor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/ExtendedManagedObjectAdvisor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/LifeCycleInvocation.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/metadata/
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/metadata/ClusteredMetaDataBridge.java
Modified:
   projects/ejb3/trunk/core/pom.xml
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/DeploymentUnit.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainerInvocation.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainerInvocationWrapper.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContextImpl.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/ENCPropagationInterceptor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3AnnotationHandler.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3Deployment.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3DescriptorHandler.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/ProxyFactoryHelper.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/NoPassivationCache.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/StatefulCache.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/simple/SimpleStatefulCache.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/tree/StatefulTreeCache.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/embedded/EJB3StandaloneDeployer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/EJB3InterceptorsFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfo.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInjector.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/LifecycleInterceptorHandler.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/ConsumerContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/MDB.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/MessagingContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/pool/AbstractPool.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/remoting/IsLocalInterceptor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/remoting/ReplicantsManagerInterceptorFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/AuthenticationInterceptorFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/JaccAuthorizationInterceptorFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/JaccHelper.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/RoleBasedAuthorizationInterceptorFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/RunAsSecurityInterceptorFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/service/ServiceContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/service/ServiceRemoteProxyFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/BaseSessionProxyFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/ProxiedStatefulBeanContext.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulBeanContext.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulClusterProxyFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulInstanceInterceptor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulLocalProxyFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulRemoteProxyFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulRemoveInterceptor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessClusterProxyFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessLocalProxyFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessRemoteProxyFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/BMTInterceptor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/TxInterceptorFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/TxUtil.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionFieldInjector.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionMethodInjector.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionPropertyInjector.java
   projects/ejb3/trunk/core/src/test/java/
   projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/cachepassivation/MockStatefulContainer.java
   projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/cachepassivation/unit/CachePassivationUnitTestCase.java
Log:
EJBTHREE-1174: merged from AS trunk

Modified: projects/ejb3/trunk/core/pom.xml
===================================================================
--- projects/ejb3/trunk/core/pom.xml	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/pom.xml	2008-03-05 09:17:19 UTC (rev 70409)
@@ -334,6 +334,10 @@
       <artifactId>jboss-ejb3-ext-api-impl</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.jboss.ejb3</groupId>
+      <artifactId>jboss-ejb3-interceptors</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.jboss.embedded</groupId>
       <artifactId>jboss-embedded</artifactId>
       <scope>test</scope>

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -22,11 +22,9 @@
 package org.jboss.ejb3;
 
 import java.util.HashMap;
-import java.util.HashSet;
 
 import org.jboss.aop.metadata.SimpleMetaData;
 import org.jboss.ejb3.interceptor.InterceptorInfo;
-import org.jboss.ejb3.interceptor.InterceptorInjector;
 import org.jboss.logging.Logger;
 import org.jboss.security.RealmMapping;
 
@@ -91,8 +89,10 @@
       return metadata;
    }
 
+   @Deprecated
    public void initialiseInterceptorInstances()
    {
+      /*
       HashSet<InterceptorInfo> interceptors = ((EJBContainer)container).getApplicableInterceptors();
       if (interceptors != null && interceptors.size() > 0 && interceptorInstances == null)
       {
@@ -112,8 +112,11 @@
             }
          }
       }
+      */
+      log.warn("FIXME: don't call BaseContext.initialiseInterceptorInstances (EJBTHREE-1174)");
    }
 
+   @Deprecated
    public Object[] getInterceptorInstances(InterceptorInfo[] interceptorInfos)
    {
       Object[] interceptors = new Object[interceptorInfos.length];

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/DeploymentUnit.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/DeploymentUnit.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/DeploymentUnit.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -22,9 +22,10 @@
 package org.jboss.ejb3;
 
 import java.net.URL;
+import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
-import java.util.Hashtable;
+
 import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
 import org.jboss.virtual.VirtualFile;
 import org.jboss.virtual.VirtualFileFilter;

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -25,17 +25,13 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
-import java.util.LinkedList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Hashtable;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 
@@ -45,45 +41,47 @@
 import javax.ejb.EJBException;
 import javax.ejb.Local;
 import javax.ejb.Remote;
+import javax.ejb.TimedObject;
 import javax.ejb.Timeout;
+import javax.ejb.Timer;
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.LinkRef;
-import javax.naming.Name;
-import javax.naming.NameClassPair;
 import javax.naming.NameNotFoundException;
-import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
 import javax.naming.Reference;
 import javax.naming.StringRefAddr;
 
-import org.jboss.aop.AspectManager;
-import org.jboss.aop.ClassContainer;
+import org.jboss.aop.Advisor;
+import org.jboss.aop.Domain;
+import org.jboss.aop.InstanceAdvisor;
 import org.jboss.aop.MethodInfo;
 import org.jboss.aop.advice.Interceptor;
-import org.jboss.aop.annotation.AnnotationElement;
-import org.jboss.aop.joinpoint.ConstructorInvocation;
-import org.jboss.aop.metadata.SimpleClassMetaDataBinding;
-import org.jboss.aop.metadata.SimpleClassMetaDataLoader;
+import org.jboss.aop.advice.PerVmAdvice;
+import org.jboss.aop.annotation.AnnotationRepository;
 import org.jboss.aop.util.MethodHashing;
 import org.jboss.ejb3.annotation.Clustered;
 import org.jboss.ejb3.annotation.SecurityDomain;
 import org.jboss.ejb3.annotation.defaults.PoolDefaults;
+import org.jboss.ejb3.aop.BeanContainer;
+import org.jboss.ejb3.aop.LifeCycleInvocation;
 import org.jboss.ejb3.deployers.JBoss5DependencyPolicy;
 import org.jboss.ejb3.entity.PersistenceUnitDeployment;
-import org.jboss.ejb3.interceptor.InterceptorInfo;
 import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
 import org.jboss.ejb3.interceptor.InterceptorInjector;
-import org.jboss.ejb3.interceptor.LifecycleInterceptorHandler;
+import org.jboss.ejb3.interceptors.aop.InterceptorsFactory;
+import org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor;
+import org.jboss.ejb3.interceptors.container.ManagedObjectAdvisor;
+import org.jboss.ejb3.interceptors.direct.DirectContainer;
+import org.jboss.ejb3.interceptors.direct.IndirectContainer;
 import org.jboss.ejb3.javaee.JavaEEComponent;
 import org.jboss.ejb3.javaee.JavaEEComponentHelper;
 import org.jboss.ejb3.javaee.JavaEEModule;
 import org.jboss.ejb3.pool.Pool;
 import org.jboss.ejb3.pool.PoolFactory;
-import org.jboss.ejb3.pool.PoolFactoryRegistry; 
-import org.jboss.ejb3.security.JaccAuthorizationInterceptor;
+import org.jboss.ejb3.pool.PoolFactoryRegistry;
 import org.jboss.ejb3.security.SecurityDomainManager;
 import org.jboss.ejb3.statistics.InvocationStatistics;
 import org.jboss.ejb3.tx.UserTransactionImpl;
@@ -101,13 +99,16 @@
 import org.jboss.injection.ResourceHandler;
 import org.jboss.injection.WebServiceRefHandler;
 import org.jboss.logging.Logger;
-import org.jboss.metadata.MetaData;
 import org.jboss.metadata.ejb.jboss.JBossAssemblyDescriptorMetaData;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
+import org.jboss.metadata.ejb.jboss.JBossMetaData;
+import org.jboss.metadata.ejb.spec.InterceptorMetaData;
+import org.jboss.metadata.ejb.spec.InterceptorsMetaData;
+import org.jboss.metadata.ejb.spec.NamedMethodMetaData;
 import org.jboss.metadata.javaee.spec.Environment;
 import org.jboss.metadata.javaee.spec.ServiceReferenceMetaData;
+import org.jboss.util.StringPropertyReplacer;
 import org.jboss.util.naming.Util;
-import org.jboss.util.StringPropertyReplacer;
 import org.jboss.virtual.VirtualFile;
 
 /**
@@ -116,11 +117,16 @@
  * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
  * @version $Revision$
  */
-public abstract class EJBContainer extends ClassContainer implements Container, InjectionContainer, JavaEEComponent
+public abstract class EJBContainer implements Container, IndirectContainer<EJBContainer, DirectContainer<EJBContainer>>, InjectionContainer, JavaEEComponent
 {
-
    private static final Logger log = Logger.getLogger(EJBContainer.class);
 
+   private String name;
+   
+   private BeanContainer beanContainer;
+   
+   private DirectContainer<EJBContainer> directContainer;
+   
    protected EjbEncFactory encFactory = new DefaultEjbEncFactory();
 
    protected Pool pool;
@@ -132,6 +138,8 @@
    protected int defaultConstructorIndex;
 
    protected String beanClassName;
+   
+   private Class<?> beanClass;
 
    protected ClassLoader classloader;
 
@@ -140,8 +148,7 @@
 
    protected Context enc;
 
-   //protected SessionCallbackHandler callbackHandler;
-   protected LifecycleInterceptorHandler callbackHandler;
+//   protected LifecycleInterceptorHandler callbackHandler;
 
    protected Hashtable initialContextProperties;
 
@@ -152,14 +159,12 @@
 
    protected Map<String, Map<AccessibleObject, Injector>> encInjections = new HashMap<String, Map<AccessibleObject, Injector>>();
 
-   protected InterceptorInfoRepository interceptorRepository;
+//   protected List<InterceptorInfo> classInterceptors = new ArrayList<InterceptorInfo>();
+//
+//   protected LinkedHashSet<InterceptorInfo> applicableInterceptors;
 
-   protected List<InterceptorInfo> classInterceptors = new ArrayList<InterceptorInfo>();
+   private HashMap<Class<?>, InterceptorInjector> interceptorInjectors = new HashMap<Class<?>, InterceptorInjector>();
 
-   protected LinkedHashSet<InterceptorInfo> applicableInterceptors;
-
-   private HashMap<Class, InterceptorInjector> interceptorInjectors = new HashMap<Class, InterceptorInjector>();
-
    private Ejb3Deployment deployment;
 
    private DependencyPolicy dependencyPolicy;
@@ -187,31 +192,31 @@
     * @param ctxProperties
     * @param interceptorRepository
     * @param deployment
+    * @param beanMetaData           the meta data for this bean or null
     */
 
-   public EJBContainer(String name, AspectManager manager, ClassLoader cl,
+   public EJBContainer(String name, Domain domain, ClassLoader cl,
                        String beanClassName, String ejbName, Hashtable ctxProperties,
-                       InterceptorInfoRepository interceptorRepository, Ejb3Deployment deployment)
+                       Ejb3Deployment deployment, JBossEnterpriseBeanMetaData beanMetaData) throws ClassNotFoundException
    {
-      super(name, manager);
-      
-      assert interceptorRepository != null : "interceptorRepository is null";
+      assert name != null : "name is null";
       assert deployment != null : "deployment is null";
       
+      this.name = name;
       this.deployment = deployment;
       this.beanClassName = beanClassName;
       this.classloader = cl;
+      this.xml = beanMetaData;
          
-      super.setChainOverridingForInheritedMethods( true );
+      this.beanClass = classloader.loadClass(beanClassName);
       
-      try
-      {
-         clazz = classloader.loadClass(beanClassName);
-      }
-      catch (ClassNotFoundException e)
-      {
-         throw new RuntimeException(e);
-      }
+      // We can't type cast the direct container, because we just loaded the beanClass
+      // so assuming we have an object is a safe bet.
+      this.beanContainer = new BeanContainer(this);
+      // Because interceptors will query back the EJBContainer for annotations
+      // we must have set beanContainer first and then do the advisor. 
+      beanContainer.initialize(ejbName, domain, beanClass, beanMetaData, cl);
+      
       this.ejbName = ejbName;
       String on = createObjectName(ejbName);
      
@@ -224,7 +229,7 @@
          throw new RuntimeException("failed to create object name for: " + on, e);
       }
       
-      annotations = new AnnotationRepositoryToMetaData(this);
+      //annotations = new AnnotationRepositoryToMetaData(this);
       
       initialContextProperties = ctxProperties;
       try
@@ -235,8 +240,6 @@
       {
          throw new RuntimeException(e);
       }
-      this.interceptorRepository = interceptorRepository;
-      this.interceptorRepository.addBeanClass(clazz.getName());
       bindORB();
       bindEJBContext();
       
@@ -278,11 +281,74 @@
       return JavaEEComponentHelper.createObjectName(deployment, ejbName);
    }
    
+   /**
+    * Do not call, for BeanContainer.
+    * @throws IllegalAccessException 
+    * @throws InstantiationException 
+    */
+   public Object createInterceptor(Class<?> interceptorClass) throws InstantiationException, IllegalAccessException
+   {
+      Object instance = interceptorClass.newInstance();
+      InterceptorInjector interceptorInjector = interceptorInjectors.get(interceptorClass);
+      assert interceptorInjector != null : "interceptorInjector not found for " + interceptorClass;
+      interceptorInjector.inject(null, instance);
+      return instance;
+   }
+   
    public String createObjectName(String unitName, String ejbName)
    {
       return JavaEEComponentHelper.createObjectName(deployment, unitName, ejbName);
    }
    
+   // TODO: re-evaluate this exposure
+   @Deprecated
+   public Advisor getAdvisor()
+   {
+      return beanContainer._getAdvisor();
+   }
+
+   /*
+    * TODO: re-evalute this exposure
+    */
+   @Deprecated
+   public AnnotationRepository getAnnotations()
+   {
+      return beanContainer.getAnnotationRepository();
+   }
+
+   protected BeanContainer getBeanContainer()
+   {
+      return beanContainer;
+   }
+   
+   /**
+    * 
+    * @return   the bean class of this container
+    * @deprecated   use getBeanClass
+    */
+   public Class<?> getClazz()
+   {
+      return getBeanClass();
+   }
+   
+   @SuppressWarnings("unchecked")
+   public static <C extends EJBContainer> C getEJBContainer(Advisor advisor)
+   {
+      try
+      {
+         return (C) ((ManagedObjectAdvisor<Object, BeanContainer>) advisor).getContainer().getEJBContainer();
+      }
+      catch(ClassCastException e)
+      {
+         throw new ClassCastException(e.getMessage() + " using " + advisor);
+      }
+   }
+   
+   public String getName()
+   {
+      return name;
+   }
+   
    public void pushContext(BeanContext<?> beanContext)
    {
       currentBean.push(beanContext);
@@ -337,6 +403,15 @@
       return jaccContextId;
    }
 
+   /**
+    * Do not call, used by BeanContainer.
+    * @return
+    */
+   public List<Method> getVirtualMethods()
+   {
+      return null;
+   }
+   
    public void setJaccContextId(String jaccContextId)
    {
       this.jaccContextId = jaccContextId;
@@ -392,6 +467,11 @@
       return dependencyPolicy;
    }
 
+   public boolean isAnnotationPresent(Class<? extends Annotation> annotationType)
+   {
+      return beanContainer.isAnnotationPresent(annotationType);
+   }
+   
    /**
     * Is the method a business method of this container.
     * 
@@ -473,19 +553,25 @@
          Map<AccessibleObject, Injector> tmp = InjectionUtil.processAnnotations(this, handlers, getBeanClass());
          injectors.addAll(tmp.values());
 
+         /*
          initialiseInterceptors();
-         for (InterceptorInfo interceptorInfo : applicableInterceptors)
+         */
+         for (Class<?> interceptorClass : beanContainer.getInterceptorClasses())
          {
+            InterceptorMetaData interceptorMetaData = findInterceptor(interceptorClass);
+            if(interceptorMetaData == null)
+               continue;
+            
             for (InjectionHandler<Environment> handler : handlers)
             {
-               handler.loadXml(interceptorInfo.getXml(), this);
+               handler.loadXml(interceptorMetaData, this);
             }
          }
-         for (InterceptorInfo interceptorInfo : applicableInterceptors)
+         for (Class<?> interceptorClass : beanContainer.getInterceptorClasses())
          {
-            Map<AccessibleObject, Injector> tmpInterceptor = InjectionUtil.processAnnotations(this, handlers, interceptorInfo.getClazz());
-            InterceptorInjector injector = new InterceptorInjector(this, interceptorInfo, tmpInterceptor);
-            interceptorInjectors.put(interceptorInfo.getClazz(), injector);
+            Map<AccessibleObject, Injector> injections = InjectionUtil.processAnnotations(this, handlers, interceptorClass);
+            InterceptorInjector injector = new InterceptorInjector(injections);
+            interceptorInjectors.put(interceptorClass, injector);
          }
 
          // When @WebServiceRef is not used service-ref won't be processed
@@ -583,16 +669,13 @@
       return xml;
    }
 
-   public void setXml(JBossEnterpriseBeanMetaData xml)
-   {
-      this.xml = xml;
-   }
-
    public JBossAssemblyDescriptorMetaData getAssemblyDescriptor()
    {
       return assembly;
    }
 
+   // FIXME: remove
+   @Deprecated
    public void setAssemblyDescriptor(JBossAssemblyDescriptorMetaData assembly)
    {
       this.assembly = assembly;
@@ -602,28 +685,9 @@
    
    public InterceptorInfoRepository getInterceptorRepository()
    {
-      return interceptorRepository;
+      throw new RuntimeException("invalid");
    }
-
-   public List<InterceptorInfo> getClassInterceptors()
-   {
-      initialiseInterceptors();
-      return classInterceptors;
-   }
-
-   public HashSet<InterceptorInfo> getApplicableInterceptors()
-   {
-      initialiseInterceptors();
-      return applicableInterceptors;
-   }
-
-   public HashMap<Class, InterceptorInjector> getInterceptorInjectors()
-   {
-      initialiseInterceptors();
-      return interceptorInjectors;
-   }
-
-
+   
    public Map<String, EncInjector> getEncInjectors()
    {
       return encInjectors;
@@ -682,7 +746,7 @@
 
    public Class<?> getBeanClass()
    {
-      return clazz;
+      return beanClass;
    }
 
    public Pool getPool()
@@ -707,6 +771,7 @@
 
    protected Object construct()
    {
+      /*
       Interceptor[] cInterceptors = constructorInterceptors[defaultConstructorIndex];
       if (cInterceptors == null)
       {
@@ -740,16 +805,33 @@
       {
          throw new RuntimeException(throwable);
       }
-
+      */
+      try
+      {
+         return beanContainer.construct();
+      }
+      catch (SecurityException e)
+      {
+         throw new RuntimeException(e);
+      }
+      catch (NoSuchMethodException e)
+      {
+         throw new RuntimeException(e);
+      }
    }
    
    protected void reinitialize()
-   {         
+   {
+      // FIXME: is this correct?
+      beanContainer.reinitializeAdvisor();
+      
+      /*
       initClassMetaDataBindingsList();
       adviceBindings.clear();
       doesHaveAspects = false;
       constructorInfos = null;
       rebuildInterceptors();
+      */
       
       bindEJBContext();
       
@@ -758,8 +840,8 @@
 
    public void create() throws Exception
    {
-      super.initializeClassContainer();
-      
+      /*
+      initializeClassContainer();
       for (int i = 0; i < constructors.length; i++)
       {
          if (constructors[i].getParameterTypes().length == 0)
@@ -768,6 +850,7 @@
             break;
          }
       }
+      */
    }
 
    // Everything must be done in start to make sure all dependencies have been satisfied
@@ -790,12 +873,12 @@
       Injector[] injectors2 = injectors.toArray(new Injector[injectors.size()]);
       if (pool != null) pool.setInjectors(injectors2);
 
-      createCallbackHandler();
+//      createCallbackHandler();
       
       // If we're clustered, find our partition name
       findPartitionName();
       
-      log.info("STARTED EJB: " + clazz.getName() + " ejbName: " + ejbName);
+      log.info("STARTED EJB: " + beanClass.getName() + " ejbName: " + ejbName);
    }
 
    public void stop() throws Exception
@@ -816,14 +899,15 @@
       InitialContextFactory.close(enc, this.initialContextProperties);
       enc = null; 
       
-      log.info("STOPPED EJB: " + clazz.getName() + " ejbName: " + ejbName);
+      log.info("STOPPED EJB: " + beanClass.getName() + " ejbName: " + ejbName);
    }
 
    public void destroy() throws Exception
    {
       encFactory.cleanupEnc(this);
       
-      super.cleanup();
+      // TODO: clean up BeanContainer?
+      //super.cleanup();
    }
 
    @SuppressWarnings("unchecked")
@@ -845,6 +929,74 @@
       }
    }
    
+   protected Method getTimeoutCallback(NamedMethodMetaData timeoutMethodMetaData, Class<?> beanClass)
+   {
+      JBossEnterpriseBeanMetaData metaData = xml;
+      if(metaData != null)
+      {
+         if(timeoutMethodMetaData != null)
+         {
+            String methodName = timeoutMethodMetaData.getMethodName();
+            try
+            {
+               return beanClass.getMethod(methodName, Timer.class);
+            }
+            catch (SecurityException e)
+            {
+               throw new RuntimeException(e);
+            }
+            catch (NoSuchMethodException e)
+            {
+               throw new RuntimeException("No method " + methodName + "(javax.ejb.Timer timer) found on bean " + ejbName, e);
+            }
+         }
+      }
+      
+      if(TimedObject.class.isAssignableFrom(beanClass))
+      {
+         try
+         {
+            return TimedObject.class.getMethod("ejbTimeout", Timer.class);
+         }
+         catch (SecurityException e)
+         {
+            throw new RuntimeException(e);
+         }
+         catch (NoSuchMethodException e)
+         {
+            throw new RuntimeException(e);
+         }
+      }
+      
+      if(metaData != null)
+      {  
+         // TODO: cross cutting concern
+         if(metaData.getEjbJarMetaData().isMetadataComplete())
+            return null;
+      }
+      
+      for (Method method : beanClass.getMethods())
+      {
+         if (getAnnotation(Timeout.class, method) != null)
+         {
+            if (Modifier.isPublic(method.getModifiers()) &&
+                  method.getReturnType().equals(Void.TYPE) &&
+                  method.getParameterTypes().length == 1 &&
+                  method.getParameterTypes()[0].equals(Timer.class))
+            {
+               // TODO: check for multiples
+               return method;
+            }
+            else
+            {
+               throw new RuntimeException("@Timeout method " + method + " must have signature: void <METHOD>(javax.ejb.Timer timer) (EJB3 18.2.2)");
+            }
+         }
+      }
+      
+      return null;
+   }
+   
    protected void initializePool() throws Exception
    {
       org.jboss.ejb3.annotation.Pool poolAnnotation = getAnnotation(org.jboss.ejb3.annotation.Pool.class);
@@ -868,14 +1020,46 @@
       pool.setInjectors(injectors.toArray(new Injector[injectors.size()]));
    }
 
+   /**
+    * Note that this method is a WIP.
+    * 
+    * @param beanContext
+    * @param callbackAnnotationClass    on of PostConstruct, PreDestroy, PostActivate or PrePassivate
+    */
+   protected void invokeCallback(BeanContext<?> beanContext, Class<? extends Annotation> callbackAnnotationClass)
+   {
+      try
+      {
+         List<Interceptor> interceptors = new ArrayList<Interceptor>(InterceptorsFactory.getLifeCycleInterceptors((InstanceAdvisor) getAdvisor(), callbackAnnotationClass));
+         interceptors.add(0, PerVmAdvice.generateInterceptor(null, new InvocationContextInterceptor(), "setup"));
+         
+         LifeCycleInvocation invocation = new LifeCycleInvocation(interceptors.toArray(new Interceptor[0]));
+         invocation.setAdvisor(getAdvisor());
+         invocation.setTargetObject(beanContext.getInstance());
+         invocation.invokeNext();
+      }
+      catch(Throwable t)
+      {
+         throw new RuntimeException(t);
+      }
+   }
+   
+   public void invokePostConstruct(BeanContext<?> beanContext)
+   {
+      invokeCallback(beanContext, PostConstruct.class);
+   }
+
+   @Deprecated
    public void invokePostConstruct(BeanContext beanContext, Object[] params)
    {
-      callbackHandler.postConstruct(beanContext, params);
+      invokePostConstruct(beanContext);
    }
 
    public void invokePreDestroy(BeanContext beanContext)
    {
-      callbackHandler.preDestroy(beanContext);
+      // This is the correct way to destroy an instance, do
+      // not call invokeCallback here.
+      beanContainer.destroy(beanContext.getInstance());
    }
 
    public void invokePostActivate(BeanContext beanContext)
@@ -932,6 +1116,7 @@
       }
    }
 
+   /*
    protected void createCallbackHandler()
    {
       try
@@ -945,6 +1130,7 @@
                  + beanClassName, e);
       }
    }
+   */
 
    protected Class[] getHandledCallbacks()
    {
@@ -952,33 +1138,23 @@
               {PostConstruct.class, PreDestroy.class, Timeout.class};
    }
 
-   private void initialiseInterceptors()
+   // TODO: once injection is finalized this method will disappear
+   private InterceptorMetaData findInterceptor(Class<?> interceptorClass)
    {
-      if (applicableInterceptors == null)
+      if(xml == null)
+         return null;
+      JBossMetaData ejbJarMetaData = xml.getEjbJarMetaData();
+      if(ejbJarMetaData == null)
+         return null;
+      InterceptorsMetaData interceptors = ejbJarMetaData.getInterceptors();
+      if(interceptors == null)
+         return null;
+      for(InterceptorMetaData interceptorMetaData : interceptors)
       {
-         log.debug("Initialising interceptors for " + getEjbName() + "...");
-         HashSet<InterceptorInfo> defaultInterceptors = interceptorRepository.getDefaultInterceptors();
-         log.debug("Default interceptors: " + defaultInterceptors);
-
-         classInterceptors = interceptorRepository.getClassInterceptors(this);
-         log.debug("Class interceptors: " + classInterceptors);
-
-         applicableInterceptors = new LinkedHashSet<InterceptorInfo>();
-         if (defaultInterceptors != null) applicableInterceptors.addAll(defaultInterceptors);
-         if (classInterceptors != null) applicableInterceptors.addAll(classInterceptors);
-
-         Method[] methods = clazz.getMethods();
-         for (int i = 0; i < methods.length; i++)
-         {
-            List methodIcptrs = interceptorRepository.getMethodInterceptors(this, methods[i]);
-            if (methodIcptrs != null && methodIcptrs.size() > 0)
-            {
-               log.debug("Method interceptors for  " + methods[i] + ": " + methodIcptrs);
-               applicableInterceptors.addAll(methodIcptrs);
-            }
-         }
-         log.debug("All applicable interceptor classes: " + applicableInterceptors);
+         if(interceptorMetaData.getInterceptorClass().equals(interceptorClass.getName()))
+            return interceptorMetaData;
       }
+      return null;
    }
    
    protected void findPartitionName()
@@ -1073,6 +1249,7 @@
       return null;
    }
 
+   /*
    @Override
    public boolean hasAnnotation(Class tgt, String annotation)
    {
@@ -1142,7 +1319,8 @@
          throw new RuntimeException(e);  //To change body of catch statement use Options | File Templates.
       }
    }
-
+   */
+   
    public Container resolveEjbContainer(String link, Class businessIntf)
    {
       return deployment.getEjbContainer(link, businessIntf);
@@ -1158,31 +1336,22 @@
       return deployment.resolveMessageDestination(link);
    }
    
-   @SuppressWarnings("unchecked")
    public <T extends Annotation> T getAnnotation(Class<T> annotationType)
    {
       if (this.getAnnotations().isDisabled(annotationType))
          return null;
       
-      return (T) resolveAnnotation(annotationType);
+      return beanContainer.getAnnotation(annotationType);
    }
    
    public <T extends Annotation> T getAnnotation(Class<T> annotationType, Class<?> clazz)
    {
-      if (clazz == this.getBeanClass())
-      {
-         return (T) resolveAnnotation(annotationType);
-      }
-      return clazz.getAnnotation(annotationType);
+      return beanContainer.getAnnotation(clazz, annotationType);
    }
 
    public <T extends Annotation> T getAnnotation(Class<T> annotationType, Class<?> clazz, Method method)
    {
-      if (clazz == this.getBeanClass())
-      {
-         return (T) resolveAnnotation(method, annotationType);
-      }
-      return method.getAnnotation(annotationType);
+      return beanContainer.getAnnotation(annotationType, clazz, method);
    }
    
    public <T extends Annotation> T getAnnotation(Class<T> annotationType, Method method)
@@ -1190,63 +1359,50 @@
       if (this.getAnnotations().isDisabled(method, annotationType))
          return null;
       
-      return (T) resolveAnnotation(method, annotationType);
+      return beanContainer.getAnnotation(annotationType, method);
    }
 
    public <T extends Annotation> T getAnnotation(Class<T> annotationType, Class<?> clazz, Field field)
    {
-      if (clazz == this.getBeanClass())
-      {
-         return (T) resolveAnnotation(field, annotationType);
-      }
-      return field.getAnnotation(annotationType);
+      return beanContainer.getAnnotation(annotationType, clazz, field);
    }
    
    public <T extends Annotation> T getAnnotation(Class<T> annotationType, Field field)
    {
-      return (T) resolveAnnotation(field, annotationType);
+      return beanContainer.getAnnotation(annotationType, field);
    }
    
-   @Override
-   public Object resolveAnnotation(Method m, Class annotation)
+   /**
+    * @deprecated use getAnnotation
+    */
+   @SuppressWarnings("unchecked")
+   public Object resolveAnnotation(Class annotationType)
    {
-      Object value = super.resolveAnnotation(m, annotation);
-      if (value == null && m.isBridge()) value = getBridgedAnnotation(m, annotation);
-      return value;
+      return getAnnotation(annotationType);
    }
    
-   protected Object getBridgedAnnotation(Method bridgeMethod, Class annotation)
+   /**
+    * @deprecated use getAnnotation
+    */
+   @SuppressWarnings("unchecked")
+   public Object resolveAnnotation(Field field, Class annotationType)
    {
-      Method[] methods = bridgeMethod.getDeclaringClass().getMethods();
-      int i = 0;
-      boolean found = false;
-      Class[] bridgeParams = bridgeMethod.getParameterTypes();
-      while (i < methods.length && !found)
-      {
-         if (!methods[i].isBridge() && methods[i].getName().equals(bridgeMethod.getName()))
-         {
-            Class[] params = methods[i].getParameterTypes();
-            if (params.length == bridgeParams.length)
-            {
-               int j = 0;
-               boolean matches = true;
-               while (j < params.length && matches)
-               {
-                  if (!bridgeParams[j].isAssignableFrom(params[j]))
-                     matches = false;
-                  ++j;
-               }
-               
-               if (matches)
-                  return resolveAnnotation(methods[i], annotation);
-            }
-         }
-         ++i;
-      }
- 
-      return null;
+      return getAnnotation(annotationType, field);
    }
    
+   /**
+    * @deprecated use getAnnotation
+    */
+   @SuppressWarnings("unchecked")
+   public Object resolveAnnotation(Method method, Class annotationType)
+   {
+      return getAnnotation(annotationType, method);
+   }
+   
+   /**
+    * @deprecated this is going to be gone soon
+    */
+   @SuppressWarnings("unchecked")
    public Object resolveAnnotation(Method m, Class[] annotationChoices)
    {
       Object value = null;
@@ -1288,11 +1444,11 @@
       return invokeStats;
    }
 
-
-   public MethodInfo getMethodInfo(Method method)
+   @Deprecated
+   protected MethodInfo getMethodInfo(Method method)
    {
       long hash = MethodHashing.calculateHash(method);
-      MethodInfo info = super.getMethodInfo(hash);
+      MethodInfo info = getAdvisor().getMethodInfo(hash);
       if (info == null)
       {
          throw new RuntimeException("Could not resolve beanClass method from proxy call: " + method.toString());
@@ -1321,9 +1477,16 @@
       this.businessInterfaces = resolveBusinessInterfaces();
       
       // Before we start to process annotations, make sure we also have the ones from interceptors-aop.
-      initializeClassContainer();
+      // FIXME: because of the flaked life cycle of an EJBContainer (we add annotations after it's been
+      // constructed), we must reinitialize the whole thing. 
+      beanContainer.reinitializeAdvisor();
    }
    
+   public void setDirectContainer(DirectContainer<EJBContainer> container)
+   {
+      this.directContainer = container;
+   }
+   
    protected Method getNonBridgeMethod(Method bridgeMethod)
    {
       Class clazz = bridgeMethod.getDeclaringClass();

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainerInvocation.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainerInvocation.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainerInvocation.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -56,11 +56,13 @@
       super(null, null);
    }
 
+   /*
    @SuppressWarnings("unchecked")
    public A getAdvisor()
    {
       return (A) super.getAdvisor();
    }
+   */
    
    public T getBeanContext()
    {

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainerInvocationWrapper.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainerInvocationWrapper.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainerInvocationWrapper.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -23,6 +23,8 @@
 
 import java.lang.reflect.Method;
 import java.util.Map;
+
+import org.jboss.aop.Advisor;
 import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.metadata.SimpleMetaData;
@@ -44,8 +46,8 @@
 
    public EJBContainerInvocationWrapper(EJBContainerInvocation<A, T> wrapped, Interceptor[] interceptors)
    {
+      super(interceptors, wrapped.getMethodHash(), wrapped.getMethod(), wrapped.getActualMethod(), wrapped.getAdvisor());
       this.wrapped = wrapped;
-      this.interceptors = interceptors;
    }
 
    public Object invokeNext() throws Throwable
@@ -167,7 +169,7 @@
       return wrapped.invokeNext(newInterceptors);
    }
 
-   public A getAdvisor()
+   public Advisor getAdvisor()
    {
       return wrapped.getAdvisor();
    }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContextImpl.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContextImpl.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContextImpl.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -41,7 +41,6 @@
 import javax.transaction.TransactionManager;
 import javax.transaction.UserTransaction;
 
-import org.jboss.aop.Advisor;
 import org.jboss.ejb3.annotation.SecurityDomain;
 import org.jboss.ejb3.tx.TxUtil;
 import org.jboss.ejb3.tx.UserTransactionImpl;
@@ -302,7 +301,7 @@
 
    public UserTransaction getUserTransaction() throws IllegalStateException
    {
-      TransactionManagementType type = TxUtil.getTransactionManagementType(((Advisor) getContainer()));
+      TransactionManagementType type = TxUtil.getTransactionManagementType(getContainer());
       if (type != TransactionManagementType.BEAN) throw new IllegalStateException("Container " + getContainer().getEjbName() + ": it is illegal to inject UserTransaction into a CMT bean");
 
       return new UserTransactionImpl();
@@ -326,7 +325,7 @@
    public void setRollbackOnly() throws IllegalStateException
    {
       // EJB1.1 11.6.1: Must throw IllegalStateException if BMT
-      TransactionManagementType type = TxUtil.getTransactionManagementType(((Advisor) getContainer()));
+      TransactionManagementType type = TxUtil.getTransactionManagementType(getContainer());
       if (type != TransactionManagementType.CONTAINER) throw new IllegalStateException("Container " + getContainer().getEjbName() + ": it is illegal to call setRollbackOnly from BMT: " + type);
 
       try
@@ -349,7 +348,7 @@
    public boolean getRollbackOnly() throws IllegalStateException
    {
       // EJB1.1 11.6.1: Must throw IllegalStateException if BMT
-      TransactionManagementType type = TxUtil.getTransactionManagementType(((Advisor) getContainer()));
+      TransactionManagementType type = TxUtil.getTransactionManagementType(getContainer());
       if (type != TransactionManagementType.CONTAINER)
          throw new IllegalStateException("Container " + getContainer().getEjbName() + ": it is illegal to call getRollbackOnly from BMT: " + type);
 

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/ENCPropagationInterceptor.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/ENCPropagationInterceptor.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/ENCPropagationInterceptor.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -21,8 +21,8 @@
  */
 package org.jboss.ejb3;
 
-import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.ejb3.aop.AbstractInterceptor;
 
 /**
  * This interceptor is needed so that the ENC is propagated in asynchronous calls.
@@ -30,16 +30,11 @@
  * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
  * @version $Revision$
  */
-public class ENCPropagationInterceptor implements Interceptor
+public class ENCPropagationInterceptor extends AbstractInterceptor
 {
-   public String getName()
-   {
-      return this.getClass().getName();
-   }
-
    public Object invoke(Invocation invocation) throws Throwable
    {
-      EJBContainer container = (EJBContainer) invocation.getAdvisor();
+      EJBContainer container = getEJBContainer(invocation);
       try
       {
          container.pushEnc();

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3AnnotationHandler.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3AnnotationHandler.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3AnnotationHandler.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -34,14 +34,21 @@
 import javax.ejb.TransactionAttributeType;
 
 import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
 import org.jboss.aop.DomainDefinition;
 import org.jboss.ejb3.mdb.ConsumerContainer;
 import org.jboss.ejb3.mdb.MDB;
-import org.jboss.ejb3.metamodel.EnterpriseBean;
 import org.jboss.ejb3.service.ServiceContainer;
 import org.jboss.ejb3.stateful.StatefulContainer;
 import org.jboss.ejb3.stateless.StatelessContainer;
 import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossConsumerBeanMetaData;
+import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
+import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeansMetaData;
+import org.jboss.metadata.ejb.jboss.JBossMessageDrivenBeanMetaData;
+import org.jboss.metadata.ejb.jboss.JBossMetaData;
+import org.jboss.metadata.ejb.jboss.JBossServiceBeanMetaData;
+import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 
 /**
  * @author <a href="mailto:bdecoste at jboss.com">William DeCoste</a>
@@ -100,6 +107,56 @@
       visible = (AnnotationsAttribute) cf.getAttribute(AnnotationsAttribute.visibleTag);
    }
 
+   /**
+    * The link from an enterprise bean to it's interceptors is via the EJB Jar meta data.
+    * So we try to recreate that link it's not already established.
+    * 
+    * Because of a bug in jboss-metadata an annotated bean will not always
+    * get some meta data, so we create some for it.
+    * 
+    * TODO: JBMETA-4
+    * 
+    * @param <M>
+    * @param deployment
+    * @param ejbName
+    * @param enterpriseBeanMetaDataClass
+    * @return
+    */
+   private <M extends JBossEnterpriseBeanMetaData> M getEnterpriseBeanMetaData(Ejb3Deployment deployment, String ejbName, Class<M> enterpriseBeanMetaDataClass)
+   {
+      JBossMetaData ejbJarMetaData = deployment.getMetaData();
+      // If there is no meta data at all, don't establish the link.
+      if(ejbJarMetaData == null)
+         return null;
+      
+      M beanMetaData = deployment.getEnterpriseBeanMetaData(ejbName, enterpriseBeanMetaDataClass);
+      if(beanMetaData == null)
+      {
+         log.warn("JBMETA-4: did not find any bean meta data for annotation bean " + ejbName + ", will create some");
+         try
+         {
+            beanMetaData = enterpriseBeanMetaDataClass.newInstance();
+         }
+         catch (InstantiationException e)
+         {
+            throw new RuntimeException();
+         }
+         catch (IllegalAccessException e)
+         {
+            throw new RuntimeException();
+         }
+         beanMetaData.setEjbName(ejbName);
+         JBossEnterpriseBeansMetaData enterpriseBeans = ejbJarMetaData.getEnterpriseBeans();
+         if(enterpriseBeans == null)
+         {
+            enterpriseBeans = new JBossEnterpriseBeansMetaData();
+            ejbJarMetaData.setEnterpriseBeans(enterpriseBeans);
+         }
+         enterpriseBeans.add(beanMetaData);
+      }
+      return beanMetaData;
+   }
+   
    public void setCtxProperties(Hashtable ctxProperties)
    {
       this.ctxProperties = ctxProperties;
@@ -131,41 +188,44 @@
 
    public List getContainers(ClassFile cf, Ejb3Deployment deployment) throws Exception
    {
-      List containers = new ArrayList();
+      List<EJBContainer> containers = new ArrayList<EJBContainer>();
 
       populateBaseInfo();
 
+      // TODO: because Ejb3Deployment.deploy will first do annotation deployments
+      // and then meta data deployments, bean meta data will never be attached to
+      // the container. So we do it here.
       for (int ejbIndex = 0; ejbIndex < ejbNames.size(); ++ejbIndex)
       {
          String ejbName = ejbNames.get(ejbIndex);
          if (ejbType == EJB_TYPE.STATELESS)
          {
-            EJBContainer container = getStatelessContainer(ejbIndex);
+            EJBContainer container = getStatelessContainer(ejbIndex, getEnterpriseBeanMetaData(deployment, ejbName, JBossSessionBeanMetaData.class));
             container.setJaccContextId(getJaccContextId());
             containers.add(container);
          }
          else if (ejbType == EJB_TYPE.STATEFUL)
          {
-            StatefulContainer container = getStatefulContainer(ejbIndex);
+            StatefulContainer container = getStatefulContainer(ejbIndex, getEnterpriseBeanMetaData(deployment, ejbName, JBossSessionBeanMetaData.class));
             container.setJaccContextId(getJaccContextId());
             containers.add(container);
          }
          else if (ejbType == EJB_TYPE.MESSAGE_DRIVEN)
          {
-            MDB container = getMDB(ejbIndex);
+            MDB container = getMDB(ejbIndex, getEnterpriseBeanMetaData(deployment, ejbName, JBossMessageDrivenBeanMetaData.class));
             validateMDBTransactionAttribute(container);
             container.setJaccContextId(getJaccContextId());
             containers.add(container);
          }
          else if (ejbType == EJB_TYPE.SERVICE)
          {
-            ServiceContainer container = getServiceContainer(ejbIndex);
+            ServiceContainer container = getServiceContainer(ejbIndex, getEnterpriseBeanMetaData(deployment, ejbName, JBossServiceBeanMetaData.class));
             container.setJaccContextId(getJaccContextId());
             containers.add(container);
          }
          else if (ejbType == EJB_TYPE.CONSUMER)
          {
-            ConsumerContainer container = getConsumerContainer(ejbIndex);
+            ConsumerContainer container = getConsumerContainer(ejbIndex, getEnterpriseBeanMetaData(deployment, ejbName, JBossConsumerBeanMetaData.class));
             container.setJaccContextId(getJaccContextId());
             containers.add(container);
          }
@@ -192,7 +252,7 @@
       return EJB3Util.getAspectDomain(visible, defaultDomain);
    }
 
-   protected ServiceContainer getServiceContainer(int ejbIndex) throws Exception
+   protected ServiceContainer getServiceContainer(int ejbIndex, JBossServiceBeanMetaData beanMetaData) throws Exception
    {
       String containerName = getAspectDomain(ejbIndex, defaultServiceDomain);
       DomainDefinition domain = AspectManager.instance().getContainer(containerName);
@@ -202,12 +262,12 @@
                  + containerName + "''");
 
       return new ServiceContainer(deployment.getMbeanServer(), di.getClassLoader(), className,
-              ejbNames.get(ejbIndex), (AspectManager) domain.getManager(), ctxProperties,
-              di.getInterceptorInfoRepository(), deployment);
+              ejbNames.get(ejbIndex), (Domain) domain.getManager(), ctxProperties,
+              deployment, beanMetaData);
 
    }
 
-   protected ConsumerContainer getConsumerContainer(int ejbIndex) throws Exception
+   protected ConsumerContainer getConsumerContainer(int ejbIndex, JBossConsumerBeanMetaData beanMetaData) throws Exception
    {
       String containerName = getAspectDomain(ejbIndex, defaultConsumerDomain);
       DomainDefinition domain = AspectManager.instance().getContainer(containerName);
@@ -216,13 +276,13 @@
          throw new RuntimeException("No container configured with name '"
                  + containerName + "''");
 
-      return new ConsumerContainer(ejbNames.get(ejbIndex), (AspectManager) domain.getManager(),
+      return new ConsumerContainer(ejbNames.get(ejbIndex), (Domain) domain.getManager(),
               di.getClassLoader(), className, ctxProperties,
-              di.getInterceptorInfoRepository(), deployment);
+              deployment, beanMetaData);
 
    }
 
-   protected StatefulContainer getStatefulContainer(int ejbIndex) throws Exception
+   protected StatefulContainer getStatefulContainer(int ejbIndex, JBossSessionBeanMetaData beanMetaData) throws Exception
    {
       String containerName = getAspectDomain(ejbIndex, defaultSFSBDomain);
       DomainDefinition domain = AspectManager.instance().getContainer(containerName);
@@ -232,12 +292,12 @@
                  + containerName + "''");
 
       return new StatefulContainer(di.getClassLoader(), className,
-              ejbNames.get(ejbIndex), (AspectManager) domain.getManager(), ctxProperties,
-              di.getInterceptorInfoRepository(), deployment);
+              ejbNames.get(ejbIndex), (Domain) domain.getManager(), ctxProperties,
+              deployment, beanMetaData);
 
    }
 
-   protected EJBContainer getStatelessContainer(int ejbIndex) throws Exception
+   protected EJBContainer getStatelessContainer(int ejbIndex, JBossSessionBeanMetaData beanMetaData) throws Exception
    {
       String containerName = getAspectDomain(ejbIndex, defaultSLSBDomain);
       
@@ -248,9 +308,8 @@
                  + containerName + "''");
 
       return new StatelessContainer(di.getClassLoader(), className,
-              ejbNames.get(ejbIndex), (AspectManager) domain.getManager(),
-              ctxProperties, di.getInterceptorInfoRepository(),
-              deployment);
+              ejbNames.get(ejbIndex), (Domain) domain.getManager(),
+              ctxProperties, deployment, beanMetaData);
    }
 
    protected String getMDBDomainName(int ejbIndex)
@@ -263,13 +322,8 @@
 
    }
 
-   protected MDB getMDB(int ejbIndex) throws Exception
+   protected MDB getMDB(int ejbIndex, JBossMessageDrivenBeanMetaData beanMetaData) throws Exception
    {
-      return getMDB(ejbIndex, null);
-   }
-
-   protected MDB getMDB(int ejbIndex, EnterpriseBean xml) throws Exception
-   {
       String domainName = getMDBDomainName(ejbIndex);
       
       String containerName = getAspectDomain(ejbIndex, domainName);
@@ -279,8 +333,8 @@
          throw new RuntimeException("No container configured with name '"
                  + containerName + "''");
 
-      MDB container = new MDB(ejbNames.get(ejbIndex), (AspectManager) domain.getManager(), di.getClassLoader(), className,
-              ctxProperties, di.getInterceptorInfoRepository(), deployment);
+      MDB container = new MDB(ejbNames.get(ejbIndex), (Domain) domain.getManager(), di.getClassLoader(), className,
+              ctxProperties, deployment, beanMetaData);
 
       return container;
    }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3Deployment.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3Deployment.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3Deployment.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -59,6 +59,7 @@
 import org.jboss.ejb3.pool.PoolFactoryRegistry;
 import org.jboss.ejb3.remoting.RemoteProxyFactoryRegistry;
 import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossMetaData;
 import org.jboss.metadata.javaee.spec.MessageDestinationsMetaData;
 import org.jboss.system.ServiceMBeanSupport;
@@ -798,6 +799,21 @@
    }
 
    /**
+    * Do not call, for use in Ejb3Handler.
+    * 
+    * @param <B>
+    * @param ejbName
+    * @param enterpriseBeanMetaDataClass
+    * @return
+    */
+   protected <B extends JBossEnterpriseBeanMetaData> B getEnterpriseBeanMetaData(String ejbName, Class<B> enterpriseBeanMetaDataClass)
+   {
+      if(metaData == null)
+         return null;
+      return enterpriseBeanMetaDataClass.cast(metaData.getEnterpriseBean(ejbName));
+   }
+   
+   /**
     * Get the meta data associated with this deployment or null if none.
     * 
     * @return   meta data or null

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3DescriptorHandler.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3DescriptorHandler.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3DescriptorHandler.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -55,7 +55,6 @@
 import javax.ejb.TransactionManagement;
 import javax.ejb.TransactionManagementType;
 import javax.interceptor.AroundInvoke;
-import javax.interceptor.ExcludeClassInterceptors;
 import javax.interceptor.ExcludeDefaultInterceptors;
 import javax.interceptor.Interceptors;
 
@@ -65,7 +64,6 @@
 import org.jboss.ejb3.annotation.Consumer;
 import org.jboss.ejb3.annotation.CurrentMessage;
 import org.jboss.ejb3.annotation.DefaultActivationSpecs;
-import org.jboss.ejb3.annotation.DefaultInterceptorMarker;
 import org.jboss.ejb3.annotation.DeliveryMode;
 import org.jboss.ejb3.annotation.Depends;
 import org.jboss.ejb3.annotation.IgnoreDependency;
@@ -93,10 +91,8 @@
 import org.jboss.ejb3.annotation.impl.CurrentMessageImpl;
 import org.jboss.ejb3.annotation.impl.DeclareRolesImpl;
 import org.jboss.ejb3.annotation.impl.DefaultActivationSpecsImpl;
-import org.jboss.ejb3.annotation.impl.DefaultInterceptorMarkerImpl;
 import org.jboss.ejb3.annotation.impl.DenyAllImpl;
 import org.jboss.ejb3.annotation.impl.DependsImpl;
-import org.jboss.ejb3.annotation.impl.ExcludeClassInterceptorsImpl;
 import org.jboss.ejb3.annotation.impl.ExcludeDefaultInterceptorsImpl;
 import org.jboss.ejb3.annotation.impl.IgnoreDependencyImpl;
 import org.jboss.ejb3.annotation.impl.InitImpl;
@@ -153,6 +149,7 @@
 import org.jboss.metadata.ejb.jboss.JBossMetaData;
 import org.jboss.metadata.ejb.jboss.JBossServiceBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
+import org.jboss.metadata.ejb.jboss.LocalProducerMetaData;
 import org.jboss.metadata.ejb.jboss.MessagePropertiesMetaData;
 import org.jboss.metadata.ejb.jboss.MethodAttributeMetaData;
 import org.jboss.metadata.ejb.jboss.MethodAttributesMetaData;
@@ -408,31 +405,31 @@
             ejbClass = di.getClassLoader().loadClass(className);
             if (ejbType == EJB_TYPE.STATELESS)
             {
-               EJBContainer container = getStatelessContainer(ejbIndex);
+               EJBContainer container = getStatelessContainer(ejbIndex, (JBossSessionBeanMetaData) enterpriseBean);
                container.setJaccContextId(getJaccContextId());
                containers.add(container);
             }
             else if (ejbType == EJB_TYPE.STATEFUL)
             {
-               StatefulContainer container = getStatefulContainer(ejbIndex);
+               StatefulContainer container = getStatefulContainer(ejbIndex, (JBossSessionBeanMetaData) enterpriseBean);
                container.setJaccContextId(getJaccContextId());
                containers.add(container);
             }
             else if (ejbType == EJB_TYPE.MESSAGE_DRIVEN)
             {
-               MDB container = getMDB(ejbIndex);
+               MDB container = getMDB(ejbIndex, (JBossMessageDrivenBeanMetaData) enterpriseBean);
                container.setJaccContextId(getJaccContextId());
                containers.add(container);
             }
             else if (ejbType == EJB_TYPE.SERVICE)
             {
-               ServiceContainer container = getServiceContainer(ejbIndex);
+               ServiceContainer container = getServiceContainer(ejbIndex, (JBossServiceBeanMetaData) enterpriseBean);
                container.setJaccContextId(getJaccContextId());
                containers.add(container);
             }
             else if (ejbType == EJB_TYPE.CONSUMER)
             {
-               ConsumerContainer container = getConsumerContainer(ejbIndex);
+               ConsumerContainer container = getConsumerContainer(ejbIndex, (JBossConsumerBeanMetaData) enterpriseBean);
                container.setJaccContextId(getJaccContextId());
                containers.add(container);
             }
@@ -443,15 +440,14 @@
       return containers;
    }
 
-   protected StatefulContainer getStatefulContainer(int ejbIndex)
+   @Override
+   protected StatefulContainer getStatefulContainer(int ejbIndex, JBossSessionBeanMetaData enterpriseBean)
          throws Exception
    {
       String ejbName = ejbNames.get(ejbIndex);
 
-      JBossEnterpriseBeanMetaData enterpriseBean = ejbs.get(ejbIndex);
+      StatefulContainer container = super.getStatefulContainer(ejbIndex, enterpriseBean);
 
-      StatefulContainer container = super.getStatefulContainer(ejbIndex);
-
       container.setAssemblyDescriptor(dd.getAssemblyDescriptor());
 
       if(enterpriseBean instanceof JBossSessionBeanMetaData)
@@ -482,15 +478,14 @@
       }
    }
 
-   protected EJBContainer getStatelessContainer(int ejbIndex)
+   @Override
+   protected EJBContainer getStatelessContainer(int ejbIndex, JBossSessionBeanMetaData enterpriseBean)
          throws Exception
    {
       String ejbName = ejbNames.get(ejbIndex);
 
-      JBossEnterpriseBeanMetaData enterpriseBean = ejbs.get(ejbIndex);
+      EJBContainer container = super.getStatelessContainer(ejbIndex, enterpriseBean);
 
-      EJBContainer container = super.getStatelessContainer(ejbIndex);
-
       container.setAssemblyDescriptor(dd.getAssemblyDescriptor());
 
       StatelessImpl annotation = new StatelessImpl(ejbName);
@@ -509,14 +504,13 @@
       return container;
    }
 
-   protected ServiceContainer getServiceContainer(int ejbIndex)
+   @Override
+   protected ServiceContainer getServiceContainer(int ejbIndex, JBossServiceBeanMetaData service)
          throws Exception
    {
       String ejbName = ejbNames.get(ejbIndex);
 
-      JBossServiceBeanMetaData service = (JBossServiceBeanMetaData) ejbs.get(ejbIndex);
-
-      ServiceContainer container = super.getServiceContainer(ejbIndex);
+      ServiceContainer container = super.getServiceContainer(ejbIndex, service);
       ServiceImpl annotation = new ServiceImpl((Service) container
             .resolveAnnotation(Service.class));
 
@@ -542,14 +536,13 @@
       return container;
    }
 
-   protected ConsumerContainer getConsumerContainer(int ejbIndex)
+   @Override
+   protected ConsumerContainer getConsumerContainer(int ejbIndex, JBossConsumerBeanMetaData consumer)
          throws Exception
    {
       String ejbName = ejbNames.get(ejbIndex);
 
-      JBossConsumerBeanMetaData consumer = (JBossConsumerBeanMetaData) ejbs.get(ejbIndex);
-
-      ConsumerContainer container = super.getConsumerContainer(ejbIndex);
+      ConsumerContainer container = super.getConsumerContainer(ejbIndex, consumer);
       ConsumerImpl annotation = new ConsumerImpl((Consumer) container
             .resolveAnnotation(Consumer.class));
 
@@ -589,18 +582,18 @@
       return defaultMDBDomain;
    }
 
-   protected MDB getMDB(int ejbIndex) throws Exception
+   @Override
+   protected MDB getMDB(int ejbIndex, JBossMessageDrivenBeanMetaData enterpriseBean) throws Exception
    {
       String ejbName = ejbNames.get(ejbIndex);
 
-      JBossEnterpriseBeanMetaData enterpriseBean = ejbs.get(ejbIndex);
+      MDB container = super.getMDB(ejbIndex, enterpriseBean);
 
-      MDB container = super.getMDB(ejbIndex);
-
       container.setAssemblyDescriptor(dd.getAssemblyDescriptor());
 
       if(enterpriseBean instanceof JBossMessageDrivenBeanMetaData)
          addMDBAnnotations(container, ejbName, (JBossMessageDrivenBeanMetaData) enterpriseBean);
+      /*
       else if(enterpriseBean instanceof JBossGenericBeanMetaData)
       {
          // EJBTHREE-936: TODO: unsupported wickedness starts here
@@ -609,6 +602,7 @@
          
          addMDBAnnotations(container, ejbName, mdb);
       }
+      */
 
       // An MDB doesn't have business interfaces, or does it?
       //addInterfaces(container, enterpriseBean);
@@ -907,8 +901,6 @@
          }
       }
       
-      container.setXml(enterpriseBean);
-
       addTransactionAnnotations(container, enterpriseBean, ejbName);
 
       addAssemblyAnnotations(container, enterpriseBean, ejbName);
@@ -991,7 +983,7 @@
       {
          addExcludeAnnotations(container, assembly.getExcludeList(), ejbName);
 
-         addInterceptorBindingAnnotations(container, enterpriseBean, ejbName);
+//         addInterceptorBindingAnnotations(container, enterpriseBean, ejbName);
       }
 
       if (enterpriseBean instanceof JBossSessionBeanMetaData)
@@ -1219,12 +1211,14 @@
          }
       }
 
+      /*
       if (!definesInterceptors
             && di.getInterceptorInfoRepository().hasDefaultInterceptors())
       {
          addClassAnnotation(container, DefaultInterceptorMarker.class,
                new DefaultInterceptorMarkerImpl());
       }
+      */
    }
 
    /**
@@ -1264,6 +1258,7 @@
          EJBContainer container, InterceptorBindingMetaData binding)
          throws ClassNotFoundException
    {
+      /*
       boolean addedAnnotations = false;
       for (java.lang.reflect.Method method : container.getBeanClass()
             .getMethods())
@@ -1343,6 +1338,8 @@
       }
 
       return addedAnnotations;
+      */
+      return false;
    }
 
    private void addEjbAnnotations(EJBContainer container,
@@ -1558,6 +1555,7 @@
    private void addClusterAnnotations(EJBContainer container,
          JBossSessionBeanMetaData enterpriseBean) throws Exception
    {
+      /* FIXME: Why disable the annotation?
       if (!enterpriseBean.isClustered())
       {
          // ask directly, not the container (metadata setup in progress)
@@ -1566,6 +1564,7 @@
             container.getAnnotations().disableAnnotation(Clustered.class.getName());
          return;
       }
+      */
 
       ClusterConfigMetaData config = enterpriseBean.getClusterConfig();
       if (config != null)
@@ -1646,28 +1645,36 @@
       if (consumer == null)
          return;
 
-      if (consumer.getProducers().size() > 0
-            || consumer.getLocalProducers().size() > 0)
+      List<ProducerMetaData> producers = consumer.getProducers();
+      List<LocalProducerMetaData> localProducers = consumer.getLocalProducers();
+      if ((producers != null && producers.size() > 0) || (localProducers != null && localProducers.size() > 0))
       {
          ProducersImpl producersAnnotation = new ProducersImpl();
 
-         for(ProducerMetaData producer : consumer.getProducers())
+         if(producers != null)
          {
-            ProducerImpl annotation = new ProducerImpl(di.getClassLoader()
-                  .loadClass(producer.getClassName()));
-            if (producer.getConnectionFactory() != null)
-               annotation.setConnectionFactory(producer.getConnectionFactory());
-            producersAnnotation.addProducer(annotation);
+            for(ProducerMetaData producer : producers)
+            {
+               ProducerImpl annotation = new ProducerImpl(di.getClassLoader()
+                     .loadClass(producer.getClassName()));
+               if (producer.getConnectionFactory() != null)
+                  annotation.setConnectionFactory(producer.getConnectionFactory());
+               producersAnnotation.addProducer(annotation);
+            }
          }
 
-         for(ProducerMetaData producer : consumer.getLocalProducers())
+         if(localProducers != null)
          {
-            ProducerImpl annotation = new ProducerImpl(di.getClassLoader()
-                  .loadClass(producer.getClassName()));
-            if (producer.getConnectionFactory() != null)
-               annotation.setConnectionFactory(producer.getConnectionFactory());
-            producersAnnotation.addProducer(annotation);
+            for(ProducerMetaData producer : localProducers)
+            {
+               ProducerImpl annotation = new ProducerImpl(di.getClassLoader()
+                     .loadClass(producer.getClassName()));
+               if (producer.getConnectionFactory() != null)
+                  annotation.setConnectionFactory(producer.getConnectionFactory());
+               producersAnnotation.addProducer(annotation);
+            }
          }
+         
          addClassAnnotation(container, Producers.class, producersAnnotation);
       }
 
@@ -2016,9 +2023,16 @@
       }
    }
 
+   /*
+    * This method in non-deterministic. It should expect to be called
+    * in random order, so at the end there is no guarenteed security
+    * annotation configuration.
+    */
+   @Deprecated
    protected void overrideAnnotations(EJBContainer container, Member m,
          String annotation, Object value)
    {
+      /*
       AnnotationRepository annotations = container.getAnnotations();
 
       if (value instanceof javax.annotation.security.DenyAll)
@@ -2040,6 +2054,7 @@
          annotations.disableAnnotation(m,
                javax.annotation.security.DenyAll.class.getName());
       }
+      */
    }
 
    private void addClassAnnotation(EJBContainer container, Class<? extends Annotation> annotationClass, Annotation annotation)

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/ProxyFactoryHelper.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/ProxyFactoryHelper.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/ProxyFactoryHelper.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -41,7 +41,6 @@
 import javax.management.ObjectInstance;
 import javax.management.ObjectName;
 
-import org.jboss.aop.Advisor;
 import org.jboss.ejb3.annotation.JndiBindingPolicy;
 import org.jboss.ejb3.annotation.LocalBinding;
 import org.jboss.ejb3.annotation.LocalHomeBinding;
@@ -687,7 +686,7 @@
          Class<?>[] remotesArray = remoteAndRemoteBusinessInterfaces
                .toArray(new Class[remoteAndRemoteBusinessInterfaces.size()]);
          remoteAnnotation = new RemoteImpl(remotesArray);
-         ((Advisor) container).getAnnotations().addClassAnnotation(Remote.class, remoteAnnotation);
+         ((EJBContainer) container).getAnnotations().addClassAnnotation(Remote.class, remoteAnnotation);
          return remoteAnnotation.value();
       }
       // No remotes were found
@@ -835,13 +834,12 @@
       return clientBindUrl;
    }
 
-   public static String getHomeJndiName(Container container)
+   public static String getHomeJndiName(EJBContainer container)
    {
       // Initialize
-      Advisor advisor = (Advisor) container;
 
       // Use explicitly-specified binding, if defined
-      RemoteHomeBinding binding = (RemoteHomeBinding) advisor.resolveAnnotation(RemoteHomeBinding.class);
+      RemoteHomeBinding binding = (RemoteHomeBinding) container.resolveAnnotation(RemoteHomeBinding.class);
       if (binding != null)
          return binding.jndiBinding();
 
@@ -850,13 +848,12 @@
             ProxyFactoryHelper.getDeploymentSummaryFromContainer(container));
    }
 
-   public static String getLocalHomeJndiName(Container container)
+   public static String getLocalHomeJndiName(EJBContainer container)
    {
       // Initialize
-      Advisor advisor = (Advisor) container;
 
       // Use explicitly-specified binding, if defined
-      LocalHomeBinding binding = (LocalHomeBinding) advisor.resolveAnnotation(LocalHomeBinding.class);
+      LocalHomeBinding binding = (LocalHomeBinding) container.resolveAnnotation(LocalHomeBinding.class);
       if (binding != null)
          return binding.jndiBinding();
 
@@ -865,18 +862,17 @@
             ProxyFactoryHelper.getDeploymentSummaryFromContainer(container));
    }
 
-   public static String getLocalJndiName(Container container)
+   public static String getLocalJndiName(EJBContainer container)
    {
       return getLocalJndiName(container, true);
    }
 
-   private static String getLocalJndiName(Container container, boolean conflictCheck)
+   private static String getLocalJndiName(EJBContainer container, boolean conflictCheck)
    {
       // Initialize
-      Advisor advisor = (Advisor) container;
 
       // See if local binding is explicitly-defined
-      LocalBinding localBinding = (LocalBinding) advisor.resolveAnnotation(LocalBinding.class);
+      LocalBinding localBinding = (LocalBinding) container.resolveAnnotation(LocalBinding.class);
 
       // If none specified
       if (localBinding == null)
@@ -897,22 +893,21 @@
       }
    }
 
-   public static String getRemoteJndiName(Container container)
+   public static String getRemoteJndiName(EJBContainer container)
    {
       return getRemoteJndiName(container, true);
    }
 
-   public static String getRemoteJndiName(Container container, boolean check)
+   public static String getRemoteJndiName(EJBContainer container, boolean check)
    {
-      Advisor advisor = (Advisor) container;
-      RemoteBinding binding = (RemoteBinding) advisor.resolveAnnotation(RemoteBinding.class);
+      RemoteBinding binding = (RemoteBinding) container.resolveAnnotation(RemoteBinding.class);
 
       return getRemoteJndiName(container, binding);
    }
 
-   private static void checkForJndiNamingConflict(Container container)
+   private static void checkForJndiNamingConflict(EJBContainer container)
    {
-      if (((Advisor) container).resolveAnnotation(Local.class) != null)
+      if (container.resolveAnnotation(Local.class) != null)
       {
          Ejb3DeploymentSummary summary = ProxyFactoryHelper.getDeploymentSummaryFromContainer(container);
          String localJndiName = ProxyFactoryHelper.getJndiBindingPolicy(container).getDefaultLocalJndiName(summary);
@@ -927,12 +922,12 @@
       }
    }
 
-   private static String getRemoteJndiName(Container container, RemoteBinding binding)
+   private static String getRemoteJndiName(EJBContainer container, RemoteBinding binding)
    {
       return getRemoteJndiName(container, binding, true);
    }
 
-   public static String getRemoteJndiName(Container container, RemoteBinding binding, boolean conflictCheck)
+   public static String getRemoteJndiName(EJBContainer container, RemoteBinding binding, boolean conflictCheck)
    {
       String jndiName = null;
       if (binding == null || binding.jndiBinding() == null || binding.jndiBinding().equals(""))
@@ -950,7 +945,7 @@
       return jndiName;
    }
 
-   public static String getDefaultRemoteJndiName(Container container)
+   public static String getDefaultRemoteJndiName(EJBContainer container)
    {
       return ProxyFactoryHelper.getJndiBindingPolicy(container).getDefaultRemoteJndiName(
             ProxyFactoryHelper.getDeploymentSummaryFromContainer(container));

Copied: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop (from rev 69808, trunk/ejb3/src/main/org/jboss/ejb3/aop)

Deleted: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/AbstractInterceptor.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/aop/AbstractInterceptor.java	2008-02-12 23:13:47 UTC (rev 69808)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/AbstractInterceptor.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -1,48 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.ejb3.aop;
-
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.ejb3.EJBContainer;
-
-/**
- * Comment
- *
- * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
- * @version $Revision: $
- */
-public abstract class AbstractInterceptor implements Interceptor
-{
-   @SuppressWarnings("unchecked")
-   public static <C extends EJBContainer> C getEJBContainer(Invocation invocation)
-   {
-      // Because of Sun JDK we must cast it to something, or else there will be
-      // no upper bound.
-      return (C) EJBContainer.getEJBContainer(invocation.getAdvisor());
-   }
-   
-   public String getName()
-   {
-      return getClass().getName();
-   }
-}

Copied: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/AbstractInterceptor.java (from rev 69808, trunk/ejb3/src/main/org/jboss/ejb3/aop/AbstractInterceptor.java)
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/AbstractInterceptor.java	                        (rev 0)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/AbstractInterceptor.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.aop;
+
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.ejb3.EJBContainer;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public abstract class AbstractInterceptor implements Interceptor
+{
+   @SuppressWarnings("unchecked")
+   public static <C extends EJBContainer> C getEJBContainer(Invocation invocation)
+   {
+      // Because of Sun JDK we must cast it to something, or else there will be
+      // no upper bound.
+      return (C) EJBContainer.getEJBContainer(invocation.getAdvisor());
+   }
+   
+   public String getName()
+   {
+      return getClass().getName();
+   }
+}

Deleted: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/aop/BeanContainer.java	2008-02-12 23:13:47 UTC (rev 69808)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -1,330 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.ejb3.aop;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.interceptor.Interceptors;
-
-import org.jboss.aop.Advisor;
-import org.jboss.aop.Domain;
-import org.jboss.aop.MethodInfo;
-import org.jboss.aop.annotation.AnnotationRepository;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.aop.util.MethodHashing;
-import org.jboss.ejb3.EJBContainer;
-import org.jboss.ejb3.cluster.metadata.ClusteredMetaDataBridge;
-import org.jboss.ejb3.interceptors.InterceptorFactoryRef;
-import org.jboss.ejb3.interceptors.aop.annotation.DefaultInterceptors;
-import org.jboss.ejb3.interceptors.container.AbstractContainer;
-import org.jboss.ejb3.interceptors.container.ContainerInterceptorFactory;
-import org.jboss.ejb3.interceptors.container.InterceptorFactoryRefImpl;
-import org.jboss.ejb3.interceptors.direct.AbstractDirectContainer;
-import org.jboss.ejb3.interceptors.lang.ClassHelper;
-import org.jboss.ejb3.interceptors.metadata.AdditiveBeanInterceptorMetaDataBridge;
-import org.jboss.ejb3.interceptors.metadata.InterceptorComponentMetaDataLoaderFactory;
-import org.jboss.ejb3.interceptors.metadata.InterceptorMetaDataBridge;
-import org.jboss.ejb3.metadata.MetaDataBridge;
-import org.jboss.ejb3.metadata.annotation.AnnotationRepositoryToMetaData;
-import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
-import org.jboss.metadata.ejb.spec.InterceptorMetaData;
-
-/**
- * Comment
- *
- * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
- * @version $Revision: $
- */
-public class BeanContainer extends AbstractDirectContainer<Object, BeanContainer>
-{
-   private EJBContainer container;
-   
-   public BeanContainer(EJBContainer container)
-   {
-      super();
-      assert container != null : "container is null";
-      this.container = container;
-   }
-   
-   public BeanContainer(EJBContainer container, String name, String domainName, Class<? extends Object> beanClass)
-   {
-      super(name, domainName, beanClass);
-      assert container != null : "container is null";
-      this.container = container;
-   }
-   
-   private static void addInterceptorClasses(List<Class<?>> interceptorClasses, Class<?> interceptors[])
-   {
-      if(interceptors != null)
-      {
-         for(Class<?> interceptorClass : interceptors)
-         {
-            if(!interceptorClasses.contains(interceptorClass))
-               interceptorClasses.add(interceptorClass);
-         }
-      }
-   }
-   
-   private static void addInterceptorClasses(List<Class<?>> interceptorClasses, Interceptors interceptorsAnnotation)
-   {
-      if(interceptorsAnnotation != null)
-      {
-         addInterceptorClasses(interceptorClasses, interceptorsAnnotation.value());
-      }
-   }
-   
-   public List<Class<?>> getInterceptorClasses()
-   {
-      // FIXME: move to ejb3-interceptors
-      List<Class<?>> interceptorClasses = new ArrayList<Class<?>>();
-      
-      DefaultInterceptors defaultInterceptorsAnnotation = getAnnotation(DefaultInterceptors.class);
-      if(defaultInterceptorsAnnotation != null)
-         addInterceptorClasses(interceptorClasses, defaultInterceptorsAnnotation.value());
-      
-      Interceptors interceptorsAnnotation = (Interceptors) getAdvisor().resolveAnnotation(Interceptors.class);
-      addInterceptorClasses(interceptorClasses, interceptorsAnnotation);
-      
-      for(Method beanMethod : ClassHelper.getAllMethods(getBeanClass()))
-      {
-         interceptorsAnnotation = (Interceptors) getAdvisor().resolveAnnotation(beanMethod, Interceptors.class);
-         addInterceptorClasses(interceptorClasses, interceptorsAnnotation);
-      }
-      
-      return interceptorClasses;
-   }
-   
-   @Override
-   protected Object createInterceptor(Class<?> interceptorClass) throws InstantiationException, IllegalAccessException
-   {
-      return container.createInterceptor(interceptorClass);
-   }
-   
-   // TODO: re-evaluate this exposure
-   @Deprecated
-   public Advisor _getAdvisor()
-   {
-      return super.getAdvisor();
-   }
-
-   // TODO: re-evaluate this exposure
-   @Deprecated
-   public AnnotationRepository getAnnotationRepository()
-   {
-      return getAdvisor().getAnnotations();
-   }
-   
-   @SuppressWarnings("unchecked")
-   public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
-   {
-      return (T) getAdvisor().resolveAnnotation(annotationClass);
-   }
-   
-   @SuppressWarnings("unchecked")
-//   public <T extends Annotation> T getAnnotation(Class<T> annotationType, Class<?> clazz)
-   public <T extends Annotation> T getAnnotation(Class<?> clazz, Class<T> annotationType)
-   {
-      if(clazz == getBeanClass())
-         return (T) getAdvisor().resolveAnnotation(annotationType);
-      // TODO: this is not right
-      return clazz.getAnnotation(annotationType);
-   }
-   
-   @SuppressWarnings("unchecked")
-   public <T extends Annotation> T getAnnotation(Class<T> annotationType, Class<?> clazz, Field field)
-   {
-      if (clazz == this.getBeanClass())
-      {
-         return (T) getAdvisor().resolveAnnotation(field, annotationType);
-      }
-      return field.getAnnotation(annotationType);
-   }
-   
-   @SuppressWarnings("unchecked")
-   public <T extends Annotation> T getAnnotation(Class<T> annotationType, Class<?> clazz, Method method)
-   {
-      if (clazz == this.getBeanClass())
-      {
-         return (T) getAdvisor().resolveAnnotation(method, annotationType);
-      }
-      // TODO: this is not right
-      return method.getAnnotation(annotationType);
-   }
-   
-   @SuppressWarnings("unchecked")
-   public <T extends Annotation> T getAnnotation(Class<T> annotationType, Field field)
-   {
-      return (T) getAdvisor().resolveAnnotation(field, annotationType);
-   }
-   
-   @SuppressWarnings("unchecked")
-   public <T extends Annotation> T getAnnotation(Class<T> annotationType, Method method)
-   {
-      T annotation = (T) getAdvisor().resolveAnnotation(method, annotationType);
-      if(annotation == null && method.isBridge())
-         annotation = getBridgedAnnotation(annotationType, method);
-      return annotation;
-   }
-   
-   private <T extends Annotation> T getBridgedAnnotation(Class<T> annotationType, Method bridgeMethod)
-   {
-      assert bridgeMethod.isBridge();
-      Method[] methods = bridgeMethod.getDeclaringClass().getMethods();
-      int i = 0;
-      boolean found = false;
-      Class<?>[] bridgeParams = bridgeMethod.getParameterTypes();
-      while (i < methods.length && !found)
-      {
-         if (!methods[i].isBridge() && methods[i].getName().equals(bridgeMethod.getName()))
-         {
-            Class<?>[] params = methods[i].getParameterTypes();
-            if (params.length == bridgeParams.length)
-            {
-               int j = 0;
-               boolean matches = true;
-               while (j < params.length && matches)
-               {
-                  if (!bridgeParams[j].isAssignableFrom(params[j]))
-                     matches = false;
-                  ++j;
-               }
-               
-               if (matches)
-                  return getAnnotation(annotationType, methods[i]);
-            }
-         }
-         ++i;
-      }
- 
-      return null;
-   }
-   
-   public final EJBContainer getEJBContainer()
-   {
-      return container;
-   }
-
-   protected List<Method> getVirtualMethods()
-   {
-      return container.getVirtualMethods();
-   }
-   
-   public void initialize(String name, Domain domain, Class<? extends Object> beanClass, JBossEnterpriseBeanMetaData beanMetaData, ClassLoader classLoader)
-   {
-      AnnotationRepositoryToMetaData annotations = new AnnotationRepositoryToMetaData(beanClass, beanMetaData, name, classLoader);
-      List<MetaDataBridge<InterceptorMetaData>> interceptorBridges = new ArrayList<MetaDataBridge<InterceptorMetaData>>();
-      interceptorBridges.add(new InterceptorMetaDataBridge());
-      annotations.addComponentMetaDataLoaderFactory(new InterceptorComponentMetaDataLoaderFactory(interceptorBridges));
-      annotations.addMetaDataBridge(new AdditiveBeanInterceptorMetaDataBridge(beanClass));
-      
-      // Ensure that an @Clustered annotation is visible to AOP if the XML says the bean is  clustered.
-      annotations.addMetaDataBridge(new ClusteredMetaDataBridge());
-      
-      initializeAdvisor(name, domain, beanClass, annotations);
-   }
-   
-   @Override
-   protected void initializeAdvisor(String name, Domain domain, Class<? extends Object> beanClass, AnnotationRepository annotations)
-   {
-      assert name != null : "name is null";
-      assert domain != null : "domain is null";
-      assert beanClass != null : "beanClass is null";
-      
-      // Decouple setting the advisor and initializing it, so interceptors
-      // can get it.
-      ExtendedManagedObjectAdvisor advisor = new ExtendedManagedObjectAdvisor(this, name, domain, annotations);
-      setAdvisor(advisor);
-      advisor.getAnnotations().addClassAnnotation(InterceptorFactoryRef.class, new InterceptorFactoryRefImpl(ContainerInterceptorFactory.class));
-      advisor.initialize(beanClass);
-   }
-   
-   @Override
-   public Object invoke(Object target, Method method, Object[] arguments) throws Throwable
-   {
-      // TODO: make the AbstractContainer extendable
-      long methodHash = MethodHashing.calculateHash(method);
-      MethodInfo info = getAdvisor().getMethodInfo(methodHash);
-      if(info == null)
-         throw new IllegalArgumentException("method " + method + " is not under advisement by " + this);
-      MethodInvocation invocation = new MethodInvocation(info, info.getInterceptors());
-      invocation.setArguments(arguments);
-      invocation.setTargetObject(target);
-      return invocation.invokeNext();
-   }
-   
-   public boolean isAnnotationPresent(Class<? extends Annotation> annotationType)
-   {
-      return getAdvisor().resolveAnnotation(annotationType) != null;
-   }
-   
-   /**
-    * FIXME: This method should not be needed. Initialization should already have happened
-    * earlier in the game. (Ejb3DescriptorHandler adds annotations after a container object is constructed.)
-    */
-   @Deprecated
-   public void reinitializeAdvisor()
-   {
-      // FIXME: Q&D
-      try
-      {
-         ((ExtendedManagedObjectAdvisor) getAdvisor()).reinitialize();
-      }
-      catch (Exception e)
-      {
-         throw new RuntimeException(e);
-      }
-   }
-   
-   /**
-    * FIXME: Q&D hack
-    * @param advisor
-    */
-   private void setAdvisor(ExtendedManagedObjectAdvisor advisor)
-   {
-      try
-      {
-         Field field = AbstractContainer.class.getDeclaredField("advisor");
-         field.setAccessible(true);
-         field.set(this, advisor);
-      }
-      catch (IllegalArgumentException e)
-      {
-         throw new RuntimeException(e);
-      }
-      catch (IllegalAccessException e)
-      {
-         throw new RuntimeException(e);
-      }
-      catch (NoSuchFieldException e)
-      {
-         throw new RuntimeException(e);
-      }
-      catch (SecurityException e)
-      {
-         throw new RuntimeException(e);
-      }
-   }
-}

Copied: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java (from rev 69808, trunk/ejb3/src/main/org/jboss/ejb3/aop/BeanContainer.java)
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java	                        (rev 0)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -0,0 +1,330 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.aop;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.interceptor.Interceptors;
+
+import org.jboss.aop.Advisor;
+import org.jboss.aop.Domain;
+import org.jboss.aop.MethodInfo;
+import org.jboss.aop.annotation.AnnotationRepository;
+import org.jboss.aop.joinpoint.MethodInvocation;
+import org.jboss.aop.util.MethodHashing;
+import org.jboss.ejb3.EJBContainer;
+import org.jboss.ejb3.cluster.metadata.ClusteredMetaDataBridge;
+import org.jboss.ejb3.interceptors.InterceptorFactoryRef;
+import org.jboss.ejb3.interceptors.aop.annotation.DefaultInterceptors;
+import org.jboss.ejb3.interceptors.container.AbstractContainer;
+import org.jboss.ejb3.interceptors.container.ContainerInterceptorFactory;
+import org.jboss.ejb3.interceptors.container.InterceptorFactoryRefImpl;
+import org.jboss.ejb3.interceptors.direct.AbstractDirectContainer;
+import org.jboss.ejb3.interceptors.lang.ClassHelper;
+import org.jboss.ejb3.interceptors.metadata.AdditiveBeanInterceptorMetaDataBridge;
+import org.jboss.ejb3.interceptors.metadata.InterceptorComponentMetaDataLoaderFactory;
+import org.jboss.ejb3.interceptors.metadata.InterceptorMetaDataBridge;
+import org.jboss.ejb3.metadata.MetaDataBridge;
+import org.jboss.ejb3.metadata.annotation.AnnotationRepositoryToMetaData;
+import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
+import org.jboss.metadata.ejb.spec.InterceptorMetaData;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public class BeanContainer extends AbstractDirectContainer<Object, BeanContainer>
+{
+   private EJBContainer container;
+   
+   public BeanContainer(EJBContainer container)
+   {
+      super();
+      assert container != null : "container is null";
+      this.container = container;
+   }
+   
+   public BeanContainer(EJBContainer container, String name, String domainName, Class<? extends Object> beanClass)
+   {
+      super(name, domainName, beanClass);
+      assert container != null : "container is null";
+      this.container = container;
+   }
+   
+   private static void addInterceptorClasses(List<Class<?>> interceptorClasses, Class<?> interceptors[])
+   {
+      if(interceptors != null)
+      {
+         for(Class<?> interceptorClass : interceptors)
+         {
+            if(!interceptorClasses.contains(interceptorClass))
+               interceptorClasses.add(interceptorClass);
+         }
+      }
+   }
+   
+   private static void addInterceptorClasses(List<Class<?>> interceptorClasses, Interceptors interceptorsAnnotation)
+   {
+      if(interceptorsAnnotation != null)
+      {
+         addInterceptorClasses(interceptorClasses, interceptorsAnnotation.value());
+      }
+   }
+   
+   public List<Class<?>> getInterceptorClasses()
+   {
+      // FIXME: move to ejb3-interceptors
+      List<Class<?>> interceptorClasses = new ArrayList<Class<?>>();
+      
+      DefaultInterceptors defaultInterceptorsAnnotation = getAnnotation(DefaultInterceptors.class);
+      if(defaultInterceptorsAnnotation != null)
+         addInterceptorClasses(interceptorClasses, defaultInterceptorsAnnotation.value());
+      
+      Interceptors interceptorsAnnotation = (Interceptors) getAdvisor().resolveAnnotation(Interceptors.class);
+      addInterceptorClasses(interceptorClasses, interceptorsAnnotation);
+      
+      for(Method beanMethod : ClassHelper.getAllMethods(getBeanClass()))
+      {
+         interceptorsAnnotation = (Interceptors) getAdvisor().resolveAnnotation(beanMethod, Interceptors.class);
+         addInterceptorClasses(interceptorClasses, interceptorsAnnotation);
+      }
+      
+      return interceptorClasses;
+   }
+   
+   @Override
+   protected Object createInterceptor(Class<?> interceptorClass) throws InstantiationException, IllegalAccessException
+   {
+      return container.createInterceptor(interceptorClass);
+   }
+   
+   // TODO: re-evaluate this exposure
+   @Deprecated
+   public Advisor _getAdvisor()
+   {
+      return super.getAdvisor();
+   }
+
+   // TODO: re-evaluate this exposure
+   @Deprecated
+   public AnnotationRepository getAnnotationRepository()
+   {
+      return getAdvisor().getAnnotations();
+   }
+   
+   @SuppressWarnings("unchecked")
+   public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
+   {
+      return (T) getAdvisor().resolveAnnotation(annotationClass);
+   }
+   
+   @SuppressWarnings("unchecked")
+//   public <T extends Annotation> T getAnnotation(Class<T> annotationType, Class<?> clazz)
+   public <T extends Annotation> T getAnnotation(Class<?> clazz, Class<T> annotationType)
+   {
+      if(clazz == getBeanClass())
+         return (T) getAdvisor().resolveAnnotation(annotationType);
+      // TODO: this is not right
+      return clazz.getAnnotation(annotationType);
+   }
+   
+   @SuppressWarnings("unchecked")
+   public <T extends Annotation> T getAnnotation(Class<T> annotationType, Class<?> clazz, Field field)
+   {
+      if (clazz == this.getBeanClass())
+      {
+         return (T) getAdvisor().resolveAnnotation(field, annotationType);
+      }
+      return field.getAnnotation(annotationType);
+   }
+   
+   @SuppressWarnings("unchecked")
+   public <T extends Annotation> T getAnnotation(Class<T> annotationType, Class<?> clazz, Method method)
+   {
+      if (clazz == this.getBeanClass())
+      {
+         return (T) getAdvisor().resolveAnnotation(method, annotationType);
+      }
+      // TODO: this is not right
+      return method.getAnnotation(annotationType);
+   }
+   
+   @SuppressWarnings("unchecked")
+   public <T extends Annotation> T getAnnotation(Class<T> annotationType, Field field)
+   {
+      return (T) getAdvisor().resolveAnnotation(field, annotationType);
+   }
+   
+   @SuppressWarnings("unchecked")
+   public <T extends Annotation> T getAnnotation(Class<T> annotationType, Method method)
+   {
+      T annotation = (T) getAdvisor().resolveAnnotation(method, annotationType);
+      if(annotation == null && method.isBridge())
+         annotation = getBridgedAnnotation(annotationType, method);
+      return annotation;
+   }
+   
+   private <T extends Annotation> T getBridgedAnnotation(Class<T> annotationType, Method bridgeMethod)
+   {
+      assert bridgeMethod.isBridge();
+      Method[] methods = bridgeMethod.getDeclaringClass().getMethods();
+      int i = 0;
+      boolean found = false;
+      Class<?>[] bridgeParams = bridgeMethod.getParameterTypes();
+      while (i < methods.length && !found)
+      {
+         if (!methods[i].isBridge() && methods[i].getName().equals(bridgeMethod.getName()))
+         {
+            Class<?>[] params = methods[i].getParameterTypes();
+            if (params.length == bridgeParams.length)
+            {
+               int j = 0;
+               boolean matches = true;
+               while (j < params.length && matches)
+               {
+                  if (!bridgeParams[j].isAssignableFrom(params[j]))
+                     matches = false;
+                  ++j;
+               }
+               
+               if (matches)
+                  return getAnnotation(annotationType, methods[i]);
+            }
+         }
+         ++i;
+      }
+ 
+      return null;
+   }
+   
+   public final EJBContainer getEJBContainer()
+   {
+      return container;
+   }
+
+   protected List<Method> getVirtualMethods()
+   {
+      return container.getVirtualMethods();
+   }
+   
+   public void initialize(String name, Domain domain, Class<? extends Object> beanClass, JBossEnterpriseBeanMetaData beanMetaData, ClassLoader classLoader)
+   {
+      AnnotationRepositoryToMetaData annotations = new AnnotationRepositoryToMetaData(beanClass, beanMetaData, name, classLoader);
+      List<MetaDataBridge<InterceptorMetaData>> interceptorBridges = new ArrayList<MetaDataBridge<InterceptorMetaData>>();
+      interceptorBridges.add(new InterceptorMetaDataBridge());
+      annotations.addComponentMetaDataLoaderFactory(new InterceptorComponentMetaDataLoaderFactory(interceptorBridges));
+      annotations.addMetaDataBridge(new AdditiveBeanInterceptorMetaDataBridge(beanClass));
+      
+      // Ensure that an @Clustered annotation is visible to AOP if the XML says the bean is  clustered.
+      annotations.addMetaDataBridge(new ClusteredMetaDataBridge());
+      
+      initializeAdvisor(name, domain, beanClass, annotations);
+   }
+   
+   @Override
+   protected void initializeAdvisor(String name, Domain domain, Class<? extends Object> beanClass, AnnotationRepository annotations)
+   {
+      assert name != null : "name is null";
+      assert domain != null : "domain is null";
+      assert beanClass != null : "beanClass is null";
+      
+      // Decouple setting the advisor and initializing it, so interceptors
+      // can get it.
+      ExtendedManagedObjectAdvisor advisor = new ExtendedManagedObjectAdvisor(this, name, domain, annotations);
+      setAdvisor(advisor);
+      advisor.getAnnotations().addClassAnnotation(InterceptorFactoryRef.class, new InterceptorFactoryRefImpl(ContainerInterceptorFactory.class));
+      advisor.initialize(beanClass);
+   }
+   
+   @Override
+   public Object invoke(Object target, Method method, Object[] arguments) throws Throwable
+   {
+      // TODO: make the AbstractContainer extendable
+      long methodHash = MethodHashing.calculateHash(method);
+      MethodInfo info = getAdvisor().getMethodInfo(methodHash);
+      if(info == null)
+         throw new IllegalArgumentException("method " + method + " is not under advisement by " + this);
+      MethodInvocation invocation = new MethodInvocation(info, info.getInterceptors());
+      invocation.setArguments(arguments);
+      invocation.setTargetObject(target);
+      return invocation.invokeNext();
+   }
+   
+   public boolean isAnnotationPresent(Class<? extends Annotation> annotationType)
+   {
+      return getAdvisor().resolveAnnotation(annotationType) != null;
+   }
+   
+   /**
+    * FIXME: This method should not be needed. Initialization should already have happened
+    * earlier in the game. (Ejb3DescriptorHandler adds annotations after a container object is constructed.)
+    */
+   @Deprecated
+   public void reinitializeAdvisor()
+   {
+      // FIXME: Q&D
+      try
+      {
+         ((ExtendedManagedObjectAdvisor) getAdvisor()).reinitialize();
+      }
+      catch (Exception e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+   
+   /**
+    * FIXME: Q&D hack
+    * @param advisor
+    */
+   private void setAdvisor(ExtendedManagedObjectAdvisor advisor)
+   {
+      try
+      {
+         Field field = AbstractContainer.class.getDeclaredField("advisor");
+         field.setAccessible(true);
+         field.set(this, advisor);
+      }
+      catch (IllegalArgumentException e)
+      {
+         throw new RuntimeException(e);
+      }
+      catch (IllegalAccessException e)
+      {
+         throw new RuntimeException(e);
+      }
+      catch (NoSuchFieldException e)
+      {
+         throw new RuntimeException(e);
+      }
+      catch (SecurityException e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+}

Deleted: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/ExtendedManagedObjectAdvisor.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/aop/ExtendedManagedObjectAdvisor.java	2008-02-12 23:13:47 UTC (rev 69808)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/ExtendedManagedObjectAdvisor.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -1,81 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.ejb3.aop;
-
-import java.lang.reflect.Method;
-import java.util.List;
-
-import org.jboss.aop.AspectManager;
-import org.jboss.aop.annotation.AnnotationRepository;
-import org.jboss.aop.util.MethodHashing;
-import org.jboss.ejb3.interceptors.container.ManagedObjectAdvisor;
-
-/**
- * The extended manager object advisor allows for virtual methods.
- * 
- * TODO: move this functionality to ejb3-interceptors
- *
- * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
- * @version $Revision: $
- */
-public class ExtendedManagedObjectAdvisor extends ManagedObjectAdvisor<Object, BeanContainer>
-{
-   protected ExtendedManagedObjectAdvisor(BeanContainer container, String name, AspectManager manager, AnnotationRepository annotations)
-   {
-      super(container, name, manager, annotations);
-   }
-   
-   @Override
-   protected void createMethodTables() throws Exception
-   {
-      super.createMethodTables();
-      List<Method> virtualMethods = getVirtualMethods();
-      if(virtualMethods != null)
-      {
-         for(Method virtualMethod : virtualMethods)
-         {
-            long hash = MethodHashing.methodHash(virtualMethod);
-            advisedMethods.put(hash, virtualMethod);
-         }
-      }
-   }
-   
-   private List<Method> getVirtualMethods()
-   {
-      return getContainer().getVirtualMethods();
-   }
-   
-   @Override
-   protected void initialize(Class<?> beanClass)
-   {
-      super.initialize(beanClass);
-   }
-   
-   protected void reinitialize() throws Exception
-   {
-      // recreate the advised methods, because virtual methods are now filled
-      createMethodTables();
-      // for some reason methodInfos are not rebuild during rebuildInterceptors
-      initializeMethodChain();
-      rebuildInterceptors();
-   }
-}

Copied: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/ExtendedManagedObjectAdvisor.java (from rev 69808, trunk/ejb3/src/main/org/jboss/ejb3/aop/ExtendedManagedObjectAdvisor.java)
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/ExtendedManagedObjectAdvisor.java	                        (rev 0)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/ExtendedManagedObjectAdvisor.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -0,0 +1,81 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.aop;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.annotation.AnnotationRepository;
+import org.jboss.aop.util.MethodHashing;
+import org.jboss.ejb3.interceptors.container.ManagedObjectAdvisor;
+
+/**
+ * The extended manager object advisor allows for virtual methods.
+ * 
+ * TODO: move this functionality to ejb3-interceptors
+ *
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public class ExtendedManagedObjectAdvisor extends ManagedObjectAdvisor<Object, BeanContainer>
+{
+   protected ExtendedManagedObjectAdvisor(BeanContainer container, String name, AspectManager manager, AnnotationRepository annotations)
+   {
+      super(container, name, manager, annotations);
+   }
+   
+   @Override
+   protected void createMethodTables() throws Exception
+   {
+      super.createMethodTables();
+      List<Method> virtualMethods = getVirtualMethods();
+      if(virtualMethods != null)
+      {
+         for(Method virtualMethod : virtualMethods)
+         {
+            long hash = MethodHashing.methodHash(virtualMethod);
+            advisedMethods.put(hash, virtualMethod);
+         }
+      }
+   }
+   
+   private List<Method> getVirtualMethods()
+   {
+      return getContainer().getVirtualMethods();
+   }
+   
+   @Override
+   protected void initialize(Class<?> beanClass)
+   {
+      super.initialize(beanClass);
+   }
+   
+   protected void reinitialize() throws Exception
+   {
+      // recreate the advised methods, because virtual methods are now filled
+      createMethodTables();
+      // for some reason methodInfos are not rebuild during rebuildInterceptors
+      initializeMethodChain();
+      rebuildInterceptors();
+   }
+}

Deleted: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/LifeCycleInvocation.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/aop/LifeCycleInvocation.java	2008-02-12 23:13:47 UTC (rev 69808)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/LifeCycleInvocation.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -1,70 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.ejb3.aop;
-
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.InvocationBase;
-
-/**
- * Comment
- *
- * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
- * @version $Revision: $
- */
-public class LifeCycleInvocation extends InvocationBase
-{
-   private static final long serialVersionUID = 1L;
-
-   public LifeCycleInvocation(Interceptor interceptors[])
-   {
-      super(interceptors);
-   }
-   
-   public Invocation copy()
-   {
-      return new LifeCycleInvocation(interceptors);
-   }
-
-   public Invocation getWrapper(Interceptor[] newchain)
-   {
-      return new LifeCycleInvocation(newchain);
-   }
-   
-   @Override
-   public Object invokeNext() throws Throwable
-   {
-      if (interceptors != null && currentInterceptor < interceptors.length)
-      {
-         try
-         {
-            return interceptors[currentInterceptor++].invoke(this);
-         }
-         finally
-         {
-            // so that interceptors like clustering can reinvoke down the chain
-            currentInterceptor--;
-         }
-      }
-      return null;
-   }
-}

Copied: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/LifeCycleInvocation.java (from rev 69808, trunk/ejb3/src/main/org/jboss/ejb3/aop/LifeCycleInvocation.java)
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/LifeCycleInvocation.java	                        (rev 0)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/LifeCycleInvocation.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.aop;
+
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.aop.joinpoint.InvocationBase;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public class LifeCycleInvocation extends InvocationBase
+{
+   private static final long serialVersionUID = 1L;
+
+   public LifeCycleInvocation(Interceptor interceptors[])
+   {
+      super(interceptors);
+   }
+   
+   public Invocation copy()
+   {
+      return new LifeCycleInvocation(interceptors);
+   }
+
+   public Invocation getWrapper(Interceptor[] newchain)
+   {
+      return new LifeCycleInvocation(newchain);
+   }
+   
+   @Override
+   public Object invokeNext() throws Throwable
+   {
+      if (interceptors != null && currentInterceptor < interceptors.length)
+      {
+         try
+         {
+            return interceptors[currentInterceptor++].invoke(this);
+         }
+         finally
+         {
+            // so that interceptors like clustering can reinvoke down the chain
+            currentInterceptor--;
+         }
+      }
+      return null;
+   }
+}

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/NoPassivationCache.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/NoPassivationCache.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/NoPassivationCache.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -22,9 +22,11 @@
 package org.jboss.ejb3.cache;
 
 import java.util.HashMap;
+
 import javax.ejb.EJBException;
 import javax.ejb.NoSuchEJBException;
-import org.jboss.ejb3.Container;
+
+import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.pool.Pool;
 import org.jboss.ejb3.stateful.StatefulBeanContext;
 
@@ -41,7 +43,7 @@
    private int createCount = 0;
    private int removeCount = 0;
 
-   public void initialize(Container container) throws Exception
+   public void initialize(EJBContainer container) throws Exception
    {
       this.pool = container.getPool();
       cacheMap = new HashMap<Object, StatefulBeanContext>();

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/StatefulCache.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/StatefulCache.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/StatefulCache.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -22,7 +22,9 @@
 package org.jboss.ejb3.cache;
 
 import javax.ejb.EJBException;
-import org.jboss.ejb3.Container;
+import javax.ejb.NoSuchEJBException;
+
+import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.stateful.StatefulBeanContext;
 
 /**
@@ -88,5 +90,5 @@
    
    int getTotalSize();
    
-   public void initialize(Container container) throws Exception;
+   public void initialize(EJBContainer container) throws Exception;
 }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/simple/SimpleStatefulCache.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/simple/SimpleStatefulCache.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/simple/SimpleStatefulCache.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -30,7 +30,6 @@
 import javax.ejb.NoSuchEJBException;
 
 import org.jboss.aop.Advisor;
-import org.jboss.ejb3.Container;
 import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.annotation.CacheConfig;
 import org.jboss.ejb3.annotation.PersistenceManager;
@@ -239,9 +238,9 @@
       }
    }
 
-   public void initialize(Container container) throws Exception
+   public void initialize(EJBContainer container) throws Exception
    {
-      Advisor advisor = (Advisor) container;
+      Advisor advisor = container.getAdvisor();
       this.pool = container.getPool();
       cacheMap = new CacheMap();
       PersistenceManager pmConfig = (PersistenceManager) advisor.resolveAnnotation(PersistenceManager.class);

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/tree/StatefulTreeCache.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/tree/StatefulTreeCache.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cache/tree/StatefulTreeCache.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -32,7 +32,6 @@
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
-import org.jboss.aop.Advisor;
 import org.jboss.cache.Cache;
 import org.jboss.cache.CacheException;
 import org.jboss.cache.CacheSPI;
@@ -49,7 +48,6 @@
 import org.jboss.cache.notifications.annotation.NodePassivated;
 import org.jboss.cache.notifications.event.NodeActivatedEvent;
 import org.jboss.cache.notifications.event.NodePassivatedEvent;
-import org.jboss.ejb3.Container;
 import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.annotation.CacheConfig;
 import org.jboss.ejb3.cache.ClusteredStatefulCache;
@@ -300,18 +298,17 @@
       }
    }
 
-   public void initialize(Container container) throws Exception
+   public void initialize(EJBContainer container) throws Exception
    {
-      this.ejbContainer = (EJBContainer) container;
-
+      this.ejbContainer = container;
+      
       log = Logger.getLogger(getClass().getName() + "." + this.ejbContainer.getEjbName());
 
       this.pool = this.ejbContainer.getPool();
       ClassLoader cl = this.ejbContainer.getClassloader();
       this.classloader = new WeakReference<ClassLoader>(cl);
-
-      Advisor advisor = this.ejbContainer;
-      CacheConfig config = (CacheConfig) advisor.resolveAnnotation(CacheConfig.class);
+      
+      CacheConfig config = (CacheConfig) ejbContainer.resolveAnnotation(CacheConfig.class);
       MBeanServer server = MBeanServerLocator.locateJBoss();
       String name = config.name();
       if (name == null || name.trim().length() == 0)

Copied: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster (from rev 69808, trunk/ejb3/src/main/org/jboss/ejb3/cluster)

Copied: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/metadata (from rev 69808, trunk/ejb3/src/main/org/jboss/ejb3/cluster/metadata)

Deleted: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/metadata/ClusteredMetaDataBridge.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/cluster/metadata/ClusteredMetaDataBridge.java	2008-02-12 23:13:47 UTC (rev 69808)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/metadata/ClusteredMetaDataBridge.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -1,116 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.ejb3.cluster.metadata;
-
-import java.lang.annotation.Annotation;
-
-import org.jboss.ejb3.annotation.Clustered;
-import org.jboss.ejb3.annotation.impl.ClusteredImpl;
-import org.jboss.ejb3.metadata.MetaDataBridge;
-import org.jboss.ha.client.loadbalance.LoadBalancePolicy;
-import org.jboss.logging.Logger;
-import org.jboss.metadata.ejb.jboss.ClusterConfigMetaData;
-import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
-import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
-
-/**
- * Creates a ClusteredImpl to match a ClusterConfigMetaData.
- *
- * @author <a href="mailto:brian.stansberry at jboss.com">Brian Stansberry</a>
- * @version $Revision: $
- */
-public class ClusteredMetaDataBridge implements MetaDataBridge<JBossEnterpriseBeanMetaData>
-{
-   private static final Logger log = Logger.getLogger(ClusteredMetaDataBridge.class);
-
-   private ClusteredImpl createAnnotationImpl()
-   {
-      try
-      {
-         return ClusteredImpl.class.newInstance();
-      }
-      catch (InstantiationException e)
-      {
-         throw new RuntimeException(e);
-      }
-      catch (IllegalAccessException e)
-      {
-         throw new RuntimeException(e);
-      }
-   }
-   
-   public <A extends Annotation> A retrieveAnnotation(Class<A> annotationClass, JBossEnterpriseBeanMetaData metaData, ClassLoader classLoader)
-   {
-      if(log.isTraceEnabled()) log.trace("retrieve annotation " + annotationClass + " on " + metaData);
-      if (annotationClass == Clustered.class && isClustered(metaData))
-      {
-         ClusteredImpl impl = createAnnotationImpl();
-         ClusterConfigMetaData ccmd = findClusterConfigMetaData(metaData);
-         if (ccmd != null)
-         {
-            if (ccmd.getPartitionName() != null)
-               impl.setPartition(ccmd.getPartitionName());
-            // FIXME Once @Clustered and ClusteredImpl are updated, just use the string values
-            if (ccmd.getBeanLoadBalancePolicy() != null)
-               impl.setLoadBalancePolicy(loadClass(classLoader, ccmd.getBeanLoadBalancePolicy()));
-            if (ccmd.getHomeLoadBalancePolicy() != null)
-               impl.setHomeLoadBalancePolicy(loadClass(classLoader, ccmd.getHomeLoadBalancePolicy()));
-         }
-         return annotationClass.cast(impl);
-      }
-      return null;
-   }
-
-   public <A extends Annotation> A retrieveAnnotation(Class<A> annotationClass, JBossEnterpriseBeanMetaData metaData, ClassLoader classLoader, String methodName, String... parameterNames)
-   {
-      return null;
-   }   
-   
-   private boolean isClustered(JBossEnterpriseBeanMetaData metadata)
-   {
-      if (metadata instanceof JBossSessionBeanMetaData)
-         return ((JBossSessionBeanMetaData) metadata).isClustered();
-      return false;
-   }
-   
-   private ClusterConfigMetaData findClusterConfigMetaData(JBossEnterpriseBeanMetaData metaData)
-   {
-      if (metaData instanceof JBossSessionBeanMetaData)
-      {
-         return ((JBossSessionBeanMetaData) metaData).getClusterConfig();
-      }
-      return null;
-   }
-   
-   @SuppressWarnings("unchecked")
-   private static <A extends LoadBalancePolicy> Class<A> loadClass(ClassLoader classLoader, String name)
-   {
-      try
-      {
-         return (Class<A>) classLoader.loadClass(name);
-      }
-      catch (ClassNotFoundException e)
-      {
-         throw new RuntimeException(e);
-      }
-   }
-}

Copied: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/metadata/ClusteredMetaDataBridge.java (from rev 69808, trunk/ejb3/src/main/org/jboss/ejb3/cluster/metadata/ClusteredMetaDataBridge.java)
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/metadata/ClusteredMetaDataBridge.java	                        (rev 0)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/cluster/metadata/ClusteredMetaDataBridge.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -0,0 +1,116 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.cluster.metadata;
+
+import java.lang.annotation.Annotation;
+
+import org.jboss.ejb3.annotation.Clustered;
+import org.jboss.ejb3.annotation.impl.ClusteredImpl;
+import org.jboss.ejb3.metadata.MetaDataBridge;
+import org.jboss.ha.client.loadbalance.LoadBalancePolicy;
+import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.ClusterConfigMetaData;
+import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
+import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
+
+/**
+ * Creates a ClusteredImpl to match a ClusterConfigMetaData.
+ *
+ * @author <a href="mailto:brian.stansberry at jboss.com">Brian Stansberry</a>
+ * @version $Revision: $
+ */
+public class ClusteredMetaDataBridge implements MetaDataBridge<JBossEnterpriseBeanMetaData>
+{
+   private static final Logger log = Logger.getLogger(ClusteredMetaDataBridge.class);
+
+   private ClusteredImpl createAnnotationImpl()
+   {
+      try
+      {
+         return ClusteredImpl.class.newInstance();
+      }
+      catch (InstantiationException e)
+      {
+         throw new RuntimeException(e);
+      }
+      catch (IllegalAccessException e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+   
+   public <A extends Annotation> A retrieveAnnotation(Class<A> annotationClass, JBossEnterpriseBeanMetaData metaData, ClassLoader classLoader)
+   {
+      if(log.isTraceEnabled()) log.trace("retrieve annotation " + annotationClass + " on " + metaData);
+      if (annotationClass == Clustered.class && isClustered(metaData))
+      {
+         ClusteredImpl impl = createAnnotationImpl();
+         ClusterConfigMetaData ccmd = findClusterConfigMetaData(metaData);
+         if (ccmd != null)
+         {
+            if (ccmd.getPartitionName() != null)
+               impl.setPartition(ccmd.getPartitionName());
+            // FIXME Once @Clustered and ClusteredImpl are updated, just use the string values
+            if (ccmd.getBeanLoadBalancePolicy() != null)
+               impl.setLoadBalancePolicy(ccmd.getBeanLoadBalancePolicy());
+            if (ccmd.getHomeLoadBalancePolicy() != null)
+               impl.setHomeLoadBalancePolicy(ccmd.getHomeLoadBalancePolicy());
+         }
+         return annotationClass.cast(impl);
+      }
+      return null;
+   }
+
+   public <A extends Annotation> A retrieveAnnotation(Class<A> annotationClass, JBossEnterpriseBeanMetaData metaData, ClassLoader classLoader, String methodName, String... parameterNames)
+   {
+      return null;
+   }   
+   
+   private boolean isClustered(JBossEnterpriseBeanMetaData metadata)
+   {
+      if (metadata instanceof JBossSessionBeanMetaData)
+         return ((JBossSessionBeanMetaData) metadata).isClustered();
+      return false;
+   }
+   
+   private ClusterConfigMetaData findClusterConfigMetaData(JBossEnterpriseBeanMetaData metaData)
+   {
+      if (metaData instanceof JBossSessionBeanMetaData)
+      {
+         return ((JBossSessionBeanMetaData) metaData).getClusterConfig();
+      }
+      return null;
+   }
+   
+   @SuppressWarnings("unchecked")
+   private static <A extends LoadBalancePolicy> Class<A> loadClass(ClassLoader classLoader, String name)
+   {
+      try
+      {
+         return (Class<A>) classLoader.loadClass(name);
+      }
+      catch (ClassNotFoundException e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+}

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/embedded/EJB3StandaloneDeployer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/embedded/EJB3StandaloneDeployer.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/embedded/EJB3StandaloneDeployer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -25,10 +25,10 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.JarURLConnection;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.net.URLConnection;
-import java.net.MalformedURLException;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashSet;
@@ -38,6 +38,7 @@
 import java.util.Properties;
 import java.util.Set;
 import java.util.zip.ZipFile;
+
 import javax.management.MBeanServer;
 import javax.management.MBeanServerFactory;
 import javax.naming.InitialContext;

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/EJB3InterceptorsFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/EJB3InterceptorsFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/EJB3InterceptorsFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -22,15 +22,12 @@
 package org.jboss.ejb3.interceptor;
 
 import java.lang.reflect.Method;
-import java.util.Arrays;
 
 import javax.jms.MessageListener;
 
 import org.jboss.aop.Advisor;
 import org.jboss.aop.InstanceAdvisor;
 import org.jboss.aop.joinpoint.Joinpoint;
-import org.jboss.aop.joinpoint.MethodJoinpoint;
-import org.jboss.ejb3.EJBContainer;
 import org.jboss.logging.Logger;
 import org.jboss.util.MethodHashing;
 
@@ -80,9 +77,10 @@
 
    public Object createPerJoinpoint(Advisor advisor, Joinpoint jp)
    {
+      /*
       if (jp instanceof MethodJoinpoint)
       {
-         EJBContainer container = (EJBContainer) advisor;
+         EJBContainer container = EJBContainer.getEJBContainer(advisor);
          Class beanClass = container.getBeanClass();
 
          try
@@ -105,6 +103,8 @@
          }
       }
       return new EJB3InterceptorsInterceptor(new InterceptorInfo[0], null);
+      */
+      throw new RuntimeException("no longer supported (EJBTHREE-1174)");
    }
 
    public Object createPerClass(Advisor advisor)

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfo.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfo.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfo.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -36,6 +36,7 @@
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision$
  */
+ at Deprecated
 public class InterceptorInfo
 {
    Class<?> clazz;

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -37,14 +37,13 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.ejb.CreateException;
 import javax.ejb.PostActivate;
 import javax.ejb.PrePassivate;
 import javax.interceptor.AroundInvoke;
-import javax.interceptor.ExcludeClassInterceptors;
-import javax.interceptor.ExcludeDefaultInterceptors;
 import javax.interceptor.InvocationContext;
 
 import org.jboss.ejb3.EJBContainer;
@@ -73,7 +72,9 @@
  * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision$
+ * @deprecated  use the new interceptors component
  */
+ at Deprecated
 public class InterceptorInfoRepository
 {
    private static Logger log = Logger.getLogger(InterceptorInfoRepository.class);
@@ -135,6 +136,7 @@
       return defaultInterceptors.size() > 0;
    }
 
+   /*
    public ArrayList<InterceptorInfo> getClassInterceptors(EJBContainer container)
    {
       javax.interceptor.Interceptors interceptors = (javax.interceptor.Interceptors) container
@@ -143,7 +145,8 @@
 
       return infos;
    }
-
+   */
+   
    public ArrayList<InterceptorInfo> getMethodInterceptors(EJBContainer container, Method m)
    {
       javax.interceptor.Interceptors interceptors = (javax.interceptor.Interceptors) container.resolveAnnotation(m,
@@ -184,6 +187,7 @@
       return getMethodsForEvent(info, type);
    }
 
+   /*
    public InterceptorInfo[] getBusinessInterceptors(EJBContainer container, Method method)
    {
       return getInterceptors(container, AroundInvoke.class, method);
@@ -208,7 +212,9 @@
    {
       return getInterceptors(container, PreDestroy.class, null);
    }
-
+   */
+   
+   /*
    private InterceptorInfo[] getInterceptors(EJBContainer container, Class type, Method method)
    {
       ArrayList<InterceptorInfo> interceptors = new ArrayList<InterceptorInfo>();
@@ -252,7 +258,9 @@
       InterceptorInfo[] ints = interceptors.toArray(new InterceptorInfo[interceptors.size()]);
       return ints;
    }
-
+   */
+   
+   /*
    private List<InterceptorInfo> getMethodOnlyInterceptorsForLifecycle(EJBContainer container, Class type, List<InterceptorInfo> infos)
    {
       HashSet<InterceptorInfo> methodLevelInterceptors = (HashSet<InterceptorInfo>)container.getApplicableInterceptors().clone();
@@ -279,10 +287,12 @@
       List<InterceptorInfo> trimmedInfos = trimUnwanted(methodLevelInterceptors, type); 
       return trimmedInfos;
    }
+   */
    
+   /*
    private boolean hasAnnotation(EJBContainer container, Class annotation, Method method)
    {
-      if (container.resolveAnnotation(annotation) != null)
+      if (container.getAnnotation(annotation) != null)
       {
          return true;
       }
@@ -294,7 +304,8 @@
 
       return false;
    }
-
+   */
+   
    private List<InterceptorInfo> trimUnwanted(Collection<InterceptorInfo> interceptors, Class type)
    {
       ArrayList<InterceptorInfo> ints = new ArrayList<InterceptorInfo>(interceptors.size());

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInjector.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInjector.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInjector.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -21,14 +21,12 @@
  */ 
 package org.jboss.ejb3.interceptor;
 
+import java.lang.reflect.AccessibleObject;
+import java.util.Map;
+
 import org.jboss.ejb3.BeanContext;
-import org.jboss.ejb3.Container;
-import org.jboss.ejb3.EJBContainer;
 import org.jboss.injection.Injector;
 import org.jboss.injection.PojoInjector;
-import org.jboss.metadata.ejb.spec.InterceptorMetaData;
-import java.lang.reflect.AccessibleObject;
-import java.util.Map;
 
 /**
  * 
@@ -37,33 +35,13 @@
  */
 public class InterceptorInjector
 {
-   EJBContainer container;
-   InterceptorInfo info;
-   PojoInjector[] injectors;
-   protected Map<AccessibleObject, Injector> encInjections;
+   private PojoInjector[] injectors;
    
-   public InterceptorInjector(Container container, InterceptorInfo info, Map<AccessibleObject, Injector> injections)
+   public InterceptorInjector(Map<AccessibleObject, Injector> injections)
    {
-      this.container = (EJBContainer)container;
-      this.info = info;
       injectors = injections.values().toArray(new PojoInjector[injections.size()]);
    }
 
-   public InterceptorMetaData getXml()
-   {
-      return info.getXml();
-   }
-   
-   public Class<?> getClazz()
-   {
-      return info.getClazz();
-   }
-   
-   public Container getContainer()
-   {
-      return container;
-   }
-   
    public void inject(BeanContext ctx, Object instance)
    {
       for (PojoInjector injector : injectors)

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/LifecycleInterceptorHandler.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/LifecycleInterceptorHandler.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/LifecycleInterceptorHandler.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -42,7 +42,9 @@
  * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision$
+ * @deprecated EJBTHREE-1174
  */
+ at Deprecated
 public class LifecycleInterceptorHandler
 {
    private static final Logger log = Logger.getLogger(LifecycleInterceptorHandler.class);
@@ -61,6 +63,7 @@
 
    public LifecycleInterceptorHandler(EJBContainer container, Class[] handledCallbacks)
    {
+      /*
       this.container = container;
       InterceptorInfoRepository repostitory = container.getInterceptorRepository();
       for (Class clazz : handledCallbacks)
@@ -90,6 +93,8 @@
             resolveTimeoutCallback();
          }
       }
+      */
+      throw new RuntimeException("no longer supported (EJBTHREE-1174)");
    }
 
    public long getTimeoutCalllbackHash()

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/ConsumerContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/ConsumerContainer.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/ConsumerContainer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -32,9 +32,10 @@
 import javax.ejb.Local;
 import javax.jms.Destination;
 import javax.jms.Message;
+import javax.jms.MessageListener;
 import javax.jms.ObjectMessage;
 
-import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
 import org.jboss.aop.MethodInfo;
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.joinpoint.InvocationResponse;
@@ -48,9 +49,10 @@
 import org.jboss.ejb3.annotation.Producer;
 import org.jboss.ejb3.annotation.Producers;
 import org.jboss.ejb3.annotation.impl.MessagePropertiesImpl;
-import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
 import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossConsumerBeanMetaData;
 import org.jboss.metadata.ejb.spec.ActivationConfigPropertyMetaData;
+import org.jboss.metadata.ejb.spec.NamedMethodMetaData;
 
 /**
  * Comment
@@ -82,11 +84,10 @@
    public static final String CONSUMER_MESSAGE = "CONSUMER_MESSAGE";
 
 
-   public ConsumerContainer(String ejbName, AspectManager manager, ClassLoader cl, String beanClassName,
-                            Hashtable ctxProperties, InterceptorInfoRepository interceptorRepository,
-                            Ejb3Deployment deployment)
+   public ConsumerContainer(String ejbName, Domain domain, ClassLoader cl, String beanClassName,
+                            Hashtable ctxProperties, Ejb3Deployment deployment, JBossConsumerBeanMetaData beanMetaData) throws ClassNotFoundException
    {
-      super(ejbName, manager, cl, beanClassName, ctxProperties, interceptorRepository, deployment);
+      super(ejbName, domain, cl, beanClassName, ctxProperties, deployment, beanMetaData);
    }
    
    public InvocationResponse dynamicInvoke(Invocation invocation) throws Throwable
@@ -98,7 +99,7 @@
       {
          Thread.currentThread().setContextClassLoader(classloader);
          MethodInvocation si = (MethodInvocation) invocation;
-         MethodInfo info = super.getMethodInfo(si.getMethodHash());
+         MethodInfo info = getAdvisor().getMethodInfo(si.getMethodHash());
          if (info == null)
          {
             throw new RuntimeException("Could not resolve beanClass method from proxy call");
@@ -107,7 +108,7 @@
          newSi = new EJBContainerInvocation(info);
          newSi.setArguments(si.getArguments());
          newSi.setMetaData(si.getMetaData());
-         newSi.setAdvisor(this);
+         newSi.setAdvisor(getAdvisor());
 
          InvocationResponse response = new InvocationResponse(newSi.invokeNext());
          response.setContextInfo(newSi.getResponseContextInfo());
@@ -139,6 +140,13 @@
       return ON_MESSAGE;
    }
    
+   @Override
+   protected NamedMethodMetaData getTimeoutMethodMetaData()
+   {
+      // TODO: add timeout method meta data to JBossConsumerBeanMetaData
+      return null;
+   }
+   
    public Object localInvoke(MethodInfo info, Object[] args) throws Throwable
    {     
       if (info.getMethod().equals(getOnMessage()))
@@ -163,7 +171,7 @@
          return super.localInvoke(info, args);
    }
    
-   public Class getMessagingType()
+   public Class<MessageListener> getMessagingType()
    {
       return javax.jms.MessageListener.class;
    }
@@ -171,7 +179,7 @@
    public MethodInfo getMethodInfo(Method method)
    {
       MethodInfo info = new MethodInfo();
-      info.setAdvisor(this);
+      info.setAdvisor(getAdvisor());
       info.setAdvisedMethod(method);
       info.setUnadvisedMethod(method);
     

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/MDB.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/MDB.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/MDB.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -21,7 +21,6 @@
  */
 package org.jboss.ejb3.mdb;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Hashtable;
@@ -34,13 +33,12 @@
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
-import org.jboss.aop.AspectManager;
-import org.jboss.aop.MethodInfo;
-import org.jboss.aop.util.MethodHashing;
+import org.jboss.aop.Domain;
 import org.jboss.ejb3.Ejb3Deployment;
 import org.jboss.ejb3.ProxyFactoryHelper;
 import org.jboss.ejb3.annotation.DefaultActivationSpecs;
-import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
+import org.jboss.metadata.ejb.jboss.JBossMessageDrivenBeanMetaData;
+import org.jboss.metadata.ejb.spec.NamedMethodMetaData;
 
 /**
  * Comment
@@ -59,10 +57,10 @@
    
    protected Class<?> messagingType = null;
    
-   public MDB(String ejbName, AspectManager manager, ClassLoader cl, String beanClassName, Hashtable ctxProperties,
-              InterceptorInfoRepository interceptorRepository, Ejb3Deployment deployment)
+   public MDB(String ejbName, Domain domain, ClassLoader cl, String beanClassName, Hashtable ctxProperties,
+              Ejb3Deployment deployment, JBossMessageDrivenBeanMetaData beanMetaData) throws ClassNotFoundException
    {
-      super(ejbName, manager, cl, beanClassName, ctxProperties, interceptorRepository, deployment);
+      super(ejbName, domain, cl, beanClassName, ctxProperties, deployment, beanMetaData);
    }
    
    public Class<?> getMessagingType()
@@ -73,7 +71,7 @@
          messagingType = annotation.messageListenerInterface();
          if (messagingType.getName().equals(Object.class.getName()))
          {
-            Set<Class<?>> businessInterfaces = ProxyFactoryHelper.getBusinessInterfaces(clazz,false);
+            Set<Class<?>> businessInterfaces = ProxyFactoryHelper.getBusinessInterfaces(getBeanClass(), false);
             if (businessInterfaces.size() > 1 || businessInterfaces.size() == 0) 
                throw new RuntimeException("Unable to choose messagingType interface for MDB " + getEjbName() + " from " + businessInterfaces);
             messagingType = businessInterfaces.iterator().next();
@@ -83,12 +81,14 @@
       return messagingType;
    }
    
+   /*
    public MethodInfo getMethodInfo(Method method)
    {
       long hash = MethodHashing.calculateHash(method);
       MethodInfo info = super.getMethodInfo(hash);
       return info;
    }
+   */
 
    public Map getActivationConfigProperties()
    {
@@ -111,6 +111,21 @@
       return result;
    }
    
+   protected JBossMessageDrivenBeanMetaData getMetaData()
+   {
+      // TODO: use generics
+      return (JBossMessageDrivenBeanMetaData) super.getMetaData();
+   }
+   
+   @Override
+   protected NamedMethodMetaData getTimeoutMethodMetaData()
+   {
+      JBossMessageDrivenBeanMetaData metaData = getMetaData();
+      if(metaData != null)
+         return metaData.getTimeoutMethod();
+      return null;
+   }
+   
    protected List<Class<?>> resolveBusinessInterfaces()
    {
       List<Class<?>> list = new ArrayList<Class<?>>();

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/MessagingContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/MessagingContainer.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/mdb/MessagingContainer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -37,7 +37,7 @@
 import javax.naming.Context;
 import javax.naming.NamingException;
 
-import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
 import org.jboss.aop.MethodInfo;
 import org.jboss.deployment.DeploymentException;
 import org.jboss.ejb3.BeanContext;
@@ -47,14 +47,15 @@
 import org.jboss.ejb3.Ejb3Module;
 import org.jboss.ejb3.ProxyFactoryHelper;
 import org.jboss.ejb3.annotation.ResourceAdapter;
-import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
 import org.jboss.ejb3.jms.JMSDestinationFactory;
 import org.jboss.ejb3.mdb.inflow.JBossMessageEndpointFactory;
 import org.jboss.ejb3.timerservice.TimedObjectInvoker;
 import org.jboss.ejb3.timerservice.TimerServiceFactory;
 import org.jboss.jms.jndi.JMSProviderAdapter;
 import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
 import org.jboss.metadata.ejb.spec.ActivationConfigPropertyMetaData;
+import org.jboss.metadata.ejb.spec.NamedMethodMetaData;
 
 /**
  * @version <tt>$Revision$</tt>
@@ -65,6 +66,7 @@
    private static final Logger log = Logger.getLogger(MessagingContainer.class);
    
    protected TimerService timerService;
+   private Method timeout;
    protected ActivationSpec activationSpec = new ActivationSpec();
    protected JBossMessageEndpointFactory messageEndpointFactory;
    private MessagingDelegateWrapper mbean = new MessagingDelegateWrapper(this);
@@ -76,13 +78,15 @@
     */
    protected final static String DEFAULT_DESTINATION_TYPE = "javax.jms.Topic";
 
-   public MessagingContainer(String ejbName, AspectManager manager, ClassLoader cl, String beanClassName, Hashtable ctxProperties,
-              InterceptorInfoRepository interceptorRepository, Ejb3Deployment deployment)
+   public MessagingContainer(String ejbName, Domain domain, ClassLoader cl, String beanClassName, Hashtable ctxProperties,
+              Ejb3Deployment deployment, JBossEnterpriseBeanMetaData beanMetaData) throws ClassNotFoundException
    {
-      super(Ejb3Module.BASE_EJB3_JMX_NAME + ",name=" + ejbName, manager, cl, beanClassName, ejbName, ctxProperties, interceptorRepository, deployment);
+      super(Ejb3Module.BASE_EJB3_JMX_NAME + ",name=" + ejbName, domain, cl, beanClassName, ejbName, ctxProperties, deployment, beanMetaData);
       
       messageEndpointFactory = new JBossMessageEndpointFactory();
       messageEndpointFactory.setContainer(this);
+      
+      initializeTimeout();
    }
    
    @Override
@@ -96,14 +100,31 @@
       return mbean;
    }
    
+   protected JBossEnterpriseBeanMetaData getMetaData()
+   {
+      // TODO: resolve this cast using generics on EJBContainer
+      return (JBossEnterpriseBeanMetaData) getXml();
+   }
+   
+   abstract protected NamedMethodMetaData getTimeoutMethodMetaData();
+   
    public abstract Class getMessagingType();
    
    public abstract Map<String, ActivationConfigPropertyMetaData> getActivationConfigProperties();
    
    protected abstract void populateActivationSpec();
    
-   public abstract MethodInfo getMethodInfo(Method method);
+   @Deprecated
+   public MethodInfo getMethodInfo(Method method)
+   {
+      return super.getMethodInfo(method);
+   }
 
+   private void initializeTimeout()
+   {
+      this.timeout = getTimeoutCallback(getTimeoutMethodMetaData(), getBeanClass());
+   }
+   
    public void setMessageEndpointFactory(JBossMessageEndpointFactory messageEndpointFactory)
    {
       this.messageEndpointFactory = messageEndpointFactory;
@@ -231,17 +252,16 @@
          throw new RuntimeException("Could not resolve beanClass method from proxy call: " + method.toString());
       }
       return localInvoke(info, args);
-
    }
 
    public Object localInvoke(MethodInfo info, Object[] args) throws Throwable
-   {     
+   {
       ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
       pushEnc();
       try
       {
          EJBContainerInvocation nextInvocation = new EJBContainerInvocation(info);
-         nextInvocation.setAdvisor(this);
+         nextInvocation.setAdvisor(getAdvisor());
          nextInvocation.setArguments(args);
          return nextInvocation.invokeNext();
       }
@@ -265,7 +285,6 @@
    
    public void callTimeout(Timer timer) throws Exception
    {
-      Method timeout = callbackHandler.getTimeoutCallback();
       if (timeout == null) throw new EJBException("No method has been annotated with @Timeout");
       Object[] args = {timer};
       try

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/pool/AbstractPool.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/pool/AbstractPool.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/pool/AbstractPool.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -21,10 +21,10 @@
  */
 package org.jboss.ejb3.pool;
 
-import org.jboss.aop.Advisor;
-import org.jboss.ejb3.annotation.CacheConfig;
 import org.jboss.ejb3.BeanContext;
 import org.jboss.ejb3.Container;
+import org.jboss.ejb3.EJBContainer;
+import org.jboss.ejb3.annotation.CacheConfig;
 import org.jboss.ejb3.stateful.StatefulBeanContext;
 import org.jboss.injection.Injector;
 import org.jboss.logging.Logger;
@@ -83,9 +83,10 @@
       if (ctx instanceof StatefulBeanContext)
       {         
          StatefulBeanContext sfctx = (StatefulBeanContext) ctx;
+         // FIXME: remove this class cast
+         EJBContainer c = (EJBContainer) container;
          // Tell context how to handle replication
-         Advisor advisor = (Advisor) container;
-         CacheConfig config = (CacheConfig) advisor.resolveAnnotation(CacheConfig.class);
+         CacheConfig config = c.getAnnotation(CacheConfig.class);
          if (config != null)
          {
             sfctx.setReplicationIsPassivation(config.replicationIsPassivation());

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/remoting/IsLocalInterceptor.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/remoting/IsLocalInterceptor.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/remoting/IsLocalInterceptor.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -24,14 +24,13 @@
 import java.io.Serializable;
 import java.util.Map;
 
-import org.jboss.aop.Dispatcher;
-import org.jboss.aop.Advisor;
 import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.logging.Logger;
-import org.jboss.serial.io.MarshalledObjectForLocalCalls;
 import org.jboss.ejb3.Container;
 import org.jboss.ejb3.Ejb3Registry;
+import org.jboss.ejb3.session.SessionContainer;
+import org.jboss.logging.Logger;
+import org.jboss.serial.io.MarshalledObjectForLocalCalls;
 
 /**
  * Routes the call to the local container, bypassing further client-side
@@ -78,7 +77,7 @@
    {
       Invocation copy = (Invocation) new MarshalledObjectForLocalCalls(invocation).get();
       copy.getMetaData().addMetaData(IS_LOCAL, IS_LOCAL, Boolean.TRUE);
-      org.jboss.aop.joinpoint.InvocationResponse response = ((Advisor) container).dynamicInvoke(null, copy);
+      org.jboss.aop.joinpoint.InvocationResponse response = ((SessionContainer) container).dynamicInvoke(null, copy);
       Map contextInfo = response.getContextInfo();
       if (contextInfo != null)
       {

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/remoting/ReplicantsManagerInterceptorFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/remoting/ReplicantsManagerInterceptorFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/remoting/ReplicantsManagerInterceptorFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -21,6 +21,8 @@
  */
 package org.jboss.ejb3.remoting;
 
+import java.util.Map;
+
 import org.jboss.aop.Advisor;
 import org.jboss.aop.InstanceAdvisor;
 import org.jboss.aop.advice.AspectFactory;
@@ -43,8 +45,10 @@
 
    public Object createPerClass(Advisor advisor)
    {
-      SessionContainer container = (SessionContainer) advisor;
-      return new ReplicantsManagerInterceptor(container.getClusterFamilies());
+      SessionContainer container = SessionContainer.getEJBContainer(advisor);
+      Map<?, ?> families = container.getClusterFamilies();
+      assert families != null : "families is null";
+      return new ReplicantsManagerInterceptor(families);
    }
 
    public Object createPerInstance(Advisor advisor, InstanceAdvisor instanceAdvisor)

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/AuthenticationInterceptorFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/AuthenticationInterceptorFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/AuthenticationInterceptorFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -24,6 +24,7 @@
 import org.jboss.aop.Advisor;
 import org.jboss.aop.advice.AspectFactory;
 import org.jboss.ejb3.Container;
+import org.jboss.ejb3.EJBContainer;
 import org.jboss.logging.Logger;
 import org.jboss.security.AuthenticationManager;
 
@@ -39,7 +40,7 @@
    
    public Object createPerClass(Advisor advisor)
    {
-      Container container = (Container)advisor;
+      Container container = EJBContainer.getEJBContainer(advisor);
       AuthenticationManager manager = container.getSecurityManager(AuthenticationManager.class);
       log.debug("Creating interceptor with authentication manager '" + manager + "'" + (manager != null ? " (security domain '" + manager.getSecurityDomain() + "')" : ""));
       //return new Ejb3AuthenticationInterceptor(manager, container);

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/JaccAuthorizationInterceptorFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/JaccAuthorizationInterceptorFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/JaccAuthorizationInterceptorFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -47,7 +47,9 @@
           
          CodeSource ejbCS = advisor.getClazz().getProtectionDomain().getCodeSource();
          
-         String ejbName = ((EJBContainer)advisor).getEjbName(); 
+         // Must be a separate line (EJBContainer cannot be dereferenced)
+         EJBContainer container = EJBContainer.getEJBContainer(advisor);
+         String ejbName = container.getEjbName(); 
          JaccAuthorizationInterceptor jai = new JaccAuthorizationInterceptor(ejbName, ejbCS);
          jai.setRealmMapping(getSecurityManager(advisor)); 
          return jai;

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/JaccHelper.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/JaccHelper.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/JaccHelper.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -303,7 +303,7 @@
       jaccCtx.addDefaultMetaData(JaccAuthorizationInterceptor.JACC,
                                  JaccAuthorizationInterceptor.CTX, jaccContextId);
 
-      container.addClassMetaData(jaccCtx);
+      container.getAdvisor().addClassMetaData(jaccCtx);
    }
 
    public static void checkPermission(CodeSource ejbCS, EJBMethodPermission methodPerm,

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/RoleBasedAuthorizationInterceptorFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/RoleBasedAuthorizationInterceptorFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/RoleBasedAuthorizationInterceptorFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -28,7 +28,6 @@
 
 import org.jboss.aop.Advisor;
 import org.jboss.aop.advice.AspectFactory;
-import org.jboss.ejb3.Container;
 import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.annotation.SecurityDomain;
 import org.jboss.security.AuthenticationManager;
@@ -48,7 +47,8 @@
    public Object createPerClass(Advisor advisor)
    {
       Object domain = null;
-      Container container = (Container)advisor;
+      // Must be a separate line (EJBContainer cannot be dereferenced)
+      EJBContainer container = EJBContainer.getEJBContainer(advisor);
       try
       {
          InitialContext ctx = container.getInitialContext();
@@ -69,7 +69,7 @@
       if (manager == null) throw new RuntimeException("Unable to find Security Domain");
       //return new RoleBasedAuthorizationInterceptor(manager, mapping, container);
       CodeSource ejbCS = advisor.getClazz().getProtectionDomain().getCodeSource();
-      String ejbName = ((EJBContainer)advisor).getEjbName(); 
+      String ejbName = container.getEjbName(); 
       return new RoleBasedAuthorizationInterceptorv2(container, ejbCS, ejbName);
    } 
 }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/RunAsSecurityInterceptorFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/RunAsSecurityInterceptorFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/security/RunAsSecurityInterceptorFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -73,7 +73,7 @@
 
    public Object createPerClass(Advisor advisor)
    {
-      EJBContainer container = (EJBContainer)advisor;
+      EJBContainer container = EJBContainer.getEJBContainer(advisor);
       RunAsIdentity runAsIdentity = getRunAsIdentity(container);
       /*if (runAsIdentity == null)
       {

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/service/ServiceContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/service/ServiceContainer.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/service/ServiceContainer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -25,7 +25,6 @@
 import java.util.Hashtable;
 import java.util.List;
 
-import javax.ejb.EJBException;
 import javax.ejb.Handle;
 import javax.ejb.Timer;
 import javax.ejb.TimerService;
@@ -41,7 +40,7 @@
 import javax.management.ObjectName;
 import javax.management.ReflectionException;
 
-import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
 import org.jboss.aop.MethodInfo;
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.joinpoint.InvocationResponse;
@@ -49,8 +48,6 @@
 import org.jboss.aop.util.MethodHashing;
 import org.jboss.aop.util.PayloadKey;
 import org.jboss.aspects.asynch.FutureHolder;
-import org.jboss.ejb.AllowedOperationsAssociation;
-import org.jboss.ejb.AllowedOperationsFlags;
 import org.jboss.ejb3.BeanContext;
 import org.jboss.ejb3.EJBContainerInvocation;
 import org.jboss.ejb3.Ejb3Deployment;
@@ -60,13 +57,13 @@
 import org.jboss.ejb3.annotation.RemoteBinding;
 import org.jboss.ejb3.annotation.Service;
 import org.jboss.ejb3.asynchronous.AsynchronousInterceptor;
-import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
 import org.jboss.ejb3.remoting.RemoteProxyFactory;
 import org.jboss.ejb3.session.SessionContainer;
 import org.jboss.ejb3.timerservice.TimedObjectInvoker;
 import org.jboss.ejb3.timerservice.TimerServiceFactory;
 import org.jboss.injection.Injector;
 import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossServiceBeanMetaData;
 
 /**
  * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
@@ -86,15 +83,16 @@
    private static final Logger log = Logger.getLogger(ServiceContainer.class);
 
    public ServiceContainer(MBeanServer server, ClassLoader cl, String beanClassName, String ejbName,
-                           AspectManager manager, Hashtable ctxProperties, InterceptorInfoRepository interceptorRepository,
-                           Ejb3Deployment deployment)
+                           Domain domain, Hashtable ctxProperties,
+                           Ejb3Deployment deployment, JBossServiceBeanMetaData beanMetaData) throws ClassNotFoundException
    {
-      super(cl, beanClassName, ejbName, manager, ctxProperties, interceptorRepository, deployment);
+      super(cl, beanClassName, ejbName, domain, ctxProperties, deployment, beanMetaData);
       this.mbeanServer = server;
    }
 
    public void callTimeout(Timer timer) throws Exception
    {
+      /*
       Method timeout = callbackHandler.getTimeoutCallback();
       if (timeout == null) throw new EJBException("No method has been annotated with @Timeout");
       Object[] args = {timer};
@@ -113,6 +111,9 @@
       {
          AllowedOperationsAssociation.popInMethodFlag();
       }
+      */
+      // FIXME: interceptors
+      throw new RuntimeException("NYI");
    }
 
    @Override
@@ -354,13 +355,13 @@
          
          Thread.currentThread().setContextClassLoader(classloader);
          long hash = MethodHashing.calculateHash(method);
-         MethodInfo info = super.getMethodInfo(hash);
+         MethodInfo info = getAdvisor().getMethodInfo(hash);
          if (info == null)
          {
             throw new RuntimeException("Could not resolve beanClass method from proxy call: " + method.toString());
          }
          EJBContainerInvocation nextInvocation = new EJBContainerInvocation(info);
-         nextInvocation.setAdvisor(this);
+         nextInvocation.setAdvisor(getAdvisor());
          nextInvocation.setArguments(args);
 
          nextInvocation = populateInvocation(nextInvocation);
@@ -395,7 +396,7 @@
       EJBContainerInvocation newSi = null;
       
       MethodInvocation si = (MethodInvocation) invocation;
-      MethodInfo info = super.getMethodInfo(si.getMethodHash());
+      MethodInfo info = getAdvisor().getMethodInfo(si.getMethodHash());
       Method method = info.getUnadvisedMethod();
       try
       {
@@ -410,7 +411,7 @@
          newSi = new EJBContainerInvocation(info);
          newSi.setArguments(si.getArguments());
          newSi.setMetaData(si.getMetaData());
-         newSi.setAdvisor(this);
+         newSi.setAdvisor(getAdvisor());
 
          newSi = populateInvocation(newSi);
 

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/service/ServiceRemoteProxyFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/service/ServiceRemoteProxyFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/service/ServiceRemoteProxyFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -26,7 +26,6 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.jboss.aop.Advisor;
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.advice.AdviceStack;
 import org.jboss.ejb3.JBossProxy;
@@ -89,7 +88,7 @@
             stackName = binding.interceptorStack();
          }
          AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
-         Object[] args = {new ServiceRemoteProxy(container, stack.createInterceptors((Advisor) container, null), locator)};
+         Object[] args = {new ServiceRemoteProxy(container, stack.createInterceptors(container.getAdvisor(), null), locator)};
          return proxyConstructor.newInstance(args);
       }
       catch (InstantiationException e)

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/BaseSessionProxyFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/BaseSessionProxyFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/BaseSessionProxyFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -87,7 +87,7 @@
       this.isClustered = container.isClustered();
    }
    
-   protected Container getContainer()
+   protected EJBContainer getContainer()
    {
       if (container == null)
       {

Copied: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/ClassProxyHack.java (from rev 69808, trunk/ejb3/src/main/org/jboss/ejb3/session/ClassProxyHack.java)
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/ClassProxyHack.java	                        (rev 0)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/ClassProxyHack.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.session;
+
+import org.jboss.aop.InstanceAdvisor;
+import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.aop.joinpoint.InvocationResponse;
+import org.jboss.aop.proxy.ClassProxy;
+import org.jboss.aop.proxy.ProxyMixin;
+
+/**
+ * Don't ask. Try observing a volcano eruption from 1 mile or outrun
+ * a lightning bolt. It's safer.
+ *
+ * org.jboss.aop.Dispatcher can handle only certain types.
+ * 
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+class ClassProxyHack implements ClassProxy
+{
+   private SessionContainer container;
+   
+   ClassProxyHack(SessionContainer container)
+   {
+      assert container != null : "container is null";
+      
+      this.container = container;
+   }
+   
+   public InvocationResponse _dynamicInvoke(Invocation invocation) throws Throwable
+   {
+      return container.dynamicInvoke(null, invocation);
+   }
+
+   public void setMixins(ProxyMixin[] mixins)
+   {
+      throw new RuntimeException("Go away, stop bothering me");
+   }
+
+   public InstanceAdvisor _getInstanceAdvisor()
+   {
+      throw new RuntimeException("Go away, stop bothering me");
+   }
+
+   public void _setInstanceAdvisor(InstanceAdvisor newAdvisor)
+   {
+      throw new RuntimeException("Go away, stop bothering me");
+   }
+
+}

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionContainer.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionContainer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -34,8 +34,8 @@
 import javax.ejb.LocalHome;
 import javax.ejb.RemoteHome;
 
-import org.jboss.aop.AspectManager;
 import org.jboss.aop.Dispatcher;
+import org.jboss.aop.Domain;
 import org.jboss.aop.MethodInfo;
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.joinpoint.InvocationResponse;
@@ -52,11 +52,12 @@
 import org.jboss.ejb3.annotation.LocalBinding;
 import org.jboss.ejb3.annotation.RemoteBinding;
 import org.jboss.ejb3.annotation.RemoteBindings;
-import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
 import org.jboss.ejb3.remoting.IsLocalInterceptor;
 import org.jboss.ejb3.remoting.RemoteProxyFactory;
 import org.jboss.ejb3.stateful.StatefulContainerInvocation;
+import org.jboss.ha.framework.server.HATarget;
 import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.serial.io.MarshalledObjectForLocalCalls;
 
 /**
@@ -71,7 +72,7 @@
    private static final Logger log = Logger.getLogger(SessionContainer.class);
 
    protected ProxyDeployer proxyDeployer;
-   protected Map clusterFamilies = new HashMap();
+   private Map<String, HATarget> clusterFamilies;
 
    public class InvokedMethod
    {
@@ -137,11 +138,10 @@
 
    protected ThreadLocalStack<InvokedMethod> invokedMethod = new ThreadLocalStack<InvokedMethod>();
 
-   public SessionContainer(ClassLoader cl, String beanClassName, String ejbName, AspectManager manager,
-                           Hashtable ctxProperties, InterceptorInfoRepository interceptorRepository,
-                           Ejb3Deployment deployment)
+   public SessionContainer(ClassLoader cl, String beanClassName, String ejbName, Domain domain,
+                           Hashtable ctxProperties, Ejb3Deployment deployment, JBossSessionBeanMetaData beanMetaData) throws ClassNotFoundException
    {
-      super(Ejb3Module.BASE_EJB3_JMX_NAME + ",name=" + ejbName, manager, cl, beanClassName, ejbName, ctxProperties, interceptorRepository, deployment);
+      super(Ejb3Module.BASE_EJB3_JMX_NAME + ",name=" + ejbName, domain, cl, beanClassName, ejbName, ctxProperties, deployment, beanMetaData);
       proxyDeployer = new ProxyDeployer(this);
    }
 
@@ -161,6 +161,8 @@
     */
    protected abstract RemoteProxyFactory createRemoteProxyFactory(RemoteBinding binding);
    
+   public abstract InvocationResponse dynamicInvoke(Object target, Invocation invocation) throws Throwable;
+   
    public Class<?> getInvokedBusinessInterface()
    {
       InvokedMethod method = invokedMethod.get();
@@ -183,6 +185,12 @@
       throw new IllegalStateException("Unable to find geInvokedBusinessInterface()");
    }
 
+   protected JBossSessionBeanMetaData getMetaData()
+   {
+      // TODO: resolve this cast using generics on EJBContainer
+      return (JBossSessionBeanMetaData) getXml();
+   }
+   
    @Override
    public void instantiated()
    {
@@ -206,12 +214,27 @@
    {
       super.start();
       // So that Remoting layer can reference this container easily.
-      Dispatcher.singleton.registerTarget(getObjectName().getCanonicalName(), this);
+      Dispatcher.singleton.registerTarget(getObjectName().getCanonicalName(), new ClassProxyHack(this));
       proxyDeployer.start();
    }
 
-   public Map getClusterFamilies()
+   /**
+    * This gets called by replicants manager interceptor factory
+    * during the initialization of the bean container (during construction of EJBContainer).
+    * So we have detached construction here.
+    * 
+    * @return the cluster families, never null
+    */
+   public Map<String, HATarget> getClusterFamilies()
    {
+      if(clusterFamilies != null)
+         return clusterFamilies;
+      
+      synchronized (this)
+      {
+         if(clusterFamilies == null)
+            clusterFamilies = new HashMap<String, HATarget>();
+      }
       return clusterFamilies;
    }
 
@@ -236,6 +259,45 @@
       super.stop();
    }
 
+   @Override
+   public List<Method> getVirtualMethods()
+   {
+      List<Method> virtualMethods = new ArrayList<Method>();
+      try
+      {
+         RemoteHome home = getAnnotation(RemoteHome.class);
+         if (home != null)
+         {
+            Method[] declaredMethods = home.value().getMethods();
+            for(Method declaredMethod : declaredMethods)
+               virtualMethods.add(declaredMethod);
+
+            declaredMethods = javax.ejb.EJBObject.class.getMethods();
+            for(Method declaredMethod : declaredMethods)
+               virtualMethods.add(declaredMethod);
+         }
+
+         LocalHome localHome = getAnnotation(LocalHome.class);
+         if (localHome != null)
+         {
+            Method[] declaredMethods = localHome.value().getMethods();
+            for(Method declaredMethod : declaredMethods)
+               virtualMethods.add(declaredMethod);
+
+            declaredMethods = javax.ejb.EJBLocalObject.class.getMethods();
+            for(Method declaredMethod : declaredMethods)
+               virtualMethods.add(declaredMethod);
+         }
+      }
+      catch (SecurityException e)
+      {
+         // TODO: privileged?
+         throw new RuntimeException(e);
+      }
+      return virtualMethods;
+   }
+   
+   /*
    protected void createMethodMap()
    {
       super.createMethodMap();
@@ -282,6 +344,7 @@
          throw new RuntimeException(e);
       }
    }
+   */
 
    protected boolean isHomeMethod(Method method)
    {
@@ -357,7 +420,7 @@
       try
       {
          long hash = MethodHashing.calculateHash(method);
-         MethodInfo info = super.getMethodInfo(hash);
+         MethodInfo info = getAdvisor().getMethodInfo(hash);
          if (info == null)
          {
             throw new RuntimeException(
@@ -378,7 +441,7 @@
 
          // FIXME: Ahem, stateful container invocation works on all.... (violating contract though)
          EJBContainerInvocation nextInvocation = new StatefulContainerInvocation(info, id);
-         nextInvocation.setAdvisor(this);
+         nextInvocation.setAdvisor(getAdvisor());
          nextInvocation.setArguments(args);
          
          // allow a container to supplement information into an invocation
@@ -524,4 +587,4 @@
    }
    
    abstract protected void removeHandle(Handle handle) throws Exception;
-}
\ No newline at end of file
+}

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/ProxiedStatefulBeanContext.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/ProxiedStatefulBeanContext.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/ProxiedStatefulBeanContext.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -28,10 +28,11 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.locks.ReentrantLock;
+
 import javax.ejb.EJBContext;
 import javax.persistence.EntityManager;
+
 import org.jboss.aop.metadata.SimpleMetaData;
-import org.jboss.ejb3.Container;
 import org.jboss.ejb3.interceptor.InterceptorInfo;
 import org.jboss.ejb3.session.SessionContainer;
 
@@ -308,11 +309,13 @@
       getDelegate().extractBeanAndInterceptors();
    }
 
+   /*
    @Override
    public void initialiseInterceptorInstances()
    {
       getDelegate().initialiseInterceptorInstances();
    }
+   */
 
    @Override
    public EJBContext getEJBContext()

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulBeanContext.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulBeanContext.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulBeanContext.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -84,7 +84,10 @@
           
          if (isClustered && container == null)
             container = (StatefulContainer)Ejb3Registry.getClusterContainer(containerClusterUid);
-        
+         
+         if(container == null)
+            throw new IllegalStateException("Can't find container " + containerGuid);
+         
          StatefulBeanContext context = new StatefulBeanContext(container, beanMO);
          context.id = this.id;
          context.metadata = this.metadata;

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulClusterProxyFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulClusterProxyFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulClusterProxyFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -26,7 +26,6 @@
 
 import javax.naming.NamingException;
 
-import org.jboss.aop.Advisor;
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.Dispatcher;
 import org.jboss.aop.advice.AdviceStack;
@@ -159,7 +158,7 @@
       }
       AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
       String partitionName = ((SessionContainer) getContainer()).getPartitionName();
-      return constructProxy(new StatefulClusteredProxy(getContainer(), stack.createInterceptors((Advisor) getContainer(), null), 
+      return constructProxy(new StatefulClusteredProxy(getContainer(), stack.createInterceptors(getContainer().getAdvisor(), null), 
             wrapper, lbPolicy, partitionName));
    }
 
@@ -181,7 +180,7 @@
    protected StatefulHandleImpl getHandle()
    {
       StatefulHandleImpl handle = new StatefulHandleImpl();
-      RemoteBinding remoteBinding = (RemoteBinding)((Advisor)getContainer()).resolveAnnotation(RemoteBinding.class);
+      RemoteBinding remoteBinding = (RemoteBinding) getContainer().resolveAnnotation(RemoteBinding.class);
       if (remoteBinding != null)
          handle.jndiName = remoteBinding.jndiBinding();
  

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainer.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -25,11 +25,11 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.ArrayList;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Map;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
 import javax.ejb.EJBHome;
 import javax.ejb.EJBObject;
 import javax.ejb.Handle;
@@ -40,9 +40,12 @@
 import javax.ejb.RemoteHome;
 import javax.ejb.TimerService;
 
-import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
+import org.jboss.aop.InstanceAdvisor;
 import org.jboss.aop.MethodInfo;
 import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.advice.PerVmAdvice;
+import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.joinpoint.InvocationResponse;
 import org.jboss.aop.util.MethodHashing;
@@ -58,11 +61,13 @@
 import org.jboss.ejb3.annotation.LocalBinding;
 import org.jboss.ejb3.annotation.RemoteBinding;
 import org.jboss.ejb3.annotation.RemoteBindings;
+import org.jboss.ejb3.aop.LifeCycleInvocation;
 import org.jboss.ejb3.cache.CacheFactoryRegistry;
 import org.jboss.ejb3.cache.Ejb3CacheFactory;
 import org.jboss.ejb3.cache.StatefulCache;
 import org.jboss.ejb3.cache.StatefulObjectFactory;
-import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
+import org.jboss.ejb3.interceptors.aop.InterceptorsFactory;
+import org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor;
 import org.jboss.ejb3.proxy.EJBMetaDataImpl;
 import org.jboss.ejb3.proxy.handle.HomeHandleImpl;
 import org.jboss.ejb3.remoting.RemoteProxyFactory;
@@ -70,6 +75,7 @@
 import org.jboss.injection.Injector;
 import org.jboss.injection.JndiPropertyInjector;
 import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 
 /**
  * Comment
@@ -84,11 +90,10 @@
    protected StatefulCache cache;
    private StatefulDelegateWrapper mbean = new StatefulDelegateWrapper(this);
 
-   public StatefulContainer(ClassLoader cl, String beanClassName, String ejbName, AspectManager manager,
-                            Hashtable ctxProperties, InterceptorInfoRepository interceptorRepository,
-                            Ejb3Deployment deployment)
+   public StatefulContainer(ClassLoader cl, String beanClassName, String ejbName, Domain domain,
+                            Hashtable ctxProperties, Ejb3Deployment deployment, JBossSessionBeanMetaData beanMetaData) throws ClassNotFoundException
    {
-      super(cl, beanClassName, ejbName, manager, ctxProperties, interceptorRepository, deployment);
+      super(cl, beanClassName, ejbName, domain, ctxProperties, deployment, beanMetaData);
    }
 
    public StatefulBeanContext create(Class<?>[] initTypes, Object[] initValues)
@@ -197,7 +202,7 @@
       try
       {
          long hash = MethodHashing.calculateHash(method);
-         MethodInfo info = super.getMethodInfo(hash);
+         MethodInfo info = getAdvisor().getMethodInfo(hash);
          if (info == null)
          {
             throw new RuntimeException(
@@ -228,7 +233,7 @@
       try
       {
          long hash = MethodHashing.calculateHash(method);
-         MethodInfo info = super.getMethodInfo(hash);
+         MethodInfo info = getAdvisor().getMethodInfo(hash);
          if (info == null)
          {
             throw new RuntimeException(
@@ -253,7 +258,7 @@
             }
             
             StatefulContainerInvocation nextInvocation = new StatefulContainerInvocation(info, id);
-            nextInvocation.setAdvisor(this);
+            nextInvocation.setAdvisor(getAdvisor());
             nextInvocation.setArguments(args);
             
             ProxyUtils.addLocalAsynchronousInfo(nextInvocation, provider);
@@ -329,10 +334,10 @@
       {
          Thread.currentThread().setContextClassLoader(classloader);
          StatefulRemoteInvocation si = (StatefulRemoteInvocation) invocation;
-         MethodInfo info = super.getMethodInfo(si.getMethodHash());
+         MethodInfo info = getAdvisor().getMethodInfo(si.getMethodHash());
          if (info == null)
          {
-            throw new RuntimeException("Could not resolve beanClass method from proxy call");
+            throw new RuntimeException("Could not resolve beanClass method from proxy call " + invocation);
          }
 
          InvocationResponse response = null;
@@ -356,7 +361,7 @@
                if (unadvisedMethod.isBridge())
                {
                   unadvisedMethod = this.getNonBridgeMethod(unadvisedMethod);
-                  info = super.getMethodInfo(MethodHashing.calculateHash(unadvisedMethod));
+                  info = super.getMethodInfo(unadvisedMethod);
                }
                
                if (si.getId() == null)
@@ -371,7 +376,7 @@
                newSi = new StatefulContainerInvocation(info, newId);
                newSi.setArguments(si.getArguments());
                newSi.setMetaData(si.getMetaData());
-               newSi.setAdvisor(this);
+               newSi.setAdvisor(getAdvisor());
    
                Object rtn = null;
                  
@@ -450,15 +455,44 @@
             }
          }
       }
-      callbackHandler.postActivate(beanContext);
+      // FIXME: this is just a hack, use an interceptor stack
+      try
+      {
+         List<Interceptor> interceptors = new ArrayList<Interceptor>(InterceptorsFactory.getLifeCycleInterceptors((InstanceAdvisor) getAdvisor(), PostActivate.class));
+         interceptors.add(0, PerVmAdvice.generateInterceptor(null, new InvocationContextInterceptor(), "setup"));
+         
+         LifeCycleInvocation invocation = new LifeCycleInvocation(interceptors.toArray(new Interceptor[0]));
+         invocation.setAdvisor(getAdvisor());
+         invocation.setTargetObject(beanContext.getInstance());
+         invocation.invokeNext();
+      }
+      catch(Throwable t)
+      {
+         throw new RuntimeException(t);
+      }
    }
 
    @Override
    public void invokePrePassivate(BeanContext beanContext)
    {
-      callbackHandler.prePassivate(beanContext);
+      // FIXME: this is just a hack, use an interceptor stack
+      try
+      {
+         List<Interceptor> interceptors = new ArrayList<Interceptor>(InterceptorsFactory.getLifeCycleInterceptors((InstanceAdvisor) getAdvisor(), PrePassivate.class));
+         interceptors.add(0, PerVmAdvice.generateInterceptor(null, new InvocationContextInterceptor(), "setup"));
+         
+         LifeCycleInvocation invocation = new LifeCycleInvocation(interceptors.toArray(new Interceptor[0]));
+         invocation.setAdvisor(getAdvisor());
+         invocation.setTargetObject(beanContext.getInstance());
+         invocation.invokeNext();
+      }
+      catch(Throwable t)
+      {
+         throw new RuntimeException(t);
+      }
    }
 
+   /*
    @Override
    protected Class[] getHandledCallbacks()
    {
@@ -466,6 +500,7 @@
               {PostConstruct.class, PreDestroy.class, PostActivate.class,
                       PrePassivate.class};
    }
+   */
 
    public void invokeInit(Object bean, Class[] initParameterTypes,
                           Object[] initParameterValues)
@@ -695,7 +730,7 @@
    
    public boolean isClustered()
    {
-      return hasAnnotation(getBeanClass(), Clustered.class.getName());
+      return isAnnotationPresent(Clustered.class);
    }
 
    protected InvocationResponse invokeHomeMethod(MethodInfo info,
@@ -873,7 +908,7 @@
 
       newStatefulInvocation.setArguments(statefulInvocation.getArguments());
       newStatefulInvocation.setMetaData(statefulInvocation.getMetaData());
-      newStatefulInvocation.setAdvisor(this);
+      newStatefulInvocation.setAdvisor(getAdvisor());
 
       return newStatefulInvocation;
    }
@@ -896,7 +931,7 @@
 
       newStatefulInvocation.setArguments(statefulInvocation.getArguments());
       newStatefulInvocation.setMetaData(statefulInvocation.getMetaData());
-      newStatefulInvocation.setAdvisor(this);
+      newStatefulInvocation.setAdvisor(getAdvisor());
 
       return newStatefulInvocation;
    }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulInstanceInterceptor.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulInstanceInterceptor.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulInstanceInterceptor.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -27,11 +27,11 @@
 import javax.ejb.ConcurrentAccessException;
 import javax.ejb.EJBException;
 
-import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.joinpoint.MethodInvocation;
 import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.annotation.SerializedConcurrentAccess;
+import org.jboss.ejb3.aop.AbstractInterceptor;
 import org.jboss.logging.Logger;
 import org.jboss.metadata.ejb.jboss.JBossAssemblyDescriptorMetaData;
 import org.jboss.metadata.ejb.spec.ApplicationExceptionMetaData;
@@ -43,7 +43,7 @@
  * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
  * @version $Revision$
  */
-public class StatefulInstanceInterceptor implements Interceptor
+public class StatefulInstanceInterceptor extends AbstractInterceptor
 {
    private static final Logger log = Logger.getLogger(StatefulInstanceInterceptor.class);
    
@@ -60,7 +60,7 @@
    {
       StatefulContainerInvocation ejb = (StatefulContainerInvocation) invocation;
       Object id = ejb.getId();
-      StatefulContainer container = (StatefulContainer) ejb.getAdvisor();
+      StatefulContainer container = getEJBContainer(invocation);
       StatefulBeanContext target = container.getCache().get(id);
 
       boolean block = container.getAnnotation(SerializedConcurrentAccess.class) != null;

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulLocalProxyFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulLocalProxyFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulLocalProxyFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -24,18 +24,16 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.rmi.dgc.VMID;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 
-import java.rmi.dgc.VMID;
-
 import javax.ejb.LocalHome;
 import javax.naming.NamingException;
 
-import org.jboss.aop.Advisor;
-import org.jboss.ejb3.Ejb3Registry;
 import org.jboss.ejb3.EJBContainer;
+import org.jboss.ejb3.Ejb3Registry;
 import org.jboss.ejb3.JBossProxy;
 import org.jboss.ejb3.ProxyFactoryHelper;
 import org.jboss.ejb3.annotation.LocalBinding;
@@ -164,7 +162,7 @@
    protected StatefulHandleImpl getHandle()
    {
       StatefulHandleImpl handle = new StatefulHandleImpl();
-      LocalBinding remoteBinding = (LocalBinding) ((Advisor)getContainer()).resolveAnnotation(LocalBinding.class);
+      LocalBinding remoteBinding = (LocalBinding) getContainer().resolveAnnotation(LocalBinding.class);
       if (remoteBinding != null)
          handle.jndiName = remoteBinding.jndiBinding();
 

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulRemoteProxyFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulRemoteProxyFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulRemoteProxyFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -29,7 +29,6 @@
 import javax.ejb.RemoteHome;
 import javax.naming.NamingException;
 
-import org.jboss.aop.Advisor;
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.Dispatcher;
 import org.jboss.aop.advice.AdviceStack;
@@ -176,7 +175,7 @@
          }
          AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
          if (stack == null) throw new RuntimeException("unable to find interceptor stack: " + stackName);
-         StatefulHomeRemoteProxy proxy = new StatefulHomeRemoteProxy(getContainer(), stack.createInterceptors((Advisor) getContainer(), null), locator);
+         StatefulHomeRemoteProxy proxy = new StatefulHomeRemoteProxy(getContainer(), stack.createInterceptors(getContainer().getAdvisor(), null), locator);
 
          setEjb21Objects(proxy);
          Class[] intfs = {homeInterface};
@@ -187,6 +186,7 @@
          throw new RuntimeException(e);  //To change body of catch statement use Options | File Templates.
       }
    }
+   
    public Object createProxy()
    {
       String stackName = "StatefulSessionClientInterceptors";
@@ -196,7 +196,7 @@
       }
       AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
       if (stack == null) throw new RuntimeException("unable to find interceptor stack: " + stackName);
-      StatefulRemoteProxy proxy = new StatefulRemoteProxy(getContainer(), stack.createInterceptors((Advisor) getContainer(), null), locator);
+      StatefulRemoteProxy proxy = new StatefulRemoteProxy(getContainer(), stack.createInterceptors(getContainer().getAdvisor(), null), locator);
 
       setEjb21Objects(proxy);
       return constructProxy(proxy);
@@ -218,7 +218,7 @@
          stackName = binding.interceptorStack();
       }
       AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
-      StatefulRemoteProxy proxy = new StatefulRemoteProxy(getContainer(), stack.createInterceptors((Advisor) getContainer(), null), locator, id);
+      StatefulRemoteProxy proxy = new StatefulRemoteProxy(getContainer(), stack.createInterceptors(getContainer().getAdvisor(), null), locator, id);
       
       setEjb21Objects(proxy);
       return constructProxy(proxy);

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulRemoveInterceptor.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulRemoveInterceptor.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulRemoveInterceptor.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -22,15 +22,15 @@
 package org.jboss.ejb3.stateful;
 
 import java.lang.reflect.Method;
+import javax.transaction.RollbackException;
 import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
 import javax.transaction.Transaction;
-import javax.transaction.SystemException;
-import javax.transaction.RollbackException;
-import org.jboss.aop.advice.Interceptor;
+
 import org.jboss.aop.joinpoint.MethodInvocation;
 import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.ejb3.aop.AbstractInterceptor;
 import org.jboss.ejb3.tx.TxUtil;
-import org.jboss.ejb3.BeanContext;
 import org.jboss.logging.Logger;
 import org.jboss.tm.TxUtils;
 
@@ -39,7 +39,7 @@
  *
  * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
  */
-public class StatefulRemoveInterceptor implements Interceptor
+public class StatefulRemoveInterceptor extends AbstractInterceptor
 {
    private static final Logger log = Logger.getLogger(StatefulRemoveInterceptor.class);
    protected boolean retainIfException;
@@ -143,7 +143,7 @@
       if (ctx == null || ctx.isDiscarded() || ctx.isRemoved()) return;
       Object id = ejb.getId();
 
-      StatefulContainer container = (StatefulContainer) ejb.getAdvisor();
+      StatefulContainer container = getEJBContainer(invocation);
       Transaction tx = null;
       try
       {

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessClusterProxyFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessClusterProxyFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessClusterProxyFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -24,7 +24,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.jboss.aop.Advisor;
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.advice.AdviceStack;
 import org.jboss.aspects.remoting.FamilyWrapper;
@@ -137,43 +136,22 @@
 
    public Object createProxy()
    {
-//      try
+      Object containerId = getContainer().getObjectName().getCanonicalName();
+      String stackName = "ClusteredStatelessSessionClientInterceptors";
+      if (binding.interceptorStack() != null && !binding.interceptorStack().equals(""))
       {
-         Object containerId = getContainer().getObjectName().getCanonicalName();
-         String stackName = "ClusteredStatelessSessionClientInterceptors";
-         if (binding.interceptorStack() != null && !binding.interceptorStack().equals(""))
-         {
-            stackName = binding.interceptorStack();
-         }
-         AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
-         /*
-         Object[] args = {new StatelessClusteredProxy(containerId, stack.createInterceptors((Advisor) container, null), wrapper, lbPolicy)};
-         return proxyConstructor.newInstance(args);
-         */
-         String partitionName = ((StatelessContainer) getContainer()).getPartitionName();
-         
-         proxy = constructProxy(new StatelessClusteredProxy(getContainer(), stack.createInterceptors((Advisor) getContainer(), null), 
-               wrapper, lbPolicy, partitionName));
-         return proxy;
+         stackName = binding.interceptorStack();
       }
+      AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
       /*
-      catch (InstantiationException e)
-      {
-         throw new RuntimeException(e);  //To change body of catch statement use Options | File Templates.
-      }
-      catch (IllegalAccessException e)
-      {
-         throw new RuntimeException(e);  //To change body of catch statement use Options | File Templates.
-      }
-      catch (IllegalArgumentException e)
-      {
-         throw new RuntimeException(e);  //To change body of catch statement use Options | File Templates.
-      }
-      catch (InvocationTargetException e)
-      {
-         throw new RuntimeException(e.getTargetException());  //To change body of catch statement use Options | File Templates.
-      }
+      Object[] args = {new StatelessClusteredProxy(containerId, stack.createInterceptors((Advisor) container, null), wrapper, lbPolicy)};
+      return proxyConstructor.newInstance(args);
       */
+      String partitionName = ((StatelessContainer) getContainer()).getPartitionName();
+      
+      proxy = constructProxy(new StatelessClusteredProxy(getContainer(), stack.createInterceptors(getContainer().getAdvisor(), null), 
+            wrapper, lbPolicy, partitionName));
+      return proxy;
    }
 
    protected StatelessHandleImpl getHandle()

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessContainer.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessContainer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -32,7 +32,7 @@
 import javax.ejb.TimerService;
 import javax.naming.NamingException;
 
-import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
 import org.jboss.aop.MethodInfo;
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.joinpoint.InvocationResponse;
@@ -51,12 +51,13 @@
 import org.jboss.ejb3.annotation.LocalBinding;
 import org.jboss.ejb3.annotation.RemoteBinding;
 import org.jboss.ejb3.annotation.RemoteBindings;
-import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
 import org.jboss.ejb3.remoting.RemoteProxyFactory;
 import org.jboss.ejb3.session.SessionContainer;
 import org.jboss.ejb3.timerservice.TimedObjectInvoker;
 import org.jboss.ejb3.timerservice.TimerServiceFactory;
 import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
+import org.jboss.metadata.ejb.spec.NamedMethodMetaData;
 import org.jboss.proxy.ejb.handle.HomeHandleImpl;
 import org.jboss.proxy.ejb.handle.StatelessHandleImpl;
 
@@ -72,13 +73,15 @@
    private static final Logger log = Logger.getLogger(StatelessContainer.class);
 
    protected TimerService timerService;
+   private Method timeout;
    private StatelessDelegateWrapper mbean = new StatelessDelegateWrapper(this);
 
-   public StatelessContainer(ClassLoader cl, String beanClassName, String ejbName, AspectManager manager,
-                             Hashtable ctxProperties, InterceptorInfoRepository interceptorRepository,
-                             Ejb3Deployment deployment)
+   public StatelessContainer(ClassLoader cl, String beanClassName, String ejbName, Domain domain,
+                             Hashtable ctxProperties, Ejb3Deployment deployment, JBossSessionBeanMetaData beanMetaData) throws ClassNotFoundException
    {
-      super(cl, beanClassName, ejbName, manager, ctxProperties, interceptorRepository, deployment);
+      super(cl, beanClassName, ejbName, domain, ctxProperties, deployment, beanMetaData);
+      
+      initializeTimeout();
    }
 
    @Override
@@ -117,6 +120,15 @@
       return mbean;
    }
    
+   private void initializeTimeout()
+   {
+      JBossSessionBeanMetaData metaData = getMetaData();
+      NamedMethodMetaData timeoutMethodMetaData = null;
+      if(metaData != null)
+         timeoutMethodMetaData = metaData.getTimeoutMethod();
+      this.timeout = getTimeoutCallback(timeoutMethodMetaData, getBeanClass());
+   }
+   
    public void start() throws Exception
    {
       try
@@ -165,7 +177,6 @@
    
    public void callTimeout(Timer timer) throws Exception
    {
-      Method timeout = callbackHandler.getTimeoutCallback();
       if (timeout == null) throw new EJBException("No method has been annotated with @Timeout");
       Object[] args = {timer};
       ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
@@ -174,9 +185,9 @@
          AllowedOperationsAssociation.pushInMethodFlag(AllowedOperationsFlags.IN_EJB_TIMEOUT);
          try
          {
-            MethodInfo info = super.getMethodInfo(callbackHandler.getTimeoutCalllbackHash());
+            MethodInfo info = super.getMethodInfo(timeout);
             EJBContainerInvocation nextInvocation = new EJBContainerInvocation(info);
-            nextInvocation.setAdvisor(this);
+            nextInvocation.setAdvisor(getAdvisor());
             nextInvocation.setArguments(args);
             nextInvocation.invokeNext();
          }
@@ -241,7 +252,7 @@
             }
 
             EJBContainerInvocation<StatelessContainer, StatelessBeanContext> nextInvocation = new EJBContainerInvocation<StatelessContainer, StatelessBeanContext>(info);
-            nextInvocation.setAdvisor(this);
+            nextInvocation.setAdvisor(getAdvisor());
             nextInvocation.setArguments(args);
             nextInvocation.setContextCallback(callback);
 
@@ -277,10 +288,10 @@
       {
          Thread.currentThread().setContextClassLoader(classloader);
          MethodInvocation si = (MethodInvocation) invocation;
-         MethodInfo info = super.getMethodInfo(si.getMethodHash());
+         MethodInfo info = getAdvisor().getMethodInfo(si.getMethodHash());
          if (info == null)
          {
-            throw new RuntimeException("Could not resolve beanClass method from proxy call");
+            throw new RuntimeException("Could not resolve beanClass method from proxy call " + invocation);
          }
 
          Method unadvisedMethod = info.getUnadvisedMethod();
@@ -307,7 +318,7 @@
                newSi = new EJBContainerInvocation(info);
                newSi.setArguments(si.getArguments());
                newSi.setMetaData(si.getMetaData());
-               newSi.setAdvisor(this);
+               newSi.setAdvisor(getAdvisor());
                try
                {
                   rtn = newSi.invokeNext();
@@ -341,7 +352,6 @@
       {
          Thread.currentThread().setContextClassLoader(oldLoader);
       }
-
    }
 
 

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -21,25 +21,27 @@
  */
 package org.jboss.ejb3.stateless;
 
-import org.jboss.aop.advice.Interceptor;
+import java.rmi.RemoteException;
+
+import javax.ejb.EJBException;
+
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.ejb3.*;
+import org.jboss.ejb3.BeanContext;
+import org.jboss.ejb3.EJBContainer;
+import org.jboss.ejb3.EJBContainerInvocation;
+import org.jboss.ejb3.aop.AbstractInterceptor;
 import org.jboss.ejb3.pool.Pool;
 import org.jboss.ejb3.stateful.StatefulRemoveInterceptor;
-import org.jboss.ejb3.tx.Ejb3TxPolicy;
 import org.jboss.logging.Logger;
 
-import javax.ejb.EJBException;
-import java.rmi.RemoteException;
-
 /**
  * Comment
  *
  * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
  * @version $Revision$
  */
-public class StatelessInstanceInterceptor implements Interceptor
+public class StatelessInstanceInterceptor extends AbstractInterceptor
 {
    private static final Logger log = Logger.getLogger(StatelessInstanceInterceptor.class);
 
@@ -51,7 +53,7 @@
    public Object invoke(Invocation invocation) throws Throwable
    {
       EJBContainerInvocation ejb = (EJBContainerInvocation) invocation;
-      EJBContainer container = (EJBContainer)ejb.getAdvisor();
+      EJBContainer container = getEJBContainer(invocation);
       Pool pool = container.getPool();
       BeanContext<?> ctx = pool.get();
       ejb.setTargetObject(ctx.getInstance());

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessLocalProxyFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessLocalProxyFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessLocalProxyFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -27,7 +27,6 @@
 
 import javax.ejb.LocalHome;
 
-import org.jboss.aop.Advisor;
 import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.JBossProxy;
 import org.jboss.ejb3.ProxyFactoryHelper;
@@ -157,7 +156,7 @@
    protected StatelessHandleImpl getHandle()
    {
       StatelessHandleImpl handle = new StatelessHandleImpl();
-      LocalBinding remoteBinding = (LocalBinding) ((Advisor)getContainer()).resolveAnnotation(LocalBinding.class);
+      LocalBinding remoteBinding = (LocalBinding) getContainer().resolveAnnotation(LocalBinding.class);
       if (remoteBinding != null)
          handle.jndiName = remoteBinding.jndiBinding();
 

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessRemoteProxyFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessRemoteProxyFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessRemoteProxyFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -28,7 +28,6 @@
 import javax.ejb.RemoteHome;
 import javax.naming.NamingException;
 
-import org.jboss.aop.Advisor;
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.advice.AdviceStack;
 import org.jboss.ejb3.EJBContainer;
@@ -153,7 +152,7 @@
    protected StatelessHandleImpl getHandle()
    {
       StatelessHandleImpl handle = new StatelessHandleImpl();
-      RemoteBinding remoteBinding = (RemoteBinding) ((Advisor)getContainer()).resolveAnnotation(RemoteBinding.class);
+      RemoteBinding remoteBinding = (RemoteBinding) getContainer().resolveAnnotation(RemoteBinding.class);
       if (remoteBinding != null)
          handle.jndiName = remoteBinding.jndiBinding() ;
 
@@ -171,7 +170,7 @@
          }
          AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
          StatelessRemoteProxy proxy = new StatelessRemoteProxy(getContainer(),
-               stack.createInterceptors((Advisor) getContainer(), null), locator);
+               stack.createInterceptors(getContainer().getAdvisor(), null), locator);
          setEjb21Objects(proxy);
          Class[] interfaces = {homeInterface};
          return java.lang.reflect.Proxy.newProxyInstance(getContainer().getBeanClass().getClassLoader(), interfaces, proxy);
@@ -184,41 +183,16 @@
 
    public Object createProxy()
    {
-//      try
+      String stackName = "StatelessSessionClientInterceptors";
+      if (binding.interceptorStack() != null && !binding.interceptorStack().equals(""))
       {
-         String stackName = "StatelessSessionClientInterceptors";
-         if (binding.interceptorStack() != null && !binding.interceptorStack().equals(""))
-         {
-            stackName = binding.interceptorStack();
-         }
-         AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
-         StatelessRemoteProxy proxy = new StatelessRemoteProxy(getContainer(),
-               stack.createInterceptors((Advisor) getContainer(), null), locator);
-         setEjb21Objects(proxy);
-         /*
-         Object[] args = {proxy};
-         return proxyConstructor.newInstance(args);
-         */
-         return constructProxy(proxy);
+         stackName = binding.interceptorStack();
       }
-      /*
-      catch (InstantiationException e)
-      {
-         throw new RuntimeException(e);  //To change body of catch statement use Options | File Templates.
-      }
-      catch (IllegalAccessException e)
-      {
-         throw new RuntimeException(e);  //To change body of catch statement use Options | File Templates.
-      }
-      catch (IllegalArgumentException e)
-      {
-         throw new RuntimeException(e);  //To change body of catch statement use Options | File Templates.
-      }
-      catch (InvocationTargetException e)
-      {
-         throw new RuntimeException(e.getTargetException());  //To change body of catch statement use Options | File Templates.
-      }
-      */
+      AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
+      StatelessRemoteProxy proxy = new StatelessRemoteProxy(getContainer(),
+            stack.createInterceptors(getContainer().getAdvisor(), null), locator);
+      setEjb21Objects(proxy);
+      return constructProxy(proxy);
    }
 
 }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/BMTInterceptor.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/BMTInterceptor.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/BMTInterceptor.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -26,11 +26,12 @@
 import javax.transaction.SystemException;
 import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
-import org.jboss.aop.advice.Interceptor;
+
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.util.PayloadKey;
 import org.jboss.ejb3.Container;
 import org.jboss.ejb3.EJBContainerInvocation;
+import org.jboss.ejb3.aop.AbstractInterceptor;
 import org.jboss.ejb3.stateful.StatefulBeanContext;
 import org.jboss.logging.Logger;
 import org.jboss.tm.TxUtils;
@@ -42,7 +43,7 @@
  *  @author <a href="mailto:osh at sparre.dk">Ole Husgaard</a>
  * @version $Revision$
  */
-public class BMTInterceptor implements Interceptor
+public class BMTInterceptor extends AbstractInterceptor
 {
    private TransactionManager tm;
    private boolean isStateless;
@@ -64,7 +65,7 @@
 
    public Object handleStateless(Invocation invocation) throws Throwable
    {
-      Container container = (Container)invocation.getAdvisor();
+      Container container = getEJBContainer(invocation);
       boolean exceptionThrown = false;
       try
       {
@@ -92,7 +93,7 @@
    public Object handleStateful(Invocation invocation) throws Throwable
    {
       EJBContainerInvocation ejb = (EJBContainerInvocation)invocation;
-      Container container = (Container)invocation.getAdvisor();
+      Container container = getEJBContainer(invocation);
 
       StatefulBeanContext ctx = (StatefulBeanContext)ejb.getBeanContext();
       Transaction tx = (Transaction)ctx.getMetaData().getMetaData("TX", "TX");

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/TxInterceptorFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/TxInterceptorFactory.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/TxInterceptorFactory.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -30,6 +30,7 @@
 import org.jboss.aop.Advisor;
 import org.jboss.aop.joinpoint.Joinpoint;
 import org.jboss.aop.joinpoint.MethodJoinpoint;
+import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.annotation.TransactionTimeout;
 import org.jboss.ejb3.stateful.StatefulContainer;
 import org.jboss.logging.Logger;
@@ -87,7 +88,11 @@
       // We have to do this until AOP supports matching based on annotation attributes
       TransactionManagementType type = TxUtil.getTransactionManagementType(advisor);
       if (type == TransactionManagementType.BEAN)
-         return new BMTInterceptor(TxUtil.getTransactionManager(), !(advisor instanceof StatefulContainer));
+      {
+         // Must be a separate line (EJBContainer cannot be dereferenced)
+         EJBContainer container = EJBContainer.getEJBContainer(advisor);
+         return new BMTInterceptor(TxUtil.getTransactionManager(), !(container instanceof StatefulContainer));
+      }
 
       Method method = ((MethodJoinpoint) jp).getMethod();
       int timeout = resolveTransactionTimeout(advisor, method);

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/TxUtil.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/TxUtil.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/tx/TxUtil.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -31,9 +31,11 @@
 import org.jboss.aop.Advisor;
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.joinpoint.MethodInvocation;
+import org.jboss.ejb3.Container;
 import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.InitialContextFactory;
 import org.jboss.ejb3.annotation.impl.ApplicationExceptionImpl;
+import org.jboss.ejb3.aop.AbstractInterceptor;
 import org.jboss.metadata.ejb.jboss.JBossAssemblyDescriptorMetaData;
 import org.jboss.metadata.ejb.spec.ApplicationExceptionMetaData;
 import org.jboss.metadata.ejb.spec.ApplicationExceptionsMetaData;
@@ -62,9 +64,20 @@
       }
    }
 
-   public static TransactionManagementType getTransactionManagementType(Advisor c)
+   public static TransactionManagementType getTransactionManagementType(Advisor advisor)
    {
-      TransactionManagement transactionManagement = (TransactionManagement) c.resolveAnnotation(TransactionManagement.class);
+      return getTransactionManagementType(EJBContainer.getEJBContainer(advisor));
+   }
+   
+   @Deprecated
+   public static TransactionManagementType getTransactionManagementType(Container container)
+   {
+      return getTransactionManagementType((EJBContainer) container);
+   }
+   
+   public static TransactionManagementType getTransactionManagementType(EJBContainer container)
+   {
+      TransactionManagement transactionManagement = (TransactionManagement) container.getAnnotation(TransactionManagement.class);
       if (transactionManagement == null) return TransactionManagementType.CONTAINER;
       return transactionManagement.value();
    }
@@ -72,7 +85,7 @@
    public static ApplicationException getApplicationException(Class<?> exceptionClass, Invocation invocation)
    {
       MethodInvocation ejb = (MethodInvocation) invocation;
-      EJBContainer container = (EJBContainer) ejb.getAdvisor();
+      EJBContainer container = AbstractInterceptor.getEJBContainer(invocation);
 
       // TODO: Wolf: refactor onto a unified metadata view
       

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionFieldInjector.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionFieldInjector.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionFieldInjector.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -22,9 +22,10 @@
 package org.jboss.injection;
 
 import java.lang.reflect.Field;
+
 import javax.ejb.TransactionManagementType;
 import javax.transaction.UserTransaction;
-import org.jboss.aop.Advisor;
+
 import org.jboss.ejb3.BeanContext;
 import org.jboss.ejb3.Container;
 import org.jboss.ejb3.tx.TxUtil;
@@ -45,7 +46,7 @@
    {
       if (container instanceof Container)
       {
-         TransactionManagementType type = TxUtil.getTransactionManagementType(((Advisor) container));
+         TransactionManagementType type = TxUtil.getTransactionManagementType((Container) container);
          if (type != TransactionManagementType.BEAN)
             throw new IllegalStateException("Container " + ((Container) container).getEjbName() + ": it is illegal to inject UserTransaction into a CMT bean");
       }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionMethodInjector.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionMethodInjector.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionMethodInjector.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -21,17 +21,17 @@
  */
 package org.jboss.injection;
 
-import org.jboss.aop.Advisor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import javax.ejb.TransactionManagementType;
+import javax.transaction.UserTransaction;
+
 import org.jboss.ejb3.BeanContext;
 import org.jboss.ejb3.Container;
 import org.jboss.ejb3.tx.TxUtil;
 import org.jboss.ejb3.tx.UserTransactionImpl;
 
-import javax.ejb.TransactionManagementType;
-import javax.transaction.UserTransaction;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
 /**
  * Comment
  *
@@ -47,7 +47,7 @@
    {
       if (container instanceof Container)
       {
-         TransactionManagementType type = TxUtil.getTransactionManagementType(((Advisor) container));
+         TransactionManagementType type = TxUtil.getTransactionManagementType(((Container) container));
          if (type != TransactionManagementType.BEAN)
             throw new IllegalStateException("Container " + ((Container) container).getEjbName() + ": it is illegal to inject UserTransaction into a CMT bean");
       }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionPropertyInjector.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionPropertyInjector.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/injection/UserTransactionPropertyInjector.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -24,7 +24,6 @@
 import javax.ejb.TransactionManagementType;
 import javax.transaction.UserTransaction;
 
-import org.jboss.aop.Advisor;
 import org.jboss.ejb3.Container;
 import org.jboss.ejb3.tx.TxUtil;
 import org.jboss.ejb3.tx.UserTransactionImpl;
@@ -45,7 +44,7 @@
       
       if (container instanceof Container)
       {
-         TransactionManagementType type = TxUtil.getTransactionManagementType(((Advisor) container));
+         TransactionManagementType type = TxUtil.getTransactionManagementType(((Container) container));
          if (type != TransactionManagementType.BEAN)
             throw new IllegalStateException("Container " + ((Container) container).getEjbName() + ": it is illegal to inject UserTransaction into a CMT bean");
       }


Property changes on: projects/ejb3/trunk/core/src/test/java
___________________________________________________________________
Name: subclipse:tags
   + 70154,AS trunk src/test,/trunk/ejb3/src/test,branch

Modified: projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/cachepassivation/MockStatefulContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/cachepassivation/MockStatefulContainer.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/cachepassivation/MockStatefulContainer.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -23,9 +23,8 @@
 
 import java.util.Hashtable;
 
-import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
 import org.jboss.ejb3.Ejb3Deployment;
-import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
 import org.jboss.ejb3.stateful.StatefulContainer;
 
 /**
@@ -38,10 +37,10 @@
 {
 
    @SuppressWarnings("unchecked")
-   public MockStatefulContainer(ClassLoader cl, String beanClassName, String ejbName, AspectManager manager,
-         Hashtable ctxProperties, InterceptorInfoRepository interceptorRepository, Ejb3Deployment deployment)
+   public MockStatefulContainer(ClassLoader cl, String beanClassName, String ejbName, Domain domain,
+         Hashtable ctxProperties, Ejb3Deployment deployment) throws ClassNotFoundException
    {
-      super(cl, beanClassName, ejbName, manager, ctxProperties, interceptorRepository, deployment);
+      super(cl, beanClassName, ejbName, domain, ctxProperties, deployment, null);
    }
    
    @Override

Modified: projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/cachepassivation/unit/CachePassivationUnitTestCase.java
===================================================================
--- projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/cachepassivation/unit/CachePassivationUnitTestCase.java	2008-03-05 07:11:49 UTC (rev 70408)
+++ projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/cachepassivation/unit/CachePassivationUnitTestCase.java	2008-03-05 09:17:19 UTC (rev 70409)
@@ -28,10 +28,10 @@
 import junit.framework.TestCase;
 
 import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
 import org.jboss.cache.transaction.DummyTransactionManager;
 import org.jboss.ejb3.Ejb3Deployment;
 import org.jboss.ejb3.Ejb3Registry;
-import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
 import org.jboss.ejb3.stateful.StatefulBeanContext;
 import org.jboss.ejb3.test.cachepassivation.MockBean;
 import org.jboss.ejb3.test.cachepassivation.MockDeploymentUnit;
@@ -67,10 +67,9 @@
       ClassLoader cl = Thread.currentThread().getContextClassLoader();
       String beanClassName = MockBean.class.getName();
       String ejbName = "MockBean";
-      AspectManager aspectManager = new AspectManager();
-      InterceptorInfoRepository interceptorRepository = new InterceptorInfoRepository(cl);
+      Domain domain = new Domain(new AspectManager(), "Test", false);
       Ejb3Deployment deployment = new MockEjb3Deployment(new MockDeploymentUnit(), null);
-      MockStatefulContainer container = new MockStatefulContainer(cl, beanClassName, ejbName, aspectManager, ctxProperties, interceptorRepository, deployment);
+      MockStatefulContainer container = new MockStatefulContainer(cl, beanClassName, ejbName, domain, ctxProperties, deployment);
       container.instantiated();
       container.processMetadata();
       System.out.println("injectors = " + container.getInjectors());




More information about the jboss-cvs-commits mailing list