1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
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.JexlPropertySet;
22
23
24 /**
25 * Wraps a reference or optional property set executor.
26 */
27 public class ReferenceSetExecutor implements JexlPropertySet {
28 /** The reference handler. */
29 private final ReferenceUberspect.ReferenceHandler handler;
30 /** The previous setter we did delegate to. */
31 private final JexlPropertySet setter;
32
33 /**
34 * Creates an instance.
35 * @param referenceHandler the reference handler
36 * @param jexlSet the property setter
37 */
38 public ReferenceSetExecutor(ReferenceUberspect.ReferenceHandler referenceHandler, JexlPropertySet jexlSet) {
39 if (referenceHandler == null || jexlSet == null) {
40 throw new IllegalArgumentException("handler and setter cant be null");
41 }
42 this.handler = referenceHandler;
43 this.setter = jexlSet;
44 }
45
46 /**
47 * Dereference an expected optional or reference .
48 * @param opt the reference
49 * @return the reference value, TRY_FAILED if null
50 */
51 protected Object getReference(Object opt) {
52 return handler.callGet(opt);
53 }
54
55 @Override
56 public Object invoke(final Object opt, final Object arg) throws Exception {
57 Object obj = getReference(opt);
58 return setter.invoke(obj, arg);
59 }
60
61 @Override
62 public Object tryInvoke(final Object opt, final Object key, final Object arg) throws JexlException.TryFailed {
63 Object obj = getReference(opt);
64 return obj == opt? JexlEngine.TRY_FAILED : obj == null? null : setter.tryInvoke(key, obj, arg);
65 }
66
67 @Override
68 public boolean tryFailed(Object rval) {
69 return setter.tryFailed(rval);
70 }
71
72 @Override
73 public boolean isCacheable() {
74 return setter.isCacheable();
75 }
76 }