1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.jexl3.jexl342;
18
19 import org.apache.commons.jexl3.JexlEngine;
20 import org.apache.commons.jexl3.JexlException;
21 import org.apache.commons.jexl3.introspection.JexlMethod;
22
23
24
25
26 public class ReferenceMethodExecutor implements JexlMethod {
27
28 private final ReferenceUberspect.ReferenceHandler handler;
29
30 private final JexlMethod method;
31
32
33
34
35
36
37
38 public ReferenceMethodExecutor(final ReferenceUberspect.ReferenceHandler referenceHandler, final JexlMethod jexlMethod) {
39 if (referenceHandler == null || jexlMethod == null) {
40 throw new IllegalArgumentException("handler and method cant be null");
41 }
42 this.method = jexlMethod;
43 this.handler = referenceHandler;
44 }
45
46
47
48
49
50
51
52 protected Object getReference(final Object opt) {
53 return handler.callGet(opt);
54 }
55
56 @Override
57 public Class<?> getReturnType() {
58 return method != null ? method.getReturnType() : null;
59 }
60
61 @Override
62 public Object invoke(final Object ref, final Object... args) throws Exception {
63 final Object obj = getReference(ref);
64 return obj == null ? null : method.invoke(obj, args);
65 }
66
67 @Override
68 public boolean isCacheable() {
69 return method != null && method.isCacheable();
70 }
71
72 @Override
73 public boolean tryFailed(final Object rval) {
74 return method == null || method.tryFailed(rval);
75 }
76
77 @Override
78 public Object tryInvoke(final String name, final Object ref, final Object... args) throws JexlException.TryFailed {
79 final Object obj = getReference(ref);
80 if (method == null) {
81 return obj == null ? null : JexlEngine.TRY_FAILED;
82 }
83 if (obj == ref) {
84 return JexlEngine.TRY_FAILED;
85 }
86 return method.tryInvoke(name, obj, args);
87 }
88 }