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 2016/12/09 10:56:52 UTC
tomee git commit: TOMEE-1985 SessionBean ejbCreate invoked
potentially twice
Repository: tomee
Updated Branches:
refs/heads/master 64c901a63 -> c80b481b3
TOMEE-1985 SessionBean ejbCreate invoked potentially twice
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/c80b481b
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/c80b481b
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/c80b481b
Branch: refs/heads/master
Commit: c80b481b3f41443157aeacc7985e682d73d7df99
Parents: 64c901a
Author: dblevins <da...@gmail.com>
Authored: Fri Dec 9 02:32:57 2016 -0800
Committer: dblevins <da...@gmail.com>
Committed: Fri Dec 9 02:32:57 2016 -0800
----------------------------------------------------------------------
.../classic/InterceptorBindingBuilder.java | 7 +-
.../stateless/StatelessInstanceManager.java | 17 --
.../StatelessSessionBeanInterfaceTest.java | 181 +++++++++++++++++++
pom.xml | 1 +
4 files changed, 186 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/c80b481b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
index 7ae4875..15cd4b3 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
@@ -99,14 +99,15 @@ public class InterceptorBindingBuilder {
if (beanInfo instanceof StatelessBeanInfo || beanInfo instanceof MessageDrivenBeanInfo) {
/*
* 4.3.10.2 and 4.5.8
- * If the stateless session bean or MDB instance has an ejbCreate method,
+ * If the stateless session bean or MDB instance has an ejbCreate method,
* the container treats the ejbCreate method as the instance\u2019s PostConstruct method,
* and, in this case, the PostConstruct annotation (or deployment descriptor metadata)
* can only be applied to the bean\u2019s ejbCreate method.
*/
final NamedMethodInfo info = new NamedMethodInfo();
info.className = clazz.getName();
- info.methodName = "ejbCreate";
+ final Method createMethod = beanContext.getCreateMethod();
+ info.methodName = (createMethod != null) ? createMethod.getName(): "ejbCreate";
info.methodParams = new ArrayList<String>();
try {
@@ -114,7 +115,7 @@ public class InterceptorBindingBuilder {
if (ejbcreate != null) {
final CallbackInfo ejbcreateAsPostConstruct = new CallbackInfo();
ejbcreateAsPostConstruct.className = ejbcreate.getDeclaringClass().getName();
- ejbcreateAsPostConstruct.method = "ejbCreate";
+ ejbcreateAsPostConstruct.method = ejbcreate.getName();
beanInfo.postConstruct.add(ejbcreateAsPostConstruct);
}
} catch (final IllegalStateException e) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/c80b481b/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java b/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
index 255d123..aaa91d3 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
@@ -58,7 +58,6 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.rmi.RemoteException;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -241,22 +240,6 @@ public class StatelessInstanceManager {
private Instance createInstance(final ThreadContext callContext, final BeanContext beanContext) throws ApplicationException {
try {
final InstanceContext context = beanContext.newInstance();
- if (context.getBean() instanceof SessionBean) {
- final Operation originalOperation = callContext.getCurrentOperation();
- try {
- callContext.setCurrentOperation(Operation.CREATE);
- final InterceptorStack ejbCreate = new InterceptorStack(
- context.getBean(),
- beanContext.getCreateMethod(),
- Operation.CREATE,
- new ArrayList<InterceptorData>(),
- new HashMap<String, Object>()
- );
- ejbCreate.invoke();
- } finally {
- callContext.setCurrentOperation(originalOperation);
- }
- }
return new Instance(context.getBean(), context.getInterceptors(), context.getCreationalContext());
} catch (Throwable e) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/c80b481b/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessSessionBeanInterfaceTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessSessionBeanInterfaceTest.java b/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessSessionBeanInterfaceTest.java
new file mode 100644
index 0000000..ad9f106
--- /dev/null
+++ b/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessSessionBeanInterfaceTest.java
@@ -0,0 +1,181 @@
+/*
+ * 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 org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Module;
+import org.apache.openejb.util.Join;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.ejb.CreateException;
+import javax.ejb.EJB;
+import javax.ejb.EJBException;
+import javax.ejb.EJBHome;
+import javax.ejb.EJBObject;
+import javax.ejb.SessionBean;
+import javax.ejb.SessionContext;
+import java.rmi.RemoteException;
+import java.util.List;
+import java.util.Stack;
+
+@RunWith(ApplicationComposer.class)
+public class StatelessSessionBeanInterfaceTest extends Assert {
+
+ @EJB
+ private GreenRemoteHome greenRemoteHome;
+
+ @EJB
+ private BlueRemoteHome blueRemoteHome;
+
+ @Module
+ public EjbJar orange() {
+ final EjbJar ejbJar = new EjbJar();
+ {
+ final StatelessBean bean = new StatelessBean("green", GreenBean.class);
+ bean.setHomeAndRemote(GreenRemoteHome.class, GreenRemote.class);
+ ejbJar.addEnterpriseBean(bean);
+ }
+ {
+ final StatelessBean bean = new StatelessBean("blue", BlueBean.class);
+ bean.setHomeAndRemote(BlueRemoteHome.class, BlueRemote.class);
+ ejbJar.addEnterpriseBean(bean);
+ }
+
+ return ejbJar;
+ }
+
+ @Test
+ public void testRegularEjbCreate() throws Exception {
+ lifecycle.clear();
+
+ assertNotNull(greenRemoteHome);
+ final GreenRemote greenRemote = greenRemoteHome.create();
+ assertEquals("", Join.join("\n", lifecycle));
+
+ final String s = greenRemote.businessMethod("one", "two");
+ assertEquals("setSessionContext\n" +
+ "ejbCreate\n" +
+ "businessMethod", Join.join("\n", lifecycle));
+
+ }
+
+ @Test
+ public void testNamedEjbCreateMethod() throws Exception {
+ lifecycle.clear();
+
+ assertNotNull(blueRemoteHome);
+ final BlueRemote greenRemote = blueRemoteHome.createObject();
+ assertEquals("", Join.join("\n", lifecycle));
+
+ final String s = greenRemote.businessMethod("one", "two");
+ assertEquals("setSessionContext\n" +
+ "ejbCreate\n" +
+ "businessMethod", Join.join("\n", lifecycle));
+
+ }
+
+ private static final List<String> lifecycle = new Stack<String>();
+
+
+ public static class GreenBean implements SessionBean {
+
+ public void ejbCreate() {
+ lifecycle.add("ejbCreate");
+ }
+
+ @Override
+ public void ejbActivate() throws EJBException, RemoteException {
+ lifecycle.add("ejbActivate");
+ }
+
+ @Override
+ public void ejbPassivate() throws EJBException, RemoteException {
+ lifecycle.add("ejbPassivate");
+ }
+
+ @Override
+ public void ejbRemove() throws EJBException, RemoteException {
+ lifecycle.add("ejbRemove");
+ }
+
+ @Override
+ public void setSessionContext(SessionContext ctx) throws EJBException, RemoteException {
+ lifecycle.add("setSessionContext");
+ }
+
+ public String businessMethod(String x, String y) {
+ lifecycle.add("businessMethod");
+ return Join.join("\n", x, y);
+ }
+
+ }
+
+ private interface GreenRemoteHome extends EJBHome {
+ GreenRemote create() throws RemoteException, CreateException;
+ }
+
+ private interface GreenRemote extends EJBObject {
+ String businessMethod(String x, String y) throws RemoteException;
+ }
+
+
+ public static class BlueBean implements SessionBean {
+
+ public void ejbCreateObject() {
+ lifecycle.add("ejbCreate");
+ }
+
+ @Override
+ public void ejbActivate() throws EJBException, RemoteException {
+ lifecycle.add("ejbActivate");
+ }
+
+ @Override
+ public void ejbPassivate() throws EJBException, RemoteException {
+ lifecycle.add("ejbPassivate");
+ }
+
+ @Override
+ public void ejbRemove() throws EJBException, RemoteException {
+ lifecycle.add("ejbRemove");
+ }
+
+ @Override
+ public void setSessionContext(SessionContext ctx) throws EJBException, RemoteException {
+ lifecycle.add("setSessionContext");
+ }
+
+ public String businessMethod(String x, String y) {
+ lifecycle.add("businessMethod");
+ return Join.join("\n", x, y);
+ }
+
+ }
+
+ private interface BlueRemoteHome extends EJBHome {
+ BlueRemote createObject() throws RemoteException, CreateException;
+ }
+
+ private interface BlueRemote extends EJBObject {
+ String businessMethod(String x, String y) throws RemoteException;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/tomee/blob/c80b481b/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 9e07ac5..479766b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,6 +30,7 @@
<relativePath><!--Resolve on repository--></relativePath>
</parent>
+
<groupId>org.apache.tomee</groupId>
<artifactId>tomee-project</artifactId>
<packaging>pom</packaging>