UnderscoredCamelCaseResolver.java

  1. package org.jbehave.core.io;

  2. import static java.util.regex.Pattern.compile;

  3. import java.util.Locale;
  4. import java.util.regex.Matcher;

  5. import org.jbehave.core.Embeddable;

  6. /**
  7.  * <p>
  8.  * Resolves story paths converting the camel-cased Java core class to
  9.  * lower-case underscore-separated paths e.g.:
  10.  * "org.jbehave.core.ICanLogin.java" -> "org/jbehave/core/i_can_login.story".
  11.  * </p>
  12.  * <p>
  13.  * By default, the {@link AbstractStoryPathResolver#DEFAULT_EXTENSION} is used
  14.  * but this can be configured via the constructor so that we can resolve class
  15.  * to use another or no extension at all, e.g.:
  16.  * "org.jbehave.core.ICanLogin.java" -> "org/jbehave/core/i_can_login".
  17.  * </p>
  18.  * <p>
  19.  * The default resolution pattern {@link #NUMBERS_AS_LOWER_CASE_LETTERS_PATTERN}
  20.  * treats numbers as lower case letters, e.g.:
  21.  * "org.jbehave.core.ICanLoginTo1Site.java" ->
  22.  * "org/jbehave/core/i_can_login_to1_site"
  23.  * </p>
  24.  * <p>
  25.  * Choose {@link #NUMBERS_AS_UPPER_CASE_LETTERS_PATTERN} to treat numbers as
  26.  * upper case letters, e.g.: "org.jbehave.core.ICanLoginTo1Site.java" ->
  27.  * "org/jbehave/core/i_can_login_to_1_site"
  28.  * </p>
  29.  */
  30. public class UnderscoredCamelCaseResolver extends AbstractStoryPathResolver {

  31.     public static final String NUMBERS_AS_LOWER_CASE_LETTERS_PATTERN = "([A-Z].*?)([A-Z]|\\z)";
  32.     public static final String NUMBERS_AS_UPPER_CASE_LETTERS_PATTERN = "([A-Z0-9].*?)([A-Z0-9]|\\z)";
  33.     private static final String UNDERSCORE = "_";
  34.     private final String resolutionPattern;
  35.     private final Locale locale;
  36.     private String wordToRemove = "";

  37.     public UnderscoredCamelCaseResolver() {
  38.         this(DEFAULT_EXTENSION);
  39.     }

  40.     public UnderscoredCamelCaseResolver(String extension) {
  41.         this(extension, NUMBERS_AS_LOWER_CASE_LETTERS_PATTERN);
  42.     }

  43.     public UnderscoredCamelCaseResolver(String extension,
  44.             String resolutionPattern) {
  45.         this(extension, resolutionPattern, Locale.getDefault());
  46.     }

  47.     public UnderscoredCamelCaseResolver(String extension,
  48.             String resolutionPattern, Locale locale) {
  49.         super(extension);
  50.         this.resolutionPattern = resolutionPattern;
  51.         this.locale = locale;
  52.     }

  53.     @Override
  54.     protected String resolveName(
  55.             Class<? extends Embeddable> embeddableClass) {
  56.         String simpleName = embeddableClass.getSimpleName();
  57.         simpleName = simpleName.replace(wordToRemove, "");
  58.         Matcher matcher = compile(resolutionPattern).matcher(
  59.                 simpleName);
  60.         int startAt = 0;
  61.         StringBuilder builder = new StringBuilder();
  62.         while (matcher.find(startAt)) {
  63.             builder.append(matcher.group(1).toLowerCase(locale));
  64.             builder.append(UNDERSCORE);
  65.             startAt = matcher.start(2);
  66.         }
  67.         return builder.substring(0, builder.length() - 1);
  68.     }

  69.     public StoryPathResolver removeFromClassName(String wordToRemove) {
  70.         this.wordToRemove = wordToRemove;
  71.         return this;
  72.     }
  73. }