001    package railo.runtime.orm.naming;
002    
003    import railo.commons.lang.StringUtil;
004    
005    public class SmartNamingStrategy implements NamingStrategy {
006            
007            public static final NamingStrategy INSTANCE = new SmartNamingStrategy();
008    
009            @Override
010            public String convertTableName(String tableName) {
011            return translate(tableName);
012        }
013    
014        @Override
015        public String convertColumnName(String columnName) { 
016            return translate(columnName);
017        }
018    
019        private static String translate(String name) {
020            if(StringUtil.isEmpty(name)) return "";
021            
022            int len=name.length();
023            StringBuilder sb = new StringBuilder();
024            char c,p,n;
025            for(int i=0;i<len;i++) {
026                    c=name.charAt(i);
027                    if(i==0 || i+1==len) {
028                            sb.append(Character.toUpperCase(c));
029                             continue;
030                    }
031                    p=name.charAt(i-1);
032                    n=name.charAt(i+1);
033                
034                // is Camel
035                    if(Character.isLowerCase(p) && Character.isUpperCase(c) && Character.isLowerCase(n)) {
036                            sb.append('_');
037                            sb.append(Character.toUpperCase(c));
038                            sb.append(Character.toUpperCase(n));
039                            i++;
040                    }
041                    else
042                            sb.append(Character.toUpperCase(c));
043            }
044            return sb.toString();
045        }
046    
047            @Override
048            public String getType() {
049                    return "smart";
050            }
051    
052    }