1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.jexl3.internal.introspection;
19 import java.util.Map;
20
21
22
23
24
25 public final class MapSetExecutor extends AbstractExecutor.Set {
26
27 private static final java.lang.reflect.Method MAP_SET = initMarker(Map.class, "put", Object.class, Object.class);
28
29 private final Object property;
30
31 private final Class<?> valueClass;
32
33
34
35
36
37
38
39
40
41
42 public static MapSetExecutor discover(final Introspector is,
43 final Class<?> clazz,
44 final Object identifier,
45 final Object value) {
46
47 if (Map.class.isAssignableFrom(clazz) && is.getMethod(clazz, "put", identifier, value) != null) {
48 return new MapSetExecutor(clazz, MAP_SET, identifier, value);
49 }
50 return null;
51 }
52
53
54
55
56
57
58
59
60 private MapSetExecutor(final Class<?> clazz, final java.lang.reflect.Method method, final Object key, final Object value) {
61 super(clazz, method);
62 property = key;
63 valueClass = classOf(value);
64 }
65
66 @Override
67 public Object getTargetProperty() {
68 return property;
69 }
70
71 @Override
72 public Object invoke(final Object obj, final Object value) {
73 @SuppressWarnings("unchecked")
74 final Map<Object,Object> map = ((Map<Object, Object>) obj);
75 map.put(property, value);
76 return value;
77 }
78
79 @Override
80 public Object tryInvoke(final Object obj, final Object key, final Object value) {
81 if (obj != null
82 && method != null
83 && objectClass.equals(obj.getClass())
84 && ((property == null && key == null)
85 || (property != null && key != null && property.getClass().equals(key.getClass())))
86 && valueClass.equals(classOf(value))) {
87 @SuppressWarnings("unchecked")
88 final Map<Object,Object> map = ((Map<Object, Object>) obj);
89 map.put(key, value);
90 return value;
91 }
92 return TRY_FAILED;
93 }
94 }