1 /*
2 * (c) Copyright 2006-2020 by rapiddweller GmbH & Volker Bergmann. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, is permitted under the terms of the
6 * GNU General Public License.
7 *
8 * For redistributing this software or a derivative work under a license other
9 * than the GPL-compatible Free Software License as defined by the Free
10 * Software Foundation or approved by OSI, you must first obtain a commercial
11 * license to this software product from rapiddweller GmbH & Volker Bergmann.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14 * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
15 * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
17 * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 * POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 package com.rapiddweller.benerator.engine.expression;
28
29 import com.rapiddweller.common.Context;
30 import com.rapiddweller.format.script.Script;
31 import com.rapiddweller.format.script.ScriptUtil;
32 import com.rapiddweller.script.Expression;
33 import com.rapiddweller.script.expression.ConstantExpression;
34 import com.rapiddweller.script.expression.DynamicExpression;
35
36 /**
37 * Expression that evaluates a script.<br/><br/>
38 * Created: 27.10.2009 13:48:11
39 *
40 * @param <E> the type parameter
41 * @author Volker Bergmann
42 * @since 0.6.0
43 */
44 public class ScriptExpression<E> extends DynamicExpression<E> {
45
46 private final Script script;
47 private final Expression<E> defaultValueExpression;
48
49 /**
50 * Instantiates a new Script expression.
51 *
52 * @param script the script
53 */
54 public ScriptExpression(String script) {
55 this(ScriptUtil.parseScriptText(script), (E) null);
56 }
57
58 /**
59 * Instantiates a new Script expression.
60 *
61 * @param script the script
62 */
63 public ScriptExpression(Script script) {
64 this(script, (E) null);
65 }
66
67 /**
68 * Instantiates a new Script expression.
69 *
70 * @param script the script
71 * @param defaultValue the default value
72 */
73 public ScriptExpression(Script script, E defaultValue) {
74 this(script, (defaultValue != null ? new ConstantExpression<>(defaultValue) : null));
75 }
76
77 private ScriptExpression(Script script, Expression<E> defaultValueExpression) {
78 this.script = script;
79 this.defaultValueExpression = defaultValueExpression;
80 }
81
82 /**
83 * Create with default expression expression.
84 *
85 * @param <T> the type parameter
86 * @param script the script
87 * @param defaultValueExpression the default value expression
88 * @return the expression
89 */
90 public static <T> Expression<T> createWithDefaultExpression(
91 Script script, Expression<T> defaultValueExpression) {
92 return new ScriptExpression<>(script, defaultValueExpression);
93 }
94
95 @Override
96 @SuppressWarnings("unchecked")
97 public E evaluate(Context context) {
98 if (script == null) {
99 return (defaultValueExpression != null ? defaultValueExpression.evaluate(context) : null);
100 } else {
101 return (E) script.evaluate(context);
102 }
103 }
104
105 @Override
106 public String toString() {
107 return script.toString();
108 }
109
110 }