001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.commons.jexl2;
019
020 import org.apache.commons.jexl2.parser.ASTJexlScript;
021
022 /**
023 * Instances of ExpressionImpl are created by the {@link JexlEngine},
024 * and this is the default implementation of the {@link Expression} and
025 * {@link Script} interface.
026 * @since 1.0
027 * @author <a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a>
028 * @version $Id: ExpressionImpl.java 885754 2009-12-01 12:47:00Z henrib $
029 */
030 public class ExpressionImpl implements Expression, Script {
031 /** The engine for this expression. */
032 protected final JexlEngine jexl;
033 /**
034 * Original expression stripped from leading & trailing spaces.
035 */
036 protected final String expression;
037 /**
038 * The resulting AST we can interpret.
039 */
040 protected final ASTJexlScript script;
041
042
043 /**
044 * Do not let this be generally instantiated with a 'new'.
045 *
046 * @param engine the interpreter to evaluate the expression
047 * @param expr the expression.
048 * @param ref the parsed expression.
049 */
050 protected ExpressionImpl(JexlEngine engine, String expr, ASTJexlScript ref) {
051 jexl = engine;
052 expression = expr;
053 script = ref;
054 }
055
056 /**
057 * {@inheritDoc}
058 */
059 public Object evaluate(JexlContext context) {
060 if (script.jjtGetNumChildren() < 1) {
061 return null;
062 }
063 Interpreter interpreter = jexl.createInterpreter(context);
064 return interpreter.interpret(script.jjtGetChild(0));
065 }
066
067 /**
068 * {@inheritDoc}
069 */
070 public String dump() {
071 Debugger debug = new Debugger();
072 return debug.debug(script)? debug.toString() : "/*?*/";
073 }
074
075 /**
076 * {@inheritDoc}
077 */
078 public String getExpression() {
079 return expression;
080 }
081
082 /**
083 * Provide a string representation of the expression.
084 *
085 * @return the expression or blank if it's null.
086 */
087 @Override
088 public String toString() {
089 String expr = getExpression();
090 return expr == null ? "" : expr;
091 }
092
093 /**
094 * {@inheritDoc}
095 */
096 public String getText() {
097 return toString();
098 }
099
100 /**
101 * {@inheritDoc}
102 */
103 public Object execute(JexlContext context) {
104 Interpreter interpreter = jexl.createInterpreter(context);
105 return interpreter.interpret(script);
106 }
107
108 }