[jboss-cvs] JBossAS SVN: r69805 - in trunk: ejb3 and 22 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Feb 12 18:02:47 EST 2008


Author: wolfc
Date: 2008-02-12 18:02:47 -0500 (Tue, 12 Feb 2008)
New Revision: 69805

Modified:
   trunk/build/build-distr.xml
   trunk/build/build-thirdparty.xml
   trunk/ejb3/.classpath
   trunk/ejb3/build-test.xml
   trunk/ejb3/build.xml
   trunk/ejb3/local.properties
   trunk/ejb3/src/main/org/jboss/ejb3/BaseContext.java
   trunk/ejb3/src/main/org/jboss/ejb3/DeploymentUnit.java
   trunk/ejb3/src/main/org/jboss/ejb3/EJBContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/EJBContainerInvocation.java
   trunk/ejb3/src/main/org/jboss/ejb3/EJBContainerInvocationWrapper.java
   trunk/ejb3/src/main/org/jboss/ejb3/EJBContextImpl.java
   trunk/ejb3/src/main/org/jboss/ejb3/ENCPropagationInterceptor.java
   trunk/ejb3/src/main/org/jboss/ejb3/Ejb3AnnotationHandler.java
   trunk/ejb3/src/main/org/jboss/ejb3/Ejb3Deployment.java
   trunk/ejb3/src/main/org/jboss/ejb3/Ejb3DescriptorHandler.java
   trunk/ejb3/src/main/org/jboss/ejb3/ProxyFactoryHelper.java
   trunk/ejb3/src/main/org/jboss/ejb3/cache/NoPassivationCache.java
   trunk/ejb3/src/main/org/jboss/ejb3/cache/StatefulCache.java
   trunk/ejb3/src/main/org/jboss/ejb3/cache/simple/SimpleStatefulCache.java
   trunk/ejb3/src/main/org/jboss/ejb3/cache/tree/StatefulTreeCache.java
   trunk/ejb3/src/main/org/jboss/ejb3/embedded/EJB3StandaloneDeployer.java
   trunk/ejb3/src/main/org/jboss/ejb3/interceptor/EJB3InterceptorsFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInfo.java
   trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java
   trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInjector.java
   trunk/ejb3/src/main/org/jboss/ejb3/interceptor/LifecycleInterceptorHandler.java
   trunk/ejb3/src/main/org/jboss/ejb3/mdb/ConsumerContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/mdb/MDB.java
   trunk/ejb3/src/main/org/jboss/ejb3/mdb/MessagingContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/pool/AbstractPool.java
   trunk/ejb3/src/main/org/jboss/ejb3/remoting/IsLocalInterceptor.java
   trunk/ejb3/src/main/org/jboss/ejb3/remoting/ReplicantsManagerInterceptorFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/security/AuthenticationInterceptorFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/security/JaccAuthorizationInterceptorFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/security/JaccHelper.java
   trunk/ejb3/src/main/org/jboss/ejb3/security/RoleBasedAuthorizationInterceptorFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/security/RunAsSecurityInterceptorFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceRemoteProxyFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/session/BaseSessionProxyFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/session/SessionContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateful/ProxiedStatefulBeanContext.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulBeanContext.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulClusterProxyFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulInstanceInterceptor.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulLocalProxyFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulRemoteProxyFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulRemoveInterceptor.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessClusterProxyFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessLocalProxyFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessRemoteProxyFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/tx/BMTInterceptor.java
   trunk/ejb3/src/main/org/jboss/ejb3/tx/TxInterceptorFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/tx/TxUtil.java
   trunk/ejb3/src/main/org/jboss/injection/UserTransactionFieldInjector.java
   trunk/ejb3/src/main/org/jboss/injection/UserTransactionMethodInjector.java
   trunk/ejb3/src/main/org/jboss/injection/UserTransactionPropertyInjector.java
   trunk/ejb3/src/resources/ejb3-interceptors-aop.xml
   trunk/ejb3/src/resources/test/aspectdomain/aspectdomain-ejb3-interceptors-aop.xml
   trunk/ejb3/src/test/org/jboss/ejb3/test/cachepassivation/MockStatefulContainer.java
   trunk/ejb3/src/test/org/jboss/ejb3/test/cachepassivation/unit/CachePassivationUnitTestCase.java
   trunk/webservices/.classpath
   trunk/webservices/build.xml
   trunk/webservices/src/main/org/jboss/wsf/container/jboss50/InvocationHandlerEJB3.java
Log:
EJBTHREE-1174: integration of ejb3-interceptors


Modified: trunk/build/build-distr.xml
===================================================================
--- trunk/build/build-distr.xml	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/build/build-distr.xml	2008-02-12 23:02:47 UTC (rev 69805)
@@ -168,6 +168,10 @@
                excludes="*-sources.jar, *-javadoc.jar"/>
       <fileset dir="${jboss.jboss.ejb3.impl.lib}" includes="*.jar"
                excludes="*-sources.jar, *-javadoc.jar"/>
+      <fileset dir="${jboss.jboss.ejb3.interceptors.lib}" includes="*.jar"
+               excludes="*-sources.jar, *-javadoc.jar"/>
+      <fileset dir="${jboss.jboss.ejb3.metadata.lib}" includes="*.jar"
+               excludes="*-sources.jar, *-javadoc.jar"/>
       <fileset dir="${hibernate.commons.annotations.lib}" includes="*.jar"/>
       <fileset dir="${hibernate.entitymanager.lib}" includes="*.jar"/>
       <fileset dir="${hibernate.annotations.lib}" includes="*.jar"/>

Modified: trunk/build/build-thirdparty.xml
===================================================================
--- trunk/build/build-thirdparty.xml	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/build/build-thirdparty.xml	2008-02-12 23:02:47 UTC (rev 69805)
@@ -93,6 +93,8 @@
     <componentref name="jboss/jboss-ejb3-cache" version="0.11.1"/>
     <componentref name="jboss/jboss-ejb3-ext-api" version="0.1.2.Beta1"/>
     <componentref name="jboss/jboss-ejb3-impl" version="0.1.2.Beta1"/>
+    <componentref name="jboss/jboss-ejb3-interceptors" version="0.12.0-SNAPSHOT"/>
+    <componentref name="jboss/jboss-ejb3-metadata" version="0.12.0-SNAPSHOT"/>
     <componentref name="jboss/jboss-ha-client" version="1.0.0.BETA1"/>
     <componentref name="jboss/jboss-ha-server-api" version="1.0.0.GA"/>
     <componentref name="jboss/jboss-jaspi-api" version="1.0-BETA1"/>

Modified: trunk/ejb3/.classpath
===================================================================
--- trunk/ejb3/.classpath	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/.classpath	2008-02-12 23:02:47 UTC (rev 69805)
@@ -68,7 +68,10 @@
 	<classpathentry kind="lib" path="/thirdparty/jboss/jboss-ejb3-cache/lib/jboss-ejb3-cache.jar" sourcepath="/thirdparty/jboss/jboss-ejb3-cache/lib/jboss-ejb3-cache-sources.jar"/>
 	<classpathentry kind="lib" path="/thirdparty/jboss/jboss-ejb3-ext-api/lib/jboss-ejb3-ext-api.jar" sourcepath="/thirdparty/jboss/jboss-ejb3-ext-api/lib/jboss-ejb3-ext-api-sources.jar"/>
 	<classpathentry kind="lib" path="/thirdparty/jboss/jboss-ejb3-impl/lib/jboss-ejb3-impl.jar" sourcepath="/thirdparty/jboss/jboss-ejb3-impl/lib/jboss-ejb3-impl-sources.jar"/>
-	<classpathentry kind="lib" path="/thirdparty/jboss/jboss-ha-client/lib/jboss-ha-client.jar"/>
+	<classpathentry kind="lib" path="/thirdparty/jboss/jboss-ha-client/lib/jboss-ha-client.jar" sourcepath="/thirdparty/jboss/jboss-ha-client/lib/jboss-ha-client-sources.jar"/>
 	<classpathentry kind="lib" path="/thirdparty/jboss/jboss-ha-server-api/lib/jboss-ha-server-api.jar"/>
+	<classpathentry kind="lib" path="/thirdparty/jboss/web/lib/jbossweb.jar" sourcepath="/thirdparty/jboss/web/lib/jbossweb-src.zip"/>
+	<classpathentry kind="lib" path="/thirdparty/jboss/jboss-ejb3-interceptors/lib/jboss-ejb3-interceptors.jar" sourcepath="/thirdparty/jboss/jboss-ejb3-interceptors/lib/jboss-ejb3-interceptors-sources.jar"/>
+	<classpathentry kind="lib" path="/thirdparty/jboss/jboss-ejb3-metadata/lib/jboss-ejb3-metadata.jar" sourcepath="/thirdparty/jboss/jboss-ejb3-metadata/lib/jboss-ejb3-metadata-sources.jar"/>
 	<classpathentry kind="output" path="output/eclipse-classes"/>
 </classpath>

Modified: trunk/ejb3/build-test.xml
===================================================================
--- trunk/ejb3/build-test.xml	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/build-test.xml	2008-02-12 23:02:47 UTC (rev 69805)
@@ -162,6 +162,7 @@
       <path refid="jboss.jboss.ejb3.cache.classpath"/>
       <path refid="jboss.jboss.ejb3.ext.api.classpath"/>
       <path refid="jboss.jboss.ejb3.impl.classpath"/>
+      <path refid="jboss.jboss.ejb3.interceptors.classpath"/>
       <path refid="jboss.metadata.classpath"/>
       <path refid="jboss.jboss.ha.client.classpath"/>
       <path refid="jboss.jboss.ha.server.api.classpath"/>
@@ -5462,6 +5463,11 @@
       <echo message="Nodes have started, waiting for cluster to stablize..."/>
    </target>
 
+   <target name="tests-clustering-setup">
+      <create-cluster-node conf="node0"/>
+      <create-cluster-node conf="node1"/>
+   </target>
+
    <target name="tests-clustering-startup" unless="${tests.clustering.skip.startup}">
  
       <!-- Caller can pass in the node names; if not these are the defaults -->  

Modified: trunk/ejb3/build.xml
===================================================================
--- trunk/ejb3/build.xml	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/build.xml	2008-02-12 23:02:47 UTC (rev 69805)
@@ -116,6 +116,8 @@
          <path refid="jboss.jboss.ejb3.cache.classpath"/>
          <path refid="jboss.jboss.ejb3.ext.api.classpath" />
          <path refid="jboss.jboss.ejb3.impl.classpath" />
+         <path refid="jboss.jboss.ejb3.interceptors.classpath" />
+         <path refid="jboss.jboss.ejb3.metadata.classpath" />
       </path>
 
       <!-- ======= -->

Modified: trunk/ejb3/local.properties
===================================================================
--- trunk/ejb3/local.properties	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/local.properties	2008-02-12 23:02:47 UTC (rev 69805)
@@ -19,3 +19,5 @@
 
 #Timeout for jboss to start
 jboss.startup.timeout=180
+
+javac.deprecation=false
\ No newline at end of file

Modified: trunk/ejb3/src/main/org/jboss/ejb3/BaseContext.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/BaseContext.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/BaseContext.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/DeploymentUnit.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/DeploymentUnit.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/DeploymentUnit.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/EJBContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/EJBContainer.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/EJBContainer.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -25,16 +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.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;
 
@@ -44,7 +41,9 @@
 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;
@@ -55,23 +54,29 @@
 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.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.Ejb3Deployer;
 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;
@@ -98,6 +103,10 @@
 import org.jboss.logging.Logger;
 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.naming.Util;
@@ -110,11 +119,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;
@@ -126,6 +140,8 @@
    protected int defaultConstructorIndex;
 
    protected String beanClassName;
+   
+   private Class<?> beanClass;
 
    protected ClassLoader classloader;
 
@@ -134,8 +150,7 @@
 
    protected Context enc;
 
-   //protected SessionCallbackHandler callbackHandler;
-   protected LifecycleInterceptorHandler callbackHandler;
+//   protected LifecycleInterceptorHandler callbackHandler;
 
    protected Hashtable initialContextProperties;
 
@@ -146,14 +161,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;
@@ -179,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);
       try
@@ -215,7 +228,7 @@
          throw new RuntimeException("failed to create object name for: " + on, e);
       }
       
-      annotations = new AnnotationRepositoryToMetaData(this);
+      //annotations = new AnnotationRepositoryToMetaData(this);
       
       initialContextProperties = ctxProperties;
       try
@@ -226,8 +239,6 @@
       {
          throw new RuntimeException(e);
       }
-      this.interceptorRepository = interceptorRepository;
-      this.interceptorRepository.addBeanClass(clazz.getName());
       bindORB();
       bindEJBContext();
       
@@ -269,11 +280,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);
@@ -328,6 +402,15 @@
       return jaccContextId;
    }
 
+   /**
+    * Do not call, used by BeanContainer.
+    * @return
+    */
+   public List<Method> getVirtualMethods()
+   {
+      return null;
+   }
+   
    public void setJaccContextId(String jaccContextId)
    {
       this.jaccContextId = jaccContextId;
@@ -378,6 +461,11 @@
       return dependencyPolicy;
    }
 
+   public boolean isAnnotationPresent(Class<? extends Annotation> annotationType)
+   {
+      return beanContainer.isAnnotationPresent(annotationType);
+   }
+   
    /**
     * Is the method a business method of this container.
     * 
@@ -459,19 +547,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
@@ -569,16 +663,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;
@@ -588,28 +679,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;
@@ -668,7 +740,7 @@
 
    public Class<?> getBeanClass()
    {
-      return clazz;
+      return beanClass;
    }
 
    public Pool getPool()
@@ -693,6 +765,7 @@
 
    protected Object construct()
    {
+      /*
       Interceptor[] cInterceptors = constructorInterceptors[defaultConstructorIndex];
       if (cInterceptors == null)
       {
@@ -726,11 +799,24 @@
       {
          throw new RuntimeException(throwable);
       }
-
+      */
+      try
+      {
+         return beanContainer.construct();
+      }
+      catch (SecurityException e)
+      {
+         throw new RuntimeException(e);
+      }
+      catch (NoSuchMethodException e)
+      {
+         throw new RuntimeException(e);
+      }
    }
 
    public void create() throws Exception
    {
+      /*
       initializeClassContainer();
       for (int i = 0; i < constructors.length; i++)
       {
@@ -740,6 +826,7 @@
             break;
          }
       }
+      */
    }
 
    // Everything must be done in start to make sure all dependencies have been satisfied
@@ -759,14 +846,14 @@
       Injector[] injectors2 = injectors.toArray(new Injector[injectors.size()]);
       if (pool != null) pool.setInjectors(injectors2);
 
-      createCallbackHandler();
+//      createCallbackHandler();
 
       JaccHelper.configureContainer(jaccContextId, this);
       
       // 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
@@ -779,12 +866,11 @@
          pool = null;
       }
       
-      log.info("STOPPED EJB: " + clazz.getName() + " ejbName: " + ejbName);
+      log.info("STOPPED EJB: " + beanClass.getName() + " ejbName: " + ejbName);
    }
 
    public void destroy() throws Exception
    {
-      super.cleanup();
    }
 
    @SuppressWarnings("unchecked")
@@ -806,6 +892,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);
@@ -830,14 +984,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)
@@ -894,6 +1080,7 @@
       }
    }
 
+   /*
    protected void createCallbackHandler()
    {
       try
@@ -907,6 +1094,7 @@
                  + beanClassName, e);
       }
    }
+   */
 
    protected Class[] getHandledCallbacks()
    {
@@ -914,33 +1102,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()
@@ -1035,6 +1213,7 @@
       return null;
    }
 
+   /*
    @Override
    public boolean hasAnnotation(Class tgt, String annotation)
    {
@@ -1104,7 +1283,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);
@@ -1120,89 +1300,67 @@
       return deployment.resolveMessageDestination(link);
    }
    
-   @SuppressWarnings("unchecked")
    public <T extends Annotation> T getAnnotation(Class<T> annotationType)
    {
-      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)
    {
-      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;
@@ -1244,11 +1402,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());
@@ -1277,9 +1435,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;
+   }
+   
    public String toString()
    {
       return getObjectName().getCanonicalName();

Modified: trunk/ejb3/src/main/org/jboss/ejb3/EJBContainerInvocation.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/EJBContainerInvocation.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/EJBContainerInvocation.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -56,11 +56,13 @@
       super(null, null);
    }
 
+   /*
    @SuppressWarnings("unchecked")
    public A getAdvisor()
    {
       return (A) super.getAdvisor();
    }
+   */
    
    public T getBeanContext()
    {

Modified: trunk/ejb3/src/main/org/jboss/ejb3/EJBContainerInvocationWrapper.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/EJBContainerInvocationWrapper.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/EJBContainerInvocationWrapper.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/EJBContextImpl.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/EJBContextImpl.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/EJBContextImpl.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/ENCPropagationInterceptor.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/ENCPropagationInterceptor.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/ENCPropagationInterceptor.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/Ejb3AnnotationHandler.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/Ejb3AnnotationHandler.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/Ejb3AnnotationHandler.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/Ejb3Deployment.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/Ejb3Deployment.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/Ejb3Deployment.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -59,6 +59,7 @@
 import org.jboss.ejb3.metadata.jpa.spec.PersistenceUnitsMetaData;
 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.virtual.VirtualFile;
@@ -732,6 +733,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: trunk/ejb3/src/main/org/jboss/ejb3/Ejb3DescriptorHandler.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/Ejb3DescriptorHandler.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/Ejb3DescriptorHandler.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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;
 
@@ -86,7 +85,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;
@@ -111,9 +109,7 @@
 import org.jboss.ejb3.annotation.impl.ConsumerImpl;
 import org.jboss.ejb3.annotation.impl.CurrentMessageImpl;
 import org.jboss.ejb3.annotation.impl.DefaultActivationSpecsImpl;
-import org.jboss.ejb3.annotation.impl.DefaultInterceptorMarkerImpl;
 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.LocalBindingImpl;
@@ -154,6 +150,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;
@@ -409,31 +406,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);
             }
@@ -444,15 +441,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)
@@ -483,15 +479,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);
@@ -510,14 +505,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));
 
@@ -543,14 +537,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));
 
@@ -590,18 +583,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
@@ -610,6 +603,7 @@
          
          addMDBAnnotations(container, ejbName, mdb);
       }
+      */
 
       // An MDB doesn't have business interfaces, or does it?
       //addInterfaces(container, enterpriseBean);
@@ -908,8 +902,6 @@
          }
       }
       
-      container.setXml(enterpriseBean);
-
       addTransactionAnnotations(container, enterpriseBean, ejbName);
 
       addAssemblyAnnotations(container, enterpriseBean, ejbName);
@@ -992,7 +984,7 @@
       {
          addExcludeAnnotations(container, assembly.getExcludeList(), ejbName);
 
-         addInterceptorBindingAnnotations(container, enterpriseBean, ejbName);
+//         addInterceptorBindingAnnotations(container, enterpriseBean, ejbName);
       }
 
       if (enterpriseBean instanceof JBossSessionBeanMetaData)
@@ -1220,12 +1212,14 @@
          }
       }
 
+      /*
       if (!definesInterceptors
             && di.getInterceptorInfoRepository().hasDefaultInterceptors())
       {
          addClassAnnotation(container, DefaultInterceptorMarker.class,
                new DefaultInterceptorMarkerImpl());
       }
+      */
    }
 
    /**
@@ -1265,6 +1259,7 @@
          EJBContainer container, InterceptorBindingMetaData binding)
          throws ClassNotFoundException
    {
+      /*
       boolean addedAnnotations = false;
       for (java.lang.reflect.Method method : container.getBeanClass()
             .getMethods())
@@ -1344,6 +1339,8 @@
       }
 
       return addedAnnotations;
+      */
+      return false;
    }
 
    private void addEjbAnnotations(EJBContainer container,
@@ -1559,6 +1556,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)
@@ -1567,6 +1565,7 @@
             container.getAnnotations().disableAnnotation(Clustered.class.getName());
          return;
       }
+      */
 
       ClusterConfigMetaData config = enterpriseBean.getClusterConfig();
       if (config != null)
@@ -1649,28 +1648,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);
       }
 
@@ -2019,9 +2026,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)
@@ -2043,6 +2057,7 @@
          annotations.disableAnnotation(m,
                javax.annotation.security.DenyAll.class.getName());
       }
+      */
    }
 
    private void addClassAnnotation(EJBContainer container, Class<? extends Annotation> annotationClass, Annotation annotation)

Modified: trunk/ejb3/src/main/org/jboss/ejb3/ProxyFactoryHelper.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/ProxyFactoryHelper.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/ProxyFactoryHelper.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -38,7 +38,6 @@
 import javax.jws.WebService;
 import javax.management.ObjectName;
 
-import org.jboss.aop.Advisor;
 import org.jboss.ejb.LocalImpl;
 import org.jboss.ejb.RemoteImpl;
 import org.jboss.ejb3.annotation.JndiBindingPolicy;
@@ -684,7 +683,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
@@ -793,13 +792,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();
 
@@ -808,13 +806,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();
 
@@ -823,18 +820,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)
@@ -855,22 +851,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);
@@ -885,12 +880,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(""))
@@ -908,7 +903,7 @@
       return jndiName;
    }
 
-   public static String getDefaultRemoteJndiName(Container container)
+   public static String getDefaultRemoteJndiName(EJBContainer container)
    {
       return ProxyFactoryHelper.getJndiBindingPolicy(container).getDefaultRemoteJndiName(
             ProxyFactoryHelper.getDeploymentSummaryFromContainer(container));

Modified: trunk/ejb3/src/main/org/jboss/ejb3/cache/NoPassivationCache.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/cache/NoPassivationCache.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/cache/NoPassivationCache.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/cache/StatefulCache.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/cache/StatefulCache.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/cache/StatefulCache.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/cache/simple/SimpleStatefulCache.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/cache/simple/SimpleStatefulCache.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/cache/simple/SimpleStatefulCache.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -30,12 +30,10 @@
 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;
 import org.jboss.ejb3.cache.StatefulCache;
-import org.jboss.ejb3.deployers.Ejb3Deployer;
 import org.jboss.ejb3.pool.Pool;
 import org.jboss.ejb3.stateful.StatefulBeanContext;
 import org.jboss.logging.Logger;
@@ -240,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: trunk/ejb3/src/main/org/jboss/ejb3/cache/tree/StatefulTreeCache.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/cache/tree/StatefulTreeCache.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/cache/tree/StatefulTreeCache.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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;
@@ -305,18 +303,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)

Modified: trunk/ejb3/src/main/org/jboss/ejb3/embedded/EJB3StandaloneDeployer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/embedded/EJB3StandaloneDeployer.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/embedded/EJB3StandaloneDeployer.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/interceptor/EJB3InterceptorsFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/interceptor/EJB3InterceptorsFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/interceptor/EJB3InterceptorsFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInfo.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInfo.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInfo.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInjector.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInjector.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/interceptor/InterceptorInjector.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/interceptor/LifecycleInterceptorHandler.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/interceptor/LifecycleInterceptorHandler.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/interceptor/LifecycleInterceptorHandler.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/mdb/ConsumerContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/mdb/ConsumerContainer.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/mdb/ConsumerContainer.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/mdb/MDB.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/mdb/MDB.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/mdb/MDB.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/mdb/MessagingContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/mdb/MessagingContainer.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/mdb/MessagingContainer.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/pool/AbstractPool.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/pool/AbstractPool.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/pool/AbstractPool.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -81,7 +81,7 @@
 //      {         
 //         StatefulBeanContext sfctx = (StatefulBeanContext) ctx;
 //         // Tell context how to handle replication
-//         Advisor advisor = (Advisor) container;
+//         Advisor advisor = *** (Advisor) container; BOGUS CLASSCAST ***
 //         CacheConfig config = (CacheConfig) advisor.resolveAnnotation(CacheConfig.class);
 //         if (config != null)
 //         {

Modified: trunk/ejb3/src/main/org/jboss/ejb3/remoting/IsLocalInterceptor.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/remoting/IsLocalInterceptor.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/remoting/IsLocalInterceptor.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/remoting/ReplicantsManagerInterceptorFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/remoting/ReplicantsManagerInterceptorFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/remoting/ReplicantsManagerInterceptorFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/security/AuthenticationInterceptorFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/security/AuthenticationInterceptorFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/security/AuthenticationInterceptorFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/security/JaccAuthorizationInterceptorFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/security/JaccAuthorizationInterceptorFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/security/JaccAuthorizationInterceptorFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/security/JaccHelper.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/security/JaccHelper.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/security/JaccHelper.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/security/RoleBasedAuthorizationInterceptorFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/security/RoleBasedAuthorizationInterceptorFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/security/RoleBasedAuthorizationInterceptorFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/security/RunAsSecurityInterceptorFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/security/RunAsSecurityInterceptorFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/security/RunAsSecurityInterceptorFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceContainer.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceContainer.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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>
@@ -87,15 +84,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};
@@ -114,6 +112,9 @@
       {
          AllowedOperationsAssociation.popInMethodFlag();
       }
+      */
+      // FIXME: interceptors
+      throw new RuntimeException("NYI");
    }
 
    @Override
@@ -345,13 +346,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);
@@ -386,7 +387,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
       {
@@ -401,7 +402,7 @@
          newSi = new EJBContainerInvocation(info);
          newSi.setArguments(si.getArguments());
          newSi.setMetaData(si.getMetaData());
-         newSi.setAdvisor(this);
+         newSi.setAdvisor(getAdvisor());
 
          newSi = populateInvocation(newSi);
 

Modified: trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceRemoteProxyFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceRemoteProxyFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceRemoteProxyFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/session/BaseSessionProxyFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/session/BaseSessionProxyFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/session/BaseSessionProxyFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -87,7 +87,7 @@
       this.isClustered = container.isClustered();
    }
    
-   protected Container getContainer()
+   protected EJBContainer getContainer()
    {
       if (container == null)
       {

Modified: trunk/ejb3/src/main/org/jboss/ejb3/session/SessionContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/session/SessionContainer.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/session/SessionContainer.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/stateful/ProxiedStatefulBeanContext.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateful/ProxiedStatefulBeanContext.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateful/ProxiedStatefulBeanContext.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulBeanContext.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulBeanContext.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulBeanContext.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulClusterProxyFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulClusterProxyFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulClusterProxyFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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;
@@ -144,7 +143,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));
    }
 
@@ -166,7 +165,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: trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulContainer.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulContainer.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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,8 +40,11 @@
 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.joinpoint.Invocation;
 import org.jboss.aop.joinpoint.InvocationResponse;
 import org.jboss.aop.util.MethodHashing;
@@ -57,11 +60,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;
@@ -69,6 +74,7 @@
 import org.jboss.injection.Injector;
 import org.jboss.injection.JndiPropertyInjector;
 import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 
 /**
  * Comment
@@ -83,11 +89,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)
@@ -196,7 +201,7 @@
       try
       {
          long hash = MethodHashing.calculateHash(method);
-         MethodInfo info = super.getMethodInfo(hash);
+         MethodInfo info = getAdvisor().getMethodInfo(hash);
          if (info == null)
          {
             throw new RuntimeException(
@@ -227,7 +232,7 @@
       try
       {
          long hash = MethodHashing.calculateHash(method);
-         MethodInfo info = super.getMethodInfo(hash);
+         MethodInfo info = getAdvisor().getMethodInfo(hash);
          if (info == null)
          {
             throw new RuntimeException(
@@ -252,7 +257,7 @@
             }
             
             StatefulContainerInvocation nextInvocation = new StatefulContainerInvocation(info, id);
-            nextInvocation.setAdvisor(this);
+            nextInvocation.setAdvisor(getAdvisor());
             nextInvocation.setArguments(args);
             
             ProxyUtils.addLocalAsynchronousInfo(nextInvocation, provider);
@@ -328,10 +333,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;
@@ -364,7 +369,7 @@
                newSi = new StatefulContainerInvocation(info, newId);
                newSi.setArguments(si.getArguments());
                newSi.setMetaData(si.getMetaData());
-               newSi.setAdvisor(this);
+               newSi.setAdvisor(getAdvisor());
    
                Object rtn = null;
                
@@ -443,15 +448,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()
    {
@@ -459,6 +493,7 @@
               {PostConstruct.class, PreDestroy.class, PostActivate.class,
                       PrePassivate.class};
    }
+   */
 
    public void invokeInit(Object bean, Class[] initParameterTypes,
                           Object[] initParameterValues)
@@ -688,7 +723,7 @@
    
    public boolean isClustered()
    {
-      return hasAnnotation(getBeanClass(), Clustered.class.getName());
+      return isAnnotationPresent(Clustered.class);
    }
 
    protected InvocationResponse invokeHomeMethod(MethodInfo info,
@@ -866,7 +901,7 @@
 
       newStatefulInvocation.setArguments(statefulInvocation.getArguments());
       newStatefulInvocation.setMetaData(statefulInvocation.getMetaData());
-      newStatefulInvocation.setAdvisor(this);
+      newStatefulInvocation.setAdvisor(getAdvisor());
 
       return newStatefulInvocation;
    }
@@ -889,7 +924,7 @@
 
       newStatefulInvocation.setArguments(statefulInvocation.getArguments());
       newStatefulInvocation.setMetaData(statefulInvocation.getMetaData());
-      newStatefulInvocation.setAdvisor(this);
+      newStatefulInvocation.setAdvisor(getAdvisor());
 
       return newStatefulInvocation;
    }

Modified: trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulInstanceInterceptor.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulInstanceInterceptor.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulInstanceInterceptor.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -27,10 +27,10 @@
 import javax.ejb.ConcurrentAccessException;
 import javax.ejb.EJBException;
 
-import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.joinpoint.Invocation;
 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;
@@ -42,7 +42,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);
    
@@ -59,7 +59,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.resolveAnnotation(SerializedConcurrentAccess.class) != null;

Modified: trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulLocalProxyFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulLocalProxyFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulLocalProxyFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulRemoteProxyFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulRemoteProxyFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulRemoteProxyFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulRemoveInterceptor.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulRemoveInterceptor.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulRemoveInterceptor.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -21,14 +21,14 @@
  */
 package org.jboss.ejb3.stateful;
 
+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.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;
 
@@ -37,7 +37,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;
@@ -117,7 +117,7 @@
       Object id = ejb.getId();
 
 
-      StatefulContainer container = (StatefulContainer) ejb.getAdvisor();
+      StatefulContainer container = getEJBContainer(invocation);
       Transaction tx = null;
       try
       {

Modified: trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessClusterProxyFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessClusterProxyFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessClusterProxyFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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;
@@ -121,43 +120,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: trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessContainer.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessContainer.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -21,24 +21,26 @@
  */
 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.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.StatefulInstanceInterceptor;
-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);
 
@@ -50,7 +52,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: trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessLocalProxyFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessLocalProxyFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessLocalProxyFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessRemoteProxyFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessRemoteProxyFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessRemoteProxyFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/tx/BMTInterceptor.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/tx/BMTInterceptor.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/tx/BMTInterceptor.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/ejb3/tx/TxInterceptorFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/tx/TxInterceptorFactory.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/tx/TxInterceptorFactory.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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;
@@ -112,7 +113,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: trunk/ejb3/src/main/org/jboss/ejb3/tx/TxUtil.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/tx/TxUtil.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/ejb3/tx/TxUtil.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -32,8 +32,10 @@
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.aop.joinpoint.MethodInvocation;
 import org.jboss.ejb.ApplicationExceptionImpl;
+import org.jboss.ejb3.Container;
 import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.InitialContextFactory;
+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: trunk/ejb3/src/main/org/jboss/injection/UserTransactionFieldInjector.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/injection/UserTransactionFieldInjector.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/injection/UserTransactionFieldInjector.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/injection/UserTransactionMethodInjector.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/injection/UserTransactionMethodInjector.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/injection/UserTransactionMethodInjector.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/main/org/jboss/injection/UserTransactionPropertyInjector.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/injection/UserTransactionPropertyInjector.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/main/org/jboss/injection/UserTransactionPropertyInjector.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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");
       }

Modified: trunk/ejb3/src/resources/ejb3-interceptors-aop.xml
===================================================================
--- trunk/ejb3/src/resources/ejb3-interceptors-aop.xml	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/resources/ejb3-interceptors-aop.xml	2008-02-12 23:02:47 UTC (rev 69805)
@@ -78,13 +78,65 @@
    <interceptor class="org.jboss.ejb3.cache.StatefulReplicationInterceptor" scope="PER_VM"/>
    <interceptor factory="org.jboss.ejb3.stateful.StatefulRemoveFactory" scope="PER_CLASS_JOINPOINT"/>
    <interceptor factory="org.jboss.ejb3.tx.TxInterceptorFactory" scope="PER_CLASS_JOINPOINT"/>
-   <interceptor factory="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory" scope="PER_CLASS_JOINPOINT"/>
+   <!-- interceptor factory="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory" scope="PER_CLASS_JOINPOINT"/ -->
    <interceptor factory="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory" scope="PER_CLASS"/>
    <interceptor class="org.jboss.ejb3.AllowedOperationsInterceptor" scope="PER_VM"/>
    <interceptor factory="org.jboss.ejb3.mdb.CurrentMessageInjectorInterceptorFactory" scope="PER_CLASS"/>
    <interceptor class="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor" scope="PER_VM"/>
 
-   <domain name="Stateless Bean">
+   <!--
+         INTERCEPTORS
+     -->
+   
+   <aspect name="InjectInterceptorsFactory" factory="org.jboss.ejb3.interceptors.aop.InjectInterceptorsFactory" scope="PER_JOINPOINT"/>
+   <aspect name="InterceptorsFactory" factory="org.jboss.ejb3.interceptors.aop.InterceptorsFactory" scope="PER_INSTANCE"/>
+   <aspect name="InvocationContextInterceptor" class="org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor" scope="PER_VM"/>
+
+   <!-- TODO: this is actually the bootstrap container -->
+   <domain name="Intercepted Bean">
+      <pointcut name="beanAroundInvokeCallbackMethods" expr="execution(* @org.jboss.ejb3.interceptors.ManagedObject->@javax.interceptor.AroundInvoke(..))"/>
+      <pointcut name="beanPostConstructCallbackMethods" expr="execution(* @org.jboss.ejb3.interceptors.ManagedObject->@javax.interceptor.PostConstruct(..))"/>
+      <pointcut name="beanPreDestroyCallbackMethods" expr="execution(* @org.jboss.ejb3.interceptors.ManagedObject->@javax.interceptor.PreDestroy(..))"/>
+      
+      <pointcut name="beanLifecycleCallbackMethods" expr="beanAroundInvokeCallbackMethods OR beanPostConstructCallbackMethods OR beanPreDestroyCallbackMethods"/>
+      
+      <!-- Prepare for dynamic AOP -->
+      <!-- TODO: optimize, we only need managed objects (and interceptors!) to be aspectized -->
+      <!-- prepare expr="all(*) AND has(@org.jboss.ejb3.interceptors.ManagedObject->new(..))"/ -->
+      <!-- TODO: let's see if we can do without 
+      <prepare expr="all(*)"/>
+      -->
+      
+      <!-- Setup AOP interceptors based on spec interceptors -->
+      <bind pointcut="construction(@org.jboss.ejb3.interceptors.ManagedObject->new(..))">
+         <!-- interceptor-ref name="LoggingInterceptor"/ -->
+         <!-- TODO: we don't need invocation context here -->
+         <!-- TODO: we do until we've seperated the post constructs -->
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="invoke" aspect="InterceptorsFactory"/>
+      </bind>
+      
+      <!-- Lifecycle Event Callbacks (EJB 3 12.4) -->
+      
+      <!-- TODO: for now handled in EJBContainer.invokePostConstruct until injection is refactored 
+      <bind pointcut="construction(@org.jboss.ejb3.interceptors.ManagedObject->new(..))">
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="postConstruct" aspect="InjectInterceptorsFactory"/>
+      </bind>
+      -->
+      
+      <!-- this is the usual way, now we move it into the other domains 
+      <bind pointcut="execution(* @org.jboss.ejb3.interceptors.ManagedObject->*(..)) AND !beanLifecycleCallbackMethods">
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="fillMethod" aspect="InvocationContextInterceptor"/>
+         <advice name="aroundInvoke" aspect="InjectInterceptorsFactory"/>
+      </bind>
+      -->
+   </domain>
+   
+   
+   
+   <domain name="Stateless Bean" extends="Intercepted Bean" inheritBindings="true">
       <bind pointcut="execution(public * *->*(..))">
          <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/>
          <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/>
@@ -105,7 +157,10 @@
          <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/>
          <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/>
          <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/>
-         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>
+         <!-- interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/ -->
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="fillMethod" aspect="InvocationContextInterceptor"/>
+         <advice name="aroundInvoke" aspect="InjectInterceptorsFactory"/>
       </bind>
       <annotation expr="!class(@org.jboss.ejb3.annotation.Pool)">
          @org.jboss.ejb3.annotation.Pool (value="ThreadlocalPool", maxSize=30, timeout=10000)
@@ -115,7 +170,7 @@
       </annotation>
    </domain>
 
-   <domain name="JACC Stateless Bean">
+   <domain name="JACC Stateless Bean" extends="Intercepted Bean" inheritBindings="true">
       <bind pointcut="execution(public * *->*(..))">
          <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/>
          <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/>
@@ -136,7 +191,10 @@
          <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/>
          <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/>
          <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/>
-         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>
+         <!-- interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/ -->
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="fillMethod" aspect="InvocationContextInterceptor"/>
+         <advice name="aroundInvoke" aspect="InjectInterceptorsFactory"/>
       </bind>
       <annotation expr="!class(@org.jboss.ejb3.annotation.Pool)">
          @org.jboss.ejb3.annotation.Pool (value="ThreadlocalPool", maxSize=30, timeout=10000)
@@ -146,7 +204,7 @@
       </annotation>
    </domain>
 
-   <domain name="Base Stateful Bean">
+   <domain name="Base Stateful Bean" extends="Intercepted Bean" inheritBindings="true">
       <bind pointcut="execution(public * *->*(..))">
          <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/>
          <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/>
@@ -183,7 +241,10 @@
       </bind>
 
       <bind pointcut="execution(public * *->*(..))">
-         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>
+         <!-- interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/ -->
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="fillMethod" aspect="InvocationContextInterceptor"/>
+         <advice name="aroundInvoke" aspect="InjectInterceptorsFactory"/>
       </bind>
 
       <annotation expr="!class(@org.jboss.ejb3.annotation.Pool)">
@@ -215,7 +276,7 @@
       </annotation>
    </domain>
 
-   <domain name="JACC Stateful Bean">
+   <domain name="JACC Stateful Bean" extends="Intercepted Bean" inheritBindings="true">
       <bind pointcut="execution(public * *->*(..))">
          <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/>
          <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/>
@@ -245,7 +306,10 @@
       <bind pointcut="execution(public * *->*(..))">
          <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/>
          <interceptor-ref name="org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor"/>
-         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>
+         <!-- interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/ -->
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="fillMethod" aspect="InvocationContextInterceptor"/>
+         <advice name="aroundInvoke" aspect="InjectInterceptorsFactory"/>
       </bind>
 
       <bind pointcut="execution(public * @org.jboss.ejb3.annotation.Clustered->*(..)) AND !execution(public * *->@javax.ejb.Remove(..))">
@@ -289,7 +353,7 @@
 
    </domain>
 
-   <domain name="Message Driven Bean">
+   <domain name="Message Driven Bean" extends="Intercepted Bean" inheritBindings="true">
       <bind pointcut="execution(public * *->*(..))">
          <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/>
          <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/>
@@ -300,7 +364,10 @@
          <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/>
          <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/>
          <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/>
-         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>
+         <!-- interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/ -->
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="fillMethod" aspect="InvocationContextInterceptor"/>
+         <advice name="aroundInvoke" aspect="InjectInterceptorsFactory"/>
       </bind>
       <annotation expr="!class(@org.jboss.ejb3.annotation.Pool)">
          @org.jboss.ejb3.annotation.Pool (value="StrictMaxPool", maxSize=15, timeout=10000)
@@ -310,7 +377,7 @@
       </annotation>
    </domain>
 
-   <domain name="Consumer Bean">
+   <domain name="Consumer Bean" extends="Intercepted Bean" inheritBindings="true">
       <bind pointcut="execution(public * *->*(..))">
          <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/>
       </bind>
@@ -324,7 +391,10 @@
          <interceptor-ref name="org.jboss.ejb3.mdb.CurrentMessageInjectorInterceptorFactory"/>
       </bind>
       <bind pointcut="execution(public * *->*(..))">
-         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>
+         <!-- interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/ -->
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="fillMethod" aspect="InvocationContextInterceptor"/>
+         <advice name="aroundInvoke" aspect="InjectInterceptorsFactory"/>
       </bind>
       <annotation expr="!class(@org.jboss.ejb3.annotation.Pool)">
          @org.jboss.ejb3.annotation.Pool (value="StrictMaxPool", maxSize=15, timeout=10000)
@@ -334,7 +404,7 @@
       </annotation>
    </domain>
 
-   <domain name="Service Bean">
+   <domain name="Service Bean" extends="Intercepted Bean" inheritBindings="true">
       <bind pointcut="execution(public * *->*(..))">
          <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/>
          <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/>
@@ -355,14 +425,17 @@
          <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/>
       </bind>
       <bind pointcut="execution(public * *->*(..)) AND !execution(* *->create()) AND !execution(* *->start())">
-         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>
+         <!-- interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/ -->
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="fillMethod" aspect="InvocationContextInterceptor"/>
+         <advice name="aroundInvoke" aspect="InjectInterceptorsFactory"/>
       </bind>
       <annotation expr="!class(@org.jboss.ejb3.annotation.JndiBindingPolicy)">
          @org.jboss.ejb3.annotation.JndiBindingPolicy (policy=org.jboss.ejb3.jndipolicy.impl.PackagingBasedJndiBindingPolicy.class)
       </annotation>
    </domain>
 
-   <domain name="JACC Service Bean">
+   <domain name="JACC Service Bean" extends="Intercepted Bean" inheritBindings="true">
       <bind pointcut="execution(public * *->*(..))">
          <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/>
          <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/>
@@ -383,7 +456,10 @@
          <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/>
       </bind>
       <bind pointcut="execution(public * *->*(..)) AND !execution(* *->create()) AND !execution(* *->start())">
-         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>
+         <!-- interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/ -->
+         <advice name="setup" aspect="InvocationContextInterceptor"/>
+         <advice name="fillMethod" aspect="InvocationContextInterceptor"/>
+         <advice name="aroundInvoke" aspect="InjectInterceptorsFactory"/>
       </bind>
       <annotation expr="!class(@org.jboss.ejb3.annotation.JndiBindingPolicy)">
          @org.jboss.ejb3.annotation.JndiBindingPolicy (policy=org.jboss.ejb3.jndipolicy.impl.PackagingBasedJndiBindingPolicy.class)

Modified: trunk/ejb3/src/resources/test/aspectdomain/aspectdomain-ejb3-interceptors-aop.xml
===================================================================
--- trunk/ejb3/src/resources/test/aspectdomain/aspectdomain-ejb3-interceptors-aop.xml	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/resources/test/aspectdomain/aspectdomain-ejb3-interceptors-aop.xml	2008-02-12 23:02:47 UTC (rev 69805)
@@ -6,7 +6,7 @@
 <aop>
    <interceptor class="org.jboss.ejb3.test.aspectdomain.TestInterceptor" scope="PER_VM"/>
 
-   <domain name="Test Aspect Domain">
+   <domain name="Test Aspect Domain" extends="Intercepted Bean" inheritBindings="true">
       <bind pointcut="execution(* *->*(..))">
          <interceptor-ref name="org.jboss.ejb3.test.aspectdomain.TestInterceptor"/>
       </bind>

Modified: trunk/ejb3/src/test/org/jboss/ejb3/test/cachepassivation/MockStatefulContainer.java
===================================================================
--- trunk/ejb3/src/test/org/jboss/ejb3/test/cachepassivation/MockStatefulContainer.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/test/org/jboss/ejb3/test/cachepassivation/MockStatefulContainer.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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: trunk/ejb3/src/test/org/jboss/ejb3/test/cachepassivation/unit/CachePassivationUnitTestCase.java
===================================================================
--- trunk/ejb3/src/test/org/jboss/ejb3/test/cachepassivation/unit/CachePassivationUnitTestCase.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/ejb3/src/test/org/jboss/ejb3/test/cachepassivation/unit/CachePassivationUnitTestCase.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -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());

Modified: trunk/webservices/.classpath
===================================================================
--- trunk/webservices/.classpath	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/webservices/.classpath	2008-02-12 23:02:47 UTC (rev 69805)
@@ -39,5 +39,6 @@
 	<classpathentry kind="lib" path="/thirdparty/sun-jaxb/lib/jaxb-api.jar"/>
 	<classpathentry kind="lib" path="/thirdparty/jboss/jbossws-framework/lib/jbossws-framework.jar" sourcepath="/thirdparty/jboss/jbossws-framework/lib/jbossws-framework-src.zip"/>
 	<classpathentry kind="lib" path="/thirdparty/jboss/jboss-ejb3-ext-api/lib/jboss-ejb3-ext-api.jar" sourcepath="/thirdparty/jboss/jboss-ejb3-ext-api/lib/jboss-ejb3-ext-api-sources.jar"/>
+	<classpathentry kind="lib" path="/thirdparty/jboss/jboss-ejb3-interceptors/lib/jboss-ejb3-interceptors.jar" sourcepath="/thirdparty/jboss/jboss-ejb3-interceptors/lib/jboss-ejb3-interceptors-sources.jar"/>
 	<classpathentry kind="output" path="output/eclipse-classes"/>
 </classpath>

Modified: trunk/webservices/build.xml
===================================================================
--- trunk/webservices/build.xml	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/webservices/build.xml	2008-02-12 23:02:47 UTC (rev 69805)
@@ -73,6 +73,7 @@
       <path refid="jboss.common.core.classpath"/>
       <path refid="jboss.common.logging.spi.classpath"/>
       <path refid="jboss.jboss.ejb3.ext.api.classpath" />   
+      <path refid="jboss.jboss.ejb3.interceptors.classpath" />   
       <path refid="jboss.jboss.javaee.classpath"/>
       <path refid="jboss.jboss.security.spi.classpath"/>
       <path refid="jboss.jboss.vfs.classpath"/>

Modified: trunk/webservices/src/main/org/jboss/wsf/container/jboss50/InvocationHandlerEJB3.java
===================================================================
--- trunk/webservices/src/main/org/jboss/wsf/container/jboss50/InvocationHandlerEJB3.java	2008-02-12 21:11:34 UTC (rev 69804)
+++ trunk/webservices/src/main/org/jboss/wsf/container/jboss50/InvocationHandlerEJB3.java	2008-02-12 23:02:47 UTC (rev 69805)
@@ -31,6 +31,7 @@
 
 import org.jboss.aop.Dispatcher;
 import org.jboss.aop.MethodInfo;
+import org.jboss.aop.util.MethodHashing;
 import org.jboss.ejb3.BeanContext;
 import org.jboss.ejb3.BeanContextLifecycleCallback;
 import org.jboss.ejb3.EJBContainerInvocation;
@@ -44,7 +45,6 @@
 import org.jboss.wsf.spi.deployment.Endpoint;
 import org.jboss.wsf.spi.invocation.ExtensibleWebServiceContext;
 import org.jboss.wsf.spi.invocation.Invocation;
-import org.jboss.wsf.spi.invocation.InvocationHandler;
 import org.jboss.wsf.spi.invocation.InvocationType;
 import org.jboss.wsf.spi.invocation.WebServiceContextFactory;
 
@@ -95,9 +95,10 @@
          Method method = getImplMethod(beanClass, wsInv.getJavaMethod());
          Object[] args = wsInv.getArgs();
 
-         MethodInfo info = container.getMethodInfo(method);
+         long hash = MethodHashing.calculateHash(method);
+         MethodInfo info = container.getAdvisor().getMethodInfo(hash);
          EJBContainerInvocation<StatelessContainer, StatelessBeanContext> jbInv = new EJBContainerInvocation<StatelessContainer, StatelessBeanContext>(info);
-         jbInv.setAdvisor(container);
+         jbInv.setAdvisor(container.getAdvisor());
          jbInv.setArguments(args);
          jbInv.setContextCallback(new CallbackImpl(wsInv));
 




More information about the jboss-cvs-commits mailing list