01: package org.vraptor.component;
02:
03: import java.lang.reflect.Method;
04: import java.util.ArrayList;
05: import java.util.List;
06:
07: import org.apache.log4j.Logger;
08:
09: import com.thoughtworks.paranamer.BytecodeReadingParanamer;
10: import com.thoughtworks.paranamer.CachingParanamer;
11: import com.thoughtworks.paranamer.Paranamer;
12:
13: public class ParanamerParameterInfoProvider implements
14: ParameterInfoProvider {
15:
16: private static final List<MethodParameter> EMPTY_LIST = new ArrayList<MethodParameter>();
17: private final ParameterInfoProvider delegate = new DefaultParameterInfoProvider();
18: private final Paranamer infoProvider = new CachingParanamer(
19: new BytecodeReadingParanamer());
20: private static final Logger LOGGER = Logger
21: .getLogger(ParanamerParameterInfoProvider.class);
22:
23: public List<MethodParameter> provideFor(Method method) {
24: if (method.getParameterTypes().length == 0) {
25: return EMPTY_LIST;
26: }
27: Class<?> declaringType = method.getDeclaringClass();
28: List<MethodParameter> original = delegate.provideFor(method);
29: if (infoProvider.areParameterNamesAvailable(declaringType,
30: method.getName()) != Paranamer.PARAMETER_NAMES_FOUND) {
31: return original;
32: }
33: String[] parameterNames = infoProvider
34: .lookupParameterNames(method);
35: if (LOGGER.isDebugEnabled()) {
36: LOGGER.debug("Found parameter names with paranamer for "
37: + method + " as " + parameterNames);
38: }
39: List<MethodParameter> modified = new ArrayList<MethodParameter>();
40: int i = 0;
41: for (MethodParameter p : original) {
42: modified.add(new MethodParameter(p.getType(), p
43: .getGenericType(), p.getPosition(),
44: parameterNames[i++]));
45: }
46: return modified;
47: }
48:
49: }
|