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