/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.rf.ide.core.testdata.text.read.recognizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.google.common.annotations.VisibleForTesting;
public abstract class ATokenRecognizer {
private final Pattern pattern;
private Matcher m;
private int lineNumber = -1;
private int columnNumber = -1;
private final RobotTokenType type;
private String text;
protected ATokenRecognizer(final Pattern p, final RobotTokenType type) {
this.pattern = p;
this.type = type;
}
public abstract ATokenRecognizer newInstance();
@VisibleForTesting
public boolean hasNext(final StringBuilder newText, final int currentLineNumber, final int currentColumnNumber) {
return hasNext(newText.toString(), currentLineNumber, currentColumnNumber);
}
public boolean hasNext(final String newText, final int currentLineNumber, final int currentColumnNumber) {
if (m == null || lineNumber != currentLineNumber || !text.equals(newText)
|| columnNumber != currentColumnNumber) {
m = pattern.matcher(newText);
this.text = newText;
this.lineNumber = currentLineNumber;
this.columnNumber = currentColumnNumber;
}
return m.find();
}
public RobotToken next() {
final RobotToken t = new RobotToken();
t.setLineNumber(lineNumber);
final int start = m.start();
t.setStartColumn(start);
final int end = m.end();
t.setText(text.substring(start, end));
t.setRaw(t.getText());
t.setType(getProducedType());
return t;
}
public RobotTokenType getProducedType() {
return type;
}
public static String createUpperLowerCaseWordWithOptionalSpaceInside(final String text) {
return createUpperLowerCaseWordWithPatternBetweenLetters(text, "[\\s]?");
}
public static String createUpperLowerCaseWordWithSpacesInside(final String text) {
return createUpperLowerCaseWordWithPatternBetweenLetters(text, "[\\s]*");
}
public static String createUpperLowerCaseWord(final String text) {
return createUpperLowerCaseWordWithPatternBetweenLetters(text, null);
}
private static String createUpperLowerCaseWordWithPatternBetweenLetters(final String text,
final String patternBetweenChars) {
final StringBuilder str = new StringBuilder();
if (text != null && text.length() > 0) {
final char[] ca = text.toCharArray();
final int size = ca.length;
for (int i = 0; i < size; i++) {
str.append('[');
final char c = ca[i];
if (Character.isLetter(c)) {
str.append(Character.toUpperCase(c)).append('|').append(Character.toLowerCase(c));
} else {
str.append(c);
}
str.append(']');
if (patternBetweenChars != null && i + 1 < size) {
str.append(patternBetweenChars);
}
}
}
return str.toString();
}
public Pattern getPattern() {
return this.pattern;
}
}