Hi, Karan I have a question for this change, the timeout method could be specified by @Timeout or impmented TimedObject or configured in the deployment descriptor, so why the annotation checking is required ? Thanks !
2010/7/21 <[email protected]> > Author: kmalhi > Date: Wed Jul 21 02:51:58 2010 > New Revision: 966073 > > URL: http://svn.apache.org/viewvc?rev=966073&view=rev > Log: > Updated CheckCallbacks to test for scenario where a class has two or more > overloaded methods, but the method with the wrong signature is annotated > with @Timeout > Commented out keys from Messages.properties and also updated a detailed > message for a key > Added @Timeout tests > > 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/CheckInvalidTimeoutTest.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=966073&r1=966072&r2=966073&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 21 02:51:58 2010 > @@ -16,6 +16,7 @@ > */ > package org.apache.openejb.config.rules; > > +import java.lang.annotation.Annotation; > import java.lang.reflect.Method; > import java.lang.reflect.Modifier; > import java.util.ArrayList; > @@ -29,6 +30,7 @@ import javax.ejb.PostActivate; > import javax.ejb.PrePassivate; > import javax.ejb.Remove; > import javax.ejb.SessionSynchronization; > +import javax.ejb.Timeout; > import javax.interceptor.InvocationContext; > > import org.apache.openejb.OpenEJBException; > @@ -336,12 +338,24 @@ public class CheckCallbacks extends Vali > if (timeout == null) return; > try { > Method method = getMethod(ejbClass, timeout.getMethodName(), > javax.ejb.Timer.class); > - > - Class<?> returnType = method.getReturnType(); > - > - if (!returnType.equals(Void.TYPE)) { > - fail(bean, "timeout.badReturnType", > timeout.getMethodName(), returnType.getName()); > + Annotation[] declaredAnnotations = > method.getDeclaredAnnotations(); > + boolean isAnnotated = false; > + for (Annotation annotation : declaredAnnotations) { > + if(annotation.equals(Timeout.class)){ > + isAnnotated = true; > + break; > + } > + } > + > + if (isAnnotated) { > + Class<?> returnType = method.getReturnType(); > + if (!returnType.equals(Void.TYPE)) { > + fail(bean, "timeout.badReturnType", > timeout.getMethodName(), returnType.getName()); > + } > + }else{ > + fail(bean, "timeout.missing.possibleTypo", > timeout.getMethodName(), getMethods(ejbClass, > timeout.getMethodName()).size()); > } > + > } catch (NoSuchMethodException e) { > List<Method> possibleMethods = getMethods(ejbClass, > timeout.getMethodName()); > > > 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=966073&r1=966072&r2=966073&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 21 02:51:58 2010 > @@ -223,10 +223,11 @@ > 2.timeout.badReturnType = Timeout method must return 'void': method {0} > returns {1} > 3.timeout.badReturnType = Timeout method "{0}" illegally returns {1} > instead of void. Change the method signature to "void {0}(javax.ejb.Timer)" > > +#Don't think this is ever going to be used, commenting it out for now. If > there is a case where this key can be used, please uncomment it and write a > test for it > # fail(bean, "timeout.missing", timeout.getMethodName()); > -1.timeout.missing = Timeout method missing > -2.timeout.missing = Timeout method missing: "{0}" in class {1} > -3.timeout.missing = Timeout method "{0}" not found in class {1}. The > required method signature is "void {0}(javax.ejb.Timer)" > +#1.timeout.missing = Timeout method missing > +#2.timeout.missing = Timeout method missing: "{0}" in class {1} > +#3.timeout.missing = Timeout method "{0}" not found in class {1}. The > required method signature is "void {0}(javax.ejb.Timer)" > > # fail(bean, "timeout.invalidArguments", timeout.getMethodName(), > getParameters(possibleMethods.get(0))); > 1.timeout.invalidArguments = Invalid Timeout arguments > @@ -236,7 +237,7 @@ > # fail(bean, "timeout.missing.possibleTypo", timeout.getMethodName(), > possibleMethods.size()); > 1.timeout.missing.possibleTypo = Timeout method missing or invalid > 2.timeout.missing.possibleTypo = Timeout method missing or invalid: looked > for "void {0}(javax.ejb.Timer)" > -3.timeout.missing.possibleTypo = Timeout method missing or invalid. There > are {1} methods with the name "{0}" visible, none have the required > signature of "void {0}(javax.ejb.Timer)" > +3.timeout.missing.possibleTypo = Timeout method missing or invalid. There > are {1} methods with the name "{0}" visible, either the wrong one has been > annotated with @Timeout or none have the required signature of "void > {0}(javax.ejb.Timer). A bean should have only one method annotated with > @Timeout and the method signature must match void {0}(javax.ejb.Timer)" > > # > fail(componentName,"timeout.tooManyMethods",timeoutMethods.size(),Join.join(",", > timeoutMethods)); > 1.timeout.tooManyMethods = More than one method annotated with @Timeout > > Modified: > openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/CheckInvalidTimeoutTest.java > URL: > http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/CheckInvalidTimeoutTest.java?rev=966073&r1=966072&r2=966073&view=diff > > ============================================================================== > --- > openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/CheckInvalidTimeoutTest.java > (original) > +++ > openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/rules/CheckInvalidTimeoutTest.java > Wed Jul 21 02:51:58 2010 > @@ -26,26 +26,40 @@ import org.junit.runner.RunWith; > > @RunWith(ValidationRunner.class) > public class CheckInvalidTimeoutTest extends TestCase { > - @Keys( { @Key(value = "timeout.badReturnType"), > @Key("timeout.invalidArguments"), @Key("timeout.tooManyMethods") }) > + @Keys( { @Key(value = "timeout.badReturnType"), > @Key("timeout.invalidArguments"), @Key("timeout.tooManyMethods") , > @Key("timeout.missing.possibleTypo")}) > public EjbJar test() throws Exception { > System.setProperty("openejb.validation.output.level", "VERBOSE"); > EjbJar ejbJar = new EjbJar(); > ejbJar.addEnterpriseBean(new StatelessBean(TestBean.class)); > ejbJar.addEnterpriseBean(new StatelessBean(FooBean.class)); > + ejbJar.addEnterpriseBean(new StatelessBean(BarBean.class)); > return ejbJar; > } > - > +// A case where the class has the method with wrong signature annotated > with @Timeout > + // timeout.badReturnType > + // timeout.invalidArguments > public static class TestBean { > @Timeout > public Object bar() { > return null; > } > } > - > +// A case where the class has more than one method annotated with @Timeout > + // timeout.tooManyMethods > public static class FooBean { > @Timeout > public void foo(javax.ejb.Timer timer) {} > @Timeout > public void bar(javax.ejb.Timer timer) {} > } > -} > \ No newline at end of file > +// A case where the class has overloaded methods, but the method with the > wrong signature has been annotated with @Timeout > + // timeout.missing.possibleTypo > + public static class BarBean { > + > + public void foo(javax.ejb.Timer timer) {} > + > + @Timeout > + public void foo() {} > + } > + > +} > > > -- Ivan
