    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    }