[jboss-cvs] JBossAS SVN: r68527 - in projects/ejb3/trunk/interceptors: src/main/java/org/jboss/ejb3/interceptors and 4 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Dec 21 16:11:56 EST 2007


Author: wolfc
Date: 2007-12-21 16:11:56 -0500 (Fri, 21 Dec 2007)
New Revision: 68527

Added:
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/ManagedObject.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/AbstractInterceptorFactory.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/BusinessMethodBeanMethodInterceptor.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InjectInterceptorsFactory.java
Modified:
   projects/ejb3/trunk/interceptors/.classpath
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/DomainClassLoader.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorSequencer.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsInterceptor.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InvocationContextInterceptor.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/BasicBean.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/unit/BasicTestRunner.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/unit/BasicTestSuite.java
   projects/ejb3/trunk/interceptors/src/test/resources/basic/jboss-aop.xml
Log:
Most interceptors are working now

Modified: projects/ejb3/trunk/interceptors/.classpath
===================================================================
--- projects/ejb3/trunk/interceptors/.classpath	2007-12-21 20:31:33 UTC (rev 68526)
+++ projects/ejb3/trunk/interceptors/.classpath	2007-12-21 21:11:56 UTC (rev 68527)
@@ -4,28 +4,28 @@
   <classpathentry kind="src" path="src/test/resources" output="eclipse-target/tests-classes" excluding="**/*.java"/>
   <classpathentry kind="output" path="eclipse-target/classes"/>
   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/apache-slide/webdavlib/2.0/webdavlib-2.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/apache-xerces/xercesImpl/2.7.1/xercesImpl-2.7.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/wutka-dtdparser/dtdparser121/1.2.1/dtdparser121-1.2.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/aop/jboss-aop/2.0.0.beta1/jboss-aop-2.0.0.beta1.jar" sourcepath="M2_REPO/org/jboss/aop/jboss-aop/2.0.0.beta1/jboss-aop-2.0.0.beta1-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/qdox/qdox/1.6/qdox-1.6.jar" sourcepath="M2_REPO/qdox/qdox/1.6/qdox-1.6-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.4/junit-4.4.jar" sourcepath="M2_REPO/junit/junit/4.4/junit-4.4-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/jboss/jbossws/jboss-jaxrpc/1.0.4.GA/jboss-jaxrpc-1.0.4.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/ant/ant/1.6.5/ant-1.6.5.jar" sourcepath="M2_REPO/ant/ant/1.6.5/ant-1.6.5-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/apache-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/jboss-common-core/2.2.1.GA/jboss-common-core-2.2.1.GA.jar" sourcepath="M2_REPO/org/jboss/jboss-common-core/2.2.1.GA/jboss-common-core-2.2.1.GA-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/jboss/javaee/jboss-transaction-api/1.0.1.20070913080910/jboss-transaction-api-1.0.1.20070913080910.jar" sourcepath="M2_REPO/org/jboss/javaee/jboss-transaction-api/1.0.1.20070913080910/jboss-transaction-api-1.0.1.20070913080910-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/jboss/microcontainer/jboss-container/2.0.0.Beta8/jboss-container-2.0.0.Beta8.jar" sourcepath="M2_REPO/org/jboss/microcontainer/jboss-container/2.0.0.Beta8/jboss-container-2.0.0.Beta8-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/javaee/jboss-ejb-api/3.0.0.20070913080910/jboss-ejb-api-3.0.0.20070913080910.jar" sourcepath="M2_REPO/org/jboss/javaee/jboss-ejb-api/3.0.0.20070913080910/jboss-ejb-api-3.0.0.20070913080910-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/jbossxb/2.0.0.CR4/jbossxb-2.0.0.CR4.jar" sourcepath="M2_REPO/org/jboss/jbossxb/2.0.0.CR4/jbossxb-2.0.0.CR4-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/aop/jboss-aop/2.0.0.beta1/jboss-aop-2.0.0.beta1.jar" sourcepath="M2_REPO/org/jboss/aop/jboss-aop/2.0.0.beta1/jboss-aop-2.0.0.beta1-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar" sourcepath="M2_REPO/junit/junit/3.8.1/junit-3.8.1-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/apache-slide/webdavlib/2.0/webdavlib-2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/apache-xerces/xml-apis/2.7.1/xml-apis-2.7.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/oswego-concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/wutka-dtdparser/dtdparser121/1.2.1/dtdparser121-1.2.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/apache-log4j/log4j/1.2.8/log4j-1.2.8.jar"/>
-  <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/jboss-common-core/2.2.1.GA/jboss-common-core-2.2.1.GA.jar" sourcepath="M2_REPO/org/jboss/jboss-common-core/2.2.1.GA/jboss-common-core-2.2.1.GA-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-core/2.0.2.GA/jboss-common-core-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-core/2.0.2.GA/jboss-common-core-2.0.2.GA-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/oswego-concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/javassist/3.6.0.GA/javassist-3.6.0.GA.jar" sourcepath="M2_REPO/org/jboss/javassist/3.6.0.GA/javassist-3.6.0.GA-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/trove/trove/2.1.1/trove-2.1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/javaee/jboss-ejb-api/3.0.0.20070913080910/jboss-ejb-api-3.0.0.20070913080910.jar" sourcepath="M2_REPO/org/jboss/javaee/jboss-ejb-api/3.0.0.20070913080910/jboss-ejb-api-3.0.0.20070913080910-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/apache-xerces/xml-apis/2.7.1/xml-apis-2.7.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/apache-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/javassist/3.6.0.GA/javassist-3.6.0.GA.jar" sourcepath="M2_REPO/org/jboss/javassist/3.6.0.GA/javassist-3.6.0.GA-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/qdox/qdox/1.6/qdox-1.6.jar" sourcepath="M2_REPO/qdox/qdox/1.6/qdox-1.6-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/jbossxb/2.0.0.CR4/jbossxb-2.0.0.CR4.jar" sourcepath="M2_REPO/org/jboss/jbossxb/2.0.0.CR4/jbossxb-2.0.0.CR4-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.0.2/activation-1.0.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/ant/ant/1.6.5/ant-1.6.5.jar" sourcepath="M2_REPO/ant/ant/1.6.5/ant-1.6.5-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/trove/trove/2.1.1/trove-2.1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-core/2.0.2.GA/jboss-common-core-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-core/2.0.2.GA/jboss-common-core-2.0.2.GA-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/jboss/jbossws/jboss-jaxrpc/1.0.4.GA/jboss-jaxrpc-1.0.4.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA-sources.jar"/>
 </classpath>
\ No newline at end of file

Added: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/ManagedObject.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/ManagedObject.java	                        (rev 0)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/ManagedObject.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+  *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.interceptors;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Indicate that this is a managed object.
+ * 
+ * A managed object will be instrumented to allow for interceptors.
+ * 
+ * Note that in most cases the annotation will be added by others, so
+ * it does not have to be explicitly added.
+ *
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+ at Inherited
+ at Documented
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.TYPE)
+public @interface ManagedObject {
+
+}


Property changes on: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/ManagedObject.java
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/AbstractInterceptorFactory.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/AbstractInterceptorFactory.java	                        (rev 0)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/AbstractInterceptorFactory.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+  *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.interceptors.aop;
+
+import org.jboss.aop.Advisor;
+import org.jboss.aop.InstanceAdvisor;
+import org.jboss.aop.advice.AspectFactory;
+import org.jboss.aop.joinpoint.Joinpoint;
+
+/**
+ * An aspect factory that can do nothing.
+ *
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public abstract class AbstractInterceptorFactory implements AspectFactory
+{
+   public Object createPerClass(Advisor advisor)
+   {
+      throw new IllegalStateException("Per class scope not supported");
+   }
+
+   public Object createPerInstance(Advisor advisor, InstanceAdvisor instanceAdvisor)
+   {
+      throw new IllegalStateException("Per instance scope not supported on " + this);
+   }
+
+   public Object createPerJoinpoint(Advisor advisor, Joinpoint jp)
+   {
+      throw new IllegalStateException("Per joinpoint scope not supported");
+   }
+
+   public Object createPerJoinpoint(Advisor advisor, InstanceAdvisor instanceAdvisor, Joinpoint jp)
+   {
+      throw new IllegalStateException("Per joinpoint instance scope not supported");
+   }
+
+   public Object createPerVM()
+   {
+      throw new IllegalStateException("Per vm scope not supported");
+   }
+   
+   public String getName()
+   {
+      return getClass().getName();
+   }
+}


Property changes on: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/AbstractInterceptorFactory.java
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/BusinessMethodBeanMethodInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/BusinessMethodBeanMethodInterceptor.java	                        (rev 0)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/BusinessMethodBeanMethodInterceptor.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -0,0 +1,83 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+  *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.interceptors.aop;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+import javax.interceptor.InvocationContext;
+
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.joinpoint.Invocation;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public class BusinessMethodBeanMethodInterceptor implements Interceptor
+{
+   private static final Class<?> PARAMETER_TYPES[] = { InvocationContext.class };
+   
+   private Method method;
+   
+   /**
+    * 
+    * @param beanMethodInterceptorMethod    a bean method interceptor on the bean itself
+    */
+   public BusinessMethodBeanMethodInterceptor(Method beanMethodInterceptorMethod)
+   {
+      assert beanMethodInterceptorMethod != null : "businessMethodInterceptorMethod is null";
+      assert beanMethodInterceptorMethod.getReturnType() == Object.class : "return type must be Object " + beanMethodInterceptorMethod;
+      assert Arrays.equals(beanMethodInterceptorMethod.getParameterTypes(), PARAMETER_TYPES) : "wrong parameter signature";
+      // Ignore throw clause
+      
+      this.method = beanMethodInterceptorMethod;
+   }
+
+   public String getName()
+   {
+      return "BusinessMethodBeanMethodInterceptor";
+   }
+
+   public Object invoke(final Invocation invocation) throws Throwable
+   {
+      final InvocationContext ctx = InvocationContextInterceptor.getInvocationContext(invocation);
+      try
+      {
+         method.setAccessible(true);
+         final Object args[] = { ctx };
+         return method.invoke(ctx.getTarget(), args);
+      }
+      catch(InvocationTargetException e)
+      {
+         throw e.getCause();
+      }
+   }
+
+   public String toString()
+   {
+      return method.toString();
+   }
+}


Property changes on: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/BusinessMethodBeanMethodInterceptor.java
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/DomainClassLoader.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/DomainClassLoader.java	2007-12-21 20:31:33 UTC (rev 68526)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/DomainClassLoader.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -33,7 +33,6 @@
 import java.security.ProtectionDomain;
 import java.security.cert.Certificate;
 
-import org.jboss.aop.Advised;
 import org.jboss.aop.Domain;
 import org.jboss.ejb3.interceptors.lang.BootstrapClassLoader;
 import org.jboss.logging.Logger;
@@ -194,7 +193,7 @@
          // Define the class
          Class<?> cls = defineClassFromBytes(name, classBytes, resolve);
          if(resolve) resolveClass(cls);
-         assert Advised.class.isAssignableFrom(cls) : "Class " + cls + " is not really transformed";
+         //assert Advised.class.isAssignableFrom(cls) : "Class " + cls + " is not really transformed";
          return cls;
       }
       catch(ClassNotFoundException e)

Added: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InjectInterceptorsFactory.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InjectInterceptorsFactory.java	                        (rev 0)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InjectInterceptorsFactory.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -0,0 +1,121 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+  *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.interceptors.aop;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.interceptor.ExcludeClassInterceptors;
+
+import org.jboss.aop.Advisor;
+import org.jboss.aop.InstanceAdvisor;
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.joinpoint.ConstructorJoinpoint;
+import org.jboss.aop.joinpoint.Joinpoint;
+import org.jboss.aop.joinpoint.MethodJoinpoint;
+import org.jboss.logging.Logger;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public class InjectInterceptorsFactory extends AbstractInterceptorFactory
+{
+   private static final Logger log = Logger.getLogger(InjectInterceptorsFactory.class);
+   
+   public InjectInterceptorsFactory()
+   {
+      log.debug("new InjectInterceptorsFactory");
+   }
+   
+   /**
+    * Generate the proper interceptor chain based on the spec interceptors.
+    */
+   @Override
+   public Object createPerJoinpoint(Advisor advisor, InstanceAdvisor instanceAdvisor, Joinpoint jp)
+   {
+      assert advisor != null;
+      assert instanceAdvisor != null;
+      assert jp instanceof MethodJoinpoint || jp instanceof ConstructorJoinpoint;
+      
+      log.debug("Create interceptor chain for " + instanceAdvisor.getClass().getName() + "@" + System.identityHashCode(instanceAdvisor) + " on " + jp);
+      
+      /*
+      defaultInterceptors = ...;
+      classInterceptors = ...;
+      businessMethodInterceptors = ...;
+      beanInterceptor = ...;
+      */
+      if(jp instanceof MethodJoinpoint)
+      {
+         // aroundInvoke
+         
+         Method method = ((MethodJoinpoint) jp).getMethod();
+         
+         List<Interceptor> interceptors = new ArrayList<Interceptor>() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public boolean addAll(Collection<? extends Interceptor> c)
+            {
+               if(c == null) return false;
+               return super.addAll(c);
+            }
+         };
+         // TODO: implement default interceptors
+//         if(!isIgnoreDefaultInterceptors(advisor, jp))
+//            interceptors.addAll(defaultInterceptors);
+         if(!isExcludeClassInterceptors(advisor, method))
+            interceptors.addAll(InterceptorsFactory.getClassInterceptors(instanceAdvisor));
+         interceptors.addAll(InterceptorsFactory.getBusinessMethodInterceptors(instanceAdvisor, method));
+         interceptors.addAll(InterceptorsFactory.getBeanInterceptors(instanceAdvisor));
+         
+         log.debug("interceptors " + interceptors);
+         
+         // TODO: total ordering (EJB 3 12.8.2.1 and @Interceptors with all)
+         // FIXME
+         return new InterceptorSequencer(interceptors);
+      }
+      else
+      {
+         // postConstruct
+         
+         // FIXME: currently still handled by InterceptorsFactory
+         
+         return new InterceptorSequencer(new Interceptor[0]);
+      }
+   }
+   
+   private static final boolean isExcludeClassInterceptors(Advisor advisor, Method method)
+   {
+      return advisor.hasAnnotation(method, ExcludeClassInterceptors.class);
+   }
+   
+   public String getName()
+   {
+      return "InjectInterceptorsFactory";
+   }
+}


Property changes on: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InjectInterceptorsFactory.java
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorSequencer.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorSequencer.java	2007-12-21 20:31:33 UTC (rev 68526)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorSequencer.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -21,8 +21,12 @@
  */
 package org.jboss.ejb3.interceptors.aop;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.logging.Logger;
 
 /**
  * Invokes some interceptors in sequence.
@@ -32,22 +36,45 @@
  */
 public class InterceptorSequencer implements Interceptor 
 {
+   private static final Logger log = Logger.getLogger(InterceptorSequencer.class);
+   
    private Interceptor[] interceptors;
    
+   public InterceptorSequencer(List<Interceptor> interceptors)
+   {
+      this(interceptors.toArray(new Interceptor[0]));
+   }
+   
    public InterceptorSequencer(Interceptor interceptors[])
    {
+      assert interceptors != null;
+      
+      //log.debug("InterceptorSequencer");
       this.interceptors = interceptors;
    }
    
+   public Object aroundInvoke(Invocation invocation) throws Throwable
+   {
+      log.debug("aroundInvoke " + invocation);
+      return invoke(invocation);
+   }
+   
    public String getName()
    {
       // TODO: might need a dynamic name
       return "InterceptorSequence";
    }
 
+   @Deprecated
    public Object invoke(Invocation invocation) throws Throwable
    {
+      if(log.isTraceEnabled()) log.trace("interceptors " + Arrays.toString(interceptors));
       Invocation newInvocation = invocation.getWrapper(interceptors);
       return newInvocation.invokeNext();
    }
+   
+   public Object postConstruct(Invocation invocation) throws Throwable
+   {
+      return invoke(invocation);
+   }
 }

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java	2007-12-21 20:31:33 UTC (rev 68526)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -32,9 +32,9 @@
 import org.jboss.aop.Advised;
 import org.jboss.aop.Advisor;
 import org.jboss.aop.InstanceAdvisor;
-import org.jboss.aop.advice.AspectFactory;
 import org.jboss.aop.advice.Interceptor;
-import org.jboss.aop.joinpoint.Joinpoint;
+import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.aop.joinpoint.MethodInvocation;
 import org.jboss.ejb3.interceptors.lang.ClassHelper;
 import org.jboss.logging.Logger;
 
@@ -44,22 +44,17 @@
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
  * @version $Revision: $
  */
-public class InterceptorsFactory implements AspectFactory
+public class InterceptorsFactory extends AbstractInterceptorFactory
 {
    private static final Logger log = Logger.getLogger(InterceptorsFactory.class);
    
-   public Object createPerClass(Advisor advisor)
-   {
-      throw new IllegalStateException("Only per instance scope is supported");
-   }
-
    public Object createPerInstance(Advisor advisor, InstanceAdvisor instanceAdvisor)
    {
       try
       {
          log.debug("createPerInstance");
-         log.debug(" advisor " + advisor.getName());
-         log.debug(" instanceAdvisor " + instanceAdvisor);
+         log.debug(" advisor " + advisor.getClass().getName());
+         log.debug(" instanceAdvisor " + toString(instanceAdvisor));
          
          Interceptors interceptorsAnnotation = (Interceptors) advisor.resolveAnnotation(Interceptors.class);
          assert interceptorsAnnotation != null : "interceptors annotation not found"; // FIXME: not correct, bean can be without interceptors
@@ -69,9 +64,10 @@
          {
             Object interceptor = interceptorClass.newInstance();
             Advisor interceptorAdvisor = ((Advised) interceptor)._getAdvisor();
-            log.info("interceptorAdvisor = " + interceptorAdvisor.getName());
+            log.debug("  interceptorAdvisor = " + interceptorAdvisor.getName());
             InstanceAdvisor interceptorInstanceAdvisor = ((Advised) interceptor)._getInstanceAdvisor();
-            log.info("interceptorInstanceAdvisor = " + interceptorInstanceAdvisor);
+            log.debug("  interceptorInstanceAdvisor = " + interceptorInstanceAdvisor.getClass().getName());
+            // TODO: should be only non-overriden methods (EJB 3 12.4.1 last bullet)
             for(Method method : ClassHelper.getAllMethods(interceptorClass))
             {
                if(interceptorAdvisor.hasAnnotation(method, PostConstruct.class))
@@ -88,16 +84,17 @@
          }
          
          Class<?> beanClass = advisor.getClazz();
+         List<Interceptor> beanInterceptors = new ArrayList<Interceptor>();
          for(Method beanMethod : ClassHelper.getAllMethods(beanClass))
          {
             interceptorsAnnotation = (Interceptors) advisor.resolveAnnotation(beanMethod, Interceptors.class);
             if(interceptorsAnnotation != null)
             {
                List<Interceptor> businessMethodInterceptors = new ArrayList<Interceptor>();
-               // TODO: use visitors
+               // TODO: use visitors?
                for(Class<?> interceptorClass : interceptorsAnnotation.value())
                {
-                  // TODO: do not create perse, we might already have done that
+                  // FIXME: do not create perse, we might already have done that
                   Object interceptor = interceptorClass.newInstance();
                   Advisor interceptorAdvisor = ((Advised) interceptor)._getAdvisor();
                   for(Method method : ClassHelper.getAllMethods(interceptorClass))
@@ -115,17 +112,25 @@
                   }
                }
                assert businessMethodInterceptors.size() > 0 : "TODO: lucky guess";
-               instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, beanMethod, businessMethodInterceptors.toArray(new Interceptor[0]));
+               instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, beanMethod, businessMethodInterceptors);
             }
+            
+            if(advisor.hasAnnotation(beanMethod, AroundInvoke.class))
+            {
+               beanInterceptors.add(new BusinessMethodBeanMethodInterceptor(beanMethod));
+            }
          }
+         log.debug("Found bean interceptors " + beanInterceptors);
+         instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, "beanInterceptors", beanInterceptors);
          
-         log.debug("classInterceptors " + classInterceptors);
+         log.debug("Found class interceptors " + classInterceptors);
          // Class Interceptors
-         instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, "classInterceptors", classInterceptors.toArray(new Interceptor[0]));
+         instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, "classInterceptors", classInterceptors);
          
          // Put the postConstructs interceptors here in the chain
          // TODO: why? We may need more control
          return new InterceptorSequencer(postConstructs.toArray(new Interceptor[0]));
+         //return null;
       }
       catch(InstantiationException e)
       {
@@ -142,25 +147,42 @@
       }
    }
 
-   public Object createPerJoinpoint(Advisor advisor, Joinpoint jp)
+   @SuppressWarnings("unchecked")
+   public static List<Interceptor> getBeanInterceptors(InstanceAdvisor instanceAdvisor)
    {
-      throw new IllegalStateException("Only per instance scope is supported");
+      return (List<Interceptor>) instanceAdvisor.getMetaData().getMetaData(InterceptorsFactory.class, "beanInterceptors");
    }
-
-   public Object createPerJoinpoint(Advisor advisor, InstanceAdvisor instanceAdvisor, Joinpoint jp)
+   
+   @SuppressWarnings("unchecked")
+   @Deprecated
+   public static Interceptor[] getBusinessMethodInterceptors(MethodInvocation invocation)
    {
-      log.warn("Only per instance scope is supported");
-      return createPerInstance(advisor, instanceAdvisor);
+      List<Interceptor> list = (List<Interceptor>) invocation.getMetaData(InterceptorsFactory.class, invocation.getActualMethod());
+      if(list == null) return null;
+      return list.toArray(new Interceptor[0]);
    }
-
-   public Object createPerVM()
+   
+   @SuppressWarnings("unchecked")
+   public static List<Interceptor> getBusinessMethodInterceptors(InstanceAdvisor instanceAdvisor, Method businessMethod)
    {
-      throw new IllegalStateException("Only per instance scope is supported");
+      return (List<Interceptor>) instanceAdvisor.getMetaData().getMetaData(InterceptorsFactory.class, businessMethod);
    }
-
-   public String getName()
+   
+   @SuppressWarnings("unchecked")
+   @Deprecated
+   public static Interceptor[] getClassInterceptors(Invocation invocation)
    {
-      return "InterceptorsFactory";
+      return ((List<Interceptor>) invocation.getMetaData(InterceptorsFactory.class, "classInterceptors")).toArray(new Interceptor[0]);
    }
-
+   
+   @SuppressWarnings("unchecked")
+   public static List<Interceptor> getClassInterceptors(InstanceAdvisor instanceAdvisor)
+   {
+      return (List<Interceptor>) instanceAdvisor.getMetaData().getMetaData(InterceptorsFactory.class, "classInterceptors");
+   }
+   
+   private String toString(Object obj)
+   {
+      return obj.getClass().getName() + "@" + System.identityHashCode(obj);
+   }
 }

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsInterceptor.java	2007-12-21 20:31:33 UTC (rev 68526)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsInterceptor.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -40,20 +40,19 @@
    
    public InterceptorsInterceptor()
    {
-      log.debug("InterceptorsInterceptor");
+      //log.debug("InterceptorsInterceptor");
    }
    
    public Object invokeBusinessMethodInterceptors(Invocation invocation) throws Throwable
    {
       assert invocation instanceof MethodInvocation : "Can only have business method interceptors on a method invocation";
-      MethodInvocation mi = (MethodInvocation) invocation;
-      Interceptor interceptors[] = (Interceptor[]) invocation.getMetaData(InterceptorsFactory.class, mi.getMethod());
+      Interceptor interceptors[] = InterceptorsFactory.getBusinessMethodInterceptors((MethodInvocation) invocation);
       return invocation.getWrapper(interceptors).invokeNext();
    }
    
    public Object invokeClassInterceptors(Invocation invocation) throws Throwable
    {
-      Interceptor interceptors[] = (Interceptor[]) invocation.getMetaData(InterceptorsFactory.class, "classInterceptors");
+      Interceptor interceptors[] = InterceptorsFactory.getClassInterceptors(invocation);
       return invocation.getWrapper(interceptors).invokeNext();
    }
    
@@ -63,4 +62,10 @@
       log.debug("advisor " + invocation.getAdvisor().getName());
       return invocation.invokeNext();
    }
+   
+   public Object postConstruct(Invocation invocation) throws Throwable
+   {
+      log.warn("postConstruct is NYI");
+      return null;
+   }
 }

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InvocationContextInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InvocationContextInterceptor.java	2007-12-21 20:31:33 UTC (rev 68526)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InvocationContextInterceptor.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -38,13 +38,22 @@
  */
 public class InvocationContextInterceptor
 {
-   public static final String INVOCATION_CONTEXT_KEY = InvocationContextInterceptor.class.getName() + ".invocationContext";
+   private static final String INVOCATION_CONTEXT_KEY = InvocationContextInterceptor.class.getName() + ".invocationContext";
 
+   /**
+    * Obtain the invocation context associated with the given invocation.
+    * 
+    * @param invocation     the AOP invocation
+    * @return               the EJB invocation context
+    */
    public static InvocationContext getInvocationContext(Invocation invocation)
    {
       InvocationContext ctx = (InvocationContext) invocation.getResponseAttachment(INVOCATION_CONTEXT_KEY);
       if(ctx == null)
          throw new IllegalStateException("InvocationContextInterceptor must be in the interceptor chain");
+      //assert ctx.invocation == invocation : "using InvocationContextInterceptor from a different bind";
+      // FIXME: is this allowed?
+      ctx.invocation = invocation;
       return ctx;
    }
    
@@ -58,7 +67,7 @@
       assert invocation instanceof MethodInvocation : "InvocationContextInterceptor.fillMethod only works on method invocation " + invocation;
       MethodInvocation mi = (MethodInvocation) invocation;
       InvocationContext ctx = getInvocationContext(invocation);
-      ctx.setBusinessMethodInvocation(mi.getActualMethod(), mi.getArguments());
+      ctx.setBusinessMethodInvocation(mi.getMethod(), mi.getArguments());
       return invocation.invokeNext();
    }
    
@@ -80,7 +89,8 @@
       finally
       {
          // TODO: I can't remove the ctx, invalidate it somehow
-         invocation.addResponseAttachment(INVOCATION_CONTEXT_KEY, null);
+         //invocation.addResponseAttachment(INVOCATION_CONTEXT_KEY, null);
+         invocation.getResponseContextInfo().remove(INVOCATION_CONTEXT_KEY);
       }
    }
 
@@ -152,5 +162,10 @@
          this.params = params;
          ((MethodInvocation) invocation).setArguments(params);
       }
+      
+      public String toString()
+      {
+         return invocation.toString();
+      }
    }
 }

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/BasicBean.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/BasicBean.java	2007-12-21 20:31:33 UTC (rev 68526)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/BasicBean.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -31,6 +31,8 @@
  * The basic bean has one class interceptor: BasicInterceptor
  * 
  * On the intercepter method there is a business method interceptor: BasicMethodInterceptor
+ * 
+ * And it has bean method interceptors: aroundInvoke
  *
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
  * @version $Revision: $
@@ -52,6 +54,10 @@
    Object aroundInvoke(InvocationContext ctx) throws Exception
    {
       log.debug("aroundInvoke " + ctx);
+      if(ctx.getTarget() != this)
+         throw new IllegalStateException("target is not this");
+      if(ctx.getMethod().getDeclaringClass() != getClass())
+         throw new IllegalStateException("method " + ctx.getMethod() + " not of this class (" + ctx.getMethod().getDeclaringClass() + " != " +  getClass() + ")");
       aroundInvokes++;
       return ctx.proceed();
    }

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/unit/BasicTestRunner.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/unit/BasicTestRunner.java	2007-12-21 20:31:33 UTC (rev 68526)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/unit/BasicTestRunner.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -23,12 +23,14 @@
 
 import java.util.Arrays;
 
+import junit.framework.TestCase;
+
+import org.jboss.aop.InstanceAdvised;
+import org.jboss.ejb3.interceptors.aop.Destructable;
 import org.jboss.ejb3.test.interceptors.basic.BasicBean;
 import org.jboss.ejb3.test.interceptors.basic.BasicInterceptor;
 import org.jboss.ejb3.test.interceptors.basic.BasicMethodInterceptor;
 
-import junit.framework.TestCase;
-
 /**
  * This one must run within a domain class loader.
  * 
@@ -44,6 +46,7 @@
       assertEquals(0, BasicInterceptor.postConstructs);
       
       BasicBean bean = new BasicBean();
+      System.out.println("instanceAdvisor = " + ((InstanceAdvised) bean)._getInstanceAdvisor());
       
       assertEquals("BasicInterceptor postConstruct must have been called once", 1, BasicInterceptor.postConstructs);
       

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/unit/BasicTestSuite.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/unit/BasicTestSuite.java	2007-12-21 20:31:33 UTC (rev 68526)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/basic/unit/BasicTestSuite.java	2007-12-21 21:11:56 UTC (rev 68527)
@@ -102,7 +102,7 @@
    public static Test suite() throws Exception
    {
       BasicTestSuite suite = new BasicTestSuite();
-      suite.addTestSuite(BasicTestRunner.class);
+      suite.addTestSuite("org.jboss.ejb3.test.interceptors.basic.unit.BasicTestRunner");
       return suite;
    }
    
@@ -113,7 +113,7 @@
       // trick or treat
       try
       {
-         super.addTestSuite(classLoader.loadClass(testClass.getName()));
+         addTestSuite(testClass.getName());
       }
       catch(final ClassNotFoundException e)
       {
@@ -127,4 +127,11 @@
          super.addTest(test);
       }
    }
+
+   @SuppressWarnings("unchecked")
+   public void addTestSuite(String testClassName) throws ClassNotFoundException
+   {
+      // trick or treat
+      super.addTestSuite((Class<? extends TestCase>) classLoader.loadClass(testClassName));
+   }
 }

Modified: projects/ejb3/trunk/interceptors/src/test/resources/basic/jboss-aop.xml
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/resources/basic/jboss-aop.xml	2007-12-21 20:31:33 UTC (rev 68526)
+++ projects/ejb3/trunk/interceptors/src/test/resources/basic/jboss-aop.xml	2007-12-21 21:11:56 UTC (rev 68527)
@@ -1,37 +1,47 @@
 <aop>
 	<aspect name="AroundInvokeInterceptor" class="org.jboss.ejb3.interceptors.aop.AroundInvokeInterceptor" scope="PER_INSTANCE"/>
+	<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="InterceptorsInterceptor" class="org.jboss.ejb3.interceptors.aop.InterceptorsInterceptor" scope="PER_INSTANCE"/>
 	<aspect name="InvocationContextInterceptor" class="org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor" scope="PER_VM"/>
 	<aspect name="PostConstructInterceptor" class="org.jboss.ejb3.interceptors.aop.PostConstructInterceptor" scope="PER_INSTANCE"/>
 	
+	<!-- Create AOP interceptors out of spec interceptors -->
+	<aspect name="ClassInterceptors" factory="org.jboss.ejb3.interceptors.aop.InjectInterceptorsFactory" scope="PER_INSTANCE">
+		<attribute name="interceptors" value="class"/>
+	</aspect>
+	<aspect name="DefaultInterceptors" factory="org.jboss.ejb3.interceptors.aop.DefaultInterceptorsFactory" scope="PER_INSTANCE"/>
+	
+	<!-- TODO: deprecated -->
 	<interceptor name="BootstrapInterceptor" class="org.jboss.ejb3.interceptors.aop.BootstrapInterceptor" scope="PER_VM"/>
+	
+	<!-- test only -->
 	<interceptor name="LoggingInterceptor" class="org.jboss.ejb3.test.interceptors.common.aop.LoggingInterceptor" scope="PER_VM"/>
 	
-	<!-- Not needed we can do this in the domain itself 
-	<bind pointcut="construction(org.jboss.ejb3.interceptors.aop.ClassContainer->new(..))">
-		<interceptor-ref name="BootstrapInterceptor"/>
-	</bind>
-	-->
-	
-	<!-- This one works
-	<bind pointcut="construction(org.jboss.ejb3.test.*->new(..))">
-		<interceptor-ref name="BootstrapInterceptor"/>
-	</bind>
-	
-	<bind pointcut="execution(org.jboss.ejb3.test.*->new(..))">
-		<interceptor-ref name="BootstrapInterceptor"/>
-	</bind>
-	
-	<bind pointcut="execution(* org.jboss.ejb3.test.*->*(..))">
-		<interceptor-ref name="BootstrapInterceptor"/>
-	</bind>
-	-->
-	
 	<!-- TODO: this is actually the bootstrap container -->
 	<domain name="InterceptorContainer">
+		<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"/>
+		
+		<!-- Does the class define class interceptors or business method interceptors -->
+		<!-- TODO: or we have defaultInterceptors -->
+		<annotation-introduction expr="constructor(@javax.interceptor.Interceptors->new(..)) OR has(* *->@javax.interceptor.Interceptors(..))">
+			@org.jboss.ejb3.interceptors.ManagedObject
+		</annotation-introduction>
+		
+		<!-- 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(..))"/ -->
 		<prepare expr="all(*)"/>
 		
+		<!-- Make sure we can _preDestroy -->
+		<introduction expr="constructor(@org.jboss.ejb3.interceptors.ManagedObject->new(..))">
+			<interfaces>org.jboss.ejb3.interceptors.aop.Destructable</interfaces>
+		</introduction>
+		
 		<!-- Why does this not work? -->
 		<!-- 
 		<bind pointcut="execution(@javax.interceptor.Interceptors->new(..))">
@@ -40,25 +50,24 @@
 		</bind>
 		-->
 		
-		<!-- Make sure we can _preDestroy -->
-		<introduction expr="constructor(@javax.interceptor.Interceptors->new(..)) OR has(* *->@javax.interceptor.Interceptors(..))">
-			<interfaces>org.jboss.ejb3.interceptors.aop.Destructable</interfaces>
-		</introduction>
-		
 		<!-- This one does work -->
 		<!-- Setup AOP interceptors based on spec interceptors -->
-		<bind pointcut="construction(@javax.interceptor.Interceptors->new(..)) OR has(* *->@javax.interceptor.Interceptors(..))">
-			<interceptor-ref name="LoggingInterceptor"/>
+		<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 -->
 			<around name="setup" aspect="InvocationContextInterceptor"/>
-			<!-- 
-			<interceptor-ref name="InterceptorsFactory"/>
-			-->
 			<around name="invoke" aspect="InterceptorsFactory"/>
-			<!-- 
-			<after name="invoke" aspect="PostConstructInterceptor"/>
-			-->
 		</bind>
 		
+		<!-- Lifecycle Event Callbacks (EJB 3 12.4) -->
+		
+		<bind pointcut="construction(@org.jboss.ejb3.interceptors.ManagedObject->new(..))">
+			<interceptor-ref name="LoggingInterceptor"/>
+			<around name="setup" aspect="InvocationContextInterceptor"/>
+			<around name="postConstruct" aspect="InjectInterceptorsFactory"/>
+		</bind>
+		
 		<!-- TODO: Junk
 		<bind pointcut="execution(* *->@javax.interceptor.Interceptors(..))">
 			<interceptor-ref name="LoggingInterceptor"/>
@@ -75,7 +84,7 @@
 		</bind>
 		-->
 		
-		<bind pointcut="execution(* *->*(..)) AND (has(* *->@javax.interceptor.Interceptors(..)) OR has(@javax.interceptor.Interceptors->new(..)))">
+		<bind pointcut="execution(* @org.jboss.ejb3.interceptors.ManagedObject->*(..))">
 			<around name="setup" aspect="InvocationContextInterceptor"/>
 			<around name="fillMethod" aspect="InvocationContextInterceptor"/>
 		</bind>
@@ -86,14 +95,24 @@
 		</bind>
 		-->
 		
+		<!-- TODO: Deprecated, use InjectInterceptorsFactory
 		<bind pointcut="!execution(* *->@javax.interceptor.ExcludeClassInterceptors(..))">
 			<around name="invokeClassInterceptors" aspect="InterceptorsInterceptor"/>
 		</bind>
+		-->
 		
+		<!-- 
 		<bind pointcut="execution(* *->*(..)) AND has(* *->@javax.interceptor.Interceptors(..))">
 			<around name="invokeBusinessMethodInterceptors" aspect="InterceptorsInterceptor"/>
 		</bind>
+		-->
 		
+		<bind pointcut="execution(* @org.jboss.ejb3.interceptors.ManagedObject->*(..)) AND !beanLifecycleCallbackMethods">
+			<around name="setup" aspect="InvocationContextInterceptor"/>
+			<around name="fillMethod" aspect="InvocationContextInterceptor"/>
+			<around name="aroundInvoke" aspect="InjectInterceptorsFactory"/>
+		</bind>
+		
 		<!-- TODO: Junk: Log everything 
 		<bind pointcut="execution(* *->*(..)) AND !execution(* org.jboss.ejb3.test.interceptors.common.aop.LoggingInterceptor->*(..))">
 			<interceptor-ref name="LoggingInterceptor"/>




More information about the jboss-cvs-commits mailing list