package sk.stuba.fiit.perconik.core.java.dom; import java.util.List; import javax.annotation.Nullable; import uk.ac.open.crc.intt.IdentifierNameTokeniser; import uk.ac.open.crc.intt.IdentifierNameTokeniserFactory; import sk.stuba.fiit.perconik.utilities.function.ListCollector; import static java.util.Arrays.asList; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Strings.isNullOrEmpty; public abstract class Tokenizer implements ListCollector<String, String> { private final IdentifierNameTokeniser tokenizer; Tokenizer(final IdentifierNameTokeniser tokenizer) { this.tokenizer = checkNotNull(tokenizer); } public static Tokenizer create(final IdentifierNameTokeniser tokenizer) { return new Unknown(tokenizer); } public static Tokenizer create(final IdentifierNameTokeniserFactory factory) { return new Known(factory); } private static final class Known extends Tokenizer { private final String settings; Known(final IdentifierNameTokeniserFactory factory) { this(factory.toString(), factory.create()); } Known(final String settings, final IdentifierNameTokeniser tokenizer) { super(tokenizer); checkArgument(!isNullOrEmpty(settings)); this.settings = settings; } @Override public String toString() { return "tokenizer(" + this.settings + ")"; } } private static final class Unknown extends Tokenizer { Unknown(final IdentifierNameTokeniser tokenizer) { super(tokenizer); } @Override public String toString() { return "tokenizer(?)"; } } public List<String> apply(final String input) { return asList(this.tokenizer.tokenise(input)); } @Override public final boolean equals(@Nullable final Object o) { if (o instanceof Tokenizer) { Tokenizer other = (Tokenizer) o; return this.tokenizer.equals(other.tokenizer); } return false; } @Override public final int hashCode() { return this.tokenizer.hashCode(); } @Override public abstract String toString(); }