001package gu.sql2java.generator;
002
003import java.util.Random;
004
005import com.google.common.base.Joiner;
006import com.google.common.base.MoreObjects;
007import com.google.common.base.Strings;
008
009import gu.sql2java.generator.Column;
010import gu.sql2java.generator.Table;
011
012public final class StringUtilities {
013        private static StringUtilities singleton = new StringUtilities();
014        public static final String PREFIX = "";
015        static String[] reserved_words = new String[]{"null", "true", "false", "abstract", "double", "int", "strictfp",
016                        "boolean", "else", "interface", "super", "break", "extends", "long", "switch", "byte", "final", "native",
017                        "synchronized", "case", "finally", "new", "this", "catch", "float", "package", "throw", "char", "for",
018                        "private", "throws", "class", "goto", "protected", "transient", "const", "if", "public", "try", "continue",
019                        "implements", "return", "void", "default", "import", "short", "volatile", "do", "instanceof", "static",
020                        "while", "assert", "enum"};
021        static String[] latin = new String[]{"Ac", "Aethiopia", "Africae", "Anazarbus", "Argonautarum", "Ciliciam", "Cydno",
022                        "Danaes,", "Etenim", "Iovis", "Mopsi,", "Mopsuestia", "Perseus", "Quibus", "Sandan", "Tarsus", "a",
023                        "abstractum", "ad", "alacriter", "alia", "amni", "anceps", "artes,", "auctoris", "aureo", "aut", "bene",
024                        "certamen", "certe", "cespite", "cognatione", "commune", "concitat", "condidisse", "conmilitio",
025                        "consumpsit,", "consurgentem", "continentur.", "cum", "cunctorum.", "dediti", "delatumque", "dicendi",
026                        "dici", "direpto", "disciplina,", "distarent,", "dolorem", "dolorum", "domicilium", "ductores", "eius",
027                        "eo", "errore", "et", "eum", "ex", "explicatis", "exultat,", "facultas", "feriens", "filius", "forte",
028                        "fuimus.", "gestu", "habent", "habitus", "haec", "hanc", "hastisque", "haut", "heroici", "hoc", "huic",
029                        "humanitatem", "iam", "illius", "in", "ingeni,", "intempestivum", "inter", "iram", "ita", "litus", "locari",
030                        "longe", "manes", "medentur", "memoratur,", "miles", "miretur,", "mors", "muri", "ne", "neque", "nobilis",
031                        "nobilitat,", "nobis", "nomine", "nos", "occurrere", "omnes", "opulentus", "ordinibus", "parans", "penitus",
032                        "perspicabilis", "pertinax", "pertinent,", "plerumque", "poterat", "profectus", "proximos", "pugnantium",
033                        "punico", "quadam", "quae", "quaedam", "quasi", "quem", "qui", "quidam", "quidem", "quis", "quod",
034                        "quoddam", "quorum", "rati", "ratio", "redirent,", "referens,", "repentina", "revocavere", "scuta", "se",
035                        "securitas", "sed", "sit", "solido", "sospitales.", "studio", "subire", "tecti", "terrebat", "tutela",
036                        "umquam", "uni", "urbs", "varietati", "vatis", "vel", "vellere", "vero,", "vinculum,", "vir", "vocabulum"};
037        private static Random rand = new Random();
038
039        private StringUtilities() {
040        }
041
042        public static synchronized StringUtilities getInstance() {
043                return singleton;
044        }
045
046        public String getPackageAsPath(String pkg) {
047                if (pkg == null) {
048                        return "";
049                }
050                return pkg.replace('.', '/');
051        }
052
053        public static String convertClass(String table, String type) {
054                String suffix = "";
055                String postfix = "";
056                if (!"".equalsIgnoreCase("")) {
057                        suffix = suffix + "_";
058                }
059                if (!"".equalsIgnoreCase(type)) {
060                        postfix = "_" + type;
061                }
062                return StringUtilities.convertName(suffix + table + postfix, false);
063        }
064
065        public static String convertClass(Table table, String type) {
066                return StringUtilities.convertClass(table.getName(), type);
067        }
068
069        public static String convertName(String name, boolean wimpyCaps) {
070                StringBuffer buffer = new StringBuffer(name.length());
071                char[] list = name.toLowerCase().toCharArray();
072                for (int i = 0; i < list.length; ++i) {
073                        if (i == 0 && !wimpyCaps) {
074                                buffer.append(Character.toUpperCase(list[i]));
075                                continue;
076                        }
077                        if (list[i] == '_' && i + 1 < list.length && i != 0) {
078                                buffer.append(Character.toUpperCase(list[++i]));
079                                continue;
080                        }
081                        buffer.append(list[i]);
082                }
083                return buffer.toString();
084        }
085
086        /**
087         * 字符串首字母大写
088         * @param name
089         * @return
090         */
091        public static String firstUpperCase(String name){
092                if(Strings.isNullOrEmpty(name))return name;
093                char[] list = name.toCharArray();
094                list[0] = Character.toUpperCase(list[0]);
095                return new String(list);
096        }
097        public static String escape(String s) {
098                return StringUtilities.isReserved(s) ? "my_" + s : s;
099        }
100
101        public static String escape(Column s) {
102                return StringUtilities.isReserved(s.getName()) ? "my_" + s.getName() : s.getName();
103        }
104
105        public static boolean isReserved(String s) {
106                for (int i = 0; i < reserved_words.length; ++i) {
107                        if (s.compareToIgnoreCase(reserved_words[i]) != 0)
108                                continue;
109                        return true;
110                }
111                return false;
112        }
113
114        public static String getSampleString(int size) {
115                StringBuffer s = new StringBuffer(size);
116                while (s.length() < size - 5) {
117                        s.append(latin[rand.nextInt(latin.length)]).append(" ");
118                }
119                return s.toString();
120        }
121        public static final String asJavaString(String input){
122                String[] list = MoreObjects.firstNonNull(input, "").split("\\r?\\n");
123                return "\"" + Joiner.on("\\n\"\n+\"").join(list) + "\"";        
124        }
125        /**
126         * 返回一个类的简单名字
127         * 
128         * @param className
129         * @return
130         */
131        public static final String simpleName(String className) {
132                return className.replaceAll("(?:\\w+\\.)*(\\w+)", "$1");
133        }
134        public static final String combinePath(String p1,String p2){
135                StringBuffer buffer = new StringBuffer();
136                buffer.append(p1);
137                if(!p1.endsWith("/")){
138                        buffer.append("/");
139                }
140                buffer.append(p2.startsWith("/") ? p2.substring(1) : p2);
141                return buffer.toString();
142        }
143}