package org.apache.lucene.queryparser.flexible.aqp.util;
import java.util.Map;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonToken;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.Token;
import org.antlr.runtime.tree.CommonErrorNode;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.Tree;
import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode;
import org.apache.lucene.queryparser.flexible.aqp.nodes.AqpANTLRNode;
/**
* A wrapper for the objects produced by ANTLR. These
* will be consumed by the aqp parser.
*
*/
public class AqpCommonTree extends CommonTree {
protected Map<Integer, String> typeToNameMap;
public AqpCommonTree() {
super();
}
public AqpCommonTree(CommonTree node) {
super(node);
}
public AqpCommonTree(AqpCommonTree node) {
super(node);
}
public AqpCommonTree(Token t) {
this.token = t;
}
public Tree dupNode() {
AqpCommonTree r = new AqpCommonTree(this);
r.setTypeToNameMap(this.typeToNameMap);
return r;
}
/** Return the whole tree converted to QueryNode tree */
public QueryNode toQueryNodeTree() throws RecognitionException {
if (children == null || children.size() == 0) {
return this.toQueryNode();
}
QueryNode buf = toQueryNode();
for (int i = 0; children != null && i < children.size(); i++) {
Object child = children.get(i);
if (child instanceof CommonErrorNode) {
throw ((CommonErrorNode) child).trappedException;
}
AqpCommonTree t = (AqpCommonTree) child;
buf.add(t.toQueryNodeTree());
}
return buf;
}
public QueryNode toQueryNode() {
return (QueryNode) new AqpANTLRNode(this);
}
public String getTokenLabel() {
if (isNil()) {
return "nil";
}
if (getType() == Token.INVALID_TOKEN_TYPE) {
return "<errornode>";
}
if (token == null) {
return null;
}
return token.getText();
}
public String getTokenInput() {
CharStream is = token.getInputStream();
if (is == null) {
return null;
}
int n = is.size();
if (getStartIndex() < n && getStopIndex() < n) {
return is.substring(getStartIndex(), getStopIndex());
} else {
return "<EOF>";
}
}
public int getTokenType() {
return token.getType();
}
public String getTypeLabel() {
int t = getTokenType();
return typeToNameMap.get(t);
}
public int getStartIndex() {
return ((CommonToken) token).getStartIndex();
// return startIndex;
}
public int getStopIndex() {
// return stopIndex;
return ((CommonToken) token).getStopIndex();
}
public void setStartIndex(int start) {
((CommonToken) token).setStartIndex(start);
}
public void setStopIndex(int end) {
((CommonToken) token).setStopIndex(end);
}
public void setTypeToNameMap(Map<Integer, String> typeMap) {
typeToNameMap = typeMap;
}
}