You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2010/01/01 22:45:47 UTC

svn commit: r895080 - in /tapestry/tapestry5/trunk/tapestry-ioc/src: main/java/org/apache/tapestry5/ioc/internal/ test/java/org/apache/tapestry5/ioc/internal/

Author: hlship
Date: Fri Jan  1 21:45:46 2010
New Revision: 895080

URL: http://svn.apache.org/viewvc?rev=895080&view=rev
Log:
TAP5-839: Tapestry should ignore (public) synthetic methods in module classes

Added:
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/SyntheticMethodModule.java   (with props)
Modified:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java?rev=895080&r1=895079&r2=895080&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java Fri Jan  1 21:45:46 2010
@@ -112,6 +112,7 @@
         Set<Method> methods = CollectionFactory.newSet(moduleClass.getMethods());
 
         methods.removeAll(OBJECT_METHODS);
+		removeSyntheticMethods(methods);
 
         boolean modulePreventsServiceDecoration = moduleClass.getAnnotation(PreventServiceDecoration.class) != null;
 
@@ -150,6 +151,18 @@
         return serviceDefs.get(serviceId);
     }
 
+	private void removeSyntheticMethods(Set<Method> methods)
+	{
+		Iterator<Method> iterator = methods.iterator();
+
+        while (iterator.hasNext())
+		{
+            Method m = iterator.next();
+            
+			if (m.isSynthetic()) iterator.remove();
+		}
+	}
+
     private void grind(Set<Method> remainingMethods, boolean modulePreventsServiceDecoration)
     {
         Method[] methods = moduleClass.getMethods();

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java?rev=895080&r1=895079&r2=895080&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java Fri Jan  1 21:45:46 2010
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry5.ioc.internal;
 
+import javassist.bytecode.AccessFlag;
 import org.apache.tapestry5.ioc.*;
 import org.apache.tapestry5.ioc.def.ContributionDef;
 import org.apache.tapestry5.ioc.def.DecoratorDef;
@@ -22,7 +23,9 @@
 import org.apache.tapestry5.ioc.internal.services.ClassFactoryImpl;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.ioc.services.ClassFab;
 import org.apache.tapestry5.ioc.services.ClassFactory;
+import org.apache.tapestry5.ioc.services.MethodSignature;
 import org.apache.tapestry5.ioc.test.IOCTestCase;
 import static org.easymock.EasyMock.contains;
 import org.slf4j.Logger;
@@ -31,6 +34,8 @@
 import org.testng.annotations.Test;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.List;
 import java.util.Set;
 
 public class DefaultModuleDefImplTest extends IOCTestCase
@@ -598,6 +603,48 @@
         verify();
     }
 
+    /**
+     * TAP5-839
+     */
+    @Test
+    public void public_synthetic_methods_are_ignored() throws NoSuchMethodException
+    {
+        Class moduleClass = createSyntheticMethodModuleClass();
+
+        Logger logger = mockLogger();
+
+        replay();
+
+        ModuleDef md = new DefaultModuleDefImpl(moduleClass, logger, classFactory);
+
+        // reality check that a service was found
+        
+        assertEquals(md.getServiceIds().size(), 1);
+
+        verify();
+    }
+
+    private Class createSyntheticMethodModuleClass() throws NoSuchMethodException
+    {
+        ClassFab fab = classFactory.newClass("EnhancedSyntheticMethodModule", SyntheticMethodModule.class);
+
+        int modifiers = Modifier.PUBLIC | AccessFlag.SYNTHETIC;
+
+        // choose arbitrary signature
+
+        MethodSignature signature = new MethodSignature(List.class.getMethod("size"));
+
+        fab.addMethod(modifiers, signature, "return 0;");
+
+        Class moduleClass = fab.createClass();
+
+        // make sure we really managed to create a synthetic method
+
+        assertTrue(moduleClass.getMethod("size").isSynthetic());
+        
+        return moduleClass;
+    }
+
     // TODO: We're short on tests that ensure that marker annotation are additive (i.e., module
     // marker annotation are
     // merged into the set specific to the service).

Added: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/SyntheticMethodModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/SyntheticMethodModule.java?rev=895080&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/SyntheticMethodModule.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/SyntheticMethodModule.java Fri Jan  1 21:45:46 2010
@@ -0,0 +1,25 @@
+// Copyright 2009 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.internal;
+
+// test will enhance this class to contain a public synthetic method
+
+public class SyntheticMethodModule
+{
+    public Object build()
+    {
+        return new Object();
+    }
+}

Propchange: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/SyntheticMethodModule.java
------------------------------------------------------------------------------
    svn:eol-style = native