ExpressionArguments.java

  1. package org.jbehave.core.expressions;

  2. import java.util.List;

  3. import org.apache.commons.text.StringTokenizer;
  4. import org.apache.commons.text.matcher.StringMatcher;
  5. import org.apache.commons.text.matcher.StringMatcherFactory;

  6. class ExpressionArguments {
  7.     private static final char DELIMITER = ',';
  8.     private static final char ESCAPE = '\\';

  9.     private static final StringMatcher QUOTE_MATCHER = StringMatcherFactory.INSTANCE.stringMatcher("\"\"\"");
  10.     private static final StringMatcher TRIMMER_MATCHER = StringMatcherFactory.INSTANCE.trimMatcher();
  11.     private static final IgnoredMatcher IGNORED_MATCHER = new IgnoredMatcher();

  12.     private final List<String> arguments;

  13.     ExpressionArguments(String argumentsAsString) {
  14.         this(argumentsAsString, Integer.MAX_VALUE);
  15.     }

  16.     ExpressionArguments(String argumentsAsString, int argsLimit) {
  17.         StringTokenizer argumentsTokenizer = new StringTokenizer(argumentsAsString)
  18.                 .setDelimiterMatcher(new DelimiterMatcher(argsLimit))
  19.                 .setQuoteMatcher(QUOTE_MATCHER)
  20.                 .setTrimmerMatcher(TRIMMER_MATCHER)
  21.                 .setIgnoredMatcher(IGNORED_MATCHER)
  22.                 .setIgnoreEmptyTokens(false);
  23.         this.arguments = argumentsTokenizer.getTokenList();
  24.     }

  25.     public List<String> getArguments() {
  26.         return arguments;
  27.     }

  28.     private static final class DelimiterMatcher implements StringMatcher {
  29.         private final int resultsLimit;
  30.         private int totalNumberOfMatches = 1;

  31.         private DelimiterMatcher(int resultsLimit) {
  32.             this.resultsLimit = resultsLimit;
  33.         }

  34.         @Override
  35.         public int isMatch(char[] buffer, int start, int bufferStart, int bufferEnd) {
  36.             if (DELIMITER == buffer[start] && (start == 0 || ESCAPE != buffer[start - 1])) {
  37.                 if (resultsLimit > totalNumberOfMatches) {
  38.                     totalNumberOfMatches++;
  39.                     return 1;
  40.                 }
  41.             }
  42.             return 0;
  43.         }
  44.     }

  45.     private static final class IgnoredMatcher implements StringMatcher {
  46.         @Override
  47.         public int isMatch(char[] buffer, int start, int bufferStart, int bufferEnd) {
  48.             int next = start + 1;
  49.             return ESCAPE == buffer[start] && next < buffer.length && DELIMITER == buffer[next] ? 1 : 0;
  50.         }
  51.     }
  52. }