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            /**
010             * @see railo.runtime.orm.NamingStrategy#convertTableName(java.lang.String)
011             */
012            public String convertTableName(String tableName) {
013            return translate(tableName);
014        }
015    
016        /**
017         * @see railo.runtime.orm.NamingStrategy#convertColumnName(java.lang.String)
018         */
019        public String convertColumnName(String columnName) { 
020            return translate(columnName);
021        }
022    
023        private static String translate(String name) {
024            if(StringUtil.isEmpty(name)) return "";
025            
026            int len=name.length();
027            StringBuilder sb = new StringBuilder();
028            char c,p,n;
029            for(int i=0;i<len;i++) {
030                    c=name.charAt(i);
031                    if(i==0 || i+1==len) {
032                            sb.append(Character.toUpperCase(c));
033                             continue;
034                    }
035                    p=name.charAt(i-1);
036                    n=name.charAt(i+1);
037                
038                // is Camel
039                    if(Character.isLowerCase(p) && Character.isUpperCase(c) && Character.isLowerCase(n)) {
040                            sb.append('_');
041                            sb.append(Character.toUpperCase(c));
042                            sb.append(Character.toUpperCase(n));
043                            i++;
044                    }
045                    else
046                            sb.append(Character.toUpperCase(c));
047            }
048            return sb.toString();
049        }
050    
051            /**
052             * @see railo.runtime.orm.NamingStrategy#getType()
053             */
054            public String getType() {
055                    return "smart";
056            }
057    
058    }