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'
+
+ }
}