cucumber.runtime.xstream.ConverterWithEnumFormat Maven / Gradle / Ivy
package cucumber.runtime.xstream;
import cucumber.deps.com.thoughtworks.xstream.converters.ConversionException;
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import static java.util.Arrays.asList;
class ConverterWithEnumFormat extends ConverterWithFormat {
private final List formats = new ArrayList();
private final Locale locale;
private final Class extends Enum> typeClass;
ConverterWithEnumFormat(Locale locale, Class extends Enum> enumClass) {
super(new Class[]{enumClass});
this.locale = locale;
this.typeClass = enumClass;
formats.add(new OriginalFormat());
formats.add(new LowercaseFormat());
formats.add(new UppercaseFormat());
formats.add(new CapitalizeFormat());
}
@Override
public T transform(String string) {
try {
return super.transform(string);
} catch (ConversionException e) {
String allowed = asList(typeClass.getEnumConstants()).toString();
throw new ConversionException(String.format("Couldn't convert %s to %s. Legal values are %s", string, typeClass.getName(), allowed));
}
}
@Override
public List getFormats() {
return formats;
}
private class OriginalFormat extends AbstractEnumFormat {
@Override
protected String transformSource(String source) {
return source;
}
}
private class LowercaseFormat extends AbstractEnumFormat {
@Override
protected String transformSource(String source) {
return source.toLowerCase(locale);
}
}
private class UppercaseFormat extends AbstractEnumFormat {
@Override
protected String transformSource(String source) {
return source.toUpperCase(locale);
}
}
private class CapitalizeFormat extends AbstractEnumFormat {
@Override
protected String transformSource(String source) {
String firstLetter = source.substring(0, 1);
String restOfTheString = source.substring(1, source.length());
return firstLetter.toUpperCase(locale) + restOfTheString;
}
}
private abstract class AbstractEnumFormat extends Format {
@Override
public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
return toAppendTo.append(String.valueOf(obj));
}
@Override
public Object parseObject(String source, ParsePosition pos) {
return source == null ? null : Enum.valueOf(typeClass, transformSource(source));
}
protected abstract String transformSource(String source);
}
}