package org.exist.storage.analysis;
import org.exist.util.XMLString;
public class TextToken implements Comparable {
public final static int ALPHA = 1;
public final static int ALPHANUM = 2;
public final static int DIGIT = 3;
public final static int EOF = -1;
public final static int FLOAT = 4;
public final static int LETTER = 5;
public final static int NUMBER = 6;
public final static int P = 7;
public final static int WS = 8;
public final static int HOST = 9;
public final static int EMAIL = 10;
public final static int ACRONYM = 11;
public final static TextToken WS_TOKEN = new TextToken(WS);
public final static TextToken EOF_TOKEN = new TextToken(EOF);
public final static String[] types = {"letter", "digit",
"whitespace", "number",
"alpha", "alphanum",
"p", "float"};
private int end = 0;
private int start = 0;
private CharSequence tokenText;
private int tokenType = EOF;
public TextToken() {
}
/**
* Constructor for the Token object
*
*@param type Description of the Parameter
*@param text Description of the Parameter
*/
public TextToken( int type, CharSequence text ) {
this( type, text, 0, text.length() );
}
/**
* Constructor for the Token object
*
*@param type Description of the Parameter
*@param text Description of the Parameter
*@param start Description of the Parameter
*/
public TextToken( int type, CharSequence text, int start ) {
this( type, text, start, start );
}
/**
* Constructor for the Token object
*
*@param type Description of the Parameter
*@param text Description of the Parameter
*@param start Description of the Parameter
*@param end Description of the Parameter
*/
public TextToken( int type, CharSequence text, int start, int end ) {
tokenType = type;
tokenText = text;
this.start = start;
this.end = end;
}
/**
* Constructor for the Token object
*
*@param type Description of the Parameter
*/
public TextToken( int type ) {
tokenType = type;
}
public void set(int type, CharSequence text, int start) {
tokenType = type;
tokenText = text;
this.start = start;
this.end = start;
}
public int startOffset() {
return start;
}
public int endOffset() {
return end;
}
public boolean isAlpha() {
return tokenType == ALPHA;
}
/**
* Consume the next character in the current buffer by incrementing
* the end offset.
*/
public void consumeNext() {
end++;
}
public void consume(TextToken token) {
this.end = token.end;
}
public char getChar() {
return tokenText.charAt( start );
}
public CharSequence getCharSequence() {
if(start >= tokenText.length() || end > tokenText.length())
throw new StringIndexOutOfBoundsException("start: " + start +
"; end=" + end + "; text=" + tokenText);
return tokenText.subSequence( start, end );
}
public String getText() {
if(start >= tokenText.length() || end > tokenText.length())
throw new StringIndexOutOfBoundsException("start: " + start +
"; end=" + end + "; text=" + tokenText);
if (tokenText instanceof XMLString)
return ((XMLString) tokenText).substring(start, end - start);
return tokenText.subSequence( start, end ).toString();
}
public int getType() {
return tokenType;
}
public void setType( int type ) {
tokenType = type;
}
public void setText( String text ) {
tokenText = text;
}
public int length() {
return end - start;
}
public int hashCode() {
int h = 0;
for (int i = start; i < end; i++) {
h = 31*h + tokenText.charAt(i);
}
return h;
}
public boolean equals(Object obj) {
String other = obj.toString();
int len = end - start;
if (len == other.length()) {
int j = start;
for (int i = 0; i < len; i++) {
if (tokenText.charAt(j++) != other.charAt(i))
return false;
}
return true;
}
return false;
}
public int compareTo(Object o) {
return getText().compareTo(o.toString());
}
public String toString() {
return getText();
}
}