001package gudusoft.gsqlparser.sqlenv.parser;
002
003import gudusoft.gsqlparser.EDbVendor;
004import gudusoft.gsqlparser.sqlenv.TSQLEnv;
005import gudusoft.gsqlparser.sqlenv.parser.grabit.GrabitSQLEnv;
006import gudusoft.gsqlparser.sqlenv.parser.grabit.MultipleGrabitSQLEnv;
007import gudusoft.gsqlparser.sqlenv.parser.sqldep.MultipleSQLDepSQLEnv;
008import gudusoft.gsqlparser.sqlenv.parser.sqldep.SQLDepSQLEnv;
009import gudusoft.gsqlparser.sqlenv.parser.sqlflow.SqlflowSQLEnv;
010import gudusoft.gsqlparser.util.SQLUtil;
011import gudusoft.gsqlparser.util.json.JSON;
012
013import java.util.ArrayList;
014import java.util.List;
015import java.util.Map;
016import java.util.logging.Level;
017import java.util.logging.Logger;
018
019@SuppressWarnings("rawtypes")
020public class TJSONSQLEnvParser implements TSQLEnvParser {
021        
022        private String defaultServer;
023        private String defaultDatabase;
024        private String defaultSchema;
025        
026        public TJSONSQLEnvParser(String defaultServer, String defaultDatabase, String defaultSchema) {
027                this.defaultServer = defaultServer;
028                this.defaultDatabase = defaultDatabase;
029                this.defaultSchema = defaultSchema;
030        }
031
032        public TSQLEnv[] parseSQLEnv(EDbVendor vendor, String sql) {
033                if (SQLUtil.isEmpty(sql))
034                        return null;
035
036                String trimSQL = sql.trim();
037                if (trimSQL.startsWith("{") && trimSQL.endsWith("}")) {
038                        return getJSONSQLEnv(vendor, trimSQL);
039                }
040
041                if (trimSQL.startsWith("[") && trimSQL.endsWith("]")) {
042                        return getMultipleJSONSQLEnv(vendor, trimSQL);
043                }
044
045                return null;
046        }
047
048        private TSQLEnv[] getMultipleJSONSQLEnv(EDbVendor vendor, String trimSQL) {
049                try {
050                        List json = (List) JSON.parseObject(trimSQL);
051                        if (trimSQL.indexOf("createdBy") != -1) {
052                                if (trimSQL.toLowerCase().indexOf("sqldep") != -1) {
053                                        return new TSQLEnv[] { new MultipleSQLDepSQLEnv(defaultServer, defaultDatabase, defaultSchema, vendor, json) };
054                                }
055                                if (trimSQL.toLowerCase().indexOf("grabit") != -1) {
056                                        return new TSQLEnv[] { new MultipleGrabitSQLEnv(defaultServer, defaultDatabase, defaultSchema, vendor, json) };
057                                }
058                        }
059                } catch (Exception e) {
060                        Logger.getLogger(TJSONSQLEnvParser.class.getName()).log(Level.WARNING, "Parse json failed.", e);
061                }
062                return null;
063        }
064
065        private TSQLEnv[] getJSONSQLEnv(EDbVendor vendor, String trimSQL) {
066                try {
067                        Map json = (Map) JSON.parseObject(trimSQL);
068                        if (json.containsKey("createdBy")) {
069                                String createdBy = (String) json.get("createdBy");
070                                if (createdBy.toLowerCase().indexOf("sqldep") != -1) {
071                                        return new TSQLEnv[] { new SQLDepSQLEnv(defaultServer, defaultDatabase, defaultSchema, vendor, json) };
072                                }
073                                if (createdBy.toLowerCase().indexOf("grabit") != -1) {
074                                        return new TSQLEnv[] { new GrabitSQLEnv(defaultServer, defaultDatabase, defaultSchema, vendor, json) };
075                                }
076                                if (createdBy.toLowerCase().indexOf("sqlflow") != -1) {
077                                        List servers = (List) json.get("servers");
078                                        if(servers == null)
079                                                return null;
080                                        List<TSQLEnv> sqlEnvs = new ArrayList<TSQLEnv>();
081                                        for (int i = 0; i < servers.size(); i++) {
082                                                Map server = (Map) servers.get(i);
083                                                String dbVendor = (String) server.get("dbVendor");
084                                                if (SQLUtil.isEmpty(dbVendor)) {
085                                                        sqlEnvs.add(new SqlflowSQLEnv(defaultServer, defaultDatabase, defaultSchema, vendor, server));
086                                                } else {
087                                                        sqlEnvs.add(new SqlflowSQLEnv(defaultServer, defaultDatabase, defaultSchema, EDbVendor.valueOf(dbVendor), server));
088                                                }
089                                        }
090                                        return sqlEnvs.toArray(new TSQLEnv[0]);
091                                }
092                        }
093                } catch (Exception e) {
094                        Logger.getLogger(TJSONSQLEnvParser.class.getName()).log(Level.WARNING, "Parse json failed.", e);
095                }
096                return null;
097        }
098}