[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