You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2007/03/10 07:39:51 UTC

svn commit: r516657 [1/2] - in /incubator/openejb/trunk/openejb3: container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/openejb/config/ container/openejb-core/src/main/java/org/apache...

Author: dblevins
Date: Fri Mar  9 22:39:49 2007
New Revision: 516657

URL: http://svn.apache.org/viewvc?view=rev&rev=516657
Log:
Full Interceptor support.  Currently wired into just Stateless beans.

Added:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java   (contents, props changed)
      - copied, changed from r515840, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LifecycleCallbackInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/InterceptorBindingInfoComparatorTest.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInterceptorTest.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/CallbackMethod.java
Removed:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LifecycleCallbackInfo.java
Modified:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/MethodInterceptorInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/StatefulBeanInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/Operation.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/Interceptor.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorData.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorStack.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/ReflectionInvocationContext.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContext.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContext.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContext.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/iTest.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AroundInvoke.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AssemblyDescriptor.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/Interceptor.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/InterceptorBinding.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/InterceptorOrder.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/LifecycleCallback.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/NamedMethod.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/StatelessBean.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/beans/DatabaseBean.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/BMTStatelessAllowedOperationsTests.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessAllowedOperationsTests.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessLocalTestSuite.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessTestSuite.java

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Fri Mar  9 22:39:49 2007
@@ -308,6 +308,10 @@
         return new ArrayList<AppInfo>(deployedApplications.values());
     }
 
+    public void createApplication(EjbJarInfo ejbJar) throws NamingException, IOException, OpenEJBException {
+        createEjbJar(ejbJar);
+    }
+
     public void createEjbJar(EjbJarInfo ejbJar) throws NamingException, IOException, OpenEJBException {
         AppInfo appInfo = new AppInfo();
         appInfo.jarPath = ejbJar.jarPath;
@@ -315,6 +319,10 @@
         createApplication(appInfo);
     }
 
+    public void createApplication(EjbJarInfo ejbJar, ClassLoader classLoader) throws NamingException, IOException, OpenEJBException {
+        createEjbJar(ejbJar, classLoader);    
+    }
+
     public void createEjbJar(EjbJarInfo ejbJar, ClassLoader classLoader) throws NamingException, IOException, OpenEJBException {
         AppInfo appInfo = new AppInfo();
         appInfo.jarPath = ejbJar.jarPath;
@@ -918,4 +926,5 @@
             return thread;
         }
     }
+
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java Fri Mar  9 22:39:49 2007
@@ -104,7 +104,7 @@
     public void applySecurityRoleReference(CoreDeploymentInfo deployment, EnterpriseBeanInfo beanInfo, AssemblerTool.RoleMapping roleMapping) {
         for (SecurityRoleReferenceInfo roleRef : beanInfo.securityRoleReferences) {
             List<String> physicalRoles = roleMapping.getPhysicalRoles(roleRef.roleLink);
-            deployment.addSecurityRoleReference(roleRef.roleName, physicalRoles);
+//HACK            deployment.addSecurityRoleReference(roleRef.roleName, physicalRoles);
         }
     }
 

Copied: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java (from r515840, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LifecycleCallbackInfo.java)
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java?view=diff&rev=516657&p1=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LifecycleCallbackInfo.java&r1=515840&p2=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LifecycleCallbackInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java Fri Mar  9 22:39:49 2007
@@ -20,7 +20,7 @@
 /**
  * @version $Revision$ $Date$
  */
-public class LifecycleCallbackInfo extends InfoObject {
+public class CallbackInfo extends InfoObject {
     public String className;
     public String method;
 }

Propchange: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author Id Revision HeadURL

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java Fri Mar  9 22:39:49 2007
@@ -31,7 +31,7 @@
     
     public JndiEncInfo jndiEnc;
 
-    public final List<LifecycleCallbackInfo> postConstruct = new ArrayList<LifecycleCallbackInfo>();
-    public final List<LifecycleCallbackInfo> preDestroy = new ArrayList<LifecycleCallbackInfo>();
+    public final List<CallbackInfo> postConstruct = new ArrayList<CallbackInfo>();
+    public final List<CallbackInfo> preDestroy = new ArrayList<CallbackInfo>();
 
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java Fri Mar  9 22:39:49 2007
@@ -27,6 +27,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
+import java.util.ArrayList;
 
 /**
  * @version $Revision$ $Date$
@@ -45,11 +46,15 @@
     public HashMap<String, DeploymentInfo> build(EjbJarInfo ejbJar, Map<String, Map<String, EntityManagerFactory>> allFactories) throws OpenEJBException {
         HashMap<String, DeploymentInfo> deployments = new HashMap<String, DeploymentInfo>();
 
+        InterceptorBindingBuilder interceptorBindingBuilder = new InterceptorBindingBuilder(classLoader, ejbJar);
 
         for (EnterpriseBeanInfo ejbInfo: ejbJar.enterpriseBeans) {
             try {
-                EnterpriseBeanBuilder deploymentBuilder = new EnterpriseBeanBuilder(classLoader, ejbInfo, ejbJar.moduleId, ejbJar.defaultInterceptors,allFactories);
+                EnterpriseBeanBuilder deploymentBuilder = new EnterpriseBeanBuilder(classLoader, ejbInfo, ejbJar.moduleId, new ArrayList(),allFactories);
                 CoreDeploymentInfo deployment = (CoreDeploymentInfo) deploymentBuilder.build();
+
+                interceptorBindingBuilder.build(deployment, ejbInfo);
+
                 deployment.setJarPath(ejbJar.jarPath);
                 deployments.put(ejbInfo.ejbDeploymentId, deployment);
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java Fri Mar  9 22:39:49 2007
@@ -23,9 +23,11 @@
     public String moduleId;
     public String jarPath;
     public final List<EnterpriseBeanInfo> enterpriseBeans = new ArrayList<EnterpriseBeanInfo>();
-    public final List<InterceptorInfo> defaultInterceptors = new ArrayList<InterceptorInfo>();
-    
+
     public final List<SecurityRoleInfo> securityRoles = new ArrayList<SecurityRoleInfo>();
     public final List<MethodPermissionInfo> methodPermissions= new ArrayList<MethodPermissionInfo>();
     public final List<MethodTransactionInfo> methodTransactions = new ArrayList<MethodTransactionInfo>();
+    public final List<InterceptorInfo> interceptors = new ArrayList<InterceptorInfo>();
+    public final List<InterceptorBindingInfo> interceptorBindings = new ArrayList<InterceptorBindingInfo>();
+
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java Fri Mar  9 22:39:49 2007
@@ -42,13 +42,13 @@
     protected static final Messages messages = new Messages("org.apache.openejb.util.resources");
     private final EnterpriseBeanInfo bean;
     private final String moduleId;
-    private final List<InterceptorInfo> defaultInterceptors;
+    private final List<String> defaultInterceptors;
     private final BeanType ejbType;
     private final ClassLoader cl;
     private final Map<String, Map<String, EntityManagerFactory>> factories;
     private List<Exception> warnings = new ArrayList<Exception>();
 
-    public EnterpriseBeanBuilder(ClassLoader cl, EnterpriseBeanInfo bean, String moduleId, List<InterceptorInfo> defaultInterceptors, Map<String, Map<String, EntityManagerFactory>> factories) {
+    public EnterpriseBeanBuilder(ClassLoader cl, EnterpriseBeanInfo bean, String moduleId, List<String> defaultInterceptors, Map<String, Map<String, EntityManagerFactory>> factories) {
         this.bean = bean;
         this.moduleId = moduleId;
         this.defaultInterceptors = defaultInterceptors;
@@ -184,11 +184,11 @@
         }
 
         // interceptors
-        InterceptorBuilder interceptorBuilder = new InterceptorBuilder(defaultInterceptors, bean);
-        for (Method method : ejbClass.getMethods()) {
-            List<InterceptorData> interceptorDatas = interceptorBuilder.build(method);
-            deployment.setMethodInterceptors(method, interceptorDatas);
-        }
+//        InterceptorBuilder interceptorBuilder = new InterceptorBuilder(new ArrayList(), bean);
+//        for (Method method : ejbClass.getMethods()) {
+//            List<InterceptorData> interceptorDatas = interceptorBuilder.build(method);
+//            deployment.setMethodInterceptors(method, interceptorDatas);
+//        }
 
         if (bean instanceof StatefulBeanInfo) {
             StatefulBeanInfo statefulBeanInfo = (StatefulBeanInfo) bean;
@@ -250,9 +250,9 @@
         return warnings;
     }
 
-    private Method getCallback(Class ejbClass, List<LifecycleCallbackInfo> callbackInfos) {
+    private Method getCallback(Class ejbClass, List<CallbackInfo> callbackInfos) {
         Method callback = null;
-        for (LifecycleCallbackInfo info : callbackInfos) {
+        for (CallbackInfo info : callbackInfos) {
             try {
                 if (ejbClass.getName().equals(info.className)) {
                     if (callback != null) {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java Fri Mar  9 22:39:49 2007
@@ -52,12 +52,10 @@
     
     public final List<SecurityRoleReferenceInfo> securityRoleReferences = new ArrayList<SecurityRoleReferenceInfo>();
 
-    public final List<LifecycleCallbackInfo> postConstruct = new ArrayList<LifecycleCallbackInfo>();
-    public final List<LifecycleCallbackInfo> preDestroy = new ArrayList<LifecycleCallbackInfo>();
+    public final List<CallbackInfo> aroundInvoke = new ArrayList<CallbackInfo>();
 
-    public boolean excludeDefaultInterceptors;
-    public final List<InterceptorInfo> classInterceptors = new ArrayList<InterceptorInfo>();
-    public final List<MethodInterceptorInfo> methodInterceptors = new ArrayList<MethodInterceptorInfo>();
+    public final List<CallbackInfo> postConstruct = new ArrayList<CallbackInfo>();
+    public final List<CallbackInfo> preDestroy = new ArrayList<CallbackInfo>();
 
     public String containerId;
 }

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java?view=auto&rev=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java Fri Mar  9 22:39:49 2007
@@ -0,0 +1,270 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.assembler.classic;
+
+import org.apache.openejb.core.CoreDeploymentInfo;
+import org.apache.openejb.core.interceptor.InterceptorData;
+import org.apache.openejb.util.Logger;
+import org.apache.openejb.OpenEJBException;
+
+import javax.interceptor.InvocationContext;
+import java.util.Comparator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.lang.reflect.Method;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class InterceptorBindingBuilder {
+
+    public static final Logger logger = Logger.getInstance("OpenEJB.startup", InterceptorBindingBuilder.class.getPackage().getName());
+
+    public static enum Level {
+        PACKAGE, CLASS, OVERLOADED_METHOD, EXACT_METHOD;
+    }
+
+    public static enum Type {
+        ADDITION_OR_LOWER_EXCLUSION, SAME_LEVEL_EXCLUSION, SAME_AND_LOWER_EXCLUSION, EXPLICIT_ORDERING;
+    }
+
+    private final EjbJarInfo ejbJarInfo;
+    private final ArrayList<InterceptorBindingInfo> bindings;
+    private final Map<String, InterceptorData> interceptors =  new HashMap<String, InterceptorData>();
+
+    public InterceptorBindingBuilder(ClassLoader cl, EjbJarInfo ejbJarInfo) throws OpenEJBException {
+        this.ejbJarInfo = ejbJarInfo;
+        bindings = new ArrayList<InterceptorBindingInfo>(ejbJarInfo.interceptorBindings);
+        Collections.sort(bindings, new IntercpetorBindingComparator());
+        Collections.reverse(bindings);
+
+        for (InterceptorInfo info : ejbJarInfo.interceptors) {
+            Class clazz = null;
+            try {
+                clazz = Class.forName(info.clazz, true, cl);
+            } catch (ClassNotFoundException e) {
+                throw new OpenEJBException("Intercpetor class cannot be loaded: "+info.clazz);
+            }
+            InterceptorData interceptor = new InterceptorData(clazz);
+
+            toMethods(clazz, info.aroundInvoke, interceptor.getAroundInvoke());
+            toMethods(clazz, info.postActivate, interceptor.getPostActivate());
+            toMethods(clazz, info.prePassivate, interceptor.getPrePassivate());
+            toMethods(clazz, info.postConstruct, interceptor.getPostConstruct());
+            toMethods(clazz, info.preDestroy, interceptor.getPreDestroy());
+            interceptors.put(info.clazz, interceptor);
+        }
+    }
+
+    private void toMethods(Class clazz, List<CallbackInfo> callbackInfos, List<Method> methods) {
+        for (CallbackInfo callbackInfo : callbackInfos) {
+            try {
+                Method method = clazz.getMethod(callbackInfo.method, InvocationContext.class);
+                methods.add(method);
+            } catch (NoSuchMethodException e) {
+                logger.warning("Interceptor method not found (skipping): public void " + callbackInfo.method + "(InvocationContext); in class " + clazz.getName());
+            }
+        }
+    }
+
+    private void toCallback(Class clazz, List<CallbackInfo> callbackInfos, List<Method> methods) {
+        for (CallbackInfo callbackInfo : callbackInfos) {
+            try {
+                Method method = clazz.getMethod(callbackInfo.method);
+                methods.add(method);
+            } catch (NoSuchMethodException e) {
+                logger.warning("Bean Callback method not found (skipping): public void " + callbackInfo.method + "(); in class " + clazz.getName());
+            }
+        }
+    }
+
+    public void build(CoreDeploymentInfo deploymentInfo, EnterpriseBeanInfo beanInfo) {
+        Class clazz = deploymentInfo.getBeanClass();
+
+        InterceptorData beanAsInterceptor = new InterceptorData(clazz);
+
+        toMethods(clazz, beanInfo.aroundInvoke, beanAsInterceptor.getAroundInvoke());
+        toCallback(clazz, beanInfo.postConstruct, beanAsInterceptor.getPostConstruct());
+        toCallback(clazz, beanInfo.preDestroy, beanAsInterceptor.getPreDestroy());
+
+        if (beanInfo instanceof StatefulBeanInfo) {
+            StatefulBeanInfo stateful = (StatefulBeanInfo) beanInfo;
+            toCallback(clazz, stateful.postActivate, beanAsInterceptor.getPostActivate());
+            toCallback(clazz, stateful.prePassivate, beanAsInterceptor.getPrePassivate());
+        }
+
+        for (Method method : deploymentInfo.getBeanClass().getMethods()) {
+            List<InterceptorBindingInfo> methodBindings = processBindings(method, beanInfo.ejbName);
+            Collections.reverse(methodBindings);
+            List<InterceptorData> methodInterceptors = new ArrayList<InterceptorData>();
+
+            for (InterceptorBindingInfo info : methodBindings) {
+                List<String> classes = (info.interceptorOrder.size() > 0) ? info.interceptorOrder : info.interceptors;
+                for (String interceptorClassName : classes) {
+                    InterceptorData interceptorData = interceptors.get(interceptorClassName);
+                    if (interceptorData == null){
+                        logger.warning("InterceptorBinding references non-existent (undeclared) interceptor: " + interceptorClassName);
+                        continue;
+                    }
+                    methodInterceptors.add(interceptorData);
+                }
+            }
+
+            // The bean itself gets to intercept too and is always last.
+            methodInterceptors.add(beanAsInterceptor);
+
+            deploymentInfo.setMethodInterceptors(method, methodInterceptors);
+        }
+    }
+
+    private List<InterceptorBindingInfo> processBindings(Method method, String ejbName){
+        List<InterceptorBindingInfo> methodBindings = new ArrayList<InterceptorBindingInfo>();
+
+        // The only critical thing to understand in this loop as that
+        // the bindings have already been sorted high to low (first to last)
+        // in this order:
+        //
+        // Primary sort is "level":
+        //   (highest/first)
+        //    - Method-level bindings with params
+        //    - Method-level with no params
+        //    - Class-level
+        //    - Package-level (aka. default level)
+        //   (lowest/last)
+        //
+        // They've been secondarily sorted *within* these levels by "type":
+        //
+        //   (highest)
+        //    - Explicit order
+        //    - Exclude applying to current and lower levels
+        //    - Exclude applying to just current level
+        //    - Any addition for current level and/or exclusion for a lower level
+        //   (lowest)
+        //
+        Set<Level> excludes = new HashSet<Level>();
+        for (InterceptorBindingInfo info : bindings) {
+            Level level = level(info);
+
+            if (!implies(method, ejbName, level, info)) continue;
+
+            Type type = type(level, info);
+
+            if (type == Type.EXPLICIT_ORDERING){
+                methodBindings.add(info);
+                // An explicit ordering trumps all other bindings of the same level or below
+                // (even other explicit order bindings).  Any bindings that were higher than
+                // this one still apply (and will have already been applied).
+                //
+                // So we keep what we have, add this last binding and we're done with this method.
+                return methodBindings;
+            }
+
+            if (type == Type.SAME_AND_LOWER_EXCLUSION){
+                // We're done as the only things that will come after this will be
+                // at the same or lower level and we've just been told to exclude them.
+                // Nothing more to do for this method.
+                return methodBindings;
+            }
+
+            if (type == Type.SAME_LEVEL_EXCLUSION){
+                excludes.add(level);
+                continue;
+            }
+
+            if (!excludes.contains(level)){
+                methodBindings.add(info);
+                if (info.excludeClassInterceptors) excludes.add(Level.CLASS);
+                if (info.excludeDefaultInterceptors) excludes.add(Level.PACKAGE);
+            }
+        }
+        return methodBindings;
+    }
+
+    private boolean implies(Method method, String ejbName, Level level, InterceptorBindingInfo info) {
+        if (level == Level.PACKAGE) return true;
+        if (!ejbName.equals(info.ejbName)) return false;
+        if (level == Level.CLASS) return true;
+
+        NamedMethodInfo methodInfo = info.method;
+
+        if (!methodInfo.methodName.equals(method.getName())) return false;
+
+        // do we have parameters?
+        List<String> params = methodInfo.methodParams;
+        if (params == null) return true;
+
+        // do we have the same number of parameters?
+        if (params.size() != method.getParameterTypes().length) return false;
+
+        // match parameters names
+        Class<?>[] parameterTypes = method.getParameterTypes();
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+
+            Class<?> parameterType = parameterTypes[i];
+            String methodParam = params.get(i);
+
+            if (methodParam.equals(getName(parameterType))) {
+                return false;
+            }
+        }
+
+        return false;
+    }
+
+    private static String getName(Class<?> type) {
+        if (type.isArray()) {
+            return getName(type.getComponentType()) + "[]";
+        } else {
+            return type.getName();
+        }
+    }
+
+    public static class IntercpetorBindingComparator implements Comparator<InterceptorBindingInfo> {
+        public int compare(InterceptorBindingInfo a, InterceptorBindingInfo b) {
+            Level levelA = level(a);
+            Level levelB = level(b);
+
+            if (levelA != levelB) return levelA.ordinal() - levelB.ordinal();
+
+            // Now resort to secondary sorting.
+
+            return type(levelA, a).ordinal() - type(levelB, b).ordinal();
+        }
+    }
+
+    private static Level level(InterceptorBindingInfo info) {
+        if (info.ejbName.equals("*")) return Level.PACKAGE;
+        if (info.method == null) return Level.CLASS;
+        if (info.method.methodParams == null) return Level.OVERLOADED_METHOD;
+        return Level.EXACT_METHOD;
+    }
+
+    private static Type type(Level level, InterceptorBindingInfo info) {
+        if (info.interceptorOrder.size() > 0) return Type.EXPLICIT_ORDERING;
+        if (level == Level.CLASS && info.excludeClassInterceptors && info.excludeDefaultInterceptors)
+            return Type.SAME_AND_LOWER_EXCLUSION;
+        if (level == Level.CLASS && info.excludeClassInterceptors) return Type.SAME_LEVEL_EXCLUSION;
+        return Type.ADDITION_OR_LOWER_EXCLUSION;
+    }
+
+}

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingInfo.java?view=auto&rev=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingInfo.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingInfo.java Fri Mar  9 22:39:49 2007
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.assembler.classic;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class InterceptorBindingInfo extends InfoObject {
+    public String ejbName;
+    public final List<String> interceptors = new ArrayList<String>();
+    public final List<String> interceptorOrder = new ArrayList<String>();
+    public boolean excludeDefaultInterceptors;
+    public boolean excludeClassInterceptors;
+    public NamedMethodInfo method;
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBuilder.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBuilder.java Fri Mar  9 22:39:49 2007
@@ -34,9 +34,9 @@
 
     public InterceptorBuilder(List<InterceptorInfo> defaultInterceptors, EnterpriseBeanInfo bean) {
         this.defaultInterceptors = toInterceptorDatas(defaultInterceptors);
-        this.excludeDefaultInterceptors = bean.excludeDefaultInterceptors;
-        this.classInterceptors = toInterceptorDatas(bean.classInterceptors);
-        this.methodInterceptors = new ArrayList<MethodInterceptorInfo>(bean.methodInterceptors);
+        this.excludeDefaultInterceptors = false;//bean.excludeDefaultInterceptors;
+        this.classInterceptors = null; //toInterceptorDatas(bean.classInterceptors);
+        this.methodInterceptors = null;//new ArrayList<MethodInterceptorInfo>(bean.methodInterceptors);
         Collections.sort(methodInterceptors, METHOD_INTERCEPTOR_INFO_COMPARATOR);
     }
 
@@ -58,7 +58,7 @@
                     }
                 }
 
-                interceptors.addAll(toInterceptorDatas(methodInterceptorInfo.interceptors));
+                //interceptors.addAll(toInterceptorDatas(methodInterceptorInfo.interceptors));
 
                 return interceptors;
             }
@@ -81,9 +81,9 @@
 
     private static List<InterceptorData> toInterceptorDatas(List<InterceptorInfo> interceptorInfos) {
         ArrayList<InterceptorData> interceptorDatas = new ArrayList<InterceptorData>(interceptorInfos.size());
-        for (InterceptorInfo interceptorInfo : interceptorInfos) {
-            interceptorDatas.add(new InterceptorData(interceptorInfo.clazz, interceptorInfo.methodName));
-        }
+//        for (InterceptorInfo interceptorInfo : interceptorInfos) {
+//            interceptorDatas.add(new InterceptorData(interceptorInfo.clazz, interceptorInfo.methodName));
+//        }
         return interceptorDatas;
     }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorInfo.java Fri Mar  9 22:39:49 2007
@@ -17,7 +17,17 @@
  */
 package org.apache.openejb.assembler.classic;
 
+import java.util.List;
+import java.util.ArrayList;
+
 public class InterceptorInfo extends InfoObject{
     public String clazz;
-    public String methodName;
+
+    public final List<CallbackInfo> aroundInvoke = new ArrayList<CallbackInfo>();
+
+    public final List<CallbackInfo> postConstruct = new ArrayList<CallbackInfo>();
+    public final List<CallbackInfo> preDestroy = new ArrayList<CallbackInfo>();
+
+    public final List<CallbackInfo> postActivate = new ArrayList<CallbackInfo>();
+    public final List<CallbackInfo> prePassivate = new ArrayList<CallbackInfo>();
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/MethodInterceptorInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/MethodInterceptorInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/MethodInterceptorInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/MethodInterceptorInfo.java Fri Mar  9 22:39:49 2007
@@ -24,5 +24,5 @@
     public MethodInfo methodInfo;
     public boolean excludeDefaultInterceptors;
     public boolean excludeClassInterceptors;
-    public final List<InterceptorInfo> interceptors = new ArrayList<InterceptorInfo>();
+    public final List<String> interceptors = new ArrayList<String>();
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/StatefulBeanInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/StatefulBeanInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/StatefulBeanInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/StatefulBeanInfo.java Fri Mar  9 22:39:49 2007
@@ -25,7 +25,7 @@
         type = STATEFUL;
     }
 
-    public final List<LifecycleCallbackInfo> postActivate = new ArrayList<LifecycleCallbackInfo>();
-    public final List<LifecycleCallbackInfo> prePassivate = new ArrayList<LifecycleCallbackInfo>();
+    public final List<CallbackInfo> postActivate = new ArrayList<CallbackInfo>();
+    public final List<CallbackInfo> prePassivate = new ArrayList<CallbackInfo>();
 
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Fri Mar  9 22:39:49 2007
@@ -17,40 +17,8 @@
 package org.apache.openejb.config;
 
 import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.jee.ApplicationClient;
-import org.apache.openejb.jee.AroundInvoke;
-import org.apache.openejb.jee.AssemblyDescriptor;
-import org.apache.openejb.jee.ContainerTransaction;
-import org.apache.openejb.jee.EjbJar;
-import org.apache.openejb.jee.EjbLocalRef;
-import org.apache.openejb.jee.EjbRef;
-import org.apache.openejb.jee.EnterpriseBean;
-import org.apache.openejb.jee.EnvEntry;
-import org.apache.openejb.jee.InjectionTarget;
-import org.apache.openejb.jee.JndiConsumer;
-import org.apache.openejb.jee.JndiReference;
-import org.apache.openejb.jee.Lifecycle;
-import org.apache.openejb.jee.LifecycleCallback;
-import org.apache.openejb.jee.MessageDrivenBean;
-import org.apache.openejb.jee.MethodParams;
-import org.apache.openejb.jee.MethodTransaction;
-import org.apache.openejb.jee.PersistenceContextRef;
-import org.apache.openejb.jee.PersistenceContextType;
-import org.apache.openejb.jee.PersistenceUnitRef;
-import org.apache.openejb.jee.Property;
-import org.apache.openejb.jee.RemoteBean;
-import org.apache.openejb.jee.ResAuth;
-import org.apache.openejb.jee.ResSharingScope;
-import org.apache.openejb.jee.ResourceEnvRef;
-import org.apache.openejb.jee.ResourceRef;
+import org.apache.openejb.jee.*;
 import org.apache.openejb.jee.SessionBean;
-import org.apache.openejb.jee.StatefulBean;
-import org.apache.openejb.jee.StatelessBean;
-import org.apache.openejb.jee.TransAttribute;
-import org.apache.openejb.jee.TransactionType;
-import org.apache.openejb.jee.ActivationConfig;
-import org.apache.openejb.jee.ActivationConfigProperty;
-import org.apache.openejb.jee.Interceptor;
 import org.apache.openejb.util.Logger;
 import org.apache.xbean.finder.ClassFinder;
 
@@ -335,6 +303,13 @@
                         if (ejbJar.getInterceptor(interceptor.getName()) == null){
                             ejbJar.addInterceptor(new Interceptor(interceptor.getName()));
                         }
+                    }
+
+                    InterceptorBinding binding = new InterceptorBinding();
+                    binding.setEjbName(bean.getEjbName());
+                    InterceptorOrder order = binding.setInterceptorOrder(new InterceptorOrder());
+                    for (Class interceptor : interceptors.value()) {
+                        order.addInterceptorClass(interceptor.getName());
                     }
                 }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java Fri Mar  9 22:39:49 2007
@@ -22,55 +22,10 @@
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.jee.oejb3.EjbDeployment;
 import org.apache.openejb.jee.oejb3.ResourceLink;
-import org.apache.openejb.assembler.classic.EjbJarInfo;
-import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
-import org.apache.openejb.assembler.classic.EntityBeanInfo;
-import org.apache.openejb.assembler.classic.InterceptorInfo;
-import org.apache.openejb.assembler.classic.JndiEncInfo;
-import org.apache.openejb.assembler.classic.LifecycleCallbackInfo;
-import org.apache.openejb.assembler.classic.MessageDrivenBeanInfo;
-import org.apache.openejb.assembler.classic.MethodInfo;
-import org.apache.openejb.assembler.classic.MethodInterceptorInfo;
-import org.apache.openejb.assembler.classic.MethodPermissionInfo;
-import org.apache.openejb.assembler.classic.MethodTransactionInfo;
-import org.apache.openejb.assembler.classic.NamedMethodInfo;
-import org.apache.openejb.assembler.classic.QueryInfo;
-import org.apache.openejb.assembler.classic.SecurityRoleInfo;
-import org.apache.openejb.assembler.classic.SecurityRoleReferenceInfo;
-import org.apache.openejb.assembler.classic.StatefulBeanInfo;
-import org.apache.openejb.assembler.classic.StatelessBeanInfo;
-import org.apache.openejb.assembler.classic.CmrFieldInfo;
-import org.apache.openejb.jee.AroundInvoke;
-import org.apache.openejb.jee.CmpField;
-import org.apache.openejb.jee.CmpVersion;
-import org.apache.openejb.jee.ContainerTransaction;
-import org.apache.openejb.jee.EnterpriseBean;
+import org.apache.openejb.assembler.classic.*;
+import org.apache.openejb.jee.*;
 import org.apache.openejb.jee.EntityBean;
-import org.apache.openejb.jee.Icon;
-import org.apache.openejb.jee.Interceptor;
-import org.apache.openejb.jee.InterceptorBinding;
-import org.apache.openejb.jee.JndiConsumer;
-import org.apache.openejb.jee.LifecycleCallback;
-import org.apache.openejb.jee.MessageDrivenBean;
-import org.apache.openejb.jee.Method;
-import org.apache.openejb.jee.MethodParams;
-import org.apache.openejb.jee.MethodPermission;
-import org.apache.openejb.jee.NamedMethod;
-import org.apache.openejb.jee.PersistenceType;
-import org.apache.openejb.jee.RemoteBean;
-import org.apache.openejb.jee.ResourceRef;
-import org.apache.openejb.jee.SecurityRole;
-import org.apache.openejb.jee.SecurityRoleRef;
 import org.apache.openejb.jee.SessionBean;
-import org.apache.openejb.jee.SessionType;
-import org.apache.openejb.jee.TransactionType;
-import org.apache.openejb.jee.ActivationConfig;
-import org.apache.openejb.jee.ActivationConfigProperty;
-import org.apache.openejb.jee.EjbRelation;
-import org.apache.openejb.jee.EjbRelationshipRole;
-import org.apache.openejb.jee.Multiplicity;
-import org.apache.openejb.jee.Query;
-import org.apache.openejb.jee.QueryMethod;
 import org.apache.openejb.loader.SystemInstance;
 
 import java.util.ArrayList;
@@ -231,72 +186,39 @@
     }
 
     private void initInterceptors(EjbModule jar, EjbJarInfo ejbJar, Map<String, EnterpriseBeanInfo> beanInfos) throws OpenEJBException {
-        if (jar.getEjbJar().getInterceptors() == null) {
-            // no interceptors to process
-            return;
-        }
+        if (jar.getEjbJar().getInterceptors() == null) return;
+        if (jar.getEjbJar().getAssemblyDescriptor() == null) return;
+        if (jar.getEjbJar().getAssemblyDescriptor().getInterceptorBinding() == null) return;
 
-        Map<String, String> interceptorMethods = new HashMap<String, String>();
-        for (Interceptor interceptor : jar.getEjbJar().getInterceptors()) {
-            AroundInvoke aroundInvoke = interceptor.getAroundInvoke().iterator().next();
-            String clazz = aroundInvoke.getClazz();
-            String methodName = aroundInvoke.getMethodName();
-            interceptorMethods.put(clazz, methodName);
-        }
+        for (Interceptor s : jar.getEjbJar().getInterceptors()) {
+            InterceptorInfo info = new InterceptorInfo();
 
-        List<InterceptorBinding> bindings = jar.getEjbJar().getAssemblyDescriptor().getInterceptorBinding();
-        for (InterceptorBinding binding : bindings) {
-            if (binding.getInterceptorOrder() != null) {
-                continue;
-            }
+            info.clazz = s.getInterceptorClass();
 
-            String ejbName = binding.getEjbName();
-            List<InterceptorInfo> interceptorInfos = getInterceptorInfos(binding.getInterceptorClass(), interceptorMethods);
-            if ("*".equals(ejbName)) {
-                ejbJar.defaultInterceptors.addAll(interceptorInfos);
-            } else {
-                EnterpriseBeanInfo beanInfo = beanInfos.get(ejbName);
-                if (beanInfo == null) {
-                    throw new OpenEJBException("Interceptor binding defined for a non existant ejb " + ejbName);
-                }
+            copyCallbacks(s.getAroundInvoke(), info.aroundInvoke);
 
-                NamedMethod method = binding.getMethod();
-                if (method == null) {
-                    beanInfo.excludeDefaultInterceptors = binding.getExcludeDefaultInterceptors();
-                    beanInfo.classInterceptors.addAll(interceptorInfos);
-                } else {
-                    MethodInterceptorInfo methodInterceptorInfo = new MethodInterceptorInfo();
-                    methodInterceptorInfo.methodInfo = new MethodInfo();
-                    methodInterceptorInfo.methodInfo.methodName = method.getMethodName();
-                    List<String> methodParam = method.getMethodParams().getMethodParam();
-                    methodInterceptorInfo.methodInfo.methodParams = methodParam;
-
-                    methodInterceptorInfo.excludeDefaultInterceptors = binding.getExcludeDefaultInterceptors();
-                    methodInterceptorInfo.excludeClassInterceptors = binding.getExcludeClassInterceptors();
-                    methodInterceptorInfo.interceptors.addAll(interceptorInfos);
+            copyCallbacks(s.getPostConstruct(), info.postConstruct);
+            copyCallbacks(s.getPreDestroy(), info.preDestroy);
 
-                    beanInfo.methodInterceptors.add(methodInterceptorInfo);
-                }
-            }
-        }
+            copyCallbacks(s.getPostActivate(), info.postActivate);
+            copyCallbacks(s.getPrePassivate(), info.prePassivate);
 
-        // todo add interceptor order
-    }
+            ejbJar.interceptors.add(info);
+        }
 
-    private static List<InterceptorInfo> getInterceptorInfos(List<String> interceptorClasses, Map<String, String> interceptorMethods) throws OpenEJBException {
-        ArrayList<InterceptorInfo> interceptorInfos = new ArrayList<InterceptorInfo>(interceptorClasses.size());
-        for (String clazz : interceptorClasses) {
-            String methodName = interceptorMethods.get(clazz);
-            if (methodName == null) {
-                throw new OpenEJBException("Interceptor class is not have an interceptor method defined: " + interceptorClasses);
+        for (InterceptorBinding binding : jar.getEjbJar().getAssemblyDescriptor().getInterceptorBinding()) {
+            InterceptorBindingInfo info = new InterceptorBindingInfo();
+            info.ejbName = binding.getEjbName();
+            info.excludeClassInterceptors = binding.getExcludeClassInterceptors();
+            info.excludeDefaultInterceptors = binding.getExcludeDefaultInterceptors();
+            info.interceptors.addAll(binding.getInterceptorClass());
+            if (binding.getInterceptorOrder() != null) {
+                info.interceptorOrder.addAll(binding.getInterceptorOrder().getInterceptorClass());
             }
 
-            InterceptorInfo interceptorInfo = new InterceptorInfo();
-            interceptorInfo.clazz = clazz;
-            interceptorInfo.methodName = methodName;
-            interceptorInfos.add(interceptorInfo);
+            info.method = toInfo(binding.getMethod());
+            ejbJar.interceptorBindings.add(info);
         }
-        return interceptorInfos;
     }
 
     private void initJndiReferences(Map<String, EjbDeployment> ejbds, Map<String, EnterpriseBeanInfo> beanInfos, Map<String, EnterpriseBean> beanData) throws OpenEJBException {
@@ -430,6 +352,9 @@
             bean = new StatelessBeanInfo();
         }
 
+        bean.timeoutMethod = toInfo(s.getTimeoutMethod());
+
+        copyCallbacks(s.getAroundInvoke(), bean.aroundInvoke);
         copyCallbacks(s.getPostConstruct(), bean.postConstruct);
         copyCallbacks(s.getPreDestroy(), bean.preDestroy);
 
@@ -464,17 +389,13 @@
     private EnterpriseBeanInfo initMessageBean(MessageDrivenBean mdb, Map m) throws OpenEJBException {
         MessageDrivenBeanInfo bean = new MessageDrivenBeanInfo();
 
+        bean.timeoutMethod = toInfo(mdb.getTimeoutMethod());
+
+        copyCallbacks(mdb.getAroundInvoke(), bean.aroundInvoke);
         copyCallbacks(mdb.getPostConstruct(), bean.postConstruct);
         copyCallbacks(mdb.getPreDestroy(), bean.preDestroy);
-        NamedMethodInfo timeoutMethodInfo = new NamedMethodInfo();
-        if (mdb.getTimeoutMethod() != null) {
-            timeoutMethodInfo.methodName = mdb.getTimeoutMethod().getMethodName();
-            if (mdb.getTimeoutMethod().getMethodParams() != null) {
-                timeoutMethodInfo.methodParams = mdb.getTimeoutMethod().getMethodParams().getMethodParam();
-            }
-        }
+
         EjbDeployment d = (EjbDeployment) m.get(mdb.getEjbName());
-        bean.timeoutMethod = timeoutMethodInfo;
         if (d == null) {
             throw new OpenEJBException("No deployment information in openejb-jar.xml for bean "
                     + mdb.getEjbName()
@@ -514,11 +435,25 @@
         return bean;
     }
 
-    private void copyCallbacks(List<LifecycleCallback> from, List<LifecycleCallbackInfo> to) {
-        for (LifecycleCallback callback : from) {
-            LifecycleCallbackInfo info = new LifecycleCallbackInfo();
-            info.className = callback.getLifecycleCallbackClass();
-            info.method = callback.getLifecycleCallbackMethod();
+    private NamedMethodInfo toInfo(NamedMethod method) {
+        if (method == null) return null;
+
+        NamedMethodInfo info = new NamedMethodInfo();
+
+        info.methodName = method.getMethodName();
+
+        if (method.getMethodParams() != null) {
+            info.methodParams = method.getMethodParams().getMethodParam();
+        }
+
+        return info;
+    }
+
+    private void copyCallbacks(List<? extends CallbackMethod> from, List<CallbackInfo> to) {
+        for (CallbackMethod callback : from) {
+            CallbackInfo info = new CallbackInfo();
+            info.className = callback.getClassName();
+            info.method = callback.getMethodName();
             to.add(info);
         }
     }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java Fri Mar  9 22:39:49 2007
@@ -554,15 +554,15 @@
         return methodInterceptors.get(method);
     }
 
+
     public void setMethodInterceptors(Method method, List<InterceptorData> interceptors) {
         methodInterceptors.put(method, interceptors);
+        this.interceptors.addAll(interceptors);
     }
 
+    private final Set<InterceptorData> interceptors = new HashSet<InterceptorData>();
+
     public Set<InterceptorData> getAllInterceptors() {
-        Set<InterceptorData> interceptors = new HashSet<InterceptorData>();
-        for (List<InterceptorData> interceptorDatas : methodInterceptors.values()) {
-            interceptors.addAll(interceptorDatas);
-        }
         return interceptors;
     }
 
@@ -680,6 +680,12 @@
         if (localInterface != null) {
             mapObjectInterface(localInterface);
             mapHomeInterface(localHomeInterface);
+        }
+        if (businessLocal != null){
+            mapObjectInterface(businessLocal);
+        }
+        if (businessRemote != null){
+            mapObjectInterface(businessRemote);
         }
 
         if (componentType == BeanType.MESSAGE_DRIVEN && MessageDrivenBean.class.isAssignableFrom(beanClass)) {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/Operation.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/Operation.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/Operation.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/Operation.java Fri Mar  9 22:39:49 2007
@@ -18,7 +18,6 @@
 
 public enum Operation {
     INJECTION,
-    LIFECYCLE,
     BUSINESS,
     BUSINESS_WS,
     TIMEOUT,

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/Interceptor.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/Interceptor.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/Interceptor.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/Interceptor.java Fri Mar  9 22:39:49 2007
@@ -27,18 +27,6 @@
     private final Object instance;
     private final Method method;
 
-    public Interceptor(Object instance, String methodName) {
-        if (instance == null) throw new NullPointerException("instance is null");
-        if (methodName == null) throw new NullPointerException("methodName is null");
-        this.instance = instance;
-        Class instanceClass = instance.getClass();
-        try {
-            this.method = instanceClass.getMethod(methodName, InvocationContext.class);
-        } catch (NoSuchMethodException e) {
-            throw new IllegalArgumentException("Interceptor method " + methodName + " not found on intercepted class " + instanceClass.getName());
-        }
-    }
-
     public Interceptor(Object instance, Method method) {
         if (instance == null) throw new NullPointerException("instance is null");
         if (method == null) throw new NullPointerException("method is null");

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorData.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorData.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorData.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorData.java Fri Mar  9 22:39:49 2007
@@ -17,46 +17,79 @@
  */
 package org.apache.openejb.core.interceptor;
 
+import org.apache.openejb.core.Operation;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+
 /**
  * @version $Rev$ $Date$
  */
 public class InterceptorData {
-    private final String interceptorClass;
-    private final String interceptorMethod;
 
-    public InterceptorData(String interceptorClass, String interceptorMethod) {
-        if (interceptorClass == null) throw new NullPointerException("interceptorClass is null");
-        if (interceptorMethod == null) throw new NullPointerException("interceptorMethod is null");
-        this.interceptorClass = interceptorClass;
-        this.interceptorMethod = interceptorMethod;
+    private Class clazz;
+
+    private final List<Method> aroundInvoke = new ArrayList<Method>();
+
+    private final List<Method> postConstruct = new ArrayList<Method>();
+    private final List<Method> preDestroy = new ArrayList<Method>();
+
+    private final List<Method> postActivate = new ArrayList<Method>();
+    private final List<Method> prePassivate = new ArrayList<Method>();
+
+    public InterceptorData(Class clazz) {
+        this.clazz = clazz;
+    }
+
+    public Class getInterceptorClass() {
+        return clazz;
+    }
+
+    public List<Method> getAroundInvoke() {
+        return aroundInvoke;
     }
 
-    public String getInterceptorClass() {
-        return interceptorClass;
+    public List<Method> getPostConstruct() {
+        return postConstruct;
     }
 
-    public String getInterceptorMethod() {
-        return interceptorMethod;
+    public List<Method> getPreDestroy() {
+        return preDestroy;
+    }
+
+    public List<Method> getPostActivate() {
+        return postActivate;
+    }
+
+    public List<Method> getPrePassivate() {
+        return prePassivate;
+    }
+
+    public List<Method> getMethods(Operation operation) {
+        switch(operation) {
+            case BUSINESS: return getAroundInvoke();
+            case CREATE: return getPostConstruct();
+            case REMOVE: return getPreDestroy();
+            case ACTIVATE: return getPostActivate();
+            case PASSIVATE: return getPrePassivate();
+        }
+        return Collections.EMPTY_LIST;
     }
 
     public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
 
-        InterceptorData that = (InterceptorData) o;
-        return interceptorClass.equals(that.interceptorClass) &&
-                interceptorMethod.equals(that.interceptorMethod);
+        final InterceptorData that = (InterceptorData) o;
 
-    }
+        if (clazz != null ? !clazz.equals(that.clazz) : that.clazz != null) return false;
 
-    public int hashCode() {
-        int result;
-        result = interceptorClass.hashCode();
-        result = 29 * result + interceptorMethod.hashCode();
-        return result;
+        return true;
     }
 
-    public String toString() {
-        return interceptorClass + "." + interceptorMethod;
+    public int hashCode() {
+        return (clazz != null ? clazz.hashCode() : 0);
     }
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorStack.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorStack.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorStack.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorStack.java Fri Mar  9 22:39:49 2007
@@ -17,13 +17,14 @@
  */
 package org.apache.openejb.core.interceptor;
 
+import org.apache.openejb.core.Operation;
+
 import javax.interceptor.InvocationContext;
 import java.lang.reflect.Method;
 import java.util.List;
-import java.util.Collection;
-import java.util.Map;
 import java.util.HashMap;
 import java.util.ArrayList;
+import java.util.Map;
 
 /**
  * @version $Rev$ $Date$
@@ -31,40 +32,36 @@
 public class InterceptorStack {
     private final Object beanInstance;
     private final List<Interceptor> interceptors;
-    private final Method method;
-    private boolean lifecycleInvocation;
+    private final Method targetMethod;
 
-    public InterceptorStack(Object beanInstance, Method method, boolean lifecycleInvocation, Collection<Object> interceptorInstances, List<InterceptorData> interceptorDatas) {
+    public InterceptorStack(Object beanInstance, Method targetMethod, Operation operation, List<InterceptorData> interceptorDatas, Map<String, Object> interceptorInstances) {
         this.beanInstance = beanInstance;
-        this.method = method;
-        this.lifecycleInvocation = lifecycleInvocation;
-
-        Map<String, Object> interceptorsByClass = new HashMap<String, Object>();
-        for (Object interceptor : interceptorInstances) {
-            interceptorsByClass.put(interceptor.getClass().getName(), interceptor);
-        }
+        this.targetMethod = targetMethod;
 
         interceptors = new ArrayList<Interceptor>(interceptorDatas.size());
         for (InterceptorData interceptorData : interceptorDatas) {
-            String interceptorClass = interceptorData.getInterceptorClass();
-            Object interceptorInstance = interceptorsByClass.get(interceptorClass);
+            Class interceptorClass = interceptorData.getInterceptorClass();
+            Object interceptorInstance = interceptorInstances.get(interceptorClass.getName());
             if (interceptorInstance == null) {
-                throw new IllegalArgumentException("No interceptor of type " + interceptorClass);
+                throw new IllegalArgumentException("No interceptor of type " + interceptorClass.getName());
+            }
+
+            List<Method> methods = interceptorData.getMethods(operation);
+            for (Method method : methods) {
+                Interceptor interceptor = new Interceptor(interceptorInstance, method);
+                interceptors.add(interceptor);
             }
-            Interceptor interceptor = new Interceptor(interceptorInstance, interceptorData.getInterceptorMethod());
-            interceptors.add(interceptor);
         }
     }
 
-    public InterceptorStack(Object beanInstance, Method method, boolean lifecycleInvocation, List<Interceptor> interceptors) {
+    public InterceptorStack(Object beanInstance, Method method, List<Interceptor> interceptors) {
         this.beanInstance = beanInstance;
-        this.method = method;
-        this.lifecycleInvocation = lifecycleInvocation;
+        this.targetMethod = method;
         this.interceptors = interceptors;
     }
 
     public InvocationContext createInvocationContext() {
-        InvocationContext invocationContext = new ReflectionInvocationContext(interceptors, beanInstance, method, lifecycleInvocation);
+        InvocationContext invocationContext = new ReflectionInvocationContext(interceptors, beanInstance, targetMethod);
         return invocationContext;
     }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/ReflectionInvocationContext.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/ReflectionInvocationContext.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/ReflectionInvocationContext.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/ReflectionInvocationContext.java Fri Mar  9 22:39:49 2007
@@ -36,20 +36,18 @@
     private final Map<String, Object> contextData = new TreeMap<String, Object>();
     private final Class<?>[] parameterTypes;
 
-    private final boolean lifecycleInvocation;
     private boolean parametersSet;
 
-    public ReflectionInvocationContext(List<Interceptor> interceptors, Object target, Method method, boolean lifecycleInvocation) {
+    public ReflectionInvocationContext(List<Interceptor> interceptors, Object target, Method method) {
         if (interceptors == null) throw new NullPointerException("interceptors is null");
         if (target == null) throw new NullPointerException("target is null");
 
         this.interceptors = interceptors.iterator();
         this.target = target;
         this.method = method;
-        parameterTypes = method.getParameterTypes();
+        parameterTypes = (method == null)? new Class[]{}: method.getParameterTypes();
         parameters = new Object[parameterTypes.length];
 
-        this.lifecycleInvocation = lifecycleInvocation;
         parametersSet = parameters.length == 0;
     }
 
@@ -58,7 +56,6 @@
     }
 
     public Method getMethod() {
-        if (lifecycleInvocation) return null;
         return method;
     }
 
@@ -75,17 +72,18 @@
             Object parameter = parameters[i];
             Class<?> parameterType = parameterTypes[i];
 
-            if (parameter == null) {
-                if (parameterType.isPrimitive()) {
-                    throw new IllegalArgumentException("Expected parameter " + i + " to be primitive type " + parameterType.getName() +
-                        ", but got a parameter that is null");
-                }
-            } else if (!parameterType.isInstance(parameter)) {
-                throw new IllegalArgumentException("Expected parameter " + i + " to be of type " + parameterType.getName() +
-                    ", but got a parameter of type " + parameter.getClass().getName());
-            }
+//            if (parameter == null) {
+//                if (parameterType.isPrimitive()) {
+//                    throw new IllegalArgumentException("Expected parameter " + i + " to be primitive type " + parameterType.getName() +
+//                        ", but got a parameter that is null");
+//                }
+//            } else if (!parameterType.isInstance(parameter)) {
+//                throw new IllegalArgumentException("Expected parameter " + i + " to be of type " + parameterType.getName() +
+//                    ", but got a parameter of type " + parameter.getClass().getName());
+//            }
         }
         System.arraycopy(parameters, 0, this.parameters, 0, parameters.length);
+        parametersSet = true;
     }
 
     public Map<String, Object> getContextData() {
@@ -99,9 +97,15 @@
             Interceptor interceptor = interceptors.next();
             Object nextInstance = interceptor.getInstance();
             Method nextMethod = interceptor.getMethod();
+
             try {
-                Object value = nextMethod.invoke(nextInstance, this);
-                return value;
+                if (nextMethod.getParameterTypes().length == 0){
+                    Object value = nextMethod.invoke(nextInstance);
+                    return value;
+                } else {
+                    Object value = nextMethod.invoke(nextInstance, this);
+                    return value;
+                }
             } catch (InvocationTargetException e) {
                 throw unwrapInvocationTargetException(e);
             }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContext.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContext.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContext.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContext.java Fri Mar  9 22:39:49 2007
@@ -198,7 +198,7 @@
 
     static {
         states[Operation.INJECTION.ordinal()] = new InjectionMdbState();
-        states[Operation.LIFECYCLE.ordinal()] = new LifecycleMdbState();
+        states[Operation.CREATE.ordinal()] = new LifecycleMdbState();
         states[Operation.BUSINESS.ordinal()] = new BusinessTimeoutMdbState();
         states[Operation.TIMEOUT.ordinal()] = new BusinessTimeoutMdbState();
     }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java Fri Mar  9 22:39:49 2007
@@ -200,7 +200,7 @@
             // call the post construct method
             Method postConstruct = deploymentInfo.getPostConstruct();
             if (postConstruct != null){
-                callContext.setCurrentOperation(Operation.LIFECYCLE);
+                callContext.setCurrentOperation(Operation.CREATE);
                 postConstruct.invoke(bean);
             }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java Fri Mar  9 22:39:49 2007
@@ -247,7 +247,7 @@
 
 
         ThreadContext createContext = new ThreadContext(deploymentInfo, primaryKey, securityIdentity);
-        createContext.setCurrentOperation(Operation.LIFECYCLE);
+        createContext.setCurrentOperation(Operation.CREATE);
         ThreadContext oldCallContext = ThreadContext.enter(createContext);
         try {
             checkAuthorization(deploymentInfo, callMethod, securityIdentity);

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContext.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContext.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContext.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContext.java Fri Mar  9 22:39:49 2007
@@ -54,7 +54,7 @@
 
     static {
         states[Operation.INJECTION.ordinal()] = new InjectionStatelessState();
-        states[Operation.LIFECYCLE.ordinal()] = new LifecycleStatelessState();
+        states[Operation.CREATE.ordinal()] = new LifecycleStatelessState();
         states[Operation.BUSINESS.ordinal()] = new BusinessStatelessState();
         states[Operation.AFTER_BEGIN.ordinal()] = new BeforeCompletion();
         states[Operation.BEFORE_COMPLETION.ordinal()] = new BeforeCompletion();

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java?view=auto&rev=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java Fri Mar  9 22:39:49 2007
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.core.stateless;
+
+import java.util.List;
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class Instance {
+    public final Object bean;
+    public final Map<String,Object> interceptors;
+
+    public Instance(Object bean, Map<String, Object> interceptors) {
+        this.bean = bean;
+        this.interceptors = interceptors;
+    }
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java Fri Mar  9 22:39:49 2007
@@ -23,6 +23,8 @@
 import org.apache.openejb.core.Operation;
 import org.apache.openejb.core.ThreadContext;
 import org.apache.openejb.core.CoreDeploymentInfo;
+import org.apache.openejb.core.interceptor.InterceptorData;
+import org.apache.openejb.core.interceptor.InterceptorStack;
 import org.apache.openejb.core.timer.EjbTimerService;
 import org.apache.openejb.core.transaction.TransactionContainer;
 import org.apache.openejb.core.transaction.TransactionContext;
@@ -37,6 +39,7 @@
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
 import java.util.HashMap;
+import java.util.List;
 
 /**
  * @org.apache.xbean.XBean element="statelessContainer"
@@ -116,7 +119,7 @@
     public Object invoke(Object deployID, Method callMethod, Object [] args, Object primKey, Object securityIdentity) throws OpenEJBException {
         CoreDeploymentInfo deployInfo = (CoreDeploymentInfo) this.getDeploymentInfo(deployID);
         if (deployInfo == null) throw new OpenEJBException("Deployment does not exist in this container. Deployment(id='"+deployID+"'), Container(id='"+containerID+"')");
-        
+
         ThreadContext callContext = new ThreadContext(deployInfo, primKey, securityIdentity);
         ThreadContext oldCallContext = ThreadContext.enter(callContext);
         try {
@@ -163,7 +166,8 @@
     protected Object _invoke(Method callMethod, Method runMethod, Object [] args, Object bean, ThreadContext callContext)
             throws org.apache.openejb.OpenEJBException {
 
-        TransactionPolicy txPolicy = callContext.getDeploymentInfo().getTransactionPolicy(callMethod);
+        CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
+        TransactionPolicy txPolicy = deploymentInfo.getTransactionPolicy(callMethod);
         TransactionContext txContext = new TransactionContext(callContext, getTransactionManager());
         txContext.callContext = callContext;
 
@@ -171,8 +175,9 @@
 
         Object returnValue = null;
         try {
-
-            returnValue = runMethod.invoke(bean, args);
+            List<InterceptorData> interceptors = deploymentInfo.getMethodInterceptors(runMethod);
+            InterceptorStack interceptorStack = new InterceptorStack(((Instance)bean).bean, runMethod, Operation.BUSINESS, interceptors, ((Instance)bean).interceptors);
+            returnValue = interceptorStack.invoke(args);
         } catch (java.lang.reflect.InvocationTargetException ite) {// handle exceptions thrown by enterprise bean
             if (ite.getTargetException() instanceof RuntimeException) {
                 /* System Exception ****************************/
@@ -185,6 +190,16 @@
                 txPolicy.handleApplicationException(ite.getTargetException(), txContext);
             }
         } catch (Throwable re) {// handle reflection exception
+            if (re instanceof RuntimeException) {
+                /* System Exception ****************************/
+
+                txPolicy.handleSystemException(re, bean, txContext);
+            } else {
+                /* Application Exception ***********************/
+                instanceManager.poolInstance(callContext, bean);
+
+                txPolicy.handleApplicationException(re, txContext);
+            }
             /*
               Any exception thrown by reflection; not by the enterprise bean. Possible
               Exceptions are:
@@ -193,7 +208,7 @@
                 NullPointerException - if the specified object is null and the method is an instance method.
                 ExceptionInInitializerError - if the initialization provoked by this method fails.
             */
-            txPolicy.handleSystemException(re, bean, txContext);
+//            txPolicy.handleSystemException(re, bean, txContext);
         } finally {
 
             txPolicy.afterInvoke(bean, txContext);

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContext.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContext.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContext.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContext.java Fri Mar  9 22:39:49 2007
@@ -60,7 +60,7 @@
 
     static {
         states[Operation.INJECTION.ordinal()] = new InjectionStatelessState();
-        states[Operation.LIFECYCLE.ordinal()] = new LifecycleStatelessState();
+        states[Operation.CREATE.ordinal()] = new LifecycleStatelessState();
         states[Operation.BUSINESS.ordinal()] = new BusinessStatelessState();
         states[Operation.BUSINESS_WS.ordinal()] = new BusinessWsStatelessState();
         states[Operation.TIMEOUT.ordinal()] = new TimeoutStatelessState();

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java Fri Mar  9 22:39:49 2007
@@ -19,12 +19,15 @@
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.StaticRecipe;
 import org.apache.xbean.recipe.Option;
+import org.apache.xbean.recipe.ConstructionException;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.SystemException;
 import org.apache.openejb.Injection;
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.Operation;
 import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.core.interceptor.InterceptorData;
+import org.apache.openejb.core.interceptor.InterceptorStack;
 import org.apache.openejb.spi.SecurityService;
 import org.apache.openejb.util.LinkedListStack;
 import org.apache.openejb.util.SafeToolkit;
@@ -32,6 +35,7 @@
 import org.apache.openejb.util.Logger;
 
 import javax.ejb.SessionContext;
+import javax.ejb.SessionBean;
 import javax.transaction.TransactionManager;
 import javax.naming.Context;
 import javax.naming.NamingException;
@@ -39,6 +43,9 @@
 import java.rmi.RemoteException;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
 
 public class StatelessInstanceManager {
     private static final Logger logger = Logger.getInstance("OpenEJB", "org.apache.openejb.util.resources");
@@ -135,12 +142,36 @@
                         logger.warning("Injection: No such property '"+property+"' in class "+beanClass.getName());
                     }
                 }
-                callContext.setCurrentOperation(Operation.LIFECYCLE);
+
+                HashMap<String, Object> interceptorInstances = new HashMap<String, Object>();
+                for (InterceptorData interceptorData : deploymentInfo.getAllInterceptors()) {
+                    if (interceptorData.getInterceptorClass().equals(beanClass)) continue;
+
+                    Class clazz = interceptorData.getInterceptorClass();
+                    ObjectRecipe interceptorRecipe = new ObjectRecipe(clazz);
+                    try {
+                        Object interceptorInstance = interceptorRecipe.create(clazz.getClassLoader());
+                        interceptorInstances.put(clazz.getName(), interceptorInstance);
+                    } catch (ConstructionException e) {
+                        throw new Exception("Failed to create interceptor: "+clazz.getName(), e);
+                    }
+                }
+
+                interceptorInstances.put(beanClass.getName(), bean);
+
+                callContext.setCurrentOperation(Operation.CREATE);
 
                 Method postConstruct = deploymentInfo.getPostConstruct();
+
                 if (postConstruct != null){
-                    postConstruct.invoke(bean);
+                    List<InterceptorData> interceptors = deploymentInfo.getMethodInterceptors(postConstruct);
+                    if (!SessionBean.class.isAssignableFrom(beanClass)){
+                        postConstruct = null;
+                    }
+                    InterceptorStack interceptorStack = new InterceptorStack(bean, postConstruct, Operation.CREATE, interceptors, interceptorInstances);
+                    interceptorStack.invoke();
                 }
+                bean = new Instance(bean, interceptorInstances);
             } catch (Throwable e) {
                 if (e instanceof java.lang.reflect.InvocationTargetException) {
                     e = ((java.lang.reflect.InvocationTargetException) e).getTargetException();
@@ -192,8 +223,15 @@
     public void freeInstance(ThreadContext callContext, Object bean) {
         try {
             callContext.setCurrentOperation(Operation.REMOVE);
-            Method preDestroy = callContext.getDeploymentInfo().getPreDestroy();
+            CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
+            Method preDestroy = deploymentInfo.getPreDestroy();
             if (preDestroy != null){
+                List<InterceptorData> interceptors = deploymentInfo.getMethodInterceptors(preDestroy);
+                if (!SessionBean.class.isAssignableFrom(deploymentInfo.getBeanClass())){
+                    preDestroy = null;
+                }
+                InterceptorStack interceptorStack = new InterceptorStack(((Instance)bean).bean, preDestroy, Operation.REMOVE, interceptors, ((Instance)bean).interceptors);
+                interceptorStack.invoke();
                 preDestroy.invoke(bean);
             }
         } catch (Throwable re) {