/*
* Copyright 2005 Nissim Karpenstein, Stein M. Hugubakken
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.exolab.castor.jdo.oql;
import java.util.ArrayList;
import java.util.Iterator;
/**
* A Node in the Parse tree which is generated by the {@link Parser} as the tree
* representation of the OQL Query. Each node has a link back to the parent node
* (null for the root node), and a vector of children. Each node contains the
* {@link Token}which represents that part of the tree.
*
* @author <a href="nissim@nksystems.com">Nissim Karpenstein </a>
* @version $Revision$ $Date: 2006-04-25 15:08:23 -0600 (Tue, 25 Apr 2006) $
*/
public final class ParseTreeNode {
private static final class NullIterator implements Iterator<ParseTreeNode> {
public boolean hasNext() { return false; }
public ParseTreeNode next() { return null; }
public void remove() { }
}
private static final NullIterator NULL_ITERATOR = new NullIterator();
private ParseTreeNode _parent;
private ArrayList<ParseTreeNode> _children;
private Token _token;
/**
* Creates a new Node with supplied parent and token.
*
* @param parent The parent of this node (null for root)
* @param token The token data in this node
*/
public ParseTreeNode(final ParseTreeNode parent, final Token token) {
_parent = parent;
_token = token;
}
/**
* Creates a new root Node with supplied token.
*
* @param token The token data in this node
*/
public ParseTreeNode(final Token token) {
_parent = null;
_token = token;
}
public String toString() {
return "ParseTreeNode{" + _token.getTokenValue() + "}";
}
public String toStringEx() {
StringBuffer s = new StringBuffer("ParseTreeNode{");
s.append(_token.getTokenValue());
Iterator<ParseTreeNode> iter = children();
while (iter.hasNext()) {
s.append(',');
s.append(iter.next().toStringEx());
}
s.append('}');
return s.toString();
}
/**
* Changes the parent of this node.
*
* @param parent The new parent.
*/
public void setParent(final ParseTreeNode parent) {
_parent = parent;
}
/**
* Adds a new node as a child of this node. Changes the nodes parent to
* this.
*
* @param child The new child
*/
public void addChild(final ParseTreeNode child) {
child.setParent(this);
if (_children == null) { _children = new ArrayList<ParseTreeNode>(); }
_children.add(child);
}
/**
* Specifies whether this node is the root of a tree.
*
* @return True if the node does not have a parent, otherwise false.
*/
public boolean isRoot() {
return (_parent == null);
}
/**
* Specifies whether this node is a leaf.
*
* @return True if the node does not have any children, otherwise false.
*/
public boolean isLeaf() {
return (_children == null) || (_children.size() == 0);
}
/**
* Accessor method for the parent of this node.
*
* @return The parent of this node.
*/
public ParseTreeNode getParent() {
return _parent;
}
/**
* Accessor method for an iteration of this nodes children.
*
* @return An Iterator of children.
*/
public Iterator<ParseTreeNode> children() {
if ((_children == null) || (_children.size() == 0)) {
return NULL_ITERATOR;
}
return _children.iterator();
}
/**
* Accessor method for individual children of this node.
*
* @param index the index of the child to retrieve.
* @return the index child of this node.
*/
public ParseTreeNode getChild(final int index) {
return _children.get(index);
}
/**
* Accessor method for the number of children of this node.
*
* @return the number of children of this node.
*/
public int getChildCount() {
if (_children == null) {
return 0;
}
return _children.size();
}
/**
* Accessor method for the token.
*
* @return The token which is the datum of this node.
*/
public Token getToken() {
return _token;
}
}