    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    package org.apache.commons.jexl2.parser;
    018
    019    import org.apache.commons.jexl2.JexlInfo;
    020
    021    /**
    022     * Base class for parser nodes - holds an 'image' of the token for later use.
    023     *
    024     * @since 2.0
    025     */
    026    public abstract class JexlNode extends SimpleNode implements JexlInfo {
    027        /** A marker interface for literals.
    028         * @param <T> the literal type
    029         */
    030        public interface Literal<T> {
    031            T getLiteral();
    032        }
    033
    034        /** token value. */
    035        public String image;
    036
    037        public JexlNode(int id) {
    038            super(id);
    039        }
    040
    041        public JexlNode(Parser p, int id) {
    042            super(p, id);
    043        }
    044
    045        public JexlInfo getInfo() {
    046            JexlNode node = this;
    047            while (node != null) {
    048                if (node.value instanceof JexlInfo) {
    049                    return (JexlInfo) node.value;
    050                }
    051                node = node.jjtGetParent();
    052            }
    053            return null;
    054        }
    055
    056        /** {@inheritDoc} */
    057        public String debugString() {
    058            JexlInfo info = getInfo();
    059            return info != null? info.debugString() : "";
    060        }
    061    }