Coverage Report - org.jbehave.core.io.UnderscoredCamelCaseResolver
 
Classes in this File Line Coverage Branch Coverage Complexity
UnderscoredCamelCaseResolver
100%
20/20
100%
2/2
1.2
 
 1  
 package org.jbehave.core.io;
 2  
 
 3  
 import static java.util.regex.Pattern.compile;
 4  
 
 5  
 import java.util.regex.Matcher;
 6  
 
 7  
 import org.jbehave.core.Embeddable;
 8  
 
 9  
 /**
 10  
  * <p>
 11  
  * Resolves story paths converting the camel-cased Java core class to
 12  
  * lower-case underscore-separated paths e.g.:
 13  
  * "org.jbehave.core.ICanLogin.java" -> "org/jbehave/core/i_can_login.story".
 14  
  * </p>
 15  
  * <p>
 16  
  * By default, the {@link AbstractStoryPathResolver#DEFAULT_EXTENSION} is used
 17  
  * but this can be configured via the constructor so that we can resolve class
 18  
  * to use another or no extension at all, e.g.:
 19  
  * "org.jbehave.core.ICanLogin.java" -> "org/jbehave/core/i_can_login".
 20  
  * </p>
 21  
  * <p>
 22  
  * The default resolution pattern {@link #NUMBERS_AS_LOWER_CASE_LETTERS_PATTERN}
 23  
  * treats numbers as lower case letters, e.g.:
 24  
  * "org.jbehave.core.ICanLoginTo1Site.java" ->
 25  
  * "org/jbehave/core/i_can_login_to1_site"
 26  
  * </p>
 27  
  * <p>
 28  
  * Choose {@link #NUMBERS_AS_UPPER_CASE_LETTERS_PATTERN} to treat numbers as
 29  
  * upper case letters, e.g.: "org.jbehave.core.ICanLoginTo1Site.java" ->
 30  
  * "org/jbehave/core/i_can_login_to_1_site"
 31  
  * </p>
 32  
  */
 33  
 public class UnderscoredCamelCaseResolver extends AbstractStoryPathResolver {
 34  
 
 35  
         public static final String NUMBERS_AS_LOWER_CASE_LETTERS_PATTERN = "([A-Z].*?)([A-Z]|\\z)";
 36  
         public static final String NUMBERS_AS_UPPER_CASE_LETTERS_PATTERN = "([A-Z0-9].*?)([A-Z0-9]|\\z)";
 37  
         private static final String UNDERSCORE = "_";
 38  
         private final String resolutionPattern;
 39  220
     private String wordToRemove = "";
 40  
 
 41  
     public UnderscoredCamelCaseResolver() {
 42  203
                 this(DEFAULT_EXTENSION);
 43  203
         }
 44  
 
 45  
         public UnderscoredCamelCaseResolver(String extension) {
 46  219
                 this(extension, NUMBERS_AS_LOWER_CASE_LETTERS_PATTERN);
 47  219
         }
 48  
 
 49  
         public UnderscoredCamelCaseResolver(String extension,
 50  
                         String resolutionPattern) {
 51  220
                 super(extension);
 52  220
                 this.resolutionPattern = resolutionPattern;
 53  220
         }
 54  
 
 55  
         @Override
 56  
         protected String resolveName(
 57  
                         Class<? extends Embeddable> embeddableClass) {
 58  46
         String simpleName = embeddableClass.getSimpleName();
 59  46
         simpleName = simpleName.replace(wordToRemove, "");
 60  46
         Matcher matcher = compile(resolutionPattern).matcher(
 61  
                 simpleName);
 62  46
                 int startAt = 0;
 63  46
                 StringBuilder builder = new StringBuilder();
 64  168
                 while (matcher.find(startAt)) {
 65  122
                         builder.append(matcher.group(1).toLowerCase());
 66  122
                         builder.append(UNDERSCORE);
 67  122
                         startAt = matcher.start(2);
 68  
                 }
 69  46
                 return builder.substring(0, builder.length() - 1);
 70  
         }
 71  
 
 72  
     public StoryPathResolver removeFromClassName(String wordToRemove) {
 73  1
         this.wordToRemove = wordToRemove;
 74  1
         return this;
 75  
     }
 76  
 }