Author: kmalhi
Date: Wed Jul 28 02:58:12 2010
New Revision: 979941

URL: http://svn.apache.org/viewvc?rev=979941&view=rev
Log:
OPENEJB-535
Implemented validation logic to check for invalid usage of lifecycle callbacks 
on bean implementing javax.ejb.SessionBean.
Added test for it and updated messages.properties with the appropriate key for 
validation message.

Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckCallbacks.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/CheckInvalidCallbacksTest.java

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckCallbacks.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckCallbacks.java?rev=979941&r1=979940&r2=979941&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckCallbacks.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckCallbacks.java
 Wed Jul 28 02:58:12 2010
@@ -278,7 +278,22 @@ public class CheckCallbacks extends Vali
     private void checkCallback(Class<?> ejbClass, String type, CallbackMethod 
callback, EnterpriseBean bean, Class... parameterTypes) {
         try {
             Method method = getMethod(ejbClass, callback.getMethodName(), 
parameterTypes);
-
+            if (implementsSessionBean(ejbClass)) {
+                SessionBean sb = (SessionBean) bean;
+                if ("PreDestroy".equals(type)) {
+                    if (!callback.getMethodName().equals("ejbRemove"))
+                        fail(bean.getEjbName(), 
"callback.sessionbean.invalidusage", type,callback.getMethodName(),ejbClass);
+                } else if ("PostActivate".equals(type)) {
+                    if (!callback.getMethodName().equals("ejbActivate"))
+                        fail(bean.getEjbName(), 
"callback.sessionbean.invalidusage", type,callback.getMethodName(),ejbClass);
+                } else if ("PrePassivate".equals(type)) {
+                    if (!callback.getMethodName().equals("ejbPassivate"))
+                        fail(bean.getEjbName(), 
"callback.sessionbean.invalidusage", type,callback.getMethodName(),ejbClass);
+                } else if ("PostConstruct".equals(type)) { //TODO KSM: need to 
check if @PostConstruct usage on Stateless session bean ejbCreate() is valid?
+                    fail(bean.getEjbName(), 
"callback.sessionbean.invalidusage", type,callback.getMethodName(),ejbClass);
+                }
+                // @AfterCompletion, @BeforeCompletion and @AfterBegin are 
assumed to be allowed to be used on Stateful bean implementing 
javax.ejb.SessionBean
+            }
             Class<?> returnType = method.getReturnType();
 
             if (!returnType.equals(Void.TYPE)) {
@@ -302,6 +317,15 @@ public class CheckCallbacks extends Vali
         }
     }
 
+    private boolean implementsSessionBean(Class<?> ejbClass) {
+        Class<?>[] interfaces = ejbClass.getInterfaces();
+        for (Class<?> interfce : interfaces) {
+            if(interfce.equals(javax.ejb.SessionBean.class))
+                return true;
+        }
+        return false;
+    }
+
     private void checkCallback(Class interceptorClass, String type, 
CallbackMethod callback, Interceptor interceptor) {
         try {
             Method method = getMethod(interceptorClass, 
callback.getMethodName(), InvocationContext.class);

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties?rev=979941&r1=979940&r2=979941&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
 Wed Jul 28 02:58:12 2010
@@ -219,6 +219,11 @@
 2.callback.sessionSynchronization.invalidUse = Session synchronization 
annotations and configurations in deployment plan should not be used while 
SessionSynchronization interface is implemented by the bean class {0}.
 3.callback.sessionSynchronization.invalidUse = Session synchronization 
annotations and configurations in deployment plan should not be used while 
SessionSynchronization interface is implemented by the bean class {0}.
 
+# fail(bean, "callback.missing.possibleTypo", type, callback.getMethodName(), 
possibleMethods.size(), callback.getClassName());
+1.callback.sessionbean.invalidusage = Invalid usage of @{0} in a class which 
implements javax.ejb.SessionBean
+2.callback.sessionbean.invalidusage = Invalid usage of @{0} in a class which 
implements javax.ejb.SessionBean
+3.callback.sessionbean.invalidusage = Invalid usage of @{0} in {2} which 
implements javax.ejb.SessionBean. @{0} was wrongly used on the method {1}(). 
The usage would have been correct if {2} did not implement 
javax.ejb.SessionBean.
+
 # fail(bean, "timeout.badReturnType", callback.getMethodName(), 
returnType.getName());
 1.timeout.badReturnType = Timeout method must return 'void'
 2.timeout.badReturnType = Timeout method must return 'void': method {0} 
returns {1}

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/CheckInvalidCallbacksTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/CheckInvalidCallbacksTest.java?rev=979941&r1=979940&r2=979941&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/CheckInvalidCallbacksTest.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/CheckInvalidCallbacksTest.java
 Wed Jul 28 02:58:12 2010
@@ -24,9 +24,14 @@ import javax.annotation.PreDestroy;
 import javax.ejb.AfterBegin;
 import javax.ejb.AfterCompletion;
 import javax.ejb.BeforeCompletion;
+import javax.ejb.CreateException;
 import javax.ejb.EJBException;
+import javax.ejb.EJBLocalHome;
+import javax.ejb.EJBLocalObject;
 import javax.ejb.PostActivate;
 import javax.ejb.PrePassivate;
+import javax.ejb.SessionBean;
+import javax.ejb.SessionContext;
 import javax.ejb.SessionSynchronization;
 
 import junit.framework.TestCase;
@@ -43,9 +48,9 @@ import org.junit.runner.RunWith;
  */
 @RunWith(ValidationRunner.class)
 public class CheckInvalidCallbacksTest extends TestCase {
-    @Keys( { @Key(value = "ignoredAnnotation", count = 10, type = 
KeyType.WARNING), @Key("callback.missing.possibleTypo"), 
@Key("callback.badReturnType"),
-            @Key("callback.badModifier"), @Key("callback.invalidArguments"), 
@Key("aroundInvoke.missing"), @Key("callback.missing"),
-            @Key(value="callback.sessionSynchronization.invalidUse",count=2) })
+    @Keys({ @Key(value = "ignoredAnnotation", count = 10, type = 
KeyType.WARNING), @Key("callback.missing.possibleTypo"), 
@Key("callback.badReturnType"),
+                    @Key("callback.badModifier"), 
@Key("callback.invalidArguments"), @Key("aroundInvoke.missing"), 
@Key("callback.missing"),
+                    @Key(value = "callback.sessionSynchronization.invalidUse", 
count = 2) })
     public EjbJar test() throws Exception {
         EjbJar ejbJar = new EjbJar();
         StatelessBean testBean = ejbJar.addEnterpriseBean(new 
StatelessBean("TestStateless", TestBean.class));
@@ -69,6 +74,19 @@ public class CheckInvalidCallbacksTest e
         return ejbJar;
     }
 
+    @Keys(@Key(value = "callback.sessionbean.invalidusage", count = 6))
+    public EjbJar test2() {
+        System.setProperty("openejb.validation.output.level", "VERBOSE");
+        EjbJar ejbJar = new EjbJar();
+        StatelessBean sun = ejbJar.addEnterpriseBean(new 
StatelessBean("SunStateless", Sun.class));
+        sun.setLocalHome(SunLocalHome.class.getName());
+        sun.setLocal(SunLocal.class.getName());
+        StatefulBean meteor = ejbJar.addEnterpriseBean(new 
StatefulBean("MeteorStateful", Meteor.class));
+        meteor.setLocal(SunLocal.class.getName());
+        meteor.setLocalHome(SunLocalHome.class.getName());
+        return ejbJar;
+    }
+
     public static class TestBean implements Callable {
         public Object call() throws Exception {
             return null;
@@ -160,9 +178,80 @@ public class CheckInvalidCallbacksTest e
         @Override
         public void beforeCompletion() throws EJBException, RemoteException {}
     }
-    
-    public static class MoonBean{
-        public Object foo(){return null;}
-        public void foo(String str){}
+
+    public static class MoonBean {
+        public Object foo() {
+            return null;
+        }
+
+        public void foo(String str) {}
+    }
+
+    public static interface SunLocalHome extends EJBLocalHome {
+        public SunLocal create() throws CreateException;
+    }
+
+    public static interface SunLocal extends EJBLocalObject {}
+
+    public class Sun implements SessionBean {
+        @PostConstruct
+        public void myPostConstruct() {}
+
+        @PreDestroy
+        public void myPreDestroy() {}
+
+        public void ejbCreate() throws CreateException {}
+
+        @Override
+        public void ejbActivate() throws EJBException, RemoteException {}
+
+        @Override
+        public void ejbPassivate() throws EJBException, RemoteException {}
+
+        @Override
+        public void ejbRemove() throws EJBException, RemoteException {}
+
+        @Override
+        public void setSessionContext(SessionContext arg0) throws 
EJBException, RemoteException {}
+    }
+
+    public class Meteor implements SessionBean {
+        @PostConstruct
+        public void myPostConstruct() {}
+
+        @PreDestroy
+        public void myPreDestroy() {}
+
+        public void ejbCreate() throws CreateException {}
+
+        @Override
+        @PostActivate
+        public void ejbActivate() throws EJBException, RemoteException {}
+
+        @Override
+        @PrePassivate
+        public void ejbPassivate() throws EJBException, RemoteException {}
+
+        @Override
+        @PreDestroy
+        public void ejbRemove() throws EJBException, RemoteException {}
+
+        @Override
+        public void setSessionContext(SessionContext arg0) throws 
EJBException, RemoteException {}
+
+        @PostActivate
+        public void myPostActivate() {}
+
+        @PrePassivate
+        public void myPrePassivate() {}
+
+        @AfterBegin
+        public void myAfterBegin() {}
+
+        @BeforeCompletion
+        public void beforeCompletion() {}
+
+        @AfterCompletion
+        public void afterCompletion(boolean committed) {}
     }
 }
\ No newline at end of file


Reply via email to