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 /** 020 * A class originally generated by JJTree with the following JavaCCOptions: 021 * MULTI=true,NODE_USES_PARSER=true,VISITOR=true,TRACK_TOKENS=false,NODE_PREFIX=AST,NODE_EXTENDS=,NODE_FACTORY= 022 * 023 * Works around issue https://javacc.dev.java.net/issues/show_bug.cgi?id=227 024 * As soon as this issue if fixed and the maven plugin uses the correct version of Javacc, this 025 * class can go away. 026 * 027 * The technical goal is to ensure every reference made in the parser was to a JexlNode; unfortunately, 028 * as in javacc 4.1, it still uses a SimpleNode reference in the generated ParserVisitor. 029 * Besides, there is no need to keep the parser around in the node. 030 * 031 * The functional goal is to a allow a <em>volatile</em> value in the node 032 * so it can serve as a last evaluation cache even in multi-threaded executions. 033 */ 034 public class SimpleNode implements Node { 035 /** The parent node. */ 036 protected JexlNode parent; 037 /** The array of children nodes. */ 038 protected JexlNode[] children; 039 /** The node type id. */ 040 protected final int id; 041 /** volatile value so it can be used as a last evaluation cache. */ 042 protected volatile Object value; 043 044 /** 045 * Creates a SimpleNode instance. 046 * @param i the node type identifier 047 */ 048 public SimpleNode(int i) { 049 id = i; 050 } 051 052 /** 053 * Creates a SimpleNode instance. 054 * @param p the parser instance 055 * @param i the node type identifier 056 */ 057 public SimpleNode(Parser p, int i) { 058 this(i); 059 } 060 061 /** {@inheritDoc} */ 062 public void jjtOpen() { 063 } 064 065 /** {@inheritDoc} */ 066 public void jjtClose() { 067 } 068 069 /** 070 * Sets this node's parent. 071 * @param n the parent 072 */ 073 public void jjtSetParent(Node n) { 074 parent = (JexlNode) n; 075 } 076 077 /** 078 * Gets this node's parent. 079 * @return the parent node 080 */ 081 public JexlNode jjtGetParent() { 082 return parent; 083 } 084 085 /** Adds a child node. 086 * @param n the child node 087 * @param i the child offset 088 */ 089 public void jjtAddChild(Node n, int i) { 090 if (children == null) { 091 children = new JexlNode[i + 1]; 092 } else if (i >= children.length) { 093 JexlNode[] c = new JexlNode[i + 1]; 094 System.arraycopy(children, 0, c, 0, children.length); 095 children = c; 096 } 097 children[i] = (JexlNode) n; 098 } 099 100 /** 101 * Gets a child of this node. 102 * @param i the child offset 103 * @return the child node 104 */ 105 public JexlNode jjtGetChild(int i) { 106 return children[i]; 107 } 108 109 /** 110 * Gets this node number of children. 111 * @return the number of children 112 */ 113 public int jjtGetNumChildren() { 114 return (children == null) ? 0 : children.length; 115 } 116 117 /** Sets this node value. 118 * @param value 119 */ 120 public void jjtSetValue(Object value) { 121 this.value = value; 122 } 123 124 /** Gets this node value. 125 * @return value 126 */ 127 public Object jjtGetValue() { 128 return value; 129 } 130 131 /** 132 * Accept the visitor. 133 * @param visitor the visitor 134 * @param data contextual data 135 * @return result of visit 136 **/ 137 public Object jjtAccept(ParserVisitor visitor, Object data) { 138 return visitor.visit(this, data); 139 } 140 141 /** 142 * Accept the visitor on all this node's children. 143 * @param visitor the visitor 144 * @param data contextual data 145 * @return result of visit 146 **/ 147 public Object childrenAccept(ParserVisitor visitor, Object data) { 148 if (children != null) { 149 for (int i = 0; i < children.length; ++i) { 150 children[i].jjtAccept(visitor, data); 151 } 152 } 153 return data; 154 } 155 156 /* You can override these two methods in subclasses of SimpleNode to 157 customize the way the JexlNode appears when the tree is dumped. If 158 your output uses more than one line you should override 159 toString(String), otherwise overriding toString() is probably all 160 you need to do. */ 161 @Override 162 public String toString() { 163 return ParserTreeConstants.jjtNodeName[id]; 164 } 165 166 public String toString(String prefix) { 167 return prefix + toString(); 168 } 169 170 /* Override this method if you want to customize how the JexlNode dumps 171 out its children. */ 172 public void dump(String prefix) { 173 System.out.println(toString(prefix)); 174 if (children != null) { 175 for (int i = 0; i < children.length; ++i) { 176 SimpleNode n = children[i]; 177 if (n != null) { 178 n.dump(prefix + " "); 179 } 180 } 181 } 182 } 183 } 184 185 /* JavaCC - OriginalChecksum=7dff880883d088a37c1e3197e4b455a0 (do not edit this line) */