/*
* Copyright 2005-2015 by BerryWorks Software, LLC. All rights reserved.
*/
package com.berryworks.edireader.tokenizer;
import com.berryworks.edireader.EDISyntaxException;
import com.berryworks.edireader.error.ErrorMessages;
import java.nio.CharBuffer;
public class TokenImpl implements Token {
private final Tokenizer tokenizer;
private final char[] digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
private CharBuffer valueBuffer = CharBuffer.wrap(new char[10]);
private TokenType type = TokenType.UNKNOWN;
private int index;
private int subElementIndex;
private boolean lastSubElement;
private boolean containsNonSpace;
private String segmentType = "";
public TokenImpl(Tokenizer tokenizer) {
this.tokenizer = tokenizer;
}
public TokenType getType() {
return type;
}
/**
* Returns true for the first subelement in a sequence of subelements.
*
* @return The first value
*/
public boolean isFirst() {
return (subElementIndex == 0);
}
/**
* Returns true if this is the last subelement in a subelement sequence.
*
* @return The last value
*/
public boolean isLast() {
return lastSubElement;
}
@Override
public void setLast(boolean value) {
lastSubElement = value;
}
/**
* Gets the 0-origin sequential position of this token within the
* segment.
*/
public int getIndex() {
return index;
}
/**
* Gets the 0-origin sequential position of a subelement within a series
* of subelements.
*/
public int getSubIndex() {
return subElementIndex;
}
@Override
public void setValue(char c) {
resetValue();
append(c);
}
/**
* Gets the data value of the token as a char array.
*
* @return The valueChars value
*/
@Override
public char[] getValueChars() {
return valueBuffer.array();
}
@Override
public int getValueLength() {
return valueBuffer.position();
}
/**
* Gets the data value of the token as a String.
*/
public String getValue() {
valueBuffer.flip();
String s = valueBuffer.toString();
valueBuffer.compact();
return s;
}
@Override
public boolean valueEquals(String v) {
return getValue().equals(v);
}
@Override
public String getSegmentType() {
return segmentType;
}
@Override
public void setSegmentType(String s) throws EDISyntaxException {
segmentType = s;
if ("".equals(segmentType))
throw new EDISyntaxException(
ErrorMessages.INVALID_BEGINNING_OF_SEGMENT, tokenizer);
}
@Override
public boolean containsNonSpace() {
return containsNonSpace;
}
@Override
public String toString() {
return "Token type=" + getType() + " value=" + getValue() +
" index=" + getIndex() + " segment=" + getSegmentType();
}
/**
* Gets the elementId of the Token.
*
* @return The elementId value
*/
public String getElementId() {
String result = getSegmentType();
int n = getIndex();
if (n < 10) {
return result + '0' + digits[n];
} else
return result + String.valueOf(n);
}
@Override
public void resetIndexes() {
index = subElementIndex = 0;
}
@Override
public void resetSubElementIndex() {
subElementIndex = 0;
}
@Override
public void incrementIndex() {
index++;
}
@Override
public void incrementSubElementIndex() {
subElementIndex++;
}
@Override
public void setType(TokenType tokenType) {
type = tokenType;
}
@Override
public void append(char c) {
if (!valueBuffer.hasRemaining())
enlarge();
valueBuffer.put(c);
if (!containsNonSpace && c != ' ')
containsNonSpace = true;
}
private void enlarge() {
CharBuffer newBuffer = CharBuffer.wrap(new char[2 * valueBuffer.capacity()]);
valueBuffer.compact();
newBuffer.append(valueBuffer);
valueBuffer = newBuffer;
}
@Override
public void resetValue() {
valueBuffer.clear();
containsNonSpace = false;
}
}