commit e8030b13b05183d1fcb12e1f6a910c10b0e5c2cd
Author: Mauro Talevi <[email protected]>
AuthorDate: Wed, 1 Oct 2014 21:10:53 +0100
Commit: Mauro Talevi <[email protected]>
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;