/**
*
* Copyright
* 2009-2015 Jayway Products AB
* 2016-2017 Föreningen Sambruk
*
* Licensed under AGPL, Version 3.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.gnu.org/licenses/agpl.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package se.streamsource.dci.value.table.gdq;
class GdqTokenizer {
String s;
int nextTokenPosition;
GdqTokenType currentTokenType; // null if no more tokens
String currentTokenStringValue;
public GdqTokenizer(String s) {
this.s = s;
this.nextTokenPosition = 0;
consumeToken();
}
GdqTokenType tokenType() {
return currentTokenType;
}
String tokenStringValue() {
return currentTokenStringValue;
}
void consumeToken() {
currentTokenType = null;
currentTokenStringValue = null;
skipWhite();
if (nextTokenPosition >= s.length()) {
return;
}
if (isDelimiter(s.charAt(nextTokenPosition))) {
currentTokenStringValue = s.substring(nextTokenPosition, nextTokenPosition+1);
currentTokenType = GdqTokenType.forStringValue(currentTokenStringValue);
nextTokenPosition++;
}
else {
// nextTokenPosition points at a word or keyword
// find first non-word position after that
int firstNonWord = nextTokenPosition;
while ( firstNonWord < s.length()
&& !isDelimiter(s.charAt(firstNonWord))
&& !Character.isWhitespace(s.charAt(firstNonWord))) {
// keep together nonwords surrounded by quotation marks
// i.e. "<longuid>,<anotherlonguid>,<andonemorelonguid>"
if((s.charAt(firstNonWord)) == '"' ){
firstNonWord = s.indexOf('"', firstNonWord + 1) + 1;
} else {
firstNonWord++;
}
}
currentTokenStringValue = s.substring(nextTokenPosition, firstNonWord);
currentTokenType = GdqTokenType.forStringValue(currentTokenStringValue);
nextTokenPosition = firstNonWord;
}
}
private static boolean isDelimiter(char c) {
return ",".indexOf(c) != -1;
}
private void skipWhite() {
while ( nextTokenPosition < s.length()
&& Character.isWhitespace(s.charAt(nextTokenPosition))) {
nextTokenPosition++;
}
}
public boolean hasToken() {
return currentTokenType != null;
}
public boolean hasToken(GdqTokenType type) {
return currentTokenType == type;
}
}