You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2007/03/10 07:39:51 UTC
svn commit: r516657 [1/2] - in /incubator/openejb/trunk/openejb3:
container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/
container/openejb-core/src/main/java/org/apache/openejb/config/
container/openejb-core/src/main/java/org/apache...
Author: dblevins
Date: Fri Mar 9 22:39:49 2007
New Revision: 516657
URL: http://svn.apache.org/viewvc?view=rev&rev=516657
Log:
Full Interceptor support. Currently wired into just Stateless beans.
Added:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java (contents, props changed)
- copied, changed from r515840, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LifecycleCallbackInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/InterceptorBindingInfoComparatorTest.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInterceptorTest.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/CallbackMethod.java
Removed:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LifecycleCallbackInfo.java
Modified:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBuilder.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/MethodInterceptorInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/StatefulBeanInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/Operation.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/Interceptor.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorData.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorStack.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/ReflectionInvocationContext.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContext.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContext.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContext.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/iTest.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AroundInvoke.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AssemblyDescriptor.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/Interceptor.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/InterceptorBinding.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/InterceptorOrder.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/LifecycleCallback.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/NamedMethod.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/StatelessBean.java
incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/beans/DatabaseBean.java
incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/BMTStatelessAllowedOperationsTests.java
incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessAllowedOperationsTests.java
incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessLocalTestSuite.java
incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessTestSuite.java
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Fri Mar 9 22:39:49 2007
@@ -308,6 +308,10 @@
return new ArrayList<AppInfo>(deployedApplications.values());
}
+ public void createApplication(EjbJarInfo ejbJar) throws NamingException, IOException, OpenEJBException {
+ createEjbJar(ejbJar);
+ }
+
public void createEjbJar(EjbJarInfo ejbJar) throws NamingException, IOException, OpenEJBException {
AppInfo appInfo = new AppInfo();
appInfo.jarPath = ejbJar.jarPath;
@@ -315,6 +319,10 @@
createApplication(appInfo);
}
+ public void createApplication(EjbJarInfo ejbJar, ClassLoader classLoader) throws NamingException, IOException, OpenEJBException {
+ createEjbJar(ejbJar, classLoader);
+ }
+
public void createEjbJar(EjbJarInfo ejbJar, ClassLoader classLoader) throws NamingException, IOException, OpenEJBException {
AppInfo appInfo = new AppInfo();
appInfo.jarPath = ejbJar.jarPath;
@@ -918,4 +926,5 @@
return thread;
}
}
+
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java Fri Mar 9 22:39:49 2007
@@ -104,7 +104,7 @@
public void applySecurityRoleReference(CoreDeploymentInfo deployment, EnterpriseBeanInfo beanInfo, AssemblerTool.RoleMapping roleMapping) {
for (SecurityRoleReferenceInfo roleRef : beanInfo.securityRoleReferences) {
List<String> physicalRoles = roleMapping.getPhysicalRoles(roleRef.roleLink);
- deployment.addSecurityRoleReference(roleRef.roleName, physicalRoles);
+//HACK deployment.addSecurityRoleReference(roleRef.roleName, physicalRoles);
}
}
Copied: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java (from r515840, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LifecycleCallbackInfo.java)
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java?view=diff&rev=516657&p1=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LifecycleCallbackInfo.java&r1=515840&p2=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LifecycleCallbackInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java Fri Mar 9 22:39:49 2007
@@ -20,7 +20,7 @@
/**
* @version $Revision$ $Date$
*/
-public class LifecycleCallbackInfo extends InfoObject {
+public class CallbackInfo extends InfoObject {
public String className;
public String method;
}
Propchange: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CallbackInfo.java
------------------------------------------------------------------------------
svn:keywords = Date Rev Author Id Revision HeadURL
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java Fri Mar 9 22:39:49 2007
@@ -31,7 +31,7 @@
public JndiEncInfo jndiEnc;
- public final List<LifecycleCallbackInfo> postConstruct = new ArrayList<LifecycleCallbackInfo>();
- public final List<LifecycleCallbackInfo> preDestroy = new ArrayList<LifecycleCallbackInfo>();
+ public final List<CallbackInfo> postConstruct = new ArrayList<CallbackInfo>();
+ public final List<CallbackInfo> preDestroy = new ArrayList<CallbackInfo>();
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java Fri Mar 9 22:39:49 2007
@@ -27,6 +27,7 @@
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
+import java.util.ArrayList;
/**
* @version $Revision$ $Date$
@@ -45,11 +46,15 @@
public HashMap<String, DeploymentInfo> build(EjbJarInfo ejbJar, Map<String, Map<String, EntityManagerFactory>> allFactories) throws OpenEJBException {
HashMap<String, DeploymentInfo> deployments = new HashMap<String, DeploymentInfo>();
+ InterceptorBindingBuilder interceptorBindingBuilder = new InterceptorBindingBuilder(classLoader, ejbJar);
for (EnterpriseBeanInfo ejbInfo: ejbJar.enterpriseBeans) {
try {
- EnterpriseBeanBuilder deploymentBuilder = new EnterpriseBeanBuilder(classLoader, ejbInfo, ejbJar.moduleId, ejbJar.defaultInterceptors,allFactories);
+ EnterpriseBeanBuilder deploymentBuilder = new EnterpriseBeanBuilder(classLoader, ejbInfo, ejbJar.moduleId, new ArrayList(),allFactories);
CoreDeploymentInfo deployment = (CoreDeploymentInfo) deploymentBuilder.build();
+
+ interceptorBindingBuilder.build(deployment, ejbInfo);
+
deployment.setJarPath(ejbJar.jarPath);
deployments.put(ejbInfo.ejbDeploymentId, deployment);
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java Fri Mar 9 22:39:49 2007
@@ -23,9 +23,11 @@
public String moduleId;
public String jarPath;
public final List<EnterpriseBeanInfo> enterpriseBeans = new ArrayList<EnterpriseBeanInfo>();
- public final List<InterceptorInfo> defaultInterceptors = new ArrayList<InterceptorInfo>();
-
+
public final List<SecurityRoleInfo> securityRoles = new ArrayList<SecurityRoleInfo>();
public final List<MethodPermissionInfo> methodPermissions= new ArrayList<MethodPermissionInfo>();
public final List<MethodTransactionInfo> methodTransactions = new ArrayList<MethodTransactionInfo>();
+ public final List<InterceptorInfo> interceptors = new ArrayList<InterceptorInfo>();
+ public final List<InterceptorBindingInfo> interceptorBindings = new ArrayList<InterceptorBindingInfo>();
+
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java Fri Mar 9 22:39:49 2007
@@ -42,13 +42,13 @@
protected static final Messages messages = new Messages("org.apache.openejb.util.resources");
private final EnterpriseBeanInfo bean;
private final String moduleId;
- private final List<InterceptorInfo> defaultInterceptors;
+ private final List<String> defaultInterceptors;
private final BeanType ejbType;
private final ClassLoader cl;
private final Map<String, Map<String, EntityManagerFactory>> factories;
private List<Exception> warnings = new ArrayList<Exception>();
- public EnterpriseBeanBuilder(ClassLoader cl, EnterpriseBeanInfo bean, String moduleId, List<InterceptorInfo> defaultInterceptors, Map<String, Map<String, EntityManagerFactory>> factories) {
+ public EnterpriseBeanBuilder(ClassLoader cl, EnterpriseBeanInfo bean, String moduleId, List<String> defaultInterceptors, Map<String, Map<String, EntityManagerFactory>> factories) {
this.bean = bean;
this.moduleId = moduleId;
this.defaultInterceptors = defaultInterceptors;
@@ -184,11 +184,11 @@
}
// interceptors
- InterceptorBuilder interceptorBuilder = new InterceptorBuilder(defaultInterceptors, bean);
- for (Method method : ejbClass.getMethods()) {
- List<InterceptorData> interceptorDatas = interceptorBuilder.build(method);
- deployment.setMethodInterceptors(method, interceptorDatas);
- }
+// InterceptorBuilder interceptorBuilder = new InterceptorBuilder(new ArrayList(), bean);
+// for (Method method : ejbClass.getMethods()) {
+// List<InterceptorData> interceptorDatas = interceptorBuilder.build(method);
+// deployment.setMethodInterceptors(method, interceptorDatas);
+// }
if (bean instanceof StatefulBeanInfo) {
StatefulBeanInfo statefulBeanInfo = (StatefulBeanInfo) bean;
@@ -250,9 +250,9 @@
return warnings;
}
- private Method getCallback(Class ejbClass, List<LifecycleCallbackInfo> callbackInfos) {
+ private Method getCallback(Class ejbClass, List<CallbackInfo> callbackInfos) {
Method callback = null;
- for (LifecycleCallbackInfo info : callbackInfos) {
+ for (CallbackInfo info : callbackInfos) {
try {
if (ejbClass.getName().equals(info.className)) {
if (callback != null) {
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java Fri Mar 9 22:39:49 2007
@@ -52,12 +52,10 @@
public final List<SecurityRoleReferenceInfo> securityRoleReferences = new ArrayList<SecurityRoleReferenceInfo>();
- public final List<LifecycleCallbackInfo> postConstruct = new ArrayList<LifecycleCallbackInfo>();
- public final List<LifecycleCallbackInfo> preDestroy = new ArrayList<LifecycleCallbackInfo>();
+ public final List<CallbackInfo> aroundInvoke = new ArrayList<CallbackInfo>();
- public boolean excludeDefaultInterceptors;
- public final List<InterceptorInfo> classInterceptors = new ArrayList<InterceptorInfo>();
- public final List<MethodInterceptorInfo> methodInterceptors = new ArrayList<MethodInterceptorInfo>();
+ public final List<CallbackInfo> postConstruct = new ArrayList<CallbackInfo>();
+ public final List<CallbackInfo> preDestroy = new ArrayList<CallbackInfo>();
public String containerId;
}
Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java?view=auto&rev=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java Fri Mar 9 22:39:49 2007
@@ -0,0 +1,270 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.assembler.classic;
+
+import org.apache.openejb.core.CoreDeploymentInfo;
+import org.apache.openejb.core.interceptor.InterceptorData;
+import org.apache.openejb.util.Logger;
+import org.apache.openejb.OpenEJBException;
+
+import javax.interceptor.InvocationContext;
+import java.util.Comparator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.lang.reflect.Method;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class InterceptorBindingBuilder {
+
+ public static final Logger logger = Logger.getInstance("OpenEJB.startup", InterceptorBindingBuilder.class.getPackage().getName());
+
+ public static enum Level {
+ PACKAGE, CLASS, OVERLOADED_METHOD, EXACT_METHOD;
+ }
+
+ public static enum Type {
+ ADDITION_OR_LOWER_EXCLUSION, SAME_LEVEL_EXCLUSION, SAME_AND_LOWER_EXCLUSION, EXPLICIT_ORDERING;
+ }
+
+ private final EjbJarInfo ejbJarInfo;
+ private final ArrayList<InterceptorBindingInfo> bindings;
+ private final Map<String, InterceptorData> interceptors = new HashMap<String, InterceptorData>();
+
+ public InterceptorBindingBuilder(ClassLoader cl, EjbJarInfo ejbJarInfo) throws OpenEJBException {
+ this.ejbJarInfo = ejbJarInfo;
+ bindings = new ArrayList<InterceptorBindingInfo>(ejbJarInfo.interceptorBindings);
+ Collections.sort(bindings, new IntercpetorBindingComparator());
+ Collections.reverse(bindings);
+
+ for (InterceptorInfo info : ejbJarInfo.interceptors) {
+ Class clazz = null;
+ try {
+ clazz = Class.forName(info.clazz, true, cl);
+ } catch (ClassNotFoundException e) {
+ throw new OpenEJBException("Intercpetor class cannot be loaded: "+info.clazz);
+ }
+ InterceptorData interceptor = new InterceptorData(clazz);
+
+ toMethods(clazz, info.aroundInvoke, interceptor.getAroundInvoke());
+ toMethods(clazz, info.postActivate, interceptor.getPostActivate());
+ toMethods(clazz, info.prePassivate, interceptor.getPrePassivate());
+ toMethods(clazz, info.postConstruct, interceptor.getPostConstruct());
+ toMethods(clazz, info.preDestroy, interceptor.getPreDestroy());
+ interceptors.put(info.clazz, interceptor);
+ }
+ }
+
+ private void toMethods(Class clazz, List<CallbackInfo> callbackInfos, List<Method> methods) {
+ for (CallbackInfo callbackInfo : callbackInfos) {
+ try {
+ Method method = clazz.getMethod(callbackInfo.method, InvocationContext.class);
+ methods.add(method);
+ } catch (NoSuchMethodException e) {
+ logger.warning("Interceptor method not found (skipping): public void " + callbackInfo.method + "(InvocationContext); in class " + clazz.getName());
+ }
+ }
+ }
+
+ private void toCallback(Class clazz, List<CallbackInfo> callbackInfos, List<Method> methods) {
+ for (CallbackInfo callbackInfo : callbackInfos) {
+ try {
+ Method method = clazz.getMethod(callbackInfo.method);
+ methods.add(method);
+ } catch (NoSuchMethodException e) {
+ logger.warning("Bean Callback method not found (skipping): public void " + callbackInfo.method + "(); in class " + clazz.getName());
+ }
+ }
+ }
+
+ public void build(CoreDeploymentInfo deploymentInfo, EnterpriseBeanInfo beanInfo) {
+ Class clazz = deploymentInfo.getBeanClass();
+
+ InterceptorData beanAsInterceptor = new InterceptorData(clazz);
+
+ toMethods(clazz, beanInfo.aroundInvoke, beanAsInterceptor.getAroundInvoke());
+ toCallback(clazz, beanInfo.postConstruct, beanAsInterceptor.getPostConstruct());
+ toCallback(clazz, beanInfo.preDestroy, beanAsInterceptor.getPreDestroy());
+
+ if (beanInfo instanceof StatefulBeanInfo) {
+ StatefulBeanInfo stateful = (StatefulBeanInfo) beanInfo;
+ toCallback(clazz, stateful.postActivate, beanAsInterceptor.getPostActivate());
+ toCallback(clazz, stateful.prePassivate, beanAsInterceptor.getPrePassivate());
+ }
+
+ for (Method method : deploymentInfo.getBeanClass().getMethods()) {
+ List<InterceptorBindingInfo> methodBindings = processBindings(method, beanInfo.ejbName);
+ Collections.reverse(methodBindings);
+ List<InterceptorData> methodInterceptors = new ArrayList<InterceptorData>();
+
+ for (InterceptorBindingInfo info : methodBindings) {
+ List<String> classes = (info.interceptorOrder.size() > 0) ? info.interceptorOrder : info.interceptors;
+ for (String interceptorClassName : classes) {
+ InterceptorData interceptorData = interceptors.get(interceptorClassName);
+ if (interceptorData == null){
+ logger.warning("InterceptorBinding references non-existent (undeclared) interceptor: " + interceptorClassName);
+ continue;
+ }
+ methodInterceptors.add(interceptorData);
+ }
+ }
+
+ // The bean itself gets to intercept too and is always last.
+ methodInterceptors.add(beanAsInterceptor);
+
+ deploymentInfo.setMethodInterceptors(method, methodInterceptors);
+ }
+ }
+
+ private List<InterceptorBindingInfo> processBindings(Method method, String ejbName){
+ List<InterceptorBindingInfo> methodBindings = new ArrayList<InterceptorBindingInfo>();
+
+ // The only critical thing to understand in this loop as that
+ // the bindings have already been sorted high to low (first to last)
+ // in this order:
+ //
+ // Primary sort is "level":
+ // (highest/first)
+ // - Method-level bindings with params
+ // - Method-level with no params
+ // - Class-level
+ // - Package-level (aka. default level)
+ // (lowest/last)
+ //
+ // They've been secondarily sorted *within* these levels by "type":
+ //
+ // (highest)
+ // - Explicit order
+ // - Exclude applying to current and lower levels
+ // - Exclude applying to just current level
+ // - Any addition for current level and/or exclusion for a lower level
+ // (lowest)
+ //
+ Set<Level> excludes = new HashSet<Level>();
+ for (InterceptorBindingInfo info : bindings) {
+ Level level = level(info);
+
+ if (!implies(method, ejbName, level, info)) continue;
+
+ Type type = type(level, info);
+
+ if (type == Type.EXPLICIT_ORDERING){
+ methodBindings.add(info);
+ // An explicit ordering trumps all other bindings of the same level or below
+ // (even other explicit order bindings). Any bindings that were higher than
+ // this one still apply (and will have already been applied).
+ //
+ // So we keep what we have, add this last binding and we're done with this method.
+ return methodBindings;
+ }
+
+ if (type == Type.SAME_AND_LOWER_EXCLUSION){
+ // We're done as the only things that will come after this will be
+ // at the same or lower level and we've just been told to exclude them.
+ // Nothing more to do for this method.
+ return methodBindings;
+ }
+
+ if (type == Type.SAME_LEVEL_EXCLUSION){
+ excludes.add(level);
+ continue;
+ }
+
+ if (!excludes.contains(level)){
+ methodBindings.add(info);
+ if (info.excludeClassInterceptors) excludes.add(Level.CLASS);
+ if (info.excludeDefaultInterceptors) excludes.add(Level.PACKAGE);
+ }
+ }
+ return methodBindings;
+ }
+
+ private boolean implies(Method method, String ejbName, Level level, InterceptorBindingInfo info) {
+ if (level == Level.PACKAGE) return true;
+ if (!ejbName.equals(info.ejbName)) return false;
+ if (level == Level.CLASS) return true;
+
+ NamedMethodInfo methodInfo = info.method;
+
+ if (!methodInfo.methodName.equals(method.getName())) return false;
+
+ // do we have parameters?
+ List<String> params = methodInfo.methodParams;
+ if (params == null) return true;
+
+ // do we have the same number of parameters?
+ if (params.size() != method.getParameterTypes().length) return false;
+
+ // match parameters names
+ Class<?>[] parameterTypes = method.getParameterTypes();
+
+ for (int i = 0; i < parameterTypes.length; i++) {
+
+ Class<?> parameterType = parameterTypes[i];
+ String methodParam = params.get(i);
+
+ if (methodParam.equals(getName(parameterType))) {
+ return false;
+ }
+ }
+
+ return false;
+ }
+
+ private static String getName(Class<?> type) {
+ if (type.isArray()) {
+ return getName(type.getComponentType()) + "[]";
+ } else {
+ return type.getName();
+ }
+ }
+
+ public static class IntercpetorBindingComparator implements Comparator<InterceptorBindingInfo> {
+ public int compare(InterceptorBindingInfo a, InterceptorBindingInfo b) {
+ Level levelA = level(a);
+ Level levelB = level(b);
+
+ if (levelA != levelB) return levelA.ordinal() - levelB.ordinal();
+
+ // Now resort to secondary sorting.
+
+ return type(levelA, a).ordinal() - type(levelB, b).ordinal();
+ }
+ }
+
+ private static Level level(InterceptorBindingInfo info) {
+ if (info.ejbName.equals("*")) return Level.PACKAGE;
+ if (info.method == null) return Level.CLASS;
+ if (info.method.methodParams == null) return Level.OVERLOADED_METHOD;
+ return Level.EXACT_METHOD;
+ }
+
+ private static Type type(Level level, InterceptorBindingInfo info) {
+ if (info.interceptorOrder.size() > 0) return Type.EXPLICIT_ORDERING;
+ if (level == Level.CLASS && info.excludeClassInterceptors && info.excludeDefaultInterceptors)
+ return Type.SAME_AND_LOWER_EXCLUSION;
+ if (level == Level.CLASS && info.excludeClassInterceptors) return Type.SAME_LEVEL_EXCLUSION;
+ return Type.ADDITION_OR_LOWER_EXCLUSION;
+ }
+
+}
Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingInfo.java?view=auto&rev=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingInfo.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingInfo.java Fri Mar 9 22:39:49 2007
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.assembler.classic;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class InterceptorBindingInfo extends InfoObject {
+ public String ejbName;
+ public final List<String> interceptors = new ArrayList<String>();
+ public final List<String> interceptorOrder = new ArrayList<String>();
+ public boolean excludeDefaultInterceptors;
+ public boolean excludeClassInterceptors;
+ public NamedMethodInfo method;
+}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBuilder.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBuilder.java Fri Mar 9 22:39:49 2007
@@ -34,9 +34,9 @@
public InterceptorBuilder(List<InterceptorInfo> defaultInterceptors, EnterpriseBeanInfo bean) {
this.defaultInterceptors = toInterceptorDatas(defaultInterceptors);
- this.excludeDefaultInterceptors = bean.excludeDefaultInterceptors;
- this.classInterceptors = toInterceptorDatas(bean.classInterceptors);
- this.methodInterceptors = new ArrayList<MethodInterceptorInfo>(bean.methodInterceptors);
+ this.excludeDefaultInterceptors = false;//bean.excludeDefaultInterceptors;
+ this.classInterceptors = null; //toInterceptorDatas(bean.classInterceptors);
+ this.methodInterceptors = null;//new ArrayList<MethodInterceptorInfo>(bean.methodInterceptors);
Collections.sort(methodInterceptors, METHOD_INTERCEPTOR_INFO_COMPARATOR);
}
@@ -58,7 +58,7 @@
}
}
- interceptors.addAll(toInterceptorDatas(methodInterceptorInfo.interceptors));
+ //interceptors.addAll(toInterceptorDatas(methodInterceptorInfo.interceptors));
return interceptors;
}
@@ -81,9 +81,9 @@
private static List<InterceptorData> toInterceptorDatas(List<InterceptorInfo> interceptorInfos) {
ArrayList<InterceptorData> interceptorDatas = new ArrayList<InterceptorData>(interceptorInfos.size());
- for (InterceptorInfo interceptorInfo : interceptorInfos) {
- interceptorDatas.add(new InterceptorData(interceptorInfo.clazz, interceptorInfo.methodName));
- }
+// for (InterceptorInfo interceptorInfo : interceptorInfos) {
+// interceptorDatas.add(new InterceptorData(interceptorInfo.clazz, interceptorInfo.methodName));
+// }
return interceptorDatas;
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorInfo.java Fri Mar 9 22:39:49 2007
@@ -17,7 +17,17 @@
*/
package org.apache.openejb.assembler.classic;
+import java.util.List;
+import java.util.ArrayList;
+
public class InterceptorInfo extends InfoObject{
public String clazz;
- public String methodName;
+
+ public final List<CallbackInfo> aroundInvoke = new ArrayList<CallbackInfo>();
+
+ public final List<CallbackInfo> postConstruct = new ArrayList<CallbackInfo>();
+ public final List<CallbackInfo> preDestroy = new ArrayList<CallbackInfo>();
+
+ public final List<CallbackInfo> postActivate = new ArrayList<CallbackInfo>();
+ public final List<CallbackInfo> prePassivate = new ArrayList<CallbackInfo>();
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/MethodInterceptorInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/MethodInterceptorInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/MethodInterceptorInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/MethodInterceptorInfo.java Fri Mar 9 22:39:49 2007
@@ -24,5 +24,5 @@
public MethodInfo methodInfo;
public boolean excludeDefaultInterceptors;
public boolean excludeClassInterceptors;
- public final List<InterceptorInfo> interceptors = new ArrayList<InterceptorInfo>();
+ public final List<String> interceptors = new ArrayList<String>();
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/StatefulBeanInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/StatefulBeanInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/StatefulBeanInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/StatefulBeanInfo.java Fri Mar 9 22:39:49 2007
@@ -25,7 +25,7 @@
type = STATEFUL;
}
- public final List<LifecycleCallbackInfo> postActivate = new ArrayList<LifecycleCallbackInfo>();
- public final List<LifecycleCallbackInfo> prePassivate = new ArrayList<LifecycleCallbackInfo>();
+ public final List<CallbackInfo> postActivate = new ArrayList<CallbackInfo>();
+ public final List<CallbackInfo> prePassivate = new ArrayList<CallbackInfo>();
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Fri Mar 9 22:39:49 2007
@@ -17,40 +17,8 @@
package org.apache.openejb.config;
import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.jee.ApplicationClient;
-import org.apache.openejb.jee.AroundInvoke;
-import org.apache.openejb.jee.AssemblyDescriptor;
-import org.apache.openejb.jee.ContainerTransaction;
-import org.apache.openejb.jee.EjbJar;
-import org.apache.openejb.jee.EjbLocalRef;
-import org.apache.openejb.jee.EjbRef;
-import org.apache.openejb.jee.EnterpriseBean;
-import org.apache.openejb.jee.EnvEntry;
-import org.apache.openejb.jee.InjectionTarget;
-import org.apache.openejb.jee.JndiConsumer;
-import org.apache.openejb.jee.JndiReference;
-import org.apache.openejb.jee.Lifecycle;
-import org.apache.openejb.jee.LifecycleCallback;
-import org.apache.openejb.jee.MessageDrivenBean;
-import org.apache.openejb.jee.MethodParams;
-import org.apache.openejb.jee.MethodTransaction;
-import org.apache.openejb.jee.PersistenceContextRef;
-import org.apache.openejb.jee.PersistenceContextType;
-import org.apache.openejb.jee.PersistenceUnitRef;
-import org.apache.openejb.jee.Property;
-import org.apache.openejb.jee.RemoteBean;
-import org.apache.openejb.jee.ResAuth;
-import org.apache.openejb.jee.ResSharingScope;
-import org.apache.openejb.jee.ResourceEnvRef;
-import org.apache.openejb.jee.ResourceRef;
+import org.apache.openejb.jee.*;
import org.apache.openejb.jee.SessionBean;
-import org.apache.openejb.jee.StatefulBean;
-import org.apache.openejb.jee.StatelessBean;
-import org.apache.openejb.jee.TransAttribute;
-import org.apache.openejb.jee.TransactionType;
-import org.apache.openejb.jee.ActivationConfig;
-import org.apache.openejb.jee.ActivationConfigProperty;
-import org.apache.openejb.jee.Interceptor;
import org.apache.openejb.util.Logger;
import org.apache.xbean.finder.ClassFinder;
@@ -335,6 +303,13 @@
if (ejbJar.getInterceptor(interceptor.getName()) == null){
ejbJar.addInterceptor(new Interceptor(interceptor.getName()));
}
+ }
+
+ InterceptorBinding binding = new InterceptorBinding();
+ binding.setEjbName(bean.getEjbName());
+ InterceptorOrder order = binding.setInterceptorOrder(new InterceptorOrder());
+ for (Class interceptor : interceptors.value()) {
+ order.addInterceptorClass(interceptor.getName());
}
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java Fri Mar 9 22:39:49 2007
@@ -22,55 +22,10 @@
import org.apache.openejb.util.Logger;
import org.apache.openejb.jee.oejb3.EjbDeployment;
import org.apache.openejb.jee.oejb3.ResourceLink;
-import org.apache.openejb.assembler.classic.EjbJarInfo;
-import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
-import org.apache.openejb.assembler.classic.EntityBeanInfo;
-import org.apache.openejb.assembler.classic.InterceptorInfo;
-import org.apache.openejb.assembler.classic.JndiEncInfo;
-import org.apache.openejb.assembler.classic.LifecycleCallbackInfo;
-import org.apache.openejb.assembler.classic.MessageDrivenBeanInfo;
-import org.apache.openejb.assembler.classic.MethodInfo;
-import org.apache.openejb.assembler.classic.MethodInterceptorInfo;
-import org.apache.openejb.assembler.classic.MethodPermissionInfo;
-import org.apache.openejb.assembler.classic.MethodTransactionInfo;
-import org.apache.openejb.assembler.classic.NamedMethodInfo;
-import org.apache.openejb.assembler.classic.QueryInfo;
-import org.apache.openejb.assembler.classic.SecurityRoleInfo;
-import org.apache.openejb.assembler.classic.SecurityRoleReferenceInfo;
-import org.apache.openejb.assembler.classic.StatefulBeanInfo;
-import org.apache.openejb.assembler.classic.StatelessBeanInfo;
-import org.apache.openejb.assembler.classic.CmrFieldInfo;
-import org.apache.openejb.jee.AroundInvoke;
-import org.apache.openejb.jee.CmpField;
-import org.apache.openejb.jee.CmpVersion;
-import org.apache.openejb.jee.ContainerTransaction;
-import org.apache.openejb.jee.EnterpriseBean;
+import org.apache.openejb.assembler.classic.*;
+import org.apache.openejb.jee.*;
import org.apache.openejb.jee.EntityBean;
-import org.apache.openejb.jee.Icon;
-import org.apache.openejb.jee.Interceptor;
-import org.apache.openejb.jee.InterceptorBinding;
-import org.apache.openejb.jee.JndiConsumer;
-import org.apache.openejb.jee.LifecycleCallback;
-import org.apache.openejb.jee.MessageDrivenBean;
-import org.apache.openejb.jee.Method;
-import org.apache.openejb.jee.MethodParams;
-import org.apache.openejb.jee.MethodPermission;
-import org.apache.openejb.jee.NamedMethod;
-import org.apache.openejb.jee.PersistenceType;
-import org.apache.openejb.jee.RemoteBean;
-import org.apache.openejb.jee.ResourceRef;
-import org.apache.openejb.jee.SecurityRole;
-import org.apache.openejb.jee.SecurityRoleRef;
import org.apache.openejb.jee.SessionBean;
-import org.apache.openejb.jee.SessionType;
-import org.apache.openejb.jee.TransactionType;
-import org.apache.openejb.jee.ActivationConfig;
-import org.apache.openejb.jee.ActivationConfigProperty;
-import org.apache.openejb.jee.EjbRelation;
-import org.apache.openejb.jee.EjbRelationshipRole;
-import org.apache.openejb.jee.Multiplicity;
-import org.apache.openejb.jee.Query;
-import org.apache.openejb.jee.QueryMethod;
import org.apache.openejb.loader.SystemInstance;
import java.util.ArrayList;
@@ -231,72 +186,39 @@
}
private void initInterceptors(EjbModule jar, EjbJarInfo ejbJar, Map<String, EnterpriseBeanInfo> beanInfos) throws OpenEJBException {
- if (jar.getEjbJar().getInterceptors() == null) {
- // no interceptors to process
- return;
- }
+ if (jar.getEjbJar().getInterceptors() == null) return;
+ if (jar.getEjbJar().getAssemblyDescriptor() == null) return;
+ if (jar.getEjbJar().getAssemblyDescriptor().getInterceptorBinding() == null) return;
- Map<String, String> interceptorMethods = new HashMap<String, String>();
- for (Interceptor interceptor : jar.getEjbJar().getInterceptors()) {
- AroundInvoke aroundInvoke = interceptor.getAroundInvoke().iterator().next();
- String clazz = aroundInvoke.getClazz();
- String methodName = aroundInvoke.getMethodName();
- interceptorMethods.put(clazz, methodName);
- }
+ for (Interceptor s : jar.getEjbJar().getInterceptors()) {
+ InterceptorInfo info = new InterceptorInfo();
- List<InterceptorBinding> bindings = jar.getEjbJar().getAssemblyDescriptor().getInterceptorBinding();
- for (InterceptorBinding binding : bindings) {
- if (binding.getInterceptorOrder() != null) {
- continue;
- }
+ info.clazz = s.getInterceptorClass();
- String ejbName = binding.getEjbName();
- List<InterceptorInfo> interceptorInfos = getInterceptorInfos(binding.getInterceptorClass(), interceptorMethods);
- if ("*".equals(ejbName)) {
- ejbJar.defaultInterceptors.addAll(interceptorInfos);
- } else {
- EnterpriseBeanInfo beanInfo = beanInfos.get(ejbName);
- if (beanInfo == null) {
- throw new OpenEJBException("Interceptor binding defined for a non existant ejb " + ejbName);
- }
+ copyCallbacks(s.getAroundInvoke(), info.aroundInvoke);
- NamedMethod method = binding.getMethod();
- if (method == null) {
- beanInfo.excludeDefaultInterceptors = binding.getExcludeDefaultInterceptors();
- beanInfo.classInterceptors.addAll(interceptorInfos);
- } else {
- MethodInterceptorInfo methodInterceptorInfo = new MethodInterceptorInfo();
- methodInterceptorInfo.methodInfo = new MethodInfo();
- methodInterceptorInfo.methodInfo.methodName = method.getMethodName();
- List<String> methodParam = method.getMethodParams().getMethodParam();
- methodInterceptorInfo.methodInfo.methodParams = methodParam;
-
- methodInterceptorInfo.excludeDefaultInterceptors = binding.getExcludeDefaultInterceptors();
- methodInterceptorInfo.excludeClassInterceptors = binding.getExcludeClassInterceptors();
- methodInterceptorInfo.interceptors.addAll(interceptorInfos);
+ copyCallbacks(s.getPostConstruct(), info.postConstruct);
+ copyCallbacks(s.getPreDestroy(), info.preDestroy);
- beanInfo.methodInterceptors.add(methodInterceptorInfo);
- }
- }
- }
+ copyCallbacks(s.getPostActivate(), info.postActivate);
+ copyCallbacks(s.getPrePassivate(), info.prePassivate);
- // todo add interceptor order
- }
+ ejbJar.interceptors.add(info);
+ }
- private static List<InterceptorInfo> getInterceptorInfos(List<String> interceptorClasses, Map<String, String> interceptorMethods) throws OpenEJBException {
- ArrayList<InterceptorInfo> interceptorInfos = new ArrayList<InterceptorInfo>(interceptorClasses.size());
- for (String clazz : interceptorClasses) {
- String methodName = interceptorMethods.get(clazz);
- if (methodName == null) {
- throw new OpenEJBException("Interceptor class is not have an interceptor method defined: " + interceptorClasses);
+ for (InterceptorBinding binding : jar.getEjbJar().getAssemblyDescriptor().getInterceptorBinding()) {
+ InterceptorBindingInfo info = new InterceptorBindingInfo();
+ info.ejbName = binding.getEjbName();
+ info.excludeClassInterceptors = binding.getExcludeClassInterceptors();
+ info.excludeDefaultInterceptors = binding.getExcludeDefaultInterceptors();
+ info.interceptors.addAll(binding.getInterceptorClass());
+ if (binding.getInterceptorOrder() != null) {
+ info.interceptorOrder.addAll(binding.getInterceptorOrder().getInterceptorClass());
}
- InterceptorInfo interceptorInfo = new InterceptorInfo();
- interceptorInfo.clazz = clazz;
- interceptorInfo.methodName = methodName;
- interceptorInfos.add(interceptorInfo);
+ info.method = toInfo(binding.getMethod());
+ ejbJar.interceptorBindings.add(info);
}
- return interceptorInfos;
}
private void initJndiReferences(Map<String, EjbDeployment> ejbds, Map<String, EnterpriseBeanInfo> beanInfos, Map<String, EnterpriseBean> beanData) throws OpenEJBException {
@@ -430,6 +352,9 @@
bean = new StatelessBeanInfo();
}
+ bean.timeoutMethod = toInfo(s.getTimeoutMethod());
+
+ copyCallbacks(s.getAroundInvoke(), bean.aroundInvoke);
copyCallbacks(s.getPostConstruct(), bean.postConstruct);
copyCallbacks(s.getPreDestroy(), bean.preDestroy);
@@ -464,17 +389,13 @@
private EnterpriseBeanInfo initMessageBean(MessageDrivenBean mdb, Map m) throws OpenEJBException {
MessageDrivenBeanInfo bean = new MessageDrivenBeanInfo();
+ bean.timeoutMethod = toInfo(mdb.getTimeoutMethod());
+
+ copyCallbacks(mdb.getAroundInvoke(), bean.aroundInvoke);
copyCallbacks(mdb.getPostConstruct(), bean.postConstruct);
copyCallbacks(mdb.getPreDestroy(), bean.preDestroy);
- NamedMethodInfo timeoutMethodInfo = new NamedMethodInfo();
- if (mdb.getTimeoutMethod() != null) {
- timeoutMethodInfo.methodName = mdb.getTimeoutMethod().getMethodName();
- if (mdb.getTimeoutMethod().getMethodParams() != null) {
- timeoutMethodInfo.methodParams = mdb.getTimeoutMethod().getMethodParams().getMethodParam();
- }
- }
+
EjbDeployment d = (EjbDeployment) m.get(mdb.getEjbName());
- bean.timeoutMethod = timeoutMethodInfo;
if (d == null) {
throw new OpenEJBException("No deployment information in openejb-jar.xml for bean "
+ mdb.getEjbName()
@@ -514,11 +435,25 @@
return bean;
}
- private void copyCallbacks(List<LifecycleCallback> from, List<LifecycleCallbackInfo> to) {
- for (LifecycleCallback callback : from) {
- LifecycleCallbackInfo info = new LifecycleCallbackInfo();
- info.className = callback.getLifecycleCallbackClass();
- info.method = callback.getLifecycleCallbackMethod();
+ private NamedMethodInfo toInfo(NamedMethod method) {
+ if (method == null) return null;
+
+ NamedMethodInfo info = new NamedMethodInfo();
+
+ info.methodName = method.getMethodName();
+
+ if (method.getMethodParams() != null) {
+ info.methodParams = method.getMethodParams().getMethodParam();
+ }
+
+ return info;
+ }
+
+ private void copyCallbacks(List<? extends CallbackMethod> from, List<CallbackInfo> to) {
+ for (CallbackMethod callback : from) {
+ CallbackInfo info = new CallbackInfo();
+ info.className = callback.getClassName();
+ info.method = callback.getMethodName();
to.add(info);
}
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java Fri Mar 9 22:39:49 2007
@@ -554,15 +554,15 @@
return methodInterceptors.get(method);
}
+
public void setMethodInterceptors(Method method, List<InterceptorData> interceptors) {
methodInterceptors.put(method, interceptors);
+ this.interceptors.addAll(interceptors);
}
+ private final Set<InterceptorData> interceptors = new HashSet<InterceptorData>();
+
public Set<InterceptorData> getAllInterceptors() {
- Set<InterceptorData> interceptors = new HashSet<InterceptorData>();
- for (List<InterceptorData> interceptorDatas : methodInterceptors.values()) {
- interceptors.addAll(interceptorDatas);
- }
return interceptors;
}
@@ -680,6 +680,12 @@
if (localInterface != null) {
mapObjectInterface(localInterface);
mapHomeInterface(localHomeInterface);
+ }
+ if (businessLocal != null){
+ mapObjectInterface(businessLocal);
+ }
+ if (businessRemote != null){
+ mapObjectInterface(businessRemote);
}
if (componentType == BeanType.MESSAGE_DRIVEN && MessageDrivenBean.class.isAssignableFrom(beanClass)) {
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/Operation.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/Operation.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/Operation.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/Operation.java Fri Mar 9 22:39:49 2007
@@ -18,7 +18,6 @@
public enum Operation {
INJECTION,
- LIFECYCLE,
BUSINESS,
BUSINESS_WS,
TIMEOUT,
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/Interceptor.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/Interceptor.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/Interceptor.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/Interceptor.java Fri Mar 9 22:39:49 2007
@@ -27,18 +27,6 @@
private final Object instance;
private final Method method;
- public Interceptor(Object instance, String methodName) {
- if (instance == null) throw new NullPointerException("instance is null");
- if (methodName == null) throw new NullPointerException("methodName is null");
- this.instance = instance;
- Class instanceClass = instance.getClass();
- try {
- this.method = instanceClass.getMethod(methodName, InvocationContext.class);
- } catch (NoSuchMethodException e) {
- throw new IllegalArgumentException("Interceptor method " + methodName + " not found on intercepted class " + instanceClass.getName());
- }
- }
-
public Interceptor(Object instance, Method method) {
if (instance == null) throw new NullPointerException("instance is null");
if (method == null) throw new NullPointerException("method is null");
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorData.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorData.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorData.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorData.java Fri Mar 9 22:39:49 2007
@@ -17,46 +17,79 @@
*/
package org.apache.openejb.core.interceptor;
+import org.apache.openejb.core.Operation;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+
/**
* @version $Rev$ $Date$
*/
public class InterceptorData {
- private final String interceptorClass;
- private final String interceptorMethod;
- public InterceptorData(String interceptorClass, String interceptorMethod) {
- if (interceptorClass == null) throw new NullPointerException("interceptorClass is null");
- if (interceptorMethod == null) throw new NullPointerException("interceptorMethod is null");
- this.interceptorClass = interceptorClass;
- this.interceptorMethod = interceptorMethod;
+ private Class clazz;
+
+ private final List<Method> aroundInvoke = new ArrayList<Method>();
+
+ private final List<Method> postConstruct = new ArrayList<Method>();
+ private final List<Method> preDestroy = new ArrayList<Method>();
+
+ private final List<Method> postActivate = new ArrayList<Method>();
+ private final List<Method> prePassivate = new ArrayList<Method>();
+
+ public InterceptorData(Class clazz) {
+ this.clazz = clazz;
+ }
+
+ public Class getInterceptorClass() {
+ return clazz;
+ }
+
+ public List<Method> getAroundInvoke() {
+ return aroundInvoke;
}
- public String getInterceptorClass() {
- return interceptorClass;
+ public List<Method> getPostConstruct() {
+ return postConstruct;
}
- public String getInterceptorMethod() {
- return interceptorMethod;
+ public List<Method> getPreDestroy() {
+ return preDestroy;
+ }
+
+ public List<Method> getPostActivate() {
+ return postActivate;
+ }
+
+ public List<Method> getPrePassivate() {
+ return prePassivate;
+ }
+
+ public List<Method> getMethods(Operation operation) {
+ switch(operation) {
+ case BUSINESS: return getAroundInvoke();
+ case CREATE: return getPostConstruct();
+ case REMOVE: return getPreDestroy();
+ case ACTIVATE: return getPostActivate();
+ case PASSIVATE: return getPrePassivate();
+ }
+ return Collections.EMPTY_LIST;
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
- InterceptorData that = (InterceptorData) o;
- return interceptorClass.equals(that.interceptorClass) &&
- interceptorMethod.equals(that.interceptorMethod);
+ final InterceptorData that = (InterceptorData) o;
- }
+ if (clazz != null ? !clazz.equals(that.clazz) : that.clazz != null) return false;
- public int hashCode() {
- int result;
- result = interceptorClass.hashCode();
- result = 29 * result + interceptorMethod.hashCode();
- return result;
+ return true;
}
- public String toString() {
- return interceptorClass + "." + interceptorMethod;
+ public int hashCode() {
+ return (clazz != null ? clazz.hashCode() : 0);
}
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorStack.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorStack.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorStack.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/InterceptorStack.java Fri Mar 9 22:39:49 2007
@@ -17,13 +17,14 @@
*/
package org.apache.openejb.core.interceptor;
+import org.apache.openejb.core.Operation;
+
import javax.interceptor.InvocationContext;
import java.lang.reflect.Method;
import java.util.List;
-import java.util.Collection;
-import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
+import java.util.Map;
/**
* @version $Rev$ $Date$
@@ -31,40 +32,36 @@
public class InterceptorStack {
private final Object beanInstance;
private final List<Interceptor> interceptors;
- private final Method method;
- private boolean lifecycleInvocation;
+ private final Method targetMethod;
- public InterceptorStack(Object beanInstance, Method method, boolean lifecycleInvocation, Collection<Object> interceptorInstances, List<InterceptorData> interceptorDatas) {
+ public InterceptorStack(Object beanInstance, Method targetMethod, Operation operation, List<InterceptorData> interceptorDatas, Map<String, Object> interceptorInstances) {
this.beanInstance = beanInstance;
- this.method = method;
- this.lifecycleInvocation = lifecycleInvocation;
-
- Map<String, Object> interceptorsByClass = new HashMap<String, Object>();
- for (Object interceptor : interceptorInstances) {
- interceptorsByClass.put(interceptor.getClass().getName(), interceptor);
- }
+ this.targetMethod = targetMethod;
interceptors = new ArrayList<Interceptor>(interceptorDatas.size());
for (InterceptorData interceptorData : interceptorDatas) {
- String interceptorClass = interceptorData.getInterceptorClass();
- Object interceptorInstance = interceptorsByClass.get(interceptorClass);
+ Class interceptorClass = interceptorData.getInterceptorClass();
+ Object interceptorInstance = interceptorInstances.get(interceptorClass.getName());
if (interceptorInstance == null) {
- throw new IllegalArgumentException("No interceptor of type " + interceptorClass);
+ throw new IllegalArgumentException("No interceptor of type " + interceptorClass.getName());
+ }
+
+ List<Method> methods = interceptorData.getMethods(operation);
+ for (Method method : methods) {
+ Interceptor interceptor = new Interceptor(interceptorInstance, method);
+ interceptors.add(interceptor);
}
- Interceptor interceptor = new Interceptor(interceptorInstance, interceptorData.getInterceptorMethod());
- interceptors.add(interceptor);
}
}
- public InterceptorStack(Object beanInstance, Method method, boolean lifecycleInvocation, List<Interceptor> interceptors) {
+ public InterceptorStack(Object beanInstance, Method method, List<Interceptor> interceptors) {
this.beanInstance = beanInstance;
- this.method = method;
- this.lifecycleInvocation = lifecycleInvocation;
+ this.targetMethod = method;
this.interceptors = interceptors;
}
public InvocationContext createInvocationContext() {
- InvocationContext invocationContext = new ReflectionInvocationContext(interceptors, beanInstance, method, lifecycleInvocation);
+ InvocationContext invocationContext = new ReflectionInvocationContext(interceptors, beanInstance, targetMethod);
return invocationContext;
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/ReflectionInvocationContext.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/ReflectionInvocationContext.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/ReflectionInvocationContext.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/interceptor/ReflectionInvocationContext.java Fri Mar 9 22:39:49 2007
@@ -36,20 +36,18 @@
private final Map<String, Object> contextData = new TreeMap<String, Object>();
private final Class<?>[] parameterTypes;
- private final boolean lifecycleInvocation;
private boolean parametersSet;
- public ReflectionInvocationContext(List<Interceptor> interceptors, Object target, Method method, boolean lifecycleInvocation) {
+ public ReflectionInvocationContext(List<Interceptor> interceptors, Object target, Method method) {
if (interceptors == null) throw new NullPointerException("interceptors is null");
if (target == null) throw new NullPointerException("target is null");
this.interceptors = interceptors.iterator();
this.target = target;
this.method = method;
- parameterTypes = method.getParameterTypes();
+ parameterTypes = (method == null)? new Class[]{}: method.getParameterTypes();
parameters = new Object[parameterTypes.length];
- this.lifecycleInvocation = lifecycleInvocation;
parametersSet = parameters.length == 0;
}
@@ -58,7 +56,6 @@
}
public Method getMethod() {
- if (lifecycleInvocation) return null;
return method;
}
@@ -75,17 +72,18 @@
Object parameter = parameters[i];
Class<?> parameterType = parameterTypes[i];
- if (parameter == null) {
- if (parameterType.isPrimitive()) {
- throw new IllegalArgumentException("Expected parameter " + i + " to be primitive type " + parameterType.getName() +
- ", but got a parameter that is null");
- }
- } else if (!parameterType.isInstance(parameter)) {
- throw new IllegalArgumentException("Expected parameter " + i + " to be of type " + parameterType.getName() +
- ", but got a parameter of type " + parameter.getClass().getName());
- }
+// if (parameter == null) {
+// if (parameterType.isPrimitive()) {
+// throw new IllegalArgumentException("Expected parameter " + i + " to be primitive type " + parameterType.getName() +
+// ", but got a parameter that is null");
+// }
+// } else if (!parameterType.isInstance(parameter)) {
+// throw new IllegalArgumentException("Expected parameter " + i + " to be of type " + parameterType.getName() +
+// ", but got a parameter of type " + parameter.getClass().getName());
+// }
}
System.arraycopy(parameters, 0, this.parameters, 0, parameters.length);
+ parametersSet = true;
}
public Map<String, Object> getContextData() {
@@ -99,9 +97,15 @@
Interceptor interceptor = interceptors.next();
Object nextInstance = interceptor.getInstance();
Method nextMethod = interceptor.getMethod();
+
try {
- Object value = nextMethod.invoke(nextInstance, this);
- return value;
+ if (nextMethod.getParameterTypes().length == 0){
+ Object value = nextMethod.invoke(nextInstance);
+ return value;
+ } else {
+ Object value = nextMethod.invoke(nextInstance, this);
+ return value;
+ }
} catch (InvocationTargetException e) {
throw unwrapInvocationTargetException(e);
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContext.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContext.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContext.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContext.java Fri Mar 9 22:39:49 2007
@@ -198,7 +198,7 @@
static {
states[Operation.INJECTION.ordinal()] = new InjectionMdbState();
- states[Operation.LIFECYCLE.ordinal()] = new LifecycleMdbState();
+ states[Operation.CREATE.ordinal()] = new LifecycleMdbState();
states[Operation.BUSINESS.ordinal()] = new BusinessTimeoutMdbState();
states[Operation.TIMEOUT.ordinal()] = new BusinessTimeoutMdbState();
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java Fri Mar 9 22:39:49 2007
@@ -200,7 +200,7 @@
// call the post construct method
Method postConstruct = deploymentInfo.getPostConstruct();
if (postConstruct != null){
- callContext.setCurrentOperation(Operation.LIFECYCLE);
+ callContext.setCurrentOperation(Operation.CREATE);
postConstruct.invoke(bean);
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java Fri Mar 9 22:39:49 2007
@@ -247,7 +247,7 @@
ThreadContext createContext = new ThreadContext(deploymentInfo, primaryKey, securityIdentity);
- createContext.setCurrentOperation(Operation.LIFECYCLE);
+ createContext.setCurrentOperation(Operation.CREATE);
ThreadContext oldCallContext = ThreadContext.enter(createContext);
try {
checkAuthorization(deploymentInfo, callMethod, securityIdentity);
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContext.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContext.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContext.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContext.java Fri Mar 9 22:39:49 2007
@@ -54,7 +54,7 @@
static {
states[Operation.INJECTION.ordinal()] = new InjectionStatelessState();
- states[Operation.LIFECYCLE.ordinal()] = new LifecycleStatelessState();
+ states[Operation.CREATE.ordinal()] = new LifecycleStatelessState();
states[Operation.BUSINESS.ordinal()] = new BusinessStatelessState();
states[Operation.AFTER_BEGIN.ordinal()] = new BeforeCompletion();
states[Operation.BEFORE_COMPLETION.ordinal()] = new BeforeCompletion();
Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java?view=auto&rev=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java Fri Mar 9 22:39:49 2007
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.core.stateless;
+
+import java.util.List;
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class Instance {
+ public final Object bean;
+ public final Map<String,Object> interceptors;
+
+ public Instance(Object bean, Map<String, Object> interceptors) {
+ this.bean = bean;
+ this.interceptors = interceptors;
+ }
+}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java Fri Mar 9 22:39:49 2007
@@ -23,6 +23,8 @@
import org.apache.openejb.core.Operation;
import org.apache.openejb.core.ThreadContext;
import org.apache.openejb.core.CoreDeploymentInfo;
+import org.apache.openejb.core.interceptor.InterceptorData;
+import org.apache.openejb.core.interceptor.InterceptorStack;
import org.apache.openejb.core.timer.EjbTimerService;
import org.apache.openejb.core.transaction.TransactionContainer;
import org.apache.openejb.core.transaction.TransactionContext;
@@ -37,6 +39,7 @@
import java.lang.reflect.Method;
import java.rmi.RemoteException;
import java.util.HashMap;
+import java.util.List;
/**
* @org.apache.xbean.XBean element="statelessContainer"
@@ -116,7 +119,7 @@
public Object invoke(Object deployID, Method callMethod, Object [] args, Object primKey, Object securityIdentity) throws OpenEJBException {
CoreDeploymentInfo deployInfo = (CoreDeploymentInfo) this.getDeploymentInfo(deployID);
if (deployInfo == null) throw new OpenEJBException("Deployment does not exist in this container. Deployment(id='"+deployID+"'), Container(id='"+containerID+"')");
-
+
ThreadContext callContext = new ThreadContext(deployInfo, primKey, securityIdentity);
ThreadContext oldCallContext = ThreadContext.enter(callContext);
try {
@@ -163,7 +166,8 @@
protected Object _invoke(Method callMethod, Method runMethod, Object [] args, Object bean, ThreadContext callContext)
throws org.apache.openejb.OpenEJBException {
- TransactionPolicy txPolicy = callContext.getDeploymentInfo().getTransactionPolicy(callMethod);
+ CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
+ TransactionPolicy txPolicy = deploymentInfo.getTransactionPolicy(callMethod);
TransactionContext txContext = new TransactionContext(callContext, getTransactionManager());
txContext.callContext = callContext;
@@ -171,8 +175,9 @@
Object returnValue = null;
try {
-
- returnValue = runMethod.invoke(bean, args);
+ List<InterceptorData> interceptors = deploymentInfo.getMethodInterceptors(runMethod);
+ InterceptorStack interceptorStack = new InterceptorStack(((Instance)bean).bean, runMethod, Operation.BUSINESS, interceptors, ((Instance)bean).interceptors);
+ returnValue = interceptorStack.invoke(args);
} catch (java.lang.reflect.InvocationTargetException ite) {// handle exceptions thrown by enterprise bean
if (ite.getTargetException() instanceof RuntimeException) {
/* System Exception ****************************/
@@ -185,6 +190,16 @@
txPolicy.handleApplicationException(ite.getTargetException(), txContext);
}
} catch (Throwable re) {// handle reflection exception
+ if (re instanceof RuntimeException) {
+ /* System Exception ****************************/
+
+ txPolicy.handleSystemException(re, bean, txContext);
+ } else {
+ /* Application Exception ***********************/
+ instanceManager.poolInstance(callContext, bean);
+
+ txPolicy.handleApplicationException(re, txContext);
+ }
/*
Any exception thrown by reflection; not by the enterprise bean. Possible
Exceptions are:
@@ -193,7 +208,7 @@
NullPointerException - if the specified object is null and the method is an instance method.
ExceptionInInitializerError - if the initialization provoked by this method fails.
*/
- txPolicy.handleSystemException(re, bean, txContext);
+// txPolicy.handleSystemException(re, bean, txContext);
} finally {
txPolicy.afterInvoke(bean, txContext);
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContext.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContext.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContext.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContext.java Fri Mar 9 22:39:49 2007
@@ -60,7 +60,7 @@
static {
states[Operation.INJECTION.ordinal()] = new InjectionStatelessState();
- states[Operation.LIFECYCLE.ordinal()] = new LifecycleStatelessState();
+ states[Operation.CREATE.ordinal()] = new LifecycleStatelessState();
states[Operation.BUSINESS.ordinal()] = new BusinessStatelessState();
states[Operation.BUSINESS_WS.ordinal()] = new BusinessWsStatelessState();
states[Operation.TIMEOUT.ordinal()] = new TimeoutStatelessState();
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java?view=diff&rev=516657&r1=516656&r2=516657
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java Fri Mar 9 22:39:49 2007
@@ -19,12 +19,15 @@
import org.apache.xbean.recipe.ObjectRecipe;
import org.apache.xbean.recipe.StaticRecipe;
import org.apache.xbean.recipe.Option;
+import org.apache.xbean.recipe.ConstructionException;
import org.apache.openejb.OpenEJBException;
import org.apache.openejb.SystemException;
import org.apache.openejb.Injection;
import org.apache.openejb.core.CoreDeploymentInfo;
import org.apache.openejb.core.Operation;
import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.core.interceptor.InterceptorData;
+import org.apache.openejb.core.interceptor.InterceptorStack;
import org.apache.openejb.spi.SecurityService;
import org.apache.openejb.util.LinkedListStack;
import org.apache.openejb.util.SafeToolkit;
@@ -32,6 +35,7 @@
import org.apache.openejb.util.Logger;
import javax.ejb.SessionContext;
+import javax.ejb.SessionBean;
import javax.transaction.TransactionManager;
import javax.naming.Context;
import javax.naming.NamingException;
@@ -39,6 +43,9 @@
import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
public class StatelessInstanceManager {
private static final Logger logger = Logger.getInstance("OpenEJB", "org.apache.openejb.util.resources");
@@ -135,12 +142,36 @@
logger.warning("Injection: No such property '"+property+"' in class "+beanClass.getName());
}
}
- callContext.setCurrentOperation(Operation.LIFECYCLE);
+
+ HashMap<String, Object> interceptorInstances = new HashMap<String, Object>();
+ for (InterceptorData interceptorData : deploymentInfo.getAllInterceptors()) {
+ if (interceptorData.getInterceptorClass().equals(beanClass)) continue;
+
+ Class clazz = interceptorData.getInterceptorClass();
+ ObjectRecipe interceptorRecipe = new ObjectRecipe(clazz);
+ try {
+ Object interceptorInstance = interceptorRecipe.create(clazz.getClassLoader());
+ interceptorInstances.put(clazz.getName(), interceptorInstance);
+ } catch (ConstructionException e) {
+ throw new Exception("Failed to create interceptor: "+clazz.getName(), e);
+ }
+ }
+
+ interceptorInstances.put(beanClass.getName(), bean);
+
+ callContext.setCurrentOperation(Operation.CREATE);
Method postConstruct = deploymentInfo.getPostConstruct();
+
if (postConstruct != null){
- postConstruct.invoke(bean);
+ List<InterceptorData> interceptors = deploymentInfo.getMethodInterceptors(postConstruct);
+ if (!SessionBean.class.isAssignableFrom(beanClass)){
+ postConstruct = null;
+ }
+ InterceptorStack interceptorStack = new InterceptorStack(bean, postConstruct, Operation.CREATE, interceptors, interceptorInstances);
+ interceptorStack.invoke();
}
+ bean = new Instance(bean, interceptorInstances);
} catch (Throwable e) {
if (e instanceof java.lang.reflect.InvocationTargetException) {
e = ((java.lang.reflect.InvocationTargetException) e).getTargetException();
@@ -192,8 +223,15 @@
public void freeInstance(ThreadContext callContext, Object bean) {
try {
callContext.setCurrentOperation(Operation.REMOVE);
- Method preDestroy = callContext.getDeploymentInfo().getPreDestroy();
+ CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
+ Method preDestroy = deploymentInfo.getPreDestroy();
if (preDestroy != null){
+ List<InterceptorData> interceptors = deploymentInfo.getMethodInterceptors(preDestroy);
+ if (!SessionBean.class.isAssignableFrom(deploymentInfo.getBeanClass())){
+ preDestroy = null;
+ }
+ InterceptorStack interceptorStack = new InterceptorStack(((Instance)bean).bean, preDestroy, Operation.REMOVE, interceptors, ((Instance)bean).interceptors);
+ interceptorStack.invoke();
preDestroy.invoke(bean);
}
} catch (Throwable re) {