package org.kroz.activerecord;
/**
* Converts names to/from Java to SQL according to naming convention
*
* @author Vladimir Kroz
*
* <p>This project based on and inspired by 'androidactiverecord' project written by JEREMYOT</p>
*/
public class CamelNotationHelper {
public CamelNotationHelper() {
}
/**
* Convert name of format thisIsAName to THIS_IS_A_NAME For each letter: if
* lower case then convert to upper case if upper case then add '_' to
* output before ading letter
*
* @param javaNotation
* @return SQL name translated from Java name
*/
public static String toSQLName(String javaNotation) {
if(javaNotation.equalsIgnoreCase("_id"))
return "_id";
StringBuilder sb = new StringBuilder();
char[] buf = javaNotation.toCharArray();
for (int i = 0; i < buf.length; i++) {
char prevChar = (i > 0) ? buf[i - 1] : 0;
char c = buf[i];
char nextChar = (i < buf.length - 1) ? buf[i + 1] : 0;
boolean isFirstChar = (i == 0) ? true : false;
// "AbCd"->"AB_CD"
// "ABCd"->"AB_CD"
// "AbCD"->"AB_CD"
// "ShowplaceDetailsVO"->"SHOWPLACE_DETAILS_VO"
if (isFirstChar || Character.isLowerCase(c)) {
sb.append(Character.toUpperCase(c));
} else if (Character.isUpperCase(c)) {
if (Character.isLetterOrDigit(prevChar)) {
if (Character.isLowerCase(prevChar)) {
sb.append('_').append(Character.toUpperCase(c));
} else if (nextChar > 0 && Character.isLowerCase(nextChar)) {
sb.append('_').append(Character.toUpperCase(c));
} else {
sb.append(c);
}
}
else {
sb.append(c);
}
}
}
return sb.toString();
}
/**
* Convert name of format THIS_IS_A_NAME to thisIsAName For each letter: if
* not '_' then convert to lower case and add to output string if '_' then
* skip letter and add next letter to output string without converting to
* lower case
*
* @param sqlNotation
* @return A name complaint with naming convention for Java methods and
* fields, converted from SQL name
*/
public static String toJavaMethodName(String sqlNotation) {
StringBuilder dest = new StringBuilder();
char[] src = sqlNotation.toCharArray();
for (int i = 0; i < src.length; i++) {
char c = src[i];
boolean isFirstChar = (i == 0) ? true : false;
if (isFirstChar || c != '_') {
dest.append(Character.toLowerCase(c));
} else {
i++;
if (i < src.length) {
dest.append(src[i]);
}
}
}
return dest.toString();
}
/**
* Convert name of format THIS_IS_A_NAME to ThisIsAName For each letter: if
* not '_' then convert to lower case and add to output string if '_' then
* skip letter and add next letter to output string without converting to
* lower case
*
* @param sqlNotation
* @return A name complaint with naming convention for Java classes,
* converted from SQL name
*/
public static String toJavaClassName(String sqlNotation) {
StringBuilder sb = new StringBuilder();
char[] buf = sqlNotation.toCharArray();
for (int i = 0; i < buf.length; i++) {
char c = buf[i];
if (i == 0) {
sb.append(buf[i]);
} else if (c != '_') {
sb.append(Character.toLowerCase(c));
} else {
i++;
if (i < buf.length) {
sb.append(buf[i]);
}
}
}
return sb.toString();
}
}