commit e8030b13b05183d1fcb12e1f6a910c10b0e5c2cd
Author:     Mauro Talevi <mauro.tal...@aquilonia.org>
AuthorDate: Wed, 1 Oct 2014 21:10:53 +0100
Commit:     Mauro Talevi <mauro.tal...@aquilonia.org>
CommitDate: Wed, 1 Oct 2014 21:10:53 +0100

    JBEHAVE-1049:  Support generic parameter types in StepCreator.

diff --git a/jbehave-core/src/main/java/org/jbehave/core/steps/StepCreator.java 
b/jbehave-core/src/main/java/org/jbehave/core/steps/StepCreator.java
index bb1171a..f61138d 100755
--- a/jbehave-core/src/main/java/org/jbehave/core/steps/StepCreator.java
+++ b/jbehave-core/src/main/java/org/jbehave/core/steps/StepCreator.java
@@ -784,14 +784,14 @@ public class StepCreator {
         private final ParameterConverters parameterConverters;
         private final Paranamer paranamer;
         private final Meta meta;
-        private int methodArity;
+        private final Type[] parameterTypes;
         
         public MethodInvoker(Method method, ParameterConverters 
parameterConverters, Paranamer paranamer, Meta meta) {
             this.method = method;
             this.parameterConverters = parameterConverters;
             this.paranamer = paranamer;
             this.meta = meta;
-            this.methodArity = method.getParameterTypes().length;
+            this.parameterTypes = method.getGenericParameterTypes();
         }
 
         public void invoke() throws InvocationTargetException, 
IllegalAccessException {
@@ -799,36 +799,35 @@ public class StepCreator {
         }
 
         private Parameter[] methodParameters() {
-            Parameter[] parameters = new Parameter[methodArity];
-            String[] annotationNamedParameters = 
annotatedParameterNames(method);
-            String[] parameterNames = paranamer.lookupParameterNames(method, 
false);
-            Class<?>[] parameterTypes = method.getParameterTypes();
+            Parameter[] parameters = new Parameter[parameterTypes.length];
+            String[] annotatedNames = annotatedParameterNames(method);
+            String[] paranamerNames = paranamer.lookupParameterNames(method, 
false);
 
-            for (int paramPosition = 0; paramPosition < methodArity; 
paramPosition++) {
-                String paramName = parameterNameFor(paramPosition, 
annotationNamedParameters, parameterNames);
-                parameters[paramPosition] = new Parameter(paramPosition, 
parameterTypes[paramPosition], paramName);
+            for (int position = 0; position < parameterTypes.length; 
position++) {
+                String name = parameterNameFor(position, annotatedNames, 
paranamerNames);
+                parameters[position] = new Parameter(position, 
parameterTypes[position], name);
             }
 
             return parameters;
         }
 
-        private String parameterNameFor(int paramPosition, String[] 
annotationNamedParameters, String[] parameterNames) {
-            String nameFromAnnotation = 
nameIfValidPositionInArray(annotationNamedParameters, paramPosition);
-            String parameterName = nameIfValidPositionInArray(parameterNames, 
paramPosition);
-            if (nameFromAnnotation != null) {
-                return nameFromAnnotation;
-            } else if (parameterName != null) {
-                return parameterName;
+        private String parameterNameFor(int position, String[] annotatedNames, 
String[] paranamerNames) {
+            String annotatedName = nameByPosition(annotatedNames, position);
+            String paranamerName = nameByPosition(paranamerNames, position);
+            if (annotatedName != null) {
+                return annotatedName;
+            } else if (paranamerName != null) {
+                return paranamerName;
             }
             return null;
         }
 
-        private String nameIfValidPositionInArray(String[] paramNames, int 
paramPosition) {
-            return paramPosition < paramNames.length ? 
paramNames[paramPosition] : null;
+        private String nameByPosition(String[] names, int position) {
+            return position < names.length ? names[position] : null;
         }
 
         private Object[] parameterValuesFrom(Meta meta) {
-            Object[] values = new Object[methodArity];
+            Object[] values = new Object[parameterTypes.length];
             for (Parameter parameter : methodParameters()) {
                values[parameter.position] = 
parameterConverters.convert(parameter.valueFrom(meta), parameter.type);
             }
@@ -837,10 +836,10 @@ public class StepCreator {
 
         private class Parameter {
             private final int position;
-            private final Class<?> type;
+            private final Type type;
             private final String name;
 
-            public Parameter(int position, Class<?> type, String name) {
+            public Parameter(int position, Type type, String name) {
                 this.position = position;
                 this.type = type;
                 this.name = name;



Reply via email to