package fitnesse.testsystems.slim.tables; import static java.lang.Character.isLetterOrDigit; import static java.lang.Character.toUpperCase; public class Disgracer { public boolean capitalizeNextWord; public StringBuffer disgracedName; private String name; public Disgracer(String name) { this.name = name; } public static String disgraceClassName(String name) { return new Disgracer(name).disgraceClassNameIfNecessary(); } public static String disgraceMethodName(String name) { return new Disgracer(name).disgraceMethodNameIfNecessary(); } private String disgraceMethodNameIfNecessary() { if (isGraceful()) { return disgraceMethodName(); } else { return name; } } private String disgraceMethodName() { capitalizeNextWord = false; return disgraceName(); } private String disgraceClassNameIfNecessary() { if (nameHasDotsBeforeEnd() || nameHasDollars()) return name; else if (isGraceful()) { return disgraceClassName(); } else { return name; } } private boolean nameHasDollars() { return name.contains("$"); } private String disgraceClassName() { capitalizeNextWord = true; return disgraceName(); } private boolean nameHasDotsBeforeEnd() { int dotIndex = name.indexOf("."); return dotIndex != -1 && dotIndex != name.length() - 1; } private String disgraceName() { disgracedName = new StringBuffer(); for (char c : name.toCharArray()) appendCharInProperCase(c); return disgracedName.toString(); } private void appendCharInProperCase(char c) { if (isGraceful(c)) { capitalizeNextWord = true; } else { appendProperlyCapitalized(c); } } private void appendProperlyCapitalized(char c) { disgracedName.append(capitalizeNextWord ? toUpperCase(c) : c); capitalizeNextWord = false; } private boolean isGraceful() { boolean isGraceful = false; for (char c : name.toCharArray()) { if (isGraceful(c)) isGraceful = true; } return isGraceful; } private boolean isGraceful(char c) { return !(isLetterOrDigit(c) || c == '_'); } }