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