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 <[email protected]> Authored: Tue Aug 18 10:08:09 2015 +0200 Committer: Jochen Kemnade <[email protected]> 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' + + } }
