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.JexlInfo;
22 import org.apache.commons.jexl3.introspection.JexlMethod;
23 import org.apache.commons.jexl3.introspection.JexlUberspect;
24
25
26
27
28
29 public class OptionalNullMethod implements JexlMethod {
30
31
32 private final JexlUberspect uberspect;
33
34
35 private final String methodName;
36
37
38 private JexlMethod delegate;
39
40 OptionalNullMethod(final JexlUberspect jexlUberspect, final String name) {
41 uberspect = jexlUberspect;
42 methodName = name;
43 }
44
45 @Override
46 public Class<?> getReturnType() {
47 return delegate != null ? delegate.getReturnType() : null;
48 }
49
50 @Override
51 public Object invoke(final Object obj, final Object... params) throws Exception {
52 if (obj == null) {
53 return null;
54 }
55 if (delegate == null) {
56 delegate = uberspect.getMethod(obj, methodName, params);
57 if (delegate == null) {
58 throw new JexlException.Method((JexlInfo) null, methodName, params);
59 }
60 }
61 return delegate.invoke(obj, params);
62 }
63
64 @Override
65 public boolean isCacheable() {
66 return false;
67 }
68
69 @Override
70 public boolean tryFailed(final Object rval) {
71 return delegate != null ? delegate.tryFailed(rval) : JexlEngine.TRY_FAILED == rval;
72 }
73
74 @Override
75 public Object tryInvoke(final String name, final Object obj, final Object... params) throws JexlException.TryFailed {
76 if (obj == null) {
77 return null;
78 }
79 return delegate != null ? delegate.tryInvoke(name, obj, params) : JexlEngine.TRY_FAILED;
80 }
81 }