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