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

Reply via email to