You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2015/08/18 10:09:11 UTC

tapestry-5 git commit: TAP5-1813: check interface methods for correct parameters when binding using StrategyBuilder

Repository: tapestry-5
Updated Branches:
  refs/heads/master 6339ad360 -> dd0c58457


TAP5-1813: check interface methods for correct parameters when binding using StrategyBuilder


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

Branch: refs/heads/master
Commit: dd0c58457cd2529413b72d709f84a040f13589b0
Parents: 6339ad3
Author: Jochen Kemnade <jo...@eddyson.de>
Authored: Tue Aug 18 10:08:09 2015 +0200
Committer: Jochen Kemnade <jo...@eddyson.de>
Committed: Tue Aug 18 10:08:09 2015 +0200

----------------------------------------------------------------------
 .../internal/services/StrategyBuilderImpl.java  | 17 ++++++++++++
 .../ioc/specs/StrategyBuilderImplSpec.groovy    | 27 ++++++++++++++++++++
 2 files changed, 44 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/dd0c5845/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/StrategyBuilderImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/StrategyBuilderImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/StrategyBuilderImpl.java
index e7f65a6..d443c70 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/StrategyBuilderImpl.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/StrategyBuilderImpl.java
@@ -62,9 +62,26 @@ public class StrategyBuilderImpl implements StrategyBuilder
             {
                 final PlasticField registryField = plasticClass.introduceField(StrategyRegistry.class, "registry")
                         .inject(registry);
+                Class<?> interfaceSelectorType = null;
 
                 for (final Method method : interfaceType.getMethods())
                 {
+                    Class<?>[] parameterTypes = method.getParameterTypes();
+                    if (parameterTypes.length == 0)
+                    {
+                        throw new IllegalArgumentException("Invalid method "  + method
+                            + ", when using the strategy pattern, every method must take at least the selector as its parameter");
+                    }
+                    Class<?> methodSelectorType = parameterTypes[0];
+                    if (interfaceSelectorType == null)
+                    {
+                        interfaceSelectorType = methodSelectorType;
+                    } else if (!interfaceSelectorType.equals(methodSelectorType))
+                    {
+                        throw new IllegalArgumentException("Conflicting method definition "  + method
+                            + ", expecting a parameter of type " + interfaceSelectorType + " as the first argument");
+
+                    }
                     plasticClass.introduceMethod(new MethodDescription(method), new InstructionBuilderCallback()
                     {
                         @Override

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/dd0c5845/tapestry-ioc/src/test/groovy/ioc/specs/StrategyBuilderImplSpec.groovy
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/test/groovy/ioc/specs/StrategyBuilderImplSpec.groovy b/tapestry-ioc/src/test/groovy/ioc/specs/StrategyBuilderImplSpec.groovy
index 9f24309..5294061 100644
--- a/tapestry-ioc/src/test/groovy/ioc/specs/StrategyBuilderImplSpec.groovy
+++ b/tapestry-ioc/src/test/groovy/ioc/specs/StrategyBuilderImplSpec.groovy
@@ -1,6 +1,8 @@
 package ioc.specs
 
 import org.apache.tapestry5.ioc.services.StrategyBuilder
+
+import spock.lang.Issue;
 import spock.lang.Shared
 
 
@@ -65,5 +67,30 @@ class StrategyBuilderImplSpec extends AbstractSharedRegistrySpecification {
 
     e.message == "No adapter from type void to type ioc.specs.KindOf is available."
   }
+  
+  interface Provider {
+    Object provide()
+  }
+  
+  interface Provider2 {
+    Object provide(String arg)
+    Object provide2(Integer arg)
+  }
+  
+  @Issue('TAP5-1813')
+  def "interface methods are checked for selector parameter"(){
+    when:
+    StrategyBuilder builder = getService StrategyBuilder
+    Provider provider = builder.build Provider, [:]
+    then:
+    IllegalArgumentException e = thrown()
+    e.message.contains 'every method must take at least the selector as its parameter'
+    when:
+    Provider2 provider2 = builder.build Provider2, [:]
+    then:
+    IllegalArgumentException e2 = thrown()
+    e2.message.contains 'expecting a parameter of type class java.lang.String as the first argument'
+   
+  }
 
 }