package net.ayld.facade.util;
import java.util.Collections;
import java.util.List;
import net.ayld.facade.util.annotation.NotThreadSafe;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Range;
@NotThreadSafe // or is it ?!?
public final class Tokenizer {
private String delimiter;
private List<String> tokens = Collections.emptyList();
private Tokenizer(String delimiter) {
this.delimiter = delimiter;
}
public static Tokenizer delimiter(String delimiter) {
return new Tokenizer(delimiter);
}
public Tokenizer tokenize(String string) {
if (string.contains(delimiter)) {
tokens = Lists.newArrayList(Splitter.on(delimiter).split(string));
}
return this;
}
public List<String> tokensIn(Range<Integer> range) {
if (!(range.hasUpperBound() && range.hasLowerBound())) {
throw new IllegalArgumentException("boundless ranges are not currently supported");
}
if (tokens.isEmpty()) {
return tokens;
}
final Integer lower = range.lowerEndpoint();
final Integer upper = range.upperEndpoint();
if (lower < 0) {
throw new IndexOutOfBoundsException("lower bound: " + lower + ", is negative");
}
if (upper > tokens.size()) {
throw new IndexOutOfBoundsException("upper bound: " + upper + ", is over the tokens size: " + tokens.size());
}
return ImmutableList.copyOf(tokens.subList(lower, upper));
}
public List<String> tokens() {
return ImmutableList.copyOf(tokens);
}
public String firstToken() {
return tokenByIndex(0);
}
public String lastToken() {
return tokenByIndex(tokens.size() - 1);
}
public String tokenByIndex(int index) {
if (index < 0 || index >= tokens.size()) {
return "";
}
return tokens.get(index);
}
}