ExpressionArguments.java
package org.jbehave.core.expressions;
import java.util.List;
import org.apache.commons.text.StringTokenizer;
import org.apache.commons.text.matcher.StringMatcher;
import org.apache.commons.text.matcher.StringMatcherFactory;
class ExpressionArguments {
private static final char DELIMITER = ',';
private static final char ESCAPE = '\\';
private static final StringMatcher QUOTE_MATCHER = StringMatcherFactory.INSTANCE.stringMatcher("\"\"\"");
private static final StringMatcher TRIMMER_MATCHER = StringMatcherFactory.INSTANCE.trimMatcher();
private static final IgnoredMatcher IGNORED_MATCHER = new IgnoredMatcher();
private final List<String> arguments;
ExpressionArguments(String argumentsAsString) {
this(argumentsAsString, Integer.MAX_VALUE);
}
ExpressionArguments(String argumentsAsString, int argsLimit) {
StringTokenizer argumentsTokenizer = new StringTokenizer(argumentsAsString)
.setDelimiterMatcher(new DelimiterMatcher(argsLimit))
.setQuoteMatcher(QUOTE_MATCHER)
.setTrimmerMatcher(TRIMMER_MATCHER)
.setIgnoredMatcher(IGNORED_MATCHER)
.setIgnoreEmptyTokens(false);
this.arguments = argumentsTokenizer.getTokenList();
}
public List<String> getArguments() {
return arguments;
}
private static final class DelimiterMatcher implements StringMatcher {
private final int resultsLimit;
private int totalNumberOfMatches = 1;
private DelimiterMatcher(int resultsLimit) {
this.resultsLimit = resultsLimit;
}
@Override
public int isMatch(char[] buffer, int start, int bufferStart, int bufferEnd) {
if (DELIMITER == buffer[start] && (start == 0 || ESCAPE != buffer[start - 1])) {
if (resultsLimit > totalNumberOfMatches) {
totalNumberOfMatches++;
return 1;
}
}
return 0;
}
}
private static final class IgnoredMatcher implements StringMatcher {
@Override
public int isMatch(char[] buffer, int start, int bufferStart, int bufferEnd) {
int next = start + 1;
return ESCAPE == buffer[start] && next < buffer.length && DELIMITER == buffer[next] ? 1 : 0;
}
}
}