package com.jsoniter.extra;
import com.jsoniter.spi.*;
public class NamingStrategySupport {
public interface NamingStrategy {
String translate(String input);
}
private static boolean enabled;
public static synchronized void enable(final NamingStrategy namingStrategy) {
if (enabled) {
throw new JsonException("NamingStrategySupport.enable can only be called once");
}
enabled = true;
JsoniterSpi.registerExtension(new EmptyExtension() {
@Override
public void updateClassDescriptor(ClassDescriptor desc) {
for (Binding binding : desc.allBindings()) {
binding.name = namingStrategy.translate(binding.name);
}
}
});
}
public static NamingStrategy SNAKE_CASE = new NamingStrategy() {
@Override
public String translate(String input) {
if (input == null) return input; // garbage in, garbage out
int length = input.length();
StringBuilder result = new StringBuilder(length * 2);
int resultLength = 0;
boolean wasPrevTranslated = false;
for (int i = 0; i < length; i++) {
char c = input.charAt(i);
if (i > 0 || c != '_') // skip first starting underscore
{
if (Character.isUpperCase(c)) {
if (!wasPrevTranslated && resultLength > 0 && result.charAt(resultLength - 1) != '_') {
result.append('_');
resultLength++;
}
c = Character.toLowerCase(c);
wasPrevTranslated = true;
} else {
wasPrevTranslated = false;
}
result.append(c);
resultLength++;
}
}
return resultLength > 0 ? result.toString() : input;
}
};
public static NamingStrategy UPPER_CAMEL_CASE = new NamingStrategy() {
@Override
public String translate(String input) {
if (input == null || input.length() == 0) {
return input; // garbage in, garbage out
}
// Replace first lower-case letter with upper-case equivalent
char c = input.charAt(0);
char uc = Character.toUpperCase(c);
if (c == uc) {
return input;
}
StringBuilder sb = new StringBuilder(input);
sb.setCharAt(0, uc);
return sb.toString();
}
};
public static NamingStrategy LOWER_CASE = new NamingStrategy() {
@Override
public String translate(String input) {
return input.toLowerCase();
}
};
public static NamingStrategy KEBAB_CASE = new NamingStrategy() {
@Override
public String translate(String input) {
if (input == null) return input; // garbage in, garbage out
int length = input.length();
if (length == 0) {
return input;
}
StringBuilder result = new StringBuilder(length + (length >> 1));
int upperCount = 0;
for (int i = 0; i < length; ++i) {
char ch = input.charAt(i);
char lc = Character.toLowerCase(ch);
if (lc == ch) { // lower-case letter means we can get new word
// but need to check for multi-letter upper-case (acronym), where assumption
// is that the last upper-case char is start of a new word
if (upperCount > 1) {
// so insert hyphen before the last character now
result.insert(result.length() - 1, '-');
}
upperCount = 0;
} else {
// Otherwise starts new word, unless beginning of string
if ((upperCount == 0) && (i > 0)) {
result.append('-');
}
++upperCount;
}
result.append(lc);
}
return result.toString();
}
};
}