1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.collections4.functors;
18
19 import java.lang.reflect.InvocationTargetException;
20 import java.lang.reflect.Method;
21 import java.util.Objects;
22
23 import org.apache.commons.collections4.FunctorException;
24 import org.apache.commons.collections4.Transformer;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 public class InvokerTransformer<T, R> implements Transformer<T, R> {
40
41
42
43
44
45
46
47
48
49
50
51 public static <I, O> Transformer<I, O> invokerTransformer(final String methodName) {
52 return new InvokerTransformer<>(Objects.requireNonNull(methodName, "methodName"));
53 }
54
55
56
57
58
59
60
61
62
63
64
65
66 public static <I, O> Transformer<I, O> invokerTransformer(final String methodName, final Class<?>[] paramTypes,
67 final Object[] args) {
68 Objects.requireNonNull(methodName, "methodName");
69 if (paramTypes == null && args != null
70 || paramTypes != null && args == null
71 || paramTypes != null && args != null && paramTypes.length != args.length) {
72 throw new IllegalArgumentException("The parameter types must match the arguments");
73 }
74 if (paramTypes == null || paramTypes.length == 0) {
75 return new InvokerTransformer<>(methodName);
76 }
77 return new InvokerTransformer<>(methodName, paramTypes, args);
78 }
79
80 private final String iMethodName;
81
82
83 private final Class<?>[] iParamTypes;
84
85
86 private final Object[] iArgs;
87
88
89
90
91
92
93 private InvokerTransformer(final String methodName) {
94 iMethodName = methodName;
95 iParamTypes = null;
96 iArgs = null;
97 }
98
99
100
101
102
103
104
105
106
107
108
109 public InvokerTransformer(final String methodName, final Class<?>[] paramTypes, final Object[] args) {
110 iMethodName = methodName;
111 iParamTypes = paramTypes != null ? paramTypes.clone() : null;
112 iArgs = args != null ? args.clone() : null;
113 }
114
115
116
117
118
119
120
121 @Override
122 @SuppressWarnings("unchecked")
123 public R transform(final Object input) {
124 if (input == null) {
125 return null;
126 }
127 try {
128 final Class<?> cls = input.getClass();
129 final Method method = cls.getMethod(iMethodName, iParamTypes);
130 return (R) method.invoke(input, iArgs);
131 } catch (final NoSuchMethodException ex) {
132 throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" +
133 input.getClass() + "' does not exist");
134 } catch (final IllegalAccessException ex) {
135 throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" +
136 input.getClass() + "' cannot be accessed");
137 } catch (final InvocationTargetException ex) {
138 throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" +
139 input.getClass() + "' threw an exception", ex);
140 }
141 }
142
143 }