1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.jexl3.internal.introspection;
18
19 import java.lang.reflect.InvocationTargetException;
20 import org.apache.commons.jexl3.JexlException;
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 public final class DuckSetExecutor extends AbstractExecutor.Set {
40
41 private final Object property;
42
43 private final Class<?> valueClass;
44
45
46
47
48
49
50
51
52
53
54 public static DuckSetExecutor discover(final Introspector is, final Class<?> clazz, final Object key, final Object value) {
55 java.lang.reflect.Method method = is.getMethod(clazz, "set", key, value);
56 if (method == null) {
57 method = is.getMethod(clazz, "put", makeArgs(key, value));
58 }
59 return method == null? null : new DuckSetExecutor(clazz, method, key, value);
60 }
61
62
63
64
65
66
67
68
69 private DuckSetExecutor(final Class<?> clazz, final java.lang.reflect.Method method, final Object key, final Object value) {
70 super(clazz, method);
71 property = key;
72 valueClass = classOf(value);
73 }
74
75 @Override
76 public Object getTargetProperty() {
77 return property;
78 }
79
80 @Override
81 public Object invoke(final Object obj, final Object value) throws IllegalAccessException, InvocationTargetException {
82 final Object[] pargs = {property, value};
83 if (method != null) {
84 method.invoke(obj, pargs);
85 }
86 return value;
87 }
88
89 @Override
90 public Object tryInvoke(final Object obj, final Object key, final Object value) {
91 if (obj != null
92 && objectClass.equals(obj.getClass())
93 && method != null
94 && ((property != null && property.equals(key))
95 || (property == null && key == null))
96 && valueClass.equals(classOf(value))) {
97 try {
98 final Object[] args = {property, value};
99 method.invoke(obj, args);
100 return value;
101 } catch (IllegalAccessException | IllegalArgumentException xill) {
102 return TRY_FAILED;
103 } catch (final InvocationTargetException xinvoke) {
104 throw JexlException.tryFailed(xinvoke);
105 }
106 }
107 return TRY_FAILED;
108 }
109 }