You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2006/12/21 17:24:06 UTC

svn commit: r489394 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/internal/ main/java/org/apache/tapestry/internal/services/ main/java/org/apache/tapestry/test/ site/apt/guide/ test/java/org/apache/tapestry/integration...

Author: hlship
Date: Thu Dec 21 08:24:05 2006
New Revision: 489394

URL: http://svn.apache.org/viewvc?view=rev&rev=489394
Log:
Add support for naming conventions for event handler methods

Added:
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryUtilsTest.java
Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryUtils.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/OnEventWorker.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
    tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/event.apt
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/ActionPage.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/NumberSelect.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/SimpleForm.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryUtils.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryUtils.java?view=diff&rev=489394&r1=489393&r2=489394
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryUtils.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryUtils.java Thu Dec 21 08:24:05 2006
@@ -38,4 +38,14 @@
             }
     }
 
+    /**
+     * Converts the first character of a string to lowercase, leavining the rest of the string
+     * unchanged.
+     */
+    public static String decapitalize(String input)
+    {
+        char first = input.charAt(0);
+
+        return Character.toLowerCase(first) + input.substring(1);
+    }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/OnEventWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/OnEventWorker.java?view=diff&rev=489394&r1=489393&r2=489394
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/OnEventWorker.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/OnEventWorker.java Thu Dec 21 08:24:05 2006
@@ -17,11 +17,13 @@
 import java.util.List;
 
 import org.apache.tapestry.annotations.OnEvent;
+import org.apache.tapestry.internal.TapestryUtils;
 import org.apache.tapestry.ioc.util.BodyBuilder;
 import org.apache.tapestry.model.MutableComponentModel;
 import org.apache.tapestry.runtime.Component;
 import org.apache.tapestry.services.ClassTransformation;
 import org.apache.tapestry.services.ComponentClassTransformWorker;
+import org.apache.tapestry.services.MethodFilter;
 import org.apache.tapestry.services.MethodSignature;
 import org.apache.tapestry.services.TransformConstants;
 import org.apache.tapestry.services.TransformUtils;
@@ -35,9 +37,20 @@
 {
     static final String OBJECT_ARRAY_TYPE = "java.lang.Object[]";
 
-    public void transform(ClassTransformation transformation, MutableComponentModel model)
+    private final String[] _empty = new String[0];
+
+    public void transform(final ClassTransformation transformation, MutableComponentModel model)
     {
-        List<MethodSignature> methods = transformation.findMethodsWithAnnotation(OnEvent.class);
+        MethodFilter filter = new MethodFilter()
+        {
+            public boolean accept(MethodSignature signature)
+            {
+                return signature.getMethodName().startsWith("on")
+                        || transformation.getMethodAnnotation(signature, OnEvent.class) != null;
+            };
+        };
+
+        List<MethodSignature> methods = transformation.findMethods(filter);
 
         // No methods, no work.
 
@@ -66,7 +79,7 @@
 
         OnEvent annotation = transformation.getMethodAnnotation(method, OnEvent.class);
 
-        String[] eventTypes = annotation.value();
+        String[] eventTypes = extractEventTypes(method, annotation);
 
         if (eventTypes.length > 0)
         {
@@ -81,7 +94,7 @@
             closeCount++;
         }
 
-        String[] componentIds = annotation.component();
+        String[] componentIds = extractComponentIds(method, annotation);
 
         if (componentIds.length > 0)
         {
@@ -125,6 +138,48 @@
 
         for (int i = 0; i < closeCount; i++)
             builder.end();
+    }
+
+    private String[] extractComponentIds(MethodSignature method, OnEvent annotation)
+    {
+        if (annotation != null)
+            return annotation.component();
+
+        // Method name started with "on". Extract the component id, if present.
+
+        String name = method.getMethodName();
+
+        int fromx = name.indexOf("From");
+
+        if (fromx < 0)
+            return _empty;
+
+        String componentId = name.substring(fromx + 4);
+
+        return new String[]
+        { TapestryUtils.decapitalize(componentId) };
+    }
+
+    private String[] extractEventTypes(MethodSignature method, OnEvent annotation)
+    {
+        if (annotation != null)
+            return annotation.value();
+
+        // Method name started with "on". Extract the event type.
+
+        String name = method.getMethodName();
+
+        int fromx = name.indexOf("From");
+
+        String eventName = fromx == -1 ? name.substring(2) : name.substring(2, fromx);
+
+        // This is intended for onAnyFromComponentId, but just onAny works too (and is dangerous).
+
+        if (eventName.equals("AnyEvent"))
+            return _empty;
+
+        return new String[]
+        { TapestryUtils.decapitalize(eventName) };
     }
 
     private void buildMethodParameters(BodyBuilder builder, MethodSignature method)

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java?view=diff&rev=489394&r1=489393&r2=489394
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java Thu Dec 21 08:24:05 2006
@@ -461,7 +461,7 @@
     protected final <T extends Annotation> void train_getMethodAnnotation(ClassTransformation ct,
             MethodSignature signature, Class<T> annotationClass, T annotation)
     {
-        expect(ct.getMethodAnnotation(signature, annotationClass)).andReturn(annotation);
+        expect(ct.getMethodAnnotation(signature, annotationClass)).andReturn(annotation).atLeastOnce();
     }
 
     protected final ClasspathAssetAliasManager newClasspathAssetAliasManager()

Modified: tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/event.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/event.apt?view=diff&rev=489394&r1=489393&r2=489394
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/event.apt (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/event.apt Thu Dec 21 08:24:05 2006
@@ -58,8 +58,39 @@
   
   []
   
-  The OnEvent annotation allows events to be selected based on the originating component,
-  or on the type of event.
+  In the above example, the choose() method will be invoked on <any event> that originates
+  inn component <<<choose>>>.  Since ActionLink components only emit a single type of event, "action", 
+  this will not be a problem.
+  
+  Some components can emit more than one type of event, in which case you will want to be more specific:
+  
++---+
+  @OnEvent(value = "action", component = "choose")
+  void choose(int value)
+  {
+    _value = value;
+  }
++---+
+  
+  The value attribute of the OnEvent annotation is the name of the event to match.
+  
+Event Handler Method Convention Names  
+  
+  As an alternative to the use of annotations, you may name your events in a specific fashion, and Tapestry will invoke your methods just as if
+  they were annotated.  
+  
+  This style of event handler methods start with the prefix "on", followed by the name of the action (capitalized).  You may then continue by adding "From" and
+  a capitalized component id.
+  
+  The previous example may be rewritten as:
+  
++---+
+  void onActionFromChoose(int value)
+  {
+    _value = value;
+  }
++---+  
+  
   
 Context
 
@@ -68,7 +99,7 @@
   an elaborate type mechanism with the odd name "DataSqueezer".
   
   Again, whatever your value is (string, number, date), it is converted into a plain string.
-  This results in a more readable string.
+  This results in a more readable URL.
   
   If you have multiple context values (by binding a list or array of objects to the ActionLink's
   context parameter), then each one, in order, will be added to the URL.
@@ -134,7 +165,7 @@
   passed to any activate event handlers.  In this way, information about the page can be encoded into URIs for the page, in a light-weight
   (and human readable) manner.
   
-  This was created with the intent of handling pages that exist to view (or perhaps edit) a specific instance of some type; in the
+  This was created with the intent of handling pages that exist to view (or perhaps to edit) a specific instance of some type; in the
   context of a CRUD application, the context is used to store the primary key of some entity object:
     
 +---+
@@ -147,14 +178,12 @@
     @Inject
     private CustomerDAO _customerDAO;
     
-    @OnEvent("passivate")
-    long passivate()
+    long onPassivate()
     {
       return _customer.getId();
     }
   
-    @OnEvent("activate")
-    void activate(long customerId)
+    void onActivate(long customerId)
     {
       _customer = _customerDAO.get(customerId);
     }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/ActionPage.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/ActionPage.java?view=diff&rev=489394&r1=489393&r2=489394
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/ActionPage.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/ActionPage.java Thu Dec 21 08:24:05 2006
@@ -12,48 +12,43 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry.integration.app1.pages;
-
-import org.apache.tapestry.annotations.ComponentClass;
-import org.apache.tapestry.annotations.OnEvent;
-import org.apache.tapestry.annotations.Persist;
-
-/**
- * 
- */
-@ComponentClass
-public class ActionPage
-{
-    private int _index;
-
-    // Must be persistent, to survive from one request to the next.
-    // An action request is always followed by a redirect request.
-    @Persist
-    private int _value;
-
-    @OnEvent(component = "choose")
-    void choose(int value)
-    {
-        _value = value;
-    }
-
-    public int getIndex()
-    {
-        return _index;
-    }
-
-    public void setIndex(int index)
-    {
-        _index = index;
-    }
-
-    public int getValue()
-    {
-        return _value;
-    }
-    
-    public String getLinkClass()
-    {
-        return _index == _value ? "selected" : null;
-    }
-}
+package org.apache.tapestry.integration.app1.pages;
+
+import org.apache.tapestry.annotations.ComponentClass;
+import org.apache.tapestry.annotations.Persist;
+
+@ComponentClass
+public class ActionPage
+{
+    private int _index;
+
+    // Must be persistent, to survive from one request to the next.
+    // An action request is always followed by a redirect request.
+    @Persist
+    private int _value;
+
+    void onActionFromChoose(int value)
+    {
+        _value = value;
+    }
+
+    public int getIndex()
+    {
+        return _index;
+    }
+
+    public void setIndex(int index)
+    {
+        _index = index;
+    }
+
+    public int getValue()
+    {
+        return _value;
+    }
+
+    public String getLinkClass()
+    {
+        return _index == _value ? "selected" : null;
+    }
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/NumberSelect.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/NumberSelect.java?view=diff&rev=489394&r1=489393&r2=489394
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/NumberSelect.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/NumberSelect.java Thu Dec 21 08:24:05 2006
@@ -16,7 +16,6 @@
 
 import org.apache.tapestry.annotations.ComponentClass;
 import org.apache.tapestry.annotations.InjectPage;
-import org.apache.tapestry.annotations.OnEvent;
 
 @ComponentClass
 public class NumberSelect
@@ -41,8 +40,7 @@
     @InjectPage
     private ShowSelection _showSelection;
 
-    @OnEvent(component = "select")
-    Object doSelect(int index)
+    Object onActionFromSelect(int index)
     {
         _showSelection.setSelected(index);
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/SimpleForm.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/SimpleForm.java?view=diff&rev=489394&r1=489393&r2=489394
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/SimpleForm.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/SimpleForm.java Thu Dec 21 08:24:05 2006
@@ -15,7 +15,6 @@
 package org.apache.tapestry.integration.app1.pages;
 
 import org.apache.tapestry.annotations.ComponentClass;
-import org.apache.tapestry.annotations.OnEvent;
 import org.apache.tapestry.annotations.Persist;
 import org.apache.tapestry.integration.app1.data.IncidentData;
 
@@ -43,8 +42,7 @@
         return _incident;
     }
 
-    @OnEvent("prepare")
-    void prepare()
+    void onPrepare()
     {
         if (_incident == null)
             _incident = new IncidentData();

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryUtilsTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryUtilsTest.java?view=auto&rev=489394
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryUtilsTest.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryUtilsTest.java Thu Dec 21 08:24:05 2006
@@ -0,0 +1,64 @@
+package org.apache.tapestry.internal;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+import org.apache.tapestry.ioc.test.TestBase;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class TapestryUtilsTest extends TestBase
+{
+    @Test
+    public void close_null_is_noop()
+    {
+        TapestryUtils.close(null);
+    }
+
+    @Test
+    public void close_success() throws Exception
+    {
+        Closeable c = newMock(Closeable.class);
+
+        c.close();
+
+        replay();
+
+        TapestryUtils.close(c);
+
+        verify();
+    }
+
+    @Test
+    public void close_ignores_exceptions() throws Exception
+    {
+        Closeable c = newMock(Closeable.class);
+
+        c.close();
+        setThrowable(new IOException());
+
+        replay();
+
+        TapestryUtils.close(c);
+
+        verify();
+    }
+
+    @Test(dataProvider = "decapitalize_inputs")
+    public void decapitalize(String input, String expected)
+    {
+        assertEquals(TapestryUtils.decapitalize(input), expected);
+    }
+
+    @DataProvider(name = "decapitalize_inputs")
+    public Object[][] decaptialize_inputs()
+    {
+        return new Object[][]
+        {
+        { "Alpha", "alpha" },
+        { "beta", "beta" },
+        { "A", "a" },
+        { "z", "z" },
+        { "0abc", "0abc" } };
+    }
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java?view=diff&rev=489394&r1=489393&r2=489394
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java Thu Dec 21 08:24:05 2006
@@ -14,13 +14,13 @@
 
 package org.apache.tapestry.internal.services;
 
+import static org.easymock.EasyMock.aryEq;
+import static org.easymock.EasyMock.eq;
+
 import java.lang.reflect.Modifier;
-import java.util.Collections;
-import java.util.List;
 
 import org.apache.tapestry.annotations.OnEvent;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
-import org.apache.tapestry.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry.model.MutableComponentModel;
 import org.apache.tapestry.services.ClassTransformation;
 import org.apache.tapestry.services.MethodSignature;
@@ -44,8 +44,10 @@
         ClassTransformation ct = newClassTransformation();
         MutableComponentModel model = newMutableComponentModel();
 
-        List<MethodSignature> methods = CollectionFactory.newList();
-        train_findMethodsWithAnnotation(ct, OnEvent.class, methods);
+        MethodSignature sig = new MethodSignature("foo");
+
+        train_findMethods(ct, sig);
+        train_getMethodAnnotation(ct, sig, OnEvent.class, null);
 
         replay();
 
@@ -63,8 +65,7 @@
 
         MethodSignature signature = new MethodSignature("foo");
 
-        List<MethodSignature> methods = Collections.singletonList(signature);
-        train_findMethodsWithAnnotation(ct, OnEvent.class, methods);
+        train_findMethods(ct, signature);
 
         train_getMethodAnnotation(ct, signature, OnEvent.class, annotation);
 
@@ -102,8 +103,7 @@
 
         MethodSignature signature = new MethodSignature("foo");
 
-        List<MethodSignature> methods = Collections.singletonList(signature);
-        train_findMethodsWithAnnotation(ct, OnEvent.class, methods);
+        train_findMethods(ct, signature);
 
         train_getMethodAnnotation(ct, signature, OnEvent.class, annotation);
 
@@ -135,6 +135,49 @@
         verify();
     }
 
+    protected final void train_addInjectedField(ClassTransformation ct, String suggestedName,
+            String actualName, String... values)
+    {
+        expect(ct.addInjectedField(eq(String[].class), eq(suggestedName), aryEq(values)))
+                .andReturn(actualName);
+    }
+
+    @Test
+    public void by_convention_on_event_type()
+    {
+        ClassTransformation ct = newClassTransformation();
+        MutableComponentModel model = newMutableComponentModel();
+
+        MethodSignature signature = new MethodSignature("onSubmit");
+
+        train_findMethods(ct, signature);
+
+        train_getMethodAnnotation(ct, signature, OnEvent.class, null);
+
+        train_addInjectedField(ct, "eventTypes", "_v", "submit");
+
+        train_getClassName(ct, "foo.Bar");
+
+        train_extendMethod(
+                ct,
+                TransformConstants.HANDLE_COMPONENT_EVENT,
+                "{",
+                BOILERPLATE_1,
+                "if ($1.matchesByEventType(_v))",
+                "{",
+                BOILERPLATE_2,
+                "$1.setSource(this, \"foo.Bar.onSubmit()\");",
+                "onSubmit();",
+                "}",
+                "}");
+
+        replay();
+
+        new OnEventWorker().transform(ct, model);
+
+        verify();
+    }
+
     @Test
     public void filter_by_component_id()
     {
@@ -147,8 +190,7 @@
 
         MethodSignature signature = new MethodSignature("foo");
 
-        List<MethodSignature> methods = Collections.singletonList(signature);
-        train_findMethodsWithAnnotation(ct, OnEvent.class, methods);
+        train_findMethods(ct, signature);
 
         train_getMethodAnnotation(ct, signature, OnEvent.class, annotation);
 
@@ -182,6 +224,44 @@
     }
 
     @Test
+    public void by_convention_on_component_id()
+    {
+        ClassTransformation ct = newClassTransformation();
+        MutableComponentModel model = newMutableComponentModel();
+
+        MethodSignature signature = new MethodSignature("onAnyEventFromZork");
+
+        train_findMethods(ct, signature);
+
+        train_getMethodAnnotation(ct, signature, OnEvent.class, null);
+
+        train_addInjectedField(ct, "componentIds", "_ids", "zork");
+
+        train_getResourcesFieldName(ct, "_res");
+
+        train_getClassName(ct, "foo.Bar");
+
+        train_extendMethod(
+                ct,
+                TransformConstants.HANDLE_COMPONENT_EVENT,
+                "{",
+                BOILERPLATE_1,
+                "if ($1.matchesByComponentId(_res, _ids))",
+                "{",
+                BOILERPLATE_2,
+                "$1.setSource(this, \"foo.Bar.onAnyEventFromZork()\");",
+                "onAnyEventFromZork();",
+                "}",
+                "}");
+
+        replay();
+
+        new OnEventWorker().transform(ct, model);
+
+        verify();
+    }
+
+    @Test
     public void filter_by_both()
     {
         ClassTransformation ct = newClassTransformation();
@@ -195,8 +275,7 @@
 
         MethodSignature signature = new MethodSignature("foo");
 
-        List<MethodSignature> methods = Collections.singletonList(signature);
-        train_findMethodsWithAnnotation(ct, OnEvent.class, methods);
+        train_findMethods(ct, signature);
 
         train_getMethodAnnotation(ct, signature, OnEvent.class, annotation);
 
@@ -246,8 +325,7 @@
         MethodSignature signature = new MethodSignature(Modifier.PRIVATE, "java.lang.String",
                 "foo", null, null);
 
-        List<MethodSignature> methods = Collections.singletonList(signature);
-        train_findMethodsWithAnnotation(ct, OnEvent.class, methods);
+        train_findMethods(ct, signature);
 
         train_getMethodAnnotation(ct, signature, OnEvent.class, annotation);
 
@@ -284,8 +362,7 @@
                 new String[]
                 { "java.lang.String" }, null);
 
-        List<MethodSignature> methods = Collections.singletonList(signature);
-        train_findMethodsWithAnnotation(ct, OnEvent.class, methods);
+        train_findMethods(ct, signature);
 
         train_getMethodAnnotation(ct, signature, OnEvent.class, annotation);
 
@@ -322,8 +399,7 @@
                 new String[]
                 { "boolean" }, null);
 
-        List<MethodSignature> methods = Collections.singletonList(signature);
-        train_findMethodsWithAnnotation(ct, OnEvent.class, methods);
+        train_findMethods(ct, signature);
 
         train_getMethodAnnotation(ct, signature, OnEvent.class, annotation);
 
@@ -361,8 +437,7 @@
                 new String[]
                 { "java.lang.String", "java.lang.Integer" }, null);
 
-        List<MethodSignature> methods = Collections.singletonList(signature);
-        train_findMethodsWithAnnotation(ct, OnEvent.class, methods);
+        train_findMethods(ct, signature);
 
         train_getMethodAnnotation(ct, signature, OnEvent.class, annotation);
 
@@ -400,8 +475,7 @@
                 new String[]
                 { "java.lang.String", OnEventWorker.OBJECT_ARRAY_TYPE, "java.lang.Integer" }, null);
 
-        List<MethodSignature> methods = Collections.singletonList(signature);
-        train_findMethodsWithAnnotation(ct, OnEvent.class, methods);
+        train_findMethods(ct, signature);
 
         train_getMethodAnnotation(ct, signature, OnEvent.class, annotation);
 
@@ -419,7 +493,8 @@
                 "{",
                 BOILERPLATE_1,
                 BOILERPLATE_2,
-                String.format("$1.setSource(this, \"foo.Bar.%s\");", signature.getMediumDescription()),
+                String.format("$1.setSource(this, \"foo.Bar.%s\");", signature
+                        .getMediumDescription()),
                 "foo((java.lang.String)$1.coerceContext(0, \"java.lang.String\"), ",
                 "$1.getContext(), ",
                 "(java.lang.Integer)$1.coerceContext(1, \"java.lang.Integer\"));",