diff --git a/.classpath b/.classpath deleted file mode 100644 index d390ea1..0000000 --- a/.classpath +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/.project b/.project deleted file mode 100644 index 322cc59..0000000 --- a/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - APIJSONParser - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 4c28b1a..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 1e9dd93..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,6 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index 14b697b..0000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/pom.xml b/pom.xml index e6ffde5..54ebe2f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,30 +1,54 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - APIJSONParser - APIJSONParser - 0.0.1-SNAPSHOT - jar + APIJSONParser + APIJSONParser + 0.0.1-SNAPSHOT + jar - APIJSONParser - http://maven.apache.org + APIJSONParser + http://maven.apache.org - - UTF-8 - + + UTF-8 + UTF-8 + 1.8 + - - - junit - junit - 3.8.1 - test - - - com.alibaba - fastjson - 1.2.21 - - + + + com.alibaba + fastjson + 1.2.21 + + + org.projectlombok + lombok + 1.18.4 + + + + com.google.guava + guava + 19.0 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + + + + diff --git a/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java b/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java index 83ed32e..99b56bc 100644 --- a/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java @@ -1,26 +1,37 @@ package zuo.biao.apijson.parser; import java.math.BigDecimal; -import java.util.ArrayList; import java.util.List; import java.util.Set; + import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Lists; +import lombok.Getter; +import lombok.Setter; + +/** + * @author zhangls + */ +public class APIJSONProvider extends BaseProvider { + + private final String ALIAS_SPLIT = ":"; + private static final String AND = " AND "; + private static final String OR = " OR "; + + @Getter @Setter + private List tableWhiteList = Lists.newArrayList(); + @Getter @Setter + private List tableBlackList = Lists.newArrayList(); + @Getter @Setter + private List columnWhiteList = Lists.newArrayList(); + @Getter @Setter + private List columnBlackList = Lists.newArrayList(); + + private JSONObject request; + + private JSONObject join; -public class APIJSONProvider extends AbstractProvider { - - private final String ALIAS_SPLIT = ":"; - private static final String AND = " AND "; - private static final String OR = " OR "; - - private List tableWhiteList = new ArrayList(); - private List tableBlackList = new ArrayList(); - private List columnWhiteList = new ArrayList(); - private List columnBlackList = new ArrayList(); - - private JSONObject request; - private JSONObject join; - /* * ================================== * 通用逻辑 @@ -29,751 +40,751 @@ public class APIJSONProvider extends AbstractProvider { * 所有操作都会涉及到的内容 * */ - - /** - * 传入的参数应该是一个通过验证的APIJSON请求 - * @param request - */ - public APIJSONProvider(JSONObject obj) { - if(obj == null) { - error("APIJSONProvider传入的请求不能为空"); - } - JSONObject tabs = obj.getJSONObject("[]"); - if(tabs == null) { - this.request = obj; - }else { - this.request = tabs; - this.join = obj.getJSONObject("join"); - } - } - /** - * 解析请求中的表名 - * 表名必须符合:(\w+(:\w+)?) - * 即: - * 表名 - * 表名:表别名 - * 两种形式 - */ - @Override - public List getTables() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - Set tableNames = request.keySet(); - String tableAliasName; - String tableRealName; - for(String tableName : tableNames) { - if(!tableName.matches("(\\w+(:\\w+)?)")) { - error("表" + tableName + "格式不符合" ); - return null; - } - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - String[] splitArray = tableName.split(ALIAS_SPLIT); - tableRealName = splitArray[0]; - tableAliasName = splitArray[1]; - }else { - tableRealName = tableAliasName = tableName; - } - validateTable(tableRealName); - list.add(tableRealName + " " + tableAliasName); - } - return list; - } + + /** + * 传入的参数应该是一个通过验证的APIJSON请求 + * + * @param obj + */ + public APIJSONProvider(JSONObject obj) { + if (obj == null) { + error("APIJSONProvider传入的请求不能为空"); + } + + JSONObject tabs = obj.getJSONObject("[]"); + if (tabs == null) { + this.request = obj; + } else { + this.request = tabs; + this.join = obj.getJSONObject("join"); + } + } + + /** + * 解析请求中的表名 + * 表名必须符合:(\w+(:\w+)?) + * 即: + * 表名 + * 表名:表别名 + * 两种形式 + */ + @Override + public List getTables() { + List list = Lists.newArrayList(); + Set tableNames = request.keySet(); + String tableAliasName; + String tableRealName; + for (String tableName : tableNames) { + if (!tableName.matches("(\\w+(:\\w+)?)")) { + error("表" + tableName + "格式不符合"); + return null; + } + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + String[] splitArray = tableName.split(ALIAS_SPLIT); + tableRealName = splitArray[0]; + tableAliasName = splitArray[1]; + } else { + tableRealName = tableAliasName = tableName; + } + validateTable(tableRealName); + list.add(tableRealName + " " + tableAliasName); + } + return list; + } /* * ================================== * 查询逻辑 * ================================== */ - - /** - * 解析请求中的字段 - * 路径:/表名/@column - * 同时为字段设置好引用的表别名,如: p.id - * 表名必须符合:(\w+(:\w+)?) - * 字段值必须符合: - * 不支持函数的正则:(\w+(:\w+)?)+(\s?,\s?(\w+(:\w+)?)+)* - * 支持函数的正则:((\w+\(\w+\):\w+|\w+)(:\w+)?)+(\s?,\s?((\w+\(\w+\):\w+|\w+)(:\w+)?)+)* - * 例:a,b,c或a:a1,b:b1,c - * 约束:必须要有表名 - * 目前支持函数 - */ - @Override - public List getSelect() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - Set tableNames = request.keySet(); - String tableRealName; - String tableAliasName; - for(String tableName : tableNames) { - //格式检查 - if(!tableName.matches("(\\w+(:\\w+)?)")) { - error("表" + tableName + "格式不符合" ); - return null; - } - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - tableRealName = tableName.split(ALIAS_SPLIT)[0]; - //填写了表别名 - tableAliasName = tableName.split(ALIAS_SPLIT)[1]; - }else { - tableRealName = tableAliasName = tableName; - } - // 获取请求@column的值 - JSONObject propertis = request.getJSONObject(tableName); - String columnsValue = propertis.getString("@column"); - - if(columnsValue == null) { - validateColumn(tableRealName,"*"); - //没有填写@column字段,默认为全部 - list.add(tableAliasName + ".*"); - }else { - if(!columnsValue.matches("((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+(\\s?,\\s?((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+)*")) { - error("字段@column:" + columnsValue + "格式不符合,正确请求如:a,b,c:d或者a,max(d):d,c:e" ); - return null; - } - //填写了,则返回tableAliasName.colName或tableAliasName.columnName as columnAliasName - String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); - for(String columnName : columnNames) { - if(columnName.contains(ALIAS_SPLIT)) { - //填写了字段别名,使用:tableAliasName.columnName as columnAliasName这种类型 - //这里columnRealName有两种情况,如:id或max(id) - String functionOrColumn = columnName.split(ALIAS_SPLIT)[0]; - if(functionOrColumn.contains("(")) { - //有函数的字段 - //去掉) - functionOrColumn = functionOrColumn.replaceAll("\\)", ""); - String[] functionStrs = functionOrColumn.split("\\("); - String funcitonName = functionStrs[0]; - //要对函数进行控制这这里进行 - //此处省略函数合法性检查的代码... - String columnRealName = functionStrs[1]; - String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; - validateColumn(tableRealName,columnRealName); - list.add(funcitonName + "(" + tableAliasName + "." + columnRealName + ")" + " as " + columnAliasName); - }else { - //没函数的字段 - String columnRealName = functionOrColumn ; - String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; - validateColumn(tableRealName,columnRealName); - list.add(tableAliasName + "." + columnRealName + " as " + columnAliasName); - } - }else { - //使用tableAliasName.columnName类型 - validateColumn(tableRealName,columnName); - list.add(tableAliasName + "." + columnName); - } - } - } - - } - } - return list; - } - /** - * 解析请求中的过滤条件 - * 支持以下模式: - * 单值:"id" : "12" 即id=12 - * 多值:"id&{}" : ">12,<30" 即 id > 12 AND id < 30 - * 多值:"id|{}" : ">12,<30" 即 id > 12 OR id < 30 - * 多值:"id{}" : [1,2,3] 即 id IN (1,2,3) - * 多值:"id!{}" : [1,2,3] 即 id NOT IN (1,2,3) - * 模糊:"content~":"keyword" 即字段content包含字符串keyword - * 模糊:"content$":"%keyword" 同样是模糊查询,%放出来自己操控 - * 正则:"content?":"^[0-9]+$" 后面填写正则即可 - * 外键:"id@":"/外键表/外键字段" - */ - @Override - public List getWhere() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - Set tableNames = request.keySet(); - String tableAliasName; - for(String tableName : tableNames) { - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - tableAliasName = tableName.split(ALIAS_SPLIT)[1]; - }else { - tableAliasName = tableName; - } - // 遍历过滤条件 - JSONObject propertis = request.getJSONObject(tableName); - conditionLoop:for(String condition : propertis.keySet() ) { - //关键字则跳过 - if(condition.startsWith("@")) { - continue conditionLoop; - } - if(condition.matches("\\w+")) { - //纯字段名 - if(propertis.get(condition) instanceof Integer || - propertis.get(condition) instanceof Float || - propertis.get(condition) instanceof Double || - propertis.get(condition) instanceof BigDecimal) { - list.add(tableAliasName + "." + condition + " = " + propertis.get(condition) ); - }else if(propertis.get(condition) instanceof String) { - list.add(tableAliasName + "." + condition + " = '" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'" ); - } - }else if(condition.matches("(\\w+(!|&|\\|)?\\{\\})+")) { - - //表示这是一个多条件类型 - if(propertis.get(condition) instanceof String) { - String exp = (String)propertis.get(condition); - //是否匹配这种类型:<20.3,>3.3,=3.3 - if(!exp.matches("(\\s?(>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)+)+(\\s?,\\s?((>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)))*")) { - error(condition + "的格式不正确,正确使用方式如: >10,<20"); - return null; - } - if(condition.endsWith("|{}")) { - String[] terms = exp.replaceAll("\\s", "").split(","); - String columnName = condition.replaceAll("\\|\\{\\}", ""); - String limit = ""; - for(int i = 0; i < terms.length; i++) { - String term = terms[i]; - if(term.startsWith(">=")) { - limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", ""); - }else if(term.startsWith("<=")) { - limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", ""); - }else if(term.startsWith(">")) { - limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", ""); - }else if(term.startsWith("<")) { - limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", ""); - }else if(term.startsWith("<>") || term.startsWith("!=") ) { - limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", ""); - }else if(term.startsWith("=")) { - limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", ""); - } - if(terms.length > 1 && (i != (terms.length - 1))) - limit += OR; - } - list.add(limit); - }else { - getLastList().add(AND); - String[] terms = exp.replaceAll("\\s", "").split(","); - String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", ""); - String limit = ""; - for(int i = 0; i < terms.length; i++) { - String term = terms[i]; - if(term.startsWith(">=")) { - limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", ""); - }else if(term.startsWith("<=")) { - limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", ""); - }else if(term.startsWith(">")) { - limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", ""); - }else if(term.startsWith("<")) { - limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", ""); - }else if(term.startsWith("<>") || term.startsWith("!=") ) { - limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", ""); - }else if(term.startsWith("=")) { - limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", ""); - } - if(terms.length > 1 && (i != (terms.length - 1))) - limit += AND; - } - list.add(limit); - - } - }else if(propertis.get(condition) instanceof JSONArray) { - JSONArray array = (JSONArray)propertis.get(condition); - //分离出字段名 - String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", ""); - String limit = ""; - if(condition.endsWith("!{}")) { - if(!array.isEmpty()) { - for(int i = 0; i < array.size(); i++) { - Object obj = array.get(i); - if(i != 0) { - limit += ", "; - } - if( obj instanceof Integer || - obj instanceof Float || - obj instanceof Double || - obj instanceof BigDecimal) { - limit += obj; - }else if(obj instanceof String) { - limit += "'" + ((String)obj).replaceAll("'", "''") + "'"; - } - } - list.add(tableAliasName + "." + columnName + " NOT IN [" + limit + "]" ); - } - }else { - if(!array.isEmpty()) { - for(int i = 0; i < array.size(); i++) { - Object obj = array.get(i); - if(i != 0) { - limit += ", "; - } - if( obj instanceof Integer || - obj instanceof Float || - obj instanceof Double || - obj instanceof BigDecimal) { - limit += obj; - }else if(obj instanceof String) { - limit += "'" + ((String)obj).replaceAll("'", "''") + "'"; - } - } - list.add(tableAliasName + "." + columnName + " IN [" + limit + "]" ); - } - } - } - }else if(condition.matches("\\w+~")) { - //字符串查询,包含 - if(propertis.get(condition) instanceof String) { - String exp = (String)propertis.get(condition); - String columnName = condition.replaceAll("~", ""); - list.add(tableAliasName + "." + columnName + " LIKE '%" + exp.replaceAll("'", "''") + "%'" ); - }else { - error(condition +"的值必须要是字符串"); - return null; - } - }else if(condition.matches("\\w+\\$")) { - //字符串查询,LIKE - if(propertis.get(condition) instanceof String) { - String exp = (String)propertis.get(condition); - String columnName = condition.replaceAll("\\$", ""); - list.add(tableAliasName + "." + columnName + " LIKE '" + exp.replaceAll("'", "''") + "'" ); - }else { - error(condition +"的值必须要是字符串"); - return null; - } - }else if(condition.matches("\\w+\\?")) { - //字符串查询,正则 - if(propertis.get(condition) instanceof String) { - String exp = (String)propertis.get(condition); - String columnName = condition.replaceAll("\\?", ""); - list.add(" regexp_like(" + tableAliasName + "." + columnName + ",'" + exp.replaceAll("'", "''") + "')" ); - }else { - error(condition +"的值必须要是字符串"); - return null; - } - }else if(condition.matches("\\w+@")) { - //内连接 - if(propertis.get(condition) instanceof String) { - String exp = (String)propertis.get(condition); - String columnName = condition.replaceAll("@", ""); - if(exp.matches("/\\w+/\\w+")) { - String[] args = exp.split("/"); - String refTable = args[1]; - String refColumn = args[2]; - list.add(refTable + "." + refColumn + " = " + tableAliasName + "." + columnName); - }else { - error(condition + "必须符合:\"/表名或别名/字段名\"的形式"); - return null; - } - }else { - error(condition +"的值必须要是字符串"); - return null; - } - } - } - - - } - return list; - } - /** - * 内连接 - * 请求:"@innerJoin" : ["table1.column1 = table2.column2","table1.column1 = table2.column2"] - * 编译之后:INNER JOIN table1 ON table1.column1=table2.column2 - */ - @Override - public List getInnerJoin() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - if(join != null && join.get("@innerJoin")!=null) { - JSONArray stms = join.getJSONArray("@innerJoin"); - for(int i = 0; i < stms.size(); i++) { - Object obj = stms.get(i); - if(obj instanceof String) { - String joinStr = (String)obj; - if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { - //table1.column1 = table2.column2 - String[] tcs = joinStr.replaceAll("\\s", "").split("="); - String leftTable = tcs[0].split("\\.")[0]; - String rightTable = tcs[1].split("\\.")[0]; - validateTable(leftTable); - list.add(leftTable + " ON " + joinStr); - }else { - error("@innerJoin的格式必须是:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2"); - return null; - } - }else { - error("@innerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); - return null; - } - } - } - } - return list; - } - /** - * 左外连接 - * - */ - @Override - public List getLeftOuterJoin() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - if(join != null && join.get("@leftOuterJoin")!=null) { - JSONArray stms = join.getJSONArray("@leftOuterJoin"); - for(int i = 0; i < stms.size(); i++) { - Object obj = stms.get(i); - if(obj instanceof String) { - String joinStr = (String)obj; - if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { - //table1.column1 = table2.column2 - String[] tcs = joinStr.replaceAll("\\s", "").split("="); - String leftTable = tcs[0].split("\\.")[0]; - String rightTable = tcs[1].split("\\.")[0]; - validateTable(leftTable); - list.add(leftTable + " ON " + joinStr); - }else { - error("@leftOuterJoin的格式必须是:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2"); - return null; - } - }else { - error("@leftOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); - return null; - } - } - } - } - return list; - } - /** - * 右外链接 - */ - @Override - public List getRightOuterJoin() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - if(join != null && join.get("@rightOuterJoin")!=null) { - JSONArray stms = join.getJSONArray("@rightOuterJoin"); - for(int i = 0; i < stms.size(); i++) { - Object obj = stms.get(i); - if(obj instanceof String) { - String joinStr = (String)obj; - if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { - //table1.column1 = table2.column2 - String[] tcs = joinStr.replaceAll("\\s", "").split("="); - String leftTable = tcs[0].split("\\.")[0]; - String rightTable = tcs[1].split("\\.")[0]; - validateTable(leftTable); - list.add(leftTable + " ON " + joinStr); - }else { - error("@rightOuterJoin的格式必须是:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2"); - return null; - } - }else { - error("@rightOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); - return null; - } - } - } - } - return list; - } - /** - * join连接 - */ - @Override - public List getJoin() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - if(join != null && join.get("@join")!=null) { - JSONArray stms = join.getJSONArray("@join"); - for(int i = 0; i < stms.size(); i++) { - Object obj = stms.get(i); - if(obj instanceof String) { - String joinStr = (String)obj; - if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { - //table1.column1 = table2.column2 - String[] tcs = joinStr.replaceAll("\\s", "").split("="); - String leftTable = tcs[0].split("\\.")[0]; - String rightTable = tcs[1].split("\\.")[0]; - validateTable(leftTable); - list.add(leftTable + " ON " + joinStr); - }else { - error("@join的格式必须是:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2"); - return null; - } - }else { - error("@join的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); - return null; - } - } - } - } - return list; - } - /** - * 外连接 - */ - @Override - public List getOuterJoin() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - if(join != null && join.get("@outerJoin")!=null) { - JSONArray stms = join.getJSONArray("@join"); - for(int i = 0; i < stms.size(); i++) { - - Object obj = stms.get(i); - if(obj instanceof String) { - String joinStr = (String)obj; - if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { - //table1.column1 = table2.column2 - String[] tcs = joinStr.replaceAll("\\s", "").split("="); - String leftTable = tcs[0].split("\\.")[0]; - String rightTable = tcs[1].split("\\.")[0]; - validateTable(leftTable); - list.add(leftTable + " ON " + joinStr); - }else { - error("@outerJoin的格式必须是:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2"); - return null; - } - }else { - error("@outerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); - return null; - } - } - } - } - return list; - } - /** - * 解析分组 - * "@group":"store_id" - */ - @Override - public List getGroupBy() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - Set tableNames = request.keySet(); - String tableAliasName; - for(String tableName : tableNames) { - //格式检查 - if(!tableName.matches("(\\w+(:\\w+)?)")) { - error("表" + tableName + "格式不符合" ); - return null; - } - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - tableAliasName = tableName.split(ALIAS_SPLIT)[1]; - }else { - tableAliasName = tableName; - } - // 获取请求@group的值 - JSONObject propertis = request.getJSONObject(tableName); - String columnsValue = propertis.getString("@group"); - if(columnsValue != null) { - if(!columnsValue.matches("\\w+(\\s?,\\s?\\w+)*")) { - error("字段@group:" + columnsValue + "格式不符合,正确请求如:a,b,c" ); - return null; - } - String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); - for(String colmunName : columnNames) { - list.add(tableAliasName + "." + colmunName); - } - } - - } - } - return list; - } - - /** - * 解析排序逻辑 - * column1+,column2-,+表示升序,-表示降序 - */ - @Override - public List getOrderBy() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.SELECT) { - Set tableNames = request.keySet(); - String tableAliasName; - for(String tableName : tableNames) { - //格式检查 - if(!tableName.matches("(\\w+(:\\w+)?)")) { - error("表" + tableName + "格式不符合" ); - return null; - } - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - tableAliasName = tableName.split(ALIAS_SPLIT)[1]; - }else { - tableAliasName = tableName; - } - // 获取请求@column的值 - JSONObject propertis = request.getJSONObject(tableName); - String columnsValue = propertis.getString("@orders"); - if(columnsValue != null) { - if(!columnsValue.matches("(\\w+(\\+|\\-)?)+(\\s?,\\s?(\\w+(\\+|\\-)?)+)*")) { - error("字段@orders:" + columnsValue + "格式不符合,正确格式如:column1+,column2-,+表示升序,-表示降序。" ); - return null; - } - //没有填写@orders字段,默认为全部 - String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); - for(String columnName : columnNames) { - if(columnName.endsWith("+")) - list.add(tableAliasName + "." + columnName.replaceAll("\\+", "") + " ASC"); - else if (columnName.endsWith("-")) - list.add(tableAliasName + "." + columnName.replaceAll("\\-", "") + " DESC"); - } - } - } - } - return list; - } + + /** + * 解析请求中的字段 + * 路径:/表名/@column + * 同时为字段设置好引用的表别名,如: p.id + * 表名必须符合:(\w+(:\w+)?) + * 字段值必须符合: + * 不支持函数的正则:(\w+(:\w+)?)+(\s?,\s?(\w+(:\w+)?)+)* + * 支持函数的正则:((\w+\(\w+\):\w+|\w+)(:\w+)?)+(\s?,\s?((\w+\(\w+\):\w+|\w+)(:\w+)?)+)* + * 例:a,b,c或a:a1,b:b1,c + * 约束:必须要有表名 + * 目前支持函数 + */ + @Override + public List getSelect() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + Set tableNames = request.keySet(); + String tableRealName; + String tableAliasName; + for (String tableName : tableNames) { + //格式检查 + if (!tableName.matches("(\\w+(:\\w+)?)")) { + error("表" + tableName + "格式不符合"); + return null; + } + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + tableRealName = tableName.split(ALIAS_SPLIT)[0]; + //填写了表别名 + tableAliasName = tableName.split(ALIAS_SPLIT)[1]; + } else { + tableRealName = tableAliasName = tableName; + } + // 获取请求@column的值 + JSONObject propertis = request.getJSONObject(tableName); + String columnsValue = propertis.getString("@column"); + + if (columnsValue == null) { + validateColumn(tableRealName, "*"); + //没有填写@column字段,默认为全部 + list.add(tableAliasName + ".*"); + } else { + if (!columnsValue.matches("((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+(\\s?,\\s?((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+)*")) { + error("字段@column:" + columnsValue + "格式不符合,正确请求如:a,b,c:d或者a,max(d):d,c:e"); + return null; + } + //填写了,则返回tableAliasName.colName或tableAliasName.columnName as columnAliasName + String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); + for (String columnName : columnNames) { + if (columnName.contains(ALIAS_SPLIT)) { + //填写了字段别名,使用:tableAliasName.columnName as columnAliasName这种类型 + //这里columnRealName有两种情况,如:id或max(id) + String functionOrColumn = columnName.split(ALIAS_SPLIT)[0]; + if (functionOrColumn.contains("(")) { + //有函数的字段 + //去掉) + functionOrColumn = functionOrColumn.replaceAll("\\)", ""); + String[] functionStrs = functionOrColumn.split("\\("); + String funcitonName = functionStrs[0]; + //要对函数进行控制这这里进行 + //此处省略函数合法性检查的代码... + String columnRealName = functionStrs[1]; + String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; + validateColumn(tableRealName, columnRealName); + list.add(funcitonName + "(" + tableAliasName + "." + columnRealName + ")" + " as " + columnAliasName); + } else { + //没函数的字段 + String columnRealName = functionOrColumn; + String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; + validateColumn(tableRealName, columnRealName); + list.add(tableAliasName + "." + columnRealName + " as " + columnAliasName); + } + } else { + //使用tableAliasName.columnName类型 + validateColumn(tableRealName, columnName); + list.add(tableAliasName + "." + columnName); + } + } + } + + } + } + return list; + } + + /** + * 解析请求中的过滤条件 + * 支持以下模式: + * 单值:"id" : "12" 即id=12 + * 多值:"id&{}" : ">12,<30" 即 id > 12 AND id < 30 + * 多值:"id|{}" : ">12,<30" 即 id > 12 OR id < 30 + * 多值:"id{}" : [1,2,3] 即 id IN (1,2,3) + * 多值:"id!{}" : [1,2,3] 即 id NOT IN (1,2,3) + * 模糊:"content~":"keyword" 即字段content包含字符串keyword + * 模糊:"content$":"%keyword" 同样是模糊查询,%放出来自己操控 + * 正则:"content?":"^[0-9]+$" 后面填写正则即可 + * 外键:"id@":"/外键表/外键字段" + */ + @Override + public List getWhere() { + List list = Lists.newArrayList(); + Set tableNames = request.keySet(); + String tableAliasName; + for (String tableName : tableNames) { + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + tableAliasName = tableName.split(ALIAS_SPLIT)[1]; + } else { + tableAliasName = tableName; + } + // 遍历过滤条件 + JSONObject propertis = request.getJSONObject(tableName); + conditionLoop: + for (String condition : propertis.keySet()) { + //关键字则跳过 + if (condition.startsWith("@")) { + continue conditionLoop; + } + if (condition.matches("\\w+")) { + //纯字段名 + if (propertis.get(condition) instanceof Integer || + propertis.get(condition) instanceof Float || + propertis.get(condition) instanceof Double || + propertis.get(condition) instanceof BigDecimal) { + list.add(tableAliasName + "." + condition + " = " + propertis.get(condition)); + } else if (propertis.get(condition) instanceof String) { + list.add(tableAliasName + "." + condition + " = '" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'"); + } + } else if (condition.matches("(\\w+(!|&|\\|)?\\{\\})+")) { + + //表示这是一个多条件类型 + if (propertis.get(condition) instanceof String) { + String exp = (String) propertis.get(condition); + //是否匹配这种类型:<20.3,>3.3,=3.3 + if (!exp.matches("(\\s?(>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)+)+(\\s?,\\s?((>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)))*")) { + error(condition + "的格式不正确,正确使用方式如: >10,<20"); + return null; + } + if (condition.endsWith("|{}")) { + String[] terms = exp.replaceAll("\\s", "").split(","); + String columnName = condition.replaceAll("\\|\\{\\}", ""); + String limit = ""; + for (int i = 0; i < terms.length; i++) { + String term = terms[i]; + if (term.startsWith(">=")) { + limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", ""); + } else if (term.startsWith("<=")) { + limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", ""); + } else if (term.startsWith(">")) { + limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", ""); + } else if (term.startsWith("<")) { + limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", ""); + } else if (term.startsWith("<>") || term.startsWith("!=")) { + limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", ""); + } else if (term.startsWith("=")) { + limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", ""); + } + if (terms.length > 1 && (i != (terms.length - 1))) + limit += OR; + } + list.add(limit); + } else { + getLastList().add(AND); + String[] terms = exp.replaceAll("\\s", "").split(","); + String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", ""); + String limit = ""; + for (int i = 0; i < terms.length; i++) { + String term = terms[i]; + if (term.startsWith(">=")) { + limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", ""); + } else if (term.startsWith("<=")) { + limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", ""); + } else if (term.startsWith(">")) { + limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", ""); + } else if (term.startsWith("<")) { + limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", ""); + } else if (term.startsWith("<>") || term.startsWith("!=")) { + limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", ""); + } else if (term.startsWith("=")) { + limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", ""); + } + if (terms.length > 1 && (i != (terms.length - 1))) + limit += AND; + } + list.add(limit); + + } + } else if (propertis.get(condition) instanceof JSONArray) { + JSONArray array = (JSONArray) propertis.get(condition); + //分离出字段名 + String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", ""); + String limit = ""; + if (condition.endsWith("!{}")) { + if (!array.isEmpty()) { + for (int i = 0; i < array.size(); i++) { + Object obj = array.get(i); + if (i != 0) { + limit += ", "; + } + if (obj instanceof Integer || + obj instanceof Float || + obj instanceof Double || + obj instanceof BigDecimal) { + limit += obj; + } else if (obj instanceof String) { + limit += "'" + ((String) obj).replaceAll("'", "''") + "'"; + } + } + list.add(tableAliasName + "." + columnName + " NOT IN [" + limit + "]"); + } + } else { + if (!array.isEmpty()) { + for (int i = 0; i < array.size(); i++) { + Object obj = array.get(i); + if (i != 0) { + limit += ", "; + } + if (obj instanceof Integer || + obj instanceof Float || + obj instanceof Double || + obj instanceof BigDecimal) { + limit += obj; + } else if (obj instanceof String) { + limit += "'" + ((String) obj).replaceAll("'", "''") + "'"; + } + } + list.add(tableAliasName + "." + columnName + " IN [" + limit + "]"); + } + } + } + } else if (condition.matches("\\w+~")) { + //字符串查询,包含 + if (propertis.get(condition) instanceof String) { + String exp = (String) propertis.get(condition); + String columnName = condition.replaceAll("~", ""); + list.add(tableAliasName + "." + columnName + " LIKE '%" + exp.replaceAll("'", "''") + "%'"); + } else { + error(condition + "的值必须要是字符串"); + return null; + } + } else if (condition.matches("\\w+\\$")) { + //字符串查询,LIKE + if (propertis.get(condition) instanceof String) { + String exp = (String) propertis.get(condition); + String columnName = condition.replaceAll("\\$", ""); + list.add(tableAliasName + "." + columnName + " LIKE '" + exp.replaceAll("'", "''") + "'"); + } else { + error(condition + "的值必须要是字符串"); + return null; + } + } else if (condition.matches("\\w+\\?")) { + //字符串查询,正则 + if (propertis.get(condition) instanceof String) { + String exp = (String) propertis.get(condition); + String columnName = condition.replaceAll("\\?", ""); + list.add(" regexp_like(" + tableAliasName + "." + columnName + ",'" + exp.replaceAll("'", "''") + "')"); + } else { + error(condition + "的值必须要是字符串"); + return null; + } + } else if (condition.matches("\\w+@")) { + //内连接 + if (propertis.get(condition) instanceof String) { + String exp = (String) propertis.get(condition); + String columnName = condition.replaceAll("@", ""); + if (exp.matches("/\\w+/\\w+")) { + String[] args = exp.split("/"); + String refTable = args[1]; + String refColumn = args[2]; + list.add(refTable + "." + refColumn + " = " + tableAliasName + "." + columnName); + } else { + error(condition + "必须符合:\"/表名或别名/字段名\"的形式"); + return null; + } + } else { + error(condition + "的值必须要是字符串"); + return null; + } + } + } + + + } + return list; + } + + /** + * 内连接 + * 请求:"@innerJoin" : ["table1.column1 = table2.column2","table1.column1 = table2.column2"] + * 编译之后:INNER JOIN table1 ON table1.column1=table2.column2 + */ + @Override + public List getInnerJoin() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + if (join != null && join.get("@innerJoin") != null) { + JSONArray stms = join.getJSONArray("@innerJoin"); + for (int i = 0; i < stms.size(); i++) { + Object obj = stms.get(i); + if (obj instanceof String) { + String joinStr = (String) obj; + if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { + //table1.column1 = table2.column2 + String[] tcs = joinStr.replaceAll("\\s", "").split("="); + String leftTable = tcs[0].split("\\.")[0]; + String rightTable = tcs[1].split("\\.")[0]; + validateTable(leftTable); + list.add(leftTable + " ON " + joinStr); + } else { + error("@innerJoin的格式必须是:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2"); + return null; + } + } else { + error("@innerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); + return null; + } + } + } + } + return list; + } + + /** + * 左外连接 + */ + @Override + public List getLeftOuterJoin() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + if (join != null && join.get("@leftOuterJoin") != null) { + JSONArray stms = join.getJSONArray("@leftOuterJoin"); + for (int i = 0; i < stms.size(); i++) { + Object obj = stms.get(i); + if (obj instanceof String) { + String joinStr = (String) obj; + if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { + //table1.column1 = table2.column2 + String[] tcs = joinStr.replaceAll("\\s", "").split("="); + String leftTable = tcs[0].split("\\.")[0]; + String rightTable = tcs[1].split("\\.")[0]; + validateTable(leftTable); + list.add(leftTable + " ON " + joinStr); + } else { + error("@leftOuterJoin的格式必须是:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2"); + return null; + } + } else { + error("@leftOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); + return null; + } + } + } + } + return list; + } + + /** + * 右外链接 + */ + @Override + public List getRightOuterJoin() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + if (join != null && join.get("@rightOuterJoin") != null) { + JSONArray stms = join.getJSONArray("@rightOuterJoin"); + for (int i = 0; i < stms.size(); i++) { + Object obj = stms.get(i); + if (obj instanceof String) { + String joinStr = (String) obj; + if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { + //table1.column1 = table2.column2 + String[] tcs = joinStr.replaceAll("\\s", "").split("="); + String leftTable = tcs[0].split("\\.")[0]; + String rightTable = tcs[1].split("\\.")[0]; + validateTable(leftTable); + list.add(leftTable + " ON " + joinStr); + } else { + error("@rightOuterJoin的格式必须是:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2"); + return null; + } + } else { + error("@rightOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); + return null; + } + } + } + } + return list; + } + + /** + * join连接 + */ + @Override + public List getJoin() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + if (join != null && join.get("@join") != null) { + JSONArray stms = join.getJSONArray("@join"); + for (int i = 0; i < stms.size(); i++) { + Object obj = stms.get(i); + if (obj instanceof String) { + String joinStr = (String) obj; + if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { + //table1.column1 = table2.column2 + String[] tcs = joinStr.replaceAll("\\s", "").split("="); + String leftTable = tcs[0].split("\\.")[0]; + String rightTable = tcs[1].split("\\.")[0]; + validateTable(leftTable); + list.add(leftTable + " ON " + joinStr); + } else { + error("@join的格式必须是:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2"); + return null; + } + } else { + error("@join的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); + return null; + } + } + } + } + return list; + } + + /** + * 外连接 + */ + @Override + public List getOuterJoin() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + if (join != null && join.get("@outerJoin") != null) { + JSONArray stms = join.getJSONArray("@join"); + for (int i = 0; i < stms.size(); i++) { + + Object obj = stms.get(i); + if (obj instanceof String) { + String joinStr = (String) obj; + if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) { + //table1.column1 = table2.column2 + String[] tcs = joinStr.replaceAll("\\s", "").split("="); + String leftTable = tcs[0].split("\\.")[0]; + String rightTable = tcs[1].split("\\.")[0]; + validateTable(leftTable); + list.add(leftTable + " ON " + joinStr); + } else { + error("@outerJoin的格式必须是:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2"); + return null; + } + } else { + error("@outerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名"); + return null; + } + } + } + } + return list; + } + + /** + * 解析分组 + * "@group":"store_id" + */ + @Override + public List getGroupBy() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + Set tableNames = request.keySet(); + String tableAliasName; + for (String tableName : tableNames) { + //格式检查 + if (!tableName.matches("(\\w+(:\\w+)?)")) { + error("表" + tableName + "格式不符合"); + return null; + } + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + tableAliasName = tableName.split(ALIAS_SPLIT)[1]; + } else { + tableAliasName = tableName; + } + // 获取请求@group的值 + JSONObject propertis = request.getJSONObject(tableName); + String columnsValue = propertis.getString("@group"); + if (columnsValue != null) { + if (!columnsValue.matches("\\w+(\\s?,\\s?\\w+)*")) { + error("字段@group:" + columnsValue + "格式不符合,正确请求如:a,b,c"); + return null; + } + String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); + for (String colmunName : columnNames) { + list.add(tableAliasName + "." + colmunName); + } + } + + } + } + return list; + } + + /** + * 解析排序逻辑 + * column1+,column2-,+表示升序,-表示降序 + */ + @Override + public List getOrderBy() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.SELECT) { + Set tableNames = request.keySet(); + String tableAliasName; + for (String tableName : tableNames) { + //格式检查 + if (!tableName.matches("(\\w+(:\\w+)?)")) { + error("表" + tableName + "格式不符合"); + return null; + } + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + tableAliasName = tableName.split(ALIAS_SPLIT)[1]; + } else { + tableAliasName = tableName; + } + // 获取请求@column的值 + JSONObject propertis = request.getJSONObject(tableName); + String columnsValue = propertis.getString("@orders"); + if (columnsValue != null) { + if (!columnsValue.matches("(\\w+(\\+|\\-)?)+(\\s?,\\s?(\\w+(\\+|\\-)?)+)*")) { + error("字段@orders:" + columnsValue + "格式不符合,正确格式如:column1+,column2-,+表示升序,-表示降序。"); + return null; + } + //没有填写@orders字段,默认为全部 + String[] columnNames = columnsValue.replaceAll("\\s", "").split(","); + for (String columnName : columnNames) { + if (columnName.endsWith("+")) { + list.add(tableAliasName + "." + columnName.replaceAll("\\+", "") + " ASC"); + } else if (columnName.endsWith("-")) { + list.add(tableAliasName + "." + columnName.replaceAll("\\-", "") + " DESC"); + } + } + } + } + } + return list; + } /* * ================================== * 新增逻辑 * ================================== */ - - @Override - public List getColumns() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.INSERT) { - Set tableNames = request.keySet(); - if(tableNames.size()!=1) { - error("新增时,表只能有一个"); - return null; - } - for(String tableName : tableNames) { - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - error("新增时,表不需要有别名"); - return null; - } - // 遍历过滤条件 - JSONObject propertis = request.getJSONObject(tableName); - for(String condition : propertis.keySet() ) { - //关键字则跳过 - if(condition.endsWith("@")) - continue; - if(condition.matches("\\w+")) { - //纯字段名 - validateColumn(tableName,condition); - list.add(condition); - }else { - error("新增时,"+condition+"必须是字段名"); - return null; - } - } - - } - } - return list; - } - - @Override - public List getValues() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.INSERT) { - Set tableNames = request.keySet(); - if(tableNames.size()!=1) { - error("新增时,表只能有一个"); - return null; - } - for(String tableName : tableNames) { - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - error("新增时,表不需要有别名"); - return null; - } - // 遍历过滤条件 - JSONObject propertis = request.getJSONObject(tableName); - for(String condition : propertis.keySet() ) { - //关键字则跳过 - if(condition.endsWith("@")) - continue; - if(condition.matches("\\w+")) { - //纯字段名 - if(propertis.get(condition) instanceof Integer || - propertis.get(condition) instanceof Float || - propertis.get(condition) instanceof Double || - propertis.get(condition) instanceof BigDecimal) { - list.add(propertis.get(condition).toString() ); - }else if(propertis.get(condition) instanceof String) { - list.add("'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'"); - } - }else { - error("新增时,"+condition+"必须是字段名"); - } - } - - } - } - return list; - } + + @Override + public List getColumns() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.INSERT) { + Set tableNames = request.keySet(); + if (tableNames.size() != 1) { + error("新增时,表只能有一个"); + return null; + } + for (String tableName : tableNames) { + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + error("新增时,表不需要有别名"); + return null; + } + // 遍历过滤条件 + JSONObject propertis = request.getJSONObject(tableName); + for (String condition : propertis.keySet()) { + //关键字则跳过 + if (condition.endsWith("@")) { + continue; + } + if (condition.matches("\\w+")) { + //纯字段名 + validateColumn(tableName, condition); + list.add(condition); + } else { + error("新增时," + condition + "必须是字段名"); + return null; + } + } + + } + } + return list; + } + + @Override + public List getValues() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.INSERT) { + Set tableNames = request.keySet(); + if (tableNames.size() != 1) { + error("新增时,表只能有一个"); + return null; + } + for (String tableName : tableNames) { + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + error("新增时,表不需要有别名"); + return null; + } + // 遍历过滤条件 + JSONObject propertis = request.getJSONObject(tableName); + for (String condition : propertis.keySet()) { + //关键字则跳过 + if (condition.endsWith("@")){ + continue; + } + if (condition.matches("\\w+")) { + //纯字段名 + if (propertis.get(condition) instanceof Integer || + propertis.get(condition) instanceof Float || + propertis.get(condition) instanceof Double || + propertis.get(condition) instanceof BigDecimal) { + list.add(propertis.get(condition).toString()); + } else if (propertis.get(condition) instanceof String) { + list.add("'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'"); + } + } else { + error("新增时," + condition + "必须是字段名"); + } + } + + } + } + return list; + } /* * ================================== * 修改逻辑 * ================================== */ - - /** - * 更新字段 - * "@description": "20190101,元旦快乐" - * 有@标记的才会更新,否则会被认为是WHERE的条件 - */ - @Override - public List getSets() { - // TODO Auto-generated method stub - List list = new ArrayList<>(); - if(getStatementType() == StatementType.UPDATE) { - Set tableNames = request.keySet(); - if(tableNames.size()!=1) { - error("更新时,表只能有一个"); - return null; - } - for(String tableName : tableNames) { - //是否有自定义别名 - if(tableName.contains(ALIAS_SPLIT)) { - //填写了表别名 - error("更新时,表不需要有别名"); - return null; - } - // 遍历过滤条件 - JSONObject propertis = request.getJSONObject(tableName); - for(String condition : propertis.keySet() ) { - //关键字则跳过 - if(condition.matches("@\\w+")) { - //要更新的字段 - String columnName = condition.replaceAll("@", ""); - if(propertis.get(condition) instanceof Integer || - propertis.get(condition) instanceof Float || - propertis.get(condition) instanceof Double || - propertis.get(condition) instanceof BigDecimal) { - validateColumn(tableName,columnName); - list.add(tableName + "." + columnName + "=" + propertis.get(condition).toString() ); - }else if(propertis.get(condition) instanceof String) { - validateColumn(tableName, columnName); - list.add(tableName + "." + columnName + "=" + "'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'"); - } - } - } - - } - } - return list; - } + + /** + * 更新字段 + * "@description": "20190101,元旦快乐" + * 有@标记的才会更新,否则会被认为是WHERE的条件 + */ + @Override + public List getSets() { + List list = Lists.newArrayList(); + if (getStatementType() == StatementType.UPDATE) { + Set tableNames = request.keySet(); + if (tableNames.size() != 1) { + error("更新时,表只能有一个"); + return null; + } + for (String tableName : tableNames) { + //是否有自定义别名 + if (tableName.contains(ALIAS_SPLIT)) { + //填写了表别名 + error("更新时,表不需要有别名"); + return null; + } + // 遍历过滤条件 + JSONObject propertis = request.getJSONObject(tableName); + for (String condition : propertis.keySet()) { + //关键字则跳过 + if (condition.matches("@\\w+")) { + //要更新的字段 + String columnName = condition.replaceAll("@", ""); + if (propertis.get(condition) instanceof Integer || + propertis.get(condition) instanceof Float || + propertis.get(condition) instanceof Double || + propertis.get(condition) instanceof BigDecimal) { + validateColumn(tableName, columnName); + list.add(tableName + "." + columnName + "=" + propertis.get(condition).toString()); + } else if (propertis.get(condition) instanceof String) { + validateColumn(tableName, columnName); + list.add(tableName + "." + columnName + "=" + "'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'"); + } + } + } + + } + } + return list; + } /* * ================================== @@ -795,81 +806,61 @@ public List getSets() { * 如果想要新增或者修改的更复杂的逻辑, * 请在外层处理完成之后以制定格式提交该SQL的黑白名单即可 * - */ - /** - * 表的黑白名单检查 - * @param tableName - */ - private void validateTable(String tableName) { - String tableUCN = tableName.toUpperCase(); - if(tableBlackList != null && !tableBlackList.isEmpty()) { - for(String tn : tableBlackList) { - if(tableUCN.equals(tn.toUpperCase())) { - error("请求的表:" + tableName + "在黑名单中"); - return; - } - } - } - - if(tableWhiteList != null && !tableWhiteList.isEmpty()) { - for(String tn : tableWhiteList) { - if(tableUCN.equals(tn.toUpperCase())) { - return; - } - } - error("请求的表:" + tableName + "不在白名单中"); - } - } - /** - * 字段黑白名单检查 - * 要求: "表.列" - * @param columnName */ - private void validateColumn(String tableName, String columnName) { - String tableUCN = tableName.toUpperCase(); - String columnUCN = columnName.toUpperCase(); - String tcUCN = tableUCN + "." + columnUCN; - if(columnBlackList != null && !columnBlackList.isEmpty()) { - for(String tc : columnBlackList) { - if(tcUCN.equals(tc.toUpperCase())) { - error("请求的字段:" + tcUCN + "在黑名单中"); - return; - } - } - } - - if(columnWhiteList != null && !columnWhiteList.isEmpty()) { - for(String tc : columnWhiteList) { - if(tc.endsWith(".*") || tcUCN.equals(tc.toUpperCase())) { - return; - } - } - error("请求的字段:" + tcUCN + "不在白名单中"); - } - } - - public List getTableWhiteList() { - return tableWhiteList; - } - public void setTableWhiteList(List tableWhiteList) { - this.tableWhiteList = tableWhiteList; - } - public List getTableBlackList() { - return tableBlackList; - } - public void setTableBlackList(List tableBlackList) { - this.tableBlackList = tableBlackList; - } - public List getColumnWhiteList() { - return columnWhiteList; - } - public void setColumnWhiteList(List columnWhiteList) { - this.columnWhiteList = columnWhiteList; - } - public List getColumnBlackList() { - return columnBlackList; - } - public void setColumnBlackList(List columnBlackList) { - this.columnBlackList = columnBlackList; - } + + /** + * 表的黑白名单检查 + * + * @param tableName + */ + private void validateTable(String tableName) { + String tableUCN = tableName.toUpperCase(); + if (tableBlackList != null && !tableBlackList.isEmpty()) { + for (String tn : tableBlackList) { + if (tableUCN.equals(tn.toUpperCase())) { + error("请求的表:" + tableName + "在黑名单中"); + return; + } + } + } + + if (tableWhiteList != null && !tableWhiteList.isEmpty()) { + for (String tn : tableWhiteList) { + if (tableUCN.equals(tn.toUpperCase())) { + return; + } + } + error("请求的表:" + tableName + "不在白名单中"); + } + } + + /** + * 字段黑白名单检查 + * 要求: "表.列" + * + * @param columnName + */ + private void validateColumn(String tableName, String columnName) { + String tableUCN = tableName.toUpperCase(); + String columnUCN = columnName.toUpperCase(); + String tcUCN = tableUCN + "." + columnUCN; + if (columnBlackList != null && !columnBlackList.isEmpty()) { + for (String tc : columnBlackList) { + if (tcUCN.equals(tc.toUpperCase())) { + error("请求的字段:" + tcUCN + "在黑名单中"); + return; + } + } + } + + if (columnWhiteList != null && !columnWhiteList.isEmpty()) { + for (String tc : columnWhiteList) { + if (tc.endsWith(".*") || tcUCN.equals(tc.toUpperCase())) { + return; + } + } + error("请求的字段:" + tcUCN + "不在白名单中"); + } + } + } diff --git a/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java b/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java index c6f71f8..faed4e2 100644 --- a/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java @@ -1,196 +1,48 @@ package zuo.biao.apijson.parser; -import java.util.ArrayList; -import java.util.List; +import com.google.common.collect.Lists; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import java.util.List; +/** + * @author zhangls + */ +@Data public abstract class AbstractProvider implements SQLProvider { - private StatementType statementType; - private List sets = new ArrayList(); - private List select = new ArrayList(); - private List tables = new ArrayList(); - private List join = new ArrayList(); - private List innerJoin = new ArrayList(); - private List outerJoin = new ArrayList(); - private List leftOuterJoin = new ArrayList(); - private List rightOuterJoin = new ArrayList(); - private List where = new ArrayList(); - private List having = new ArrayList(); - private List groupBy = new ArrayList(); - private List orderBy = new ArrayList(); - private List lastList = new ArrayList(); - private List columns = new ArrayList(); - private List values = new ArrayList(); - private boolean distinct; - - private Message message = new Message(); - - public Message getMessage() { - return message; - }; - /** - * 接收错误消息 - * @param err - */ - public void error(String err) { - StackTraceElement ste = new Throwable().getStackTrace()[1]; - //this.message.error(ste.getFileName() + ": Line " + ste.getLineNumber() + " Error message:" +err, ste); - this.message.error(err, ste); - } - - @Override - public StatementType getStatementType() { - // TODO Auto-generated method stub - return statementType; - } - public void setStatementType(StatementType statementType) { - // TODO Auto-generated method stub - this.statementType = statementType; - } - - @Override - public List getSets() { - // TODO Auto-generated method stub - return sets; - } - - @Override - public List getSelect() { - // TODO Auto-generated method stub - return select; - } - - @Override - public List getTables() { - // TODO Auto-generated method stub - return tables; - } - - @Override - public List getJoin() { - // TODO Auto-generated method stub - return join; - } - - @Override - public List getInnerJoin() { - // TODO Auto-generated method stub - return innerJoin; - } - - @Override - public List getOuterJoin() { - // TODO Auto-generated method stub - return outerJoin; - } - - @Override - public List getLeftOuterJoin() { - // TODO Auto-generated method stub - return leftOuterJoin; - } - - @Override - public List getRightOuterJoin() { - // TODO Auto-generated method stub - return rightOuterJoin; - } - - @Override - public List getWhere() { - // TODO Auto-generated method stub - return where; - } - - @Override - public List getHaving() { - // TODO Auto-generated method stub - return having; - } - - @Override - public List getGroupBy() { - // TODO Auto-generated method stub - return groupBy; - } - - @Override - public List getOrderBy() { - // TODO Auto-generated method stub - return orderBy; - } - - @Override - public List getLastList() { - // TODO Auto-generated method stub - return lastList; - } - - @Override - public List getColumns() { - // TODO Auto-generated method stub - return columns; - } - @Override - public List getValues() { - // TODO Auto-generated method stub - return values; - } + private StatementType statementType; + private List sets = Lists.newArrayList(); + private List select = Lists.newArrayList(); + private List tables = Lists.newArrayList(); + private List join = Lists.newArrayList(); + private List innerJoin = Lists.newArrayList(); + private List outerJoin = Lists.newArrayList(); + private List leftOuterJoin = Lists.newArrayList(); + private List rightOuterJoin = Lists.newArrayList(); + private List where = Lists.newArrayList(); + private List having = Lists.newArrayList(); + private List groupBy = Lists.newArrayList(); + private List orderBy = Lists.newArrayList(); + private List lastList = Lists.newArrayList(); + private List columns = Lists.newArrayList(); + private List values = Lists.newArrayList(); + private boolean distinct; + + private Message message = new Message(); + + /** + * 接收错误消息 + * + * @param err + */ + public void error(String err) { + StackTraceElement ste = new Throwable().getStackTrace()[1]; + + this.message.error(err, ste); + } - @Override - public boolean isDistinct() { - // TODO Auto-generated method stub - return distinct; - } - public void setSets(List sets) { - this.sets = sets; - } - public void setSelect(List select) { - this.select = select; - } - public void setTables(List tables) { - this.tables = tables; - } - public void setJoin(List join) { - this.join = join; - } - public void setInnerJoin(List innerJoin) { - this.innerJoin = innerJoin; - } - public void setOuterJoin(List outerJoin) { - this.outerJoin = outerJoin; - } - public void setLeftOuterJoin(List leftOuterJoin) { - this.leftOuterJoin = leftOuterJoin; - } - public void setRightOuterJoin(List rightOuterJoin) { - this.rightOuterJoin = rightOuterJoin; - } - public void setWhere(List where) { - this.where = where; - } - public void setHaving(List having) { - this.having = having; - } - public void setGroupBy(List groupBy) { - this.groupBy = groupBy; - } - public void setOrderBy(List orderBy) { - this.orderBy = orderBy; - } - public void setLastList(List lastList) { - this.lastList = lastList; - } - public void setColumns(List columns) { - this.columns = columns; - } - public void setValues(List values) { - this.values = values; - } - public void setDistinct(boolean distinct) { - this.distinct = distinct; - } - } diff --git a/src/main/java/zuo/biao/apijson/parser/App.java b/src/main/java/zuo/biao/apijson/parser/App.java index 06c74db..6de7e73 100644 --- a/src/main/java/zuo/biao/apijson/parser/App.java +++ b/src/main/java/zuo/biao/apijson/parser/App.java @@ -13,13 +13,7 @@ public class App public static void main( String[] args ) throws SQLProviderException { long st = System.currentTimeMillis(); - String json = "{\r\n" + - " \"Product:p\":{\r\n" + - " \"@column\":\"name,max(price):max_price\",\r\n" + - " \"name~\": \"双11\",\r\n" + - " \"@group\": \"name\"\r\n" + - " }\r\n" + - "}"; + String json = "{'Product:p':{'name~':'双11','@group':'name','@column':'name,max(price):max_price'}}"; JSONObject req = JSONObject.parseObject(json); long fastJsonet = System.currentTimeMillis(); //JSON解析太耗时了174ms diff --git a/src/main/java/zuo/biao/apijson/parser/BaseProvider.java b/src/main/java/zuo/biao/apijson/parser/BaseProvider.java index 00311cb..a42b434 100644 --- a/src/main/java/zuo/biao/apijson/parser/BaseProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/BaseProvider.java @@ -1,5 +1,8 @@ package zuo.biao.apijson.parser; +/** + * @author zhangls + */ public class BaseProvider extends AbstractProvider { } diff --git a/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java b/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java index 69d2a8d..78a3510 100644 --- a/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java @@ -1,185 +1,169 @@ package zuo.biao.apijson.parser; +import lombok.Getter; + import java.util.List; /** - * 该类延伸出来转换方法,让继承的子类实现 - * toXXX方法时转换逻辑,需要继承实现 - * @author Zerounary + * 该类延伸出来转换方法,让继承的子类实现 + * toXXX方法时转换逻辑,需要继承实现 * + * @author Zerounary */ -public abstract class InterpreterProvider extends AbstractProvider{ - - private T statementTypeHandle; - private T setsHandle; - private T selectHandle; - private T tableHandle; - private T joinHandle; - private T innerJoinHandle; - private T valuesHandle; - private T outerJoinHandle; - private T leftOuterJoinHandle; - private T rightOuterJoinHandle; - private T whereHandle; - private T havingHandle; - private T groupByHandle; - private T orderByHandle; - private T columnsHandle; - private T lastListHandle; - private T distinctHandle; - - public T getStatementTypeHandle() { - return statementTypeHandle; - } - public void setStatementTypeHandle(T statementTypeHandle) { - setStatementType(toSatementType(statementTypeHandle)); - this.statementTypeHandle = statementTypeHandle; - } - public abstract StatementType toSatementType(T charger) ; - - public T getSetsHandle() { - return setsHandle; - } - public void setSetsHandle(T setsHandle) { - setSets(toSets(setsHandle)); - this.setsHandle = setsHandle; - } - public abstract List toSets(T charger) ; - - public T getSelectHandle() { - return selectHandle; - } - public void setSelectHandle(T selectHandle) { - setSelect(toSelect(selectHandle)); - this.selectHandle = selectHandle; - } - public abstract List toSelect(T charger) ; - - public T getTableHandle() { - return tableHandle; - } - public void setTableHandle(T charger) { - setTables(toTables(charger)); - this.tableHandle = charger; - } - public abstract List toTables(T charger) ; - - public T getJoinHandle() { - return joinHandle; - } - public void setJoinHandle(T charger) { - setJoin(toJoin(charger)); - this.joinHandle = charger; - } - public abstract List toJoin(T charger) ; - - public T getInnerJoinHandle() { - return innerJoinHandle; - } - public void setInnerJoinHandle(T charger) { - setInnerJoin(toInnerJoin(charger)); - this.innerJoinHandle = charger; - } - public abstract List toInnerJoin(T charger) ; - - public T getValuesHandle() { - return valuesHandle; - } - public void setValuesHandle(T charger) { - setValues(toValues(charger)); - this.valuesHandle = charger; - } - public abstract List toValues(T charger) ; - - public T getOuterJoinHandle() { - return outerJoinHandle; - } - public void setOuterJoinHandle(T charger) { - setOuterJoin(toOuterJoin(charger)); - this.outerJoinHandle = charger; - } - public abstract List toOuterJoin(T charger) ; - - public T getLeftOuterJoinHandle() { - return leftOuterJoinHandle; - } - public void setLeftOuterJoinHandle(T charger) { - setLeftOuterJoin(toLeftOuterJoin(charger)); - this.leftOuterJoinHandle = charger; - } - public abstract List toLeftOuterJoin(T charger) ; - - public T getRightOuterJoinHandle() { - return rightOuterJoinHandle; - } - public void setRightOuterJoinHandle(T charger) { - setRightOuterJoin(toRightOuterJoin(charger)); - this.rightOuterJoinHandle = charger; - } - public abstract List toRightOuterJoin(T charger) ; - - public T getWhereHandle() { - return whereHandle; - } - public void setWhereHandle(T charger) { - setWhere(toWhere(charger)); - this.whereHandle = charger; - } - public abstract List toWhere(T charger) ; - - public T getHavingHandle() { - return havingHandle; - } - public void setHavingHandle(T charger) { - setHaving(toHaving(charger)); - this.havingHandle = charger; - } - public abstract List toHaving(T charger) ; - - public T getGroupByHandle() { - return groupByHandle; - } - public void setGroupByHandle(T charger) { - setGroupBy(toGroupBy(charger)); - this.groupByHandle = charger; - } - public abstract List toGroupBy(T charger) ; - - public T getOrderByHandle() { - return orderByHandle; - } - public void setOrderByHandle(T charger) { - - this.orderByHandle = charger; - } - public abstract List toOrderBy(T charger) ; - - public T getColumnsHandle() { - return columnsHandle; - } - public void setColumnsHandle(T charger) { - setColumns(toColumns(charger)); - this.columnsHandle = charger; - } - public abstract List toColumns(T charger) ; - - public T getLastListHandle() { - return lastListHandle; - } - public void setLastListHandle(T charger) { - setLastList(toLastList(charger)); - this.lastListHandle = charger; - } - public abstract List toLastList(T charger) ; - - public T getDistinctHandle() { - return distinctHandle; - } - public void setDistinctHandle(T charger) { - super.setDistinct(toDistinct(charger)); - this.distinctHandle = charger; - } - public abstract boolean toDistinct(T charger) ; - +public abstract class InterpreterProvider extends BaseProvider { + + @Getter + private T statementTypeHandle; + @Getter + private T setsHandle; + @Getter + private T selectHandle; + @Getter + private T tableHandle; + @Getter + private T joinHandle; + @Getter + private T innerJoinHandle; + @Getter + private T valuesHandle; + @Getter + private T outerJoinHandle; + @Getter + private T leftOuterJoinHandle; + @Getter + private T rightOuterJoinHandle; + @Getter + private T whereHandle; + @Getter + private T havingHandle; + @Getter + private T groupByHandle; + @Getter + private T orderByHandle; + @Getter + private T columnsHandle; + @Getter + private T lastListHandle; + @Getter + private T distinctHandle; + + public void setStatementTypeHandle(T statementTypeHandle) { + setStatementType(toSatementType(statementTypeHandle)); + this.statementTypeHandle = statementTypeHandle; + } + + public abstract StatementType toSatementType(T charger); + + public void setSetsHandle(T setsHandle) { + setSets(toSets(setsHandle)); + this.setsHandle = setsHandle; + } + + public abstract List toSets(T charger); + + public void setSelectHandle(T selectHandle) { + setSelect(toSelect(selectHandle)); + this.selectHandle = selectHandle; + } + + public abstract List toSelect(T charger); + + public void setTableHandle(T charger) { + setTables(toTables(charger)); + this.tableHandle = charger; + } + + public abstract List toTables(T charger); + + public void setJoinHandle(T charger) { + setJoin(toJoin(charger)); + this.joinHandle = charger; + } + + public abstract List toJoin(T charger); + + public void setInnerJoinHandle(T charger) { + setInnerJoin(toInnerJoin(charger)); + this.innerJoinHandle = charger; + } + + public abstract List toInnerJoin(T charger); + + public void setValuesHandle(T charger) { + setValues(toValues(charger)); + this.valuesHandle = charger; + } + + public abstract List toValues(T charger); + + public void setOuterJoinHandle(T charger) { + setOuterJoin(toOuterJoin(charger)); + this.outerJoinHandle = charger; + } + + public abstract List toOuterJoin(T charger); + + public void setLeftOuterJoinHandle(T charger) { + setLeftOuterJoin(toLeftOuterJoin(charger)); + this.leftOuterJoinHandle = charger; + } + + public abstract List toLeftOuterJoin(T charger); + + public void setRightOuterJoinHandle(T charger) { + setRightOuterJoin(toRightOuterJoin(charger)); + this.rightOuterJoinHandle = charger; + } + + public abstract List toRightOuterJoin(T charger); + + public void setWhereHandle(T charger) { + setWhere(toWhere(charger)); + this.whereHandle = charger; + } + + public abstract List toWhere(T charger); + + public void setHavingHandle(T charger) { + setHaving(toHaving(charger)); + this.havingHandle = charger; + } + + public abstract List toHaving(T charger); + + public void setGroupByHandle(T charger) { + setGroupBy(toGroupBy(charger)); + this.groupByHandle = charger; + } + + public abstract List toGroupBy(T charger); + + public void setOrderByHandle(T charger) { + + this.orderByHandle = charger; + } + + public abstract List toOrderBy(T charger); + + public void setColumnsHandle(T charger) { + setColumns(toColumns(charger)); + this.columnsHandle = charger; + } + + public abstract List toColumns(T charger); + + public void setLastListHandle(T charger) { + setLastList(toLastList(charger)); + this.lastListHandle = charger; + } + + public abstract List toLastList(T charger); + + public void setDistinctHandle(T charger) { + super.setDistinct(toDistinct(charger)); + this.distinctHandle = charger; + } + + public abstract boolean toDistinct(T charger); } diff --git a/src/main/java/zuo/biao/apijson/parser/Message.java b/src/main/java/zuo/biao/apijson/parser/Message.java index f381152..144f995 100644 --- a/src/main/java/zuo/biao/apijson/parser/Message.java +++ b/src/main/java/zuo/biao/apijson/parser/Message.java @@ -1,56 +1,43 @@ package zuo.biao.apijson.parser; +import com.google.common.collect.Lists; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + import java.util.ArrayList; import java.util.List; + /** * 消息通知类,通过这个类型把Provider的消息传递给SQLBuilder * 比如:当我们自定义操作遇到异常需要抛出异常的时候,往这个类里面塞StackTraceElement异常 - * 之后传到SQLBuilder中getSQL方法,统一抛出异常。 - * @author Zerounary + * 之后传到SQLBuilder中getSQL方法,统一抛出异常。 * + * @author Zerounary */ public class Message { - private List errors = new ArrayList<>(); - - public List getErrors() { - return errors; - } - - public void setErrors(List errors) { - this.errors = errors; - } - - public void error(String errorMsg, StackTraceElement stack) { - errors.add(new ErrorElement(errorMsg, stack)); - } - - public void cleanErrors() { - errors.clear(); - } - - public class ErrorElement { - private String errorMsg; - private StackTraceElement stack; - public ErrorElement() { - - } - public ErrorElement(String errorMsg, StackTraceElement stack) { - this.errorMsg = errorMsg; - this.stack = stack; - } - public String getErrorMsg() { - return errorMsg; - } - public void setErrorMsg(String errorMsg) { - this.errorMsg = errorMsg; - } - public StackTraceElement getStack() { - return stack; - } - public void setStack(StackTraceElement stack) { - this.stack = stack; - } - - } + + @Getter + @Setter + private List errors = Lists.newArrayList(); + + + public void error(String errorMsg, StackTraceElement stack) { + errors.add(new ErrorElement(errorMsg, stack)); + } + + public void cleanErrors() { + errors.clear(); + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public class ErrorElement { + private String errorMsg; + private StackTraceElement stack; + } } diff --git a/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java b/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java index e2b0a79..9eea0c8 100644 --- a/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java +++ b/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java @@ -1,218 +1,219 @@ package zuo.biao.apijson.parser; +import com.google.common.collect.Lists; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + import java.io.IOException; import java.util.ArrayList; import java.util.List; - +/** + * @author zhangls + */ public class SQLExplorer { - private static final String AND = ") \nAND ("; - private static final String OR = ") \nOR ("; - private SQLStatement sql = new SQLStatement(); - private SQLProvider sqlProvider; - public SQLExplorer(SQLProvider sqlProvider) { - this.sqlProvider = sqlProvider; - } - - public String getSQL() throws SQLProviderException { - feedSQLStatement(); - //异常处理 - if(!sqlProvider.getMessage().getErrors().isEmpty()) { - throw new SQLProviderException(sqlProvider.getMessage().getErrors()); - } - StringBuffer sb = new StringBuffer(); - sql.sql(sb); - return sb.toString(); - } - - /*** - * 将提供器提供的数据刷新到SQLStatement中 - */ - private void feedSQLStatement() { - sql = new SQLStatement(); - if(sqlProvider.getStatementType() == null) - return; - - sql.statementType = sqlProvider.getStatementType(); - sql.sets.addAll(ofNullable(sqlProvider.getSets())); - sql.select.addAll(ofNullable(sqlProvider.getSelect())); - sql.tables.addAll(ofNullable(sqlProvider.getTables())); - sql.join.addAll(ofNullable(sqlProvider.getJoin())); - sql.innerJoin.addAll(ofNullable(sqlProvider.getInnerJoin())); - sql.outerJoin.addAll(ofNullable(sqlProvider.getOuterJoin())); - sql.leftOuterJoin.addAll(ofNullable(sqlProvider.getLeftOuterJoin())); - sql.rightOuterJoin.addAll(ofNullable(sqlProvider.getRightOuterJoin())); - sql.where.addAll(ofNullable(sqlProvider.getWhere())); - sql.having.addAll(ofNullable(sqlProvider.getHaving())); - sql.groupBy.addAll(ofNullable(sqlProvider.getGroupBy())); - sql.orderBy.addAll(ofNullable(sqlProvider.getOrderBy())); - sql.lastList.addAll(ofNullable(sqlProvider.getLastList())); - sql.columns.addAll(ofNullable(sqlProvider.getColumns())); - sql.values.addAll(ofNullable(sqlProvider.getValues())); - } - - public SQLProvider getSqlProvider() { - return sqlProvider; - } - - public void setSqlProvider(SQLProvider sqlProvider) { - this.sqlProvider = sqlProvider; - } - - private List ofNullable(List list){ - if(list == null) - return new ArrayList(); - return list; - } - - private static class SafeAppendable { - private final Appendable a; - private boolean empty = true; - - public SafeAppendable(Appendable a) { - super(); - this.a = a; - } - - public SafeAppendable append(CharSequence s) { - try { - if (empty && s.length() > 0) { - empty = false; - } - a.append(s); - } catch (IOException e) { - throw new RuntimeException(e); - } - return this; - } - - public boolean isEmpty() { - return empty; - } - - } - - private static class SQLStatement { - - private StatementType statementType; - private List sets = new ArrayList(); - private List select = new ArrayList(); - private List tables = new ArrayList(); - private List join = new ArrayList(); - private List innerJoin = new ArrayList(); - private List outerJoin = new ArrayList(); - private List leftOuterJoin = new ArrayList(); - private List rightOuterJoin = new ArrayList(); - private List where = new ArrayList(); - private List having = new ArrayList(); - private List groupBy = new ArrayList(); - private List orderBy = new ArrayList(); - private List lastList = new ArrayList(); - private List columns = new ArrayList(); - private List values = new ArrayList(); - private boolean distinct; - - public SQLStatement() { - // Prevent Synthetic Access - } - - private void sqlClause(SafeAppendable builder, String keyword, List parts, String open, String close, - String conjunction) { - if (!parts.isEmpty()) { - if (!builder.isEmpty()) { - builder.append("\n"); - } - builder.append(keyword); - builder.append(" "); - builder.append(open); - String last = "________"; - for (int i = 0, n = parts.size(); i < n; i++) { - String part = parts.get(i); - if (i > 0 && !part.equals(AND) && !part.equals(OR) && !last.equals(AND) && !last.equals(OR)) { - builder.append(conjunction); - } - builder.append(part); - last = part; - } - builder.append(close); - } - } - - private String selectSQL(SafeAppendable builder) { - if (distinct) { - sqlClause(builder, "SELECT DISTINCT", select, "", "", ", "); - } else { - sqlClause(builder, "SELECT", select, "", "", ", "); - } - - sqlClause(builder, "FROM", tables, "", "", ", "); - joins(builder); - sqlClause(builder, "WHERE", where, "(", ")", " AND "); - sqlClause(builder, "GROUP BY", groupBy, "", "", ", "); - sqlClause(builder, "HAVING", having, "(", ")", " AND "); - sqlClause(builder, "ORDER BY", orderBy, "", "", ", "); - return builder.toString(); - } - - private void joins(SafeAppendable builder) { - sqlClause(builder, "JOIN", join, "", "", "\nJOIN "); - sqlClause(builder, "INNER JOIN", innerJoin, "", "", "\nINNER JOIN "); - sqlClause(builder, "OUTER JOIN", outerJoin, "", "", "\nOUTER JOIN "); - sqlClause(builder, "LEFT OUTER JOIN", leftOuterJoin, "", "", "\nLEFT OUTER JOIN "); - sqlClause(builder, "RIGHT OUTER JOIN", rightOuterJoin, "", "", "\nRIGHT OUTER JOIN "); - } - - private String insertSQL(SafeAppendable builder) { - sqlClause(builder, "INSERT INTO", tables, "", "", ""); - sqlClause(builder, "", columns, "(", ")", ", "); - sqlClause(builder, "VALUES", values, "(", ")", ", "); - return builder.toString(); - } - - private String deleteSQL(SafeAppendable builder) { - sqlClause(builder, "DELETE FROM", tables, "", "", ""); - sqlClause(builder, "WHERE", where, "(", ")", " AND "); - return builder.toString(); - } - - private String updateSQL(SafeAppendable builder) { - sqlClause(builder, "UPDATE", tables, "", "", ""); - joins(builder); - sqlClause(builder, "SET", sets, "", "", ", "); - sqlClause(builder, "WHERE", where, "(", ")", " AND "); - return builder.toString(); - } - - public String sql(Appendable a) { - SafeAppendable builder = new SafeAppendable(a); - if (statementType == null) { - return null; - } - - String answer; - - switch (statementType) { - case DELETE: - answer = deleteSQL(builder); - break; - - case INSERT: - answer = insertSQL(builder); - break; - - case SELECT: - answer = selectSQL(builder); - break; - - case UPDATE: - answer = updateSQL(builder); - break; - - default: - answer = null; - } - - return answer; - } - } + private static final String AND = ") \nAND ("; + private static final String OR = ") \nOR ("; + private SQLStatement sql = new SQLStatement(); + + @Getter + @Setter + private SQLProvider sqlProvider; + + public SQLExplorer(SQLProvider sqlProvider) { + this.sqlProvider = sqlProvider; + } + + public String getSQL() throws SQLProviderException { + feedSQLStatement(); + //异常处理 + if (!sqlProvider.getMessage().getErrors().isEmpty()) { + throw new SQLProviderException(sqlProvider.getMessage().getErrors()); + } + StringBuffer sb = new StringBuffer(); + sql.sql(sb); + return sb.toString(); + } + + /** + * 将提供器提供的数据刷新到SQLStatement中 + */ + private void feedSQLStatement() { + sql = new SQLStatement(); + if (sqlProvider.getStatementType() == null) { + return; + } + + sql.statementType = sqlProvider.getStatementType(); + sql.sets.addAll(ofNullable(sqlProvider.getSets())); + sql.select.addAll(ofNullable(sqlProvider.getSelect())); + sql.tables.addAll(ofNullable(sqlProvider.getTables())); + sql.join.addAll(ofNullable(sqlProvider.getJoin())); + sql.innerJoin.addAll(ofNullable(sqlProvider.getInnerJoin())); + sql.outerJoin.addAll(ofNullable(sqlProvider.getOuterJoin())); + sql.leftOuterJoin.addAll(ofNullable(sqlProvider.getLeftOuterJoin())); + sql.rightOuterJoin.addAll(ofNullable(sqlProvider.getRightOuterJoin())); + sql.where.addAll(ofNullable(sqlProvider.getWhere())); + sql.having.addAll(ofNullable(sqlProvider.getHaving())); + sql.groupBy.addAll(ofNullable(sqlProvider.getGroupBy())); + sql.orderBy.addAll(ofNullable(sqlProvider.getOrderBy())); + sql.lastList.addAll(ofNullable(sqlProvider.getLastList())); + sql.columns.addAll(ofNullable(sqlProvider.getColumns())); + sql.values.addAll(ofNullable(sqlProvider.getValues())); + } + + private List ofNullable(List list) { + if (list == null) { + return Lists.newArrayList(); + } + return list; + } + + private static class SafeAppendable { + private final Appendable a; + private boolean empty = true; + + public SafeAppendable(Appendable a) { + super(); + this.a = a; + } + + public SafeAppendable append(CharSequence s) { + try { + if (empty && s.length() > 0) { + empty = false; + } + a.append(s); + } catch (IOException e) { + throw new RuntimeException(e); + } + return this; + } + + public boolean isEmpty() { + return empty; + } + + } + + @NoArgsConstructor + private static class SQLStatement { + + private StatementType statementType; + private List sets = Lists.newArrayList(); + private List select = Lists.newArrayList(); + private List tables = Lists.newArrayList(); + private List join = Lists.newArrayList(); + private List innerJoin = Lists.newArrayList(); + private List outerJoin = Lists.newArrayList(); + private List leftOuterJoin = Lists.newArrayList(); + private List rightOuterJoin = Lists.newArrayList(); + private List where = Lists.newArrayList(); + private List having = Lists.newArrayList(); + private List groupBy = Lists.newArrayList(); + private List orderBy = Lists.newArrayList(); + private List lastList = Lists.newArrayList(); + private List columns = Lists.newArrayList(); + private List values = Lists.newArrayList(); + private boolean distinct; + + private void sqlClause(SafeAppendable builder, String keyword, List parts, String open, String close, String conjunction) { + if (!parts.isEmpty()) { + if (!builder.isEmpty()) { + builder.append("\n"); + } + builder.append(keyword); + builder.append(" "); + builder.append(open); + String last = "________"; + for (int i = 0, n = parts.size(); i < n; i++) { + String part = parts.get(i); + if (i > 0 && !part.equals(AND) && !part.equals(OR) && !last.equals(AND) && !last.equals(OR)) { + builder.append(conjunction); + } + builder.append(part); + last = part; + } + builder.append(close); + } + } + + private String selectSQL(SafeAppendable builder) { + if (distinct) { + sqlClause(builder, "SELECT DISTINCT", select, "", "", ", "); + } else { + sqlClause(builder, "SELECT", select, "", "", ", "); + } + + sqlClause(builder, "FROM", tables, "", "", ", "); + joins(builder); + sqlClause(builder, "WHERE", where, "(", ")", " AND "); + sqlClause(builder, "GROUP BY", groupBy, "", "", ", "); + sqlClause(builder, "HAVING", having, "(", ")", " AND "); + sqlClause(builder, "ORDER BY", orderBy, "", "", ", "); + return builder.toString(); + } + + private void joins(SafeAppendable builder) { + sqlClause(builder, "JOIN", join, "", "", "\nJOIN "); + sqlClause(builder, "INNER JOIN", innerJoin, "", "", "\nINNER JOIN "); + sqlClause(builder, "OUTER JOIN", outerJoin, "", "", "\nOUTER JOIN "); + sqlClause(builder, "LEFT OUTER JOIN", leftOuterJoin, "", "", "\nLEFT OUTER JOIN "); + sqlClause(builder, "RIGHT OUTER JOIN", rightOuterJoin, "", "", "\nRIGHT OUTER JOIN "); + } + + private String insertSQL(SafeAppendable builder) { + sqlClause(builder, "INSERT INTO", tables, "", "", ""); + sqlClause(builder, "", columns, "(", ")", ", "); + sqlClause(builder, "VALUES", values, "(", ")", ", "); + return builder.toString(); + } + + private String deleteSQL(SafeAppendable builder) { + sqlClause(builder, "DELETE FROM", tables, "", "", ""); + sqlClause(builder, "WHERE", where, "(", ")", " AND "); + return builder.toString(); + } + + private String updateSQL(SafeAppendable builder) { + sqlClause(builder, "UPDATE", tables, "", "", ""); + joins(builder); + sqlClause(builder, "SET", sets, "", "", ", "); + sqlClause(builder, "WHERE", where, "(", ")", " AND "); + return builder.toString(); + } + + public String sql(Appendable a) { + SafeAppendable builder = new SafeAppendable(a); + if (statementType == null) { + return null; + } + + String answer; + + switch (statementType) { + case DELETE: + answer = deleteSQL(builder); + break; + + case INSERT: + answer = insertSQL(builder); + break; + + case SELECT: + answer = selectSQL(builder); + break; + + case UPDATE: + answer = updateSQL(builder); + break; + + default: + answer = null; + } + + return answer; + } + } } diff --git a/src/main/java/zuo/biao/apijson/parser/SQLProvider.java b/src/main/java/zuo/biao/apijson/parser/SQLProvider.java index 7dbfa2a..944a8ec 100644 --- a/src/main/java/zuo/biao/apijson/parser/SQLProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/SQLProvider.java @@ -1,77 +1,106 @@ package zuo.biao.apijson.parser; import java.util.List; + /** * 实现这个接口提供SQLBuilder获取构造SQL语句所需要的数据 - * @author Zerounary * + * @author Zerounary */ public interface SQLProvider { - /** - * 消息类,如果Provider中有异常,通过这个方法可以传递消息 - * @return - */ - public Message getMessage(); - /** - * StatementType表示要生成的是SELECT,INSERT,UPDATE,DLEETE中的哪种 - * @return StatementType - */ - public StatementType getStatementType(); - /** - * StatementType为UPDATE时 - * UPDATE要更新的字段 - * @return List - */ - public List getSets() ; - /** - * StatementType为SELECT时 - * SELECT要查询的字段 - * @return List - */ - public List getSelect() ; - /** - * StatementType所有类型都将使用这个方法 - * SQL所涉及的表 - * @return - */ - public List getTables(); - public List getJoin(); - public List getInnerJoin() ; - public List getOuterJoin() ; - public List getLeftOuterJoin() ; - public List getRightOuterJoin() ; - /** - * SQL过滤条件 - * @return - */ - public List getWhere(); - public List getHaving(); - /** - * StatementType为SELECT时 - * SQL查询时的分组 - * @return - */ - public List getGroupBy() ; - /** - * StatementType为SELECT时 - * SQL查询时的排序 - * @return - */ - public List getOrderBy() ; - public List getLastList() ; - /** - * StatementType为INSERT时 - * SQL新增的字段 - * @return - */ - public List getColumns() ; - /** - * StatementType为INSERT时 - * SQL新增字段所对应的值 - * @return - */ - public List getValues() ; - public boolean isDistinct() ; - - + + /** + * 消息类,如果Provider中有异常,通过这个方法可以传递消息 + * + * @return + */ + public Message getMessage(); + + /** + * StatementType表示要生成的是SELECT,INSERT,UPDATE,DLEETE中的哪种 + * + * @return StatementType + */ + public StatementType getStatementType(); + + /** + * StatementType为UPDATE时 + * UPDATE要更新的字段 + * + * @return List + */ + public List getSets(); + + /** + * StatementType为SELECT时 + * SELECT要查询的字段 + * + * @return List + */ + public List getSelect(); + + /** + * StatementType所有类型都将使用这个方法 + * SQL所涉及的表 + * + * @return + */ + public List getTables(); + + public List getJoin(); + + public List getInnerJoin(); + + public List getOuterJoin(); + + public List getLeftOuterJoin(); + + public List getRightOuterJoin(); + + /** + * SQL过滤条件 + * + * @return + */ + public List getWhere(); + + public List getHaving(); + + /** + * StatementType为SELECT时 + * SQL查询时的分组 + * + * @return + */ + public List getGroupBy(); + + /** + * StatementType为SELECT时 + * SQL查询时的排序 + * + * @return + */ + public List getOrderBy(); + + public List getLastList(); + + /** + * StatementType为INSERT时 + * SQL新增的字段 + * + * @return + */ + public List getColumns(); + + /** + * StatementType为INSERT时 + * SQL新增字段所对应的值 + * + * @return + */ + public List getValues(); + + public boolean isDistinct(); + + } diff --git a/src/main/java/zuo/biao/apijson/parser/SQLProviderException.java b/src/main/java/zuo/biao/apijson/parser/SQLProviderException.java index 12c826e..8fa0f71 100644 --- a/src/main/java/zuo/biao/apijson/parser/SQLProviderException.java +++ b/src/main/java/zuo/biao/apijson/parser/SQLProviderException.java @@ -1,53 +1,49 @@ package zuo.biao.apijson.parser; -import java.util.ArrayList; -import java.util.HashSet; + import java.util.List; import java.util.Set; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import zuo.biao.apijson.parser.Message.ErrorElement; - +/** + * @author zhangls + */ +@NoArgsConstructor public class SQLProviderException extends Exception { - - private List errors; - private Set errorMsgs = new HashSet<>(); - - public SQLProviderException() { - - } - public SQLProviderException(String message) { - super(message); - } - public SQLProviderException(Throwable cause) { - super(cause); - } - public SQLProviderException(List errors) { - List stackTrace = new ArrayList<>(); - StringBuffer sb = new StringBuffer(); - for(int i = 0; i < errors.size(); i++) { - errorMsgs.add(errors.get(i).getErrorMsg() + Utils.NEW_LINE); - sb.append( i + ".Error message: ----> " + errors.get(i).getErrorMsg() + Utils.NEW_LINE); - stackTrace.add(errors.get(i).getStack()); - } - System.err.print(sb.toString()); - StackTraceElement[] stack = new StackTraceElement[stackTrace.size()]; - super.setStackTrace(stackTrace.toArray(stack)); - this.errors = errors; - } - - public List getErrors() { - return errors; - } - public void setErrors(List errors) { - this.errors = errors; - } - public Set getErrorMsgs() { - return errorMsgs; - } - public void setErrorMsgs(Set errorMsgs) { - this.errorMsgs = errorMsgs; - } - - + + @Getter + @Setter + private List errors; + @Getter + @Setter + private Set errorMsgs = Sets.newHashSet(); + + + public SQLProviderException(String message) { + super(message); + } + + public SQLProviderException(Throwable cause) { + super(cause); + } + + public SQLProviderException(List errors) { + List stackTrace = Lists.newArrayList(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < errors.size(); i++) { + errorMsgs.add(errors.get(i).getErrorMsg() + Utils.NEW_LINE); + sb.append(i + ".Error message: ----> " + errors.get(i).getErrorMsg() + Utils.NEW_LINE); + stackTrace.add(errors.get(i).getStack()); + } + System.err.print(sb.toString()); + StackTraceElement[] stack = new StackTraceElement[stackTrace.size()]; + super.setStackTrace(stackTrace.toArray(stack)); + this.errors = errors; + } } diff --git a/src/test/java/zuo/biao/apijson/parser/AppTest.java b/src/test/java/zuo/biao/apijson/parser/AppTest.java deleted file mode 100644 index 6cc93e4..0000000 --- a/src/test/java/zuo/biao/apijson/parser/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package zuo.biao.apijson.parser; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/src/test/java/zuo/biao/apijson/parser/TestCase.java b/src/test/java/zuo/biao/apijson/parser/TestCase.java new file mode 100644 index 0000000..110b3a2 --- /dev/null +++ b/src/test/java/zuo/biao/apijson/parser/TestCase.java @@ -0,0 +1,74 @@ +package zuo.biao.apijson.parser; + +import java.util.Arrays; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; + +/** + * Created by zhangls on 2019/1/7. + */ +public class TestCase { + + public static void main(String[] args) { + /* of */ + //调用工厂方法创建Optional实例 + Optional name = Optional.of("YanWei"); + //传入参数为null,抛出NullPointerException. + //Optional someNull = Optional.of(null); + +/*opNullable*/ + Optional empty = Optional.ofNullable(null); + +/*isPresent*/ + if (name.isPresent()) { + System.out.println(name.get());//输出YanWei + } + +/*get*/ + try { + System.out.println(empty.get()); + } catch (NoSuchElementException ex) { + System.err.println(ex.getMessage()); + } + +/*ifPresent*/ + name.ifPresent((value) -> { + System.out.println("The length of the value is: " + value.length()); + }); + + empty.ifPresent((value) -> { + System.out.println("The length of the value is: " + value.toString()); + }); + +/*orElse*/ + System.out.println(empty.orElse("There is no value present!")); + System.out.println(name.orElse("There is some value!")); + +/*orElseGet*/ + System.out.println(empty.orElseGet(() -> "Default Value")); + System.out.println(name.orElseGet(String::new)); + +/*orElseThrow*/ + try { + empty.orElseThrow(IllegalArgumentException::new); + } catch (Throwable ex) { + System.out.println("error:" + ex.getMessage()); + } + +/*map*/ + Optional upperName = name.map((value) -> value.toUpperCase()); + System.out.println(upperName.orElse("No value found")); + +/*flatMap*/ + upperName = name.flatMap((value) -> Optional.of(value.toUpperCase())); + System.out.println(upperName.get()); + +/*filter*/ + List names = Arrays.asList("YanWei", "YanTian"); + for (String s : names) { + Optional nameLenLessThan7 = Optional.of(s).filter((value) -> value.length() < 7); + System.out.println(nameLenLessThan7.orElse("The name is more than 6 characters")); + } + } +} diff --git a/target/classes/META-INF/MANIFEST.MF b/target/classes/META-INF/MANIFEST.MF deleted file mode 100644 index 77c881a..0000000 --- a/target/classes/META-INF/MANIFEST.MF +++ /dev/null @@ -1,5 +0,0 @@ -Manifest-Version: 1.0 -Built-By: Zerounary -Build-Jdk: 1.8.0_144 -Created-By: Maven Integration for Eclipse - diff --git a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties b/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties deleted file mode 100644 index b28d1ab..0000000 --- a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties +++ /dev/null @@ -1,7 +0,0 @@ -#Generated by Maven Integration for Eclipse -#Tue Dec 25 10:09:51 CST 2018 -version=0.0.1-SNAPSHOT -groupId=APIJSONParser -m2e.projectName=APIJSONParser -m2e.projectLocation=D\:\\Programing software\\eclipse_workspaces\\works\\APIJSONParser -artifactId=APIJSONParser diff --git a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml b/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml deleted file mode 100644 index e6ffde5..0000000 --- a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - 4.0.0 - - APIJSONParser - APIJSONParser - 0.0.1-SNAPSHOT - jar - - APIJSONParser - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 3.8.1 - test - - - com.alibaba - fastjson - 1.2.21 - - - diff --git a/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class b/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class deleted file mode 100644 index 6345296..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/AbstractProvider.class b/target/classes/zuo/biao/apijson/parser/AbstractProvider.class deleted file mode 100644 index 52e084a..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/AbstractProvider.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/App.class b/target/classes/zuo/biao/apijson/parser/App.class deleted file mode 100644 index 64ddeda..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/App.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/BaseProvider.class b/target/classes/zuo/biao/apijson/parser/BaseProvider.class deleted file mode 100644 index 62aaeec..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/BaseProvider.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/InterpreterProvider.class b/target/classes/zuo/biao/apijson/parser/InterpreterProvider.class deleted file mode 100644 index bef21b4..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/InterpreterProvider.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/Message$ErrorElement.class b/target/classes/zuo/biao/apijson/parser/Message$ErrorElement.class deleted file mode 100644 index 41de4f5..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/Message$ErrorElement.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/Message.class b/target/classes/zuo/biao/apijson/parser/Message.class deleted file mode 100644 index 85772d8..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/Message.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/SQLExplorer$SQLStatement.class b/target/classes/zuo/biao/apijson/parser/SQLExplorer$SQLStatement.class deleted file mode 100644 index 7b035da..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/SQLExplorer$SQLStatement.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/SQLExplorer$SafeAppendable.class b/target/classes/zuo/biao/apijson/parser/SQLExplorer$SafeAppendable.class deleted file mode 100644 index 2f0fc2a..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/SQLExplorer$SafeAppendable.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/SQLExplorer.class b/target/classes/zuo/biao/apijson/parser/SQLExplorer.class deleted file mode 100644 index f8b489d..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/SQLExplorer.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/SQLProvider.class b/target/classes/zuo/biao/apijson/parser/SQLProvider.class deleted file mode 100644 index b3896d4..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/SQLProvider.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/SQLProviderException.class b/target/classes/zuo/biao/apijson/parser/SQLProviderException.class deleted file mode 100644 index 1b17e7b..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/SQLProviderException.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/StatementType.class b/target/classes/zuo/biao/apijson/parser/StatementType.class deleted file mode 100644 index 23f9938..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/StatementType.class and /dev/null differ diff --git a/target/classes/zuo/biao/apijson/parser/Utils.class b/target/classes/zuo/biao/apijson/parser/Utils.class deleted file mode 100644 index e3a7ae8..0000000 Binary files a/target/classes/zuo/biao/apijson/parser/Utils.class and /dev/null differ diff --git a/target/test-classes/zuo/biao/apijson/parser/AppTest.class b/target/test-classes/zuo/biao/apijson/parser/AppTest.class deleted file mode 100644 index 894a6a4..0000000 Binary files a/target/test-classes/zuo/biao/apijson/parser/AppTest.class and /dev/null differ