package cucumber.runtime.xstream; import cucumber.deps.com.thoughtworks.xstream.converters.SingleValueConverter; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; /** * Converts Strings of the form /hello/im to a {@link Pattern}, using a syntax * similar to regexp engines like Ruby, Perl and JavaScript. Flags: * * <ul> * <li>d : UNIX_LINES</li> * <li>i : CASE_INSENSITIVE</li> * <li>x : COMMENTS</li> * <li>m : MULTILINE</li> * <li>l : LITERAL</li> * <li>s : DOTALL</li> * <li>u : UNICODE_CASE</li> * <li>c : CANON_EQ</li> * </ul> */ public class PatternConverter implements SingleValueConverter { private static final Pattern PATTERN_PATTERN = Pattern.compile("/(.*)/(.+)"); public String toString(Object o) { throw new UnsupportedOperationException(); } @Override public Object fromString(String pattern) { Matcher matcher = PATTERN_PATTERN.matcher(pattern); if (matcher.matches()) { return Pattern.compile(matcher.group(1), flags(matcher.group(2))); } else { return Pattern.compile(pattern); } } private int flags(String flags) { int result = 0; for (char c : flags.toCharArray()) { result |= flag(c); } return result; } private enum FLAG { d(Pattern.UNIX_LINES), i(Pattern.CASE_INSENSITIVE), x(Pattern.COMMENTS), m(Pattern.MULTILINE), l(Pattern.LITERAL), s(Pattern.DOTALL), u(Pattern.UNICODE_CASE), c(Pattern.CANON_EQ); private final int modifier; FLAG(int modifier) { this.modifier = modifier; } } private int flag(char c) { return FLAG.valueOf(String.valueOf(c)).modifier; } @Override public boolean canConvert(Class type) { return type.equals(Pattern.class); } }