Author: genspring
Date: Thu May 26 03:42:40 2011
New Revision: 1127775
URL: http://svn.apache.org/viewvc?rev=1127775&view=rev
Log:
OPENEJB-1559 if the stateless session bean instance has an ejbCreate method,
the container should treat the ejbCreate method as the instance's PostConstruct
method
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java?rev=1127775&r1=1127774&r2=1127775&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
Thu May 26 03:42:40 2011
@@ -96,6 +96,34 @@ public class InterceptorBindingBuilder {
Class clazz = beanContext.getBeanClass();
InterceptorData beanAsInterceptor = new InterceptorData(clazz);
+
+
+
+ if (beanInfo instanceof StatelessBeanInfo) {
+ /*
+ * 4.3.10.2 If the stateless session bean instance has an
ejbCreate method,
+ * the container treats the ejbCreate method as the instanceâs
PostConstruct method,
+ * and, in this case, the PostConstruct annotation (or deployment
descriptor metadata)
+ * can only be applied to the beanâs ejbCreate method.
+ */
+ NamedMethodInfo info = new NamedMethodInfo();
+ info.className = clazz.getName();
+ info.methodName = "ejbCreate";
+ info.methodParams = new ArrayList<String>();
+
+ try {
+ Method ejbcreate = MethodInfoUtil.toMethod(clazz, info);
+ if (ejbcreate != null) {
+ CallbackInfo ejbcreateAsPostConstruct = new CallbackInfo();
+ ejbcreateAsPostConstruct.className =
ejbcreate.getDeclaringClass().getName();
+ ejbcreateAsPostConstruct.method = "ejbCreate";
+ beanInfo.postConstruct.add(ejbcreateAsPostConstruct);
+ }
+ } catch (IllegalStateException e) {
+ // there's no ejbCreate method in stateless bean.
+ }
+
+ }
toMethods(clazz, beanInfo.aroundInvoke,
beanAsInterceptor.getAroundInvoke());
toCallback(clazz, beanInfo.postConstruct,
beanAsInterceptor.getPostConstruct());
@@ -272,10 +300,10 @@ public class InterceptorBindingBuilder {
for (CallbackInfo callbackInfo : callbackInfos) {
try {
Method method = getMethod(clazz, callbackInfo.method,
InvocationContext.class);
- if (callbackInfo.className == null &&
method.getDeclaringClass().equals(clazz)){
+ if (callbackInfo.className == null &&
method.getDeclaringClass().equals(clazz) && !methods.contains(method)){
methods.add(method);
}
- if
(method.getDeclaringClass().getName().equals(callbackInfo.className)){
+ if
(method.getDeclaringClass().getName().equals(callbackInfo.className) &&
!methods.contains(method)){
methods.add(method);
} else {
// check for a private method on the declared class
@@ -289,7 +317,7 @@ public class InterceptorBindingBuilder {
try {
method = getMethod(c, callbackInfo.method,
InvocationContext.class);
// make sure it is private
- if (Modifier.isPrivate(method.getModifiers())) {
+ if (Modifier.isPrivate(method.getModifiers()) &&
!methods.contains(method)) {
SetAccessible.on(method);
methods.add(method);
}
@@ -330,9 +358,9 @@ public class InterceptorBindingBuilder {
for (CallbackInfo callbackInfo : callbackInfos) {
try {
Method method = getMethod(clazz, callbackInfo.method,
parameterTypes);
- if (callbackInfo.className == null){
+ if (callbackInfo.className == null &&
!methods.contains(method)){
methods.add(method);
- } else if
(method.getDeclaringClass().getName().equals(callbackInfo.className)){
+ } else if
(method.getDeclaringClass().getName().equals(callbackInfo.className) &&
!methods.contains(method)){
methods.add(method);
} else {
// check for a private method on the declared class
@@ -346,7 +374,7 @@ public class InterceptorBindingBuilder {
try {
method = c.getDeclaredMethod(callbackInfo.method);
// make sure it is private
- if (Modifier.isPrivate(method.getModifiers())) {
+ if (Modifier.isPrivate(method.getModifiers()) &&
!methods.contains(method)) {
SetAccessible.on(method);
methods.add(method);
}