// Modified or written by Object Mentor, Inc. for inclusion with FitNesse.
// Copyright (c) 2002 Cunningham & Cunningham, Inc.
// Released under the terms of the GNU General Public License version 2 or later.
// Copyright (C) 2003,2004 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the GNU General Public License version 2 or
// later.
package util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GracefulNamer {
private static final Pattern disgracefulNamePattern = Pattern
.compile("\\w(?:[.]|\\w)*[^.]");
public static boolean isGracefulName(String fixtureName) {
Matcher matcher = disgracefulNamePattern.matcher(fixtureName);
return !matcher.matches();
}
public static String disgrace(String fixtureName) {
GracefulNamer namer = new GracefulNamer();
for (int i = 0; i < fixtureName.length(); i++) {
char c = fixtureName.charAt(i);
if (Character.isLetter(c))
namer.currentState.letter(c);
else if (Character.isDigit(c))
namer.currentState.digit(c);
else
namer.currentState.other(c);
}
return namer.finalName.toString();
}
public static String regrace(String disgracefulName) {
final char separator = '.';
char c = '?';
GracefulNamer namer = new GracefulNamer();
if (!disgracefulName.isEmpty())
namer.finalName.append(c = disgracefulName.charAt(0));
boolean isGrabbingDigits = false;
boolean wasSeparator = c == '.' || c == '<' || c == '>';
for (int i = 1; i < disgracefulName.length(); i++) {
c = disgracefulName.charAt(i);
if ((Character.isUpperCase(c))
|| (Character.isDigit(c) && !isGrabbingDigits)
|| (c == separator)
) {
if (!wasSeparator) namer.finalName.append(" ");
wasSeparator = (c == separator);
}
isGrabbingDigits = (Character.isDigit(c));
namer.finalName.append(c);
}
return namer.finalName.toString();
}
private StringBuffer finalName = new StringBuffer();
private GracefulNameState currentState = new OutOfWordState();
private GracefulNamer() {
}
private interface GracefulNameState {
void letter(char c);
void digit(char c);
void other(char c);
}
private class InWordState implements GracefulNameState {
@Override
public void letter(char c) {
finalName.append(c);
}
@Override
public void digit(char c) {
finalName.append(c);
currentState = new InNumberState();
}
@Override
public void other(char c) {
currentState = new OutOfWordState();
}
}
private class InNumberState implements GracefulNameState {
@Override
public void letter(char c) {
finalName.append(Character.toUpperCase(c));
currentState = new InWordState();
}
@Override
public void digit(char c) {
finalName.append(c);
}
@Override
public void other(char c) {
currentState = new OutOfWordState();
}
}
private class OutOfWordState implements GracefulNameState {
@Override
public void letter(char c) {
finalName.append(Character.toUpperCase(c));
currentState = new InWordState();
}
@Override
public void digit(char c) {
finalName.append(c);
currentState = new InNumberState();
}
@Override
public void other(char c) {
}
}
}