You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by jk...@apache.org on 2014/04/30 13:40:25 UTC

git commit: TAP5-2302: ignore methods overridden from java.lang.Object in module classes

Repository: tapestry-5
Updated Branches:
  refs/heads/master df619008f -> 4458dc3aa


TAP5-2302: ignore methods overridden from java.lang.Object in module classes


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/4458dc3a
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/4458dc3a
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/4458dc3a

Branch: refs/heads/master
Commit: 4458dc3aa020103654c63d69344d77883a4ae21f
Parents: df61900
Author: Jochen Kemnade <jo...@eddyson.de>
Authored: Wed Apr 30 13:38:44 2014 +0200
Committer: Jochen Kemnade <jo...@eddyson.de>
Committed: Wed Apr 30 13:40:02 2014 +0200

----------------------------------------------------------------------
 .../ioc/internal/DefaultModuleDefImpl.java      | 34 +++++++++++++++-
 .../ioc/specs/DefaultModuleDefImplSpec.groovy   | 12 ++++++
 .../ModuleWithOverriddenObjectMethods.java      | 42 ++++++++++++++++++++
 3 files changed, 87 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4458dc3a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
index eca6b7d..be3c3ee 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
@@ -119,7 +119,20 @@ public class DefaultModuleDefImpl implements ModuleDef2, ServiceDefAccumulator
 
         Set<Method> methods = CollectionFactory.newSet(moduleClass.getMethods());
 
-        methods.removeAll(OBJECT_METHODS);
+        Iterator<Method> methodIterator = methods.iterator();
+
+        while (methodIterator.hasNext())
+        {
+            Method method = methodIterator.next();
+            for (Method objectMethod : OBJECT_METHODS)
+            {
+                if (signaturesAreEqual(method, objectMethod))
+                {
+                    methodIterator.remove();
+                }
+            }
+        }
+
         removeSyntheticMethods(methods);
 
         boolean modulePreventsServiceDecoration = moduleClass.getAnnotation(PreventServiceDecoration.class) != null;
@@ -134,6 +147,25 @@ public class DefaultModuleDefImpl implements ModuleDef2, ServiceDefAccumulator
                 moduleClass.getName(), InternalUtils.joinSorted(methods)));
     }
 
+    private static boolean signaturesAreEqual(Method m1, Method m2)
+    {
+        if (m1.getName() == m2.getName()) {
+            if (!m1.getReturnType().equals(m2.getReturnType()))
+                return false;
+            Class<?>[] params1 = m1.getParameterTypes();
+            Class<?>[] params2 = m2.getParameterTypes();
+            if (params1.length == params2.length)
+            {
+                for (int i = 0; i < params1.length; i++) {
+                    if (params1[i] != params2[i])
+                        return false;
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * Identifies the module class and a list of service ids within the module.
      */

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4458dc3a/tapestry-ioc/src/test/groovy/ioc/specs/DefaultModuleDefImplSpec.groovy
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/test/groovy/ioc/specs/DefaultModuleDefImplSpec.groovy b/tapestry-ioc/src/test/groovy/ioc/specs/DefaultModuleDefImplSpec.groovy
index d017dfc..5600ed0 100644
--- a/tapestry-ioc/src/test/groovy/ioc/specs/DefaultModuleDefImplSpec.groovy
+++ b/tapestry-ioc/src/test/groovy/ioc/specs/DefaultModuleDefImplSpec.groovy
@@ -424,6 +424,18 @@ class DefaultModuleDefImplSpec extends Specification {
 
     md.serviceIds.size() == 1
   }
+  
+  def "Methods overridden from Object are ignored"() {
+
+    when:
+
+    def md = module ModuleWithOverriddenObjectMethods
+
+    then:
+
+    md.serviceIds.size() == 1
+  }
+
 
   private createSyntheticModuleClass() {
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4458dc3a/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ModuleWithOverriddenObjectMethods.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ModuleWithOverriddenObjectMethods.java b/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ModuleWithOverriddenObjectMethods.java
new file mode 100644
index 0000000..3999820
--- /dev/null
+++ b/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ModuleWithOverriddenObjectMethods.java
@@ -0,0 +1,42 @@
+// Copyright 2006, 2007, 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;
+
+/**
+ * Used by {@link org.apache.tapestry5.ioc.internal.DefaultModuleDefImplTest}.
+ */
+public class ModuleWithOverriddenObjectMethods
+{
+  public static Object build()
+  {
+      return new Object();
+  }
+
+  @Override
+  public int hashCode() {
+    return 23;
+  }
+  
+  @Override
+  public boolean equals(Object obj) {
+    return super.equals(obj);
+  }
+  
+  @Override
+  public String toString() {
+    return "This is a module class that overrides Object methods";
+  }
+  
+}