Explorar o código

动态java 类开发中

wuxw %!s(int64=6) %!d(string=hai) anos
pai
achega
9c914bf821

+ 16 - 0
java110-core/src/main/java/com/java110/core/javassist/IJavassist.java

@@ -0,0 +1,16 @@
+package com.java110.core.javassist;
+
+import com.java110.entity.service.DataQuery;
+
+/**
+ * @ClassName IJavassist
+ * @Description TODO
+ * @Author wuxw
+ * @Date 2019/9/4 23:08
+ * @Version 1.0
+ * add by wuxw 2019/9/4
+ **/
+public interface IJavassist {
+
+    public void execute(DataQuery dataQuery);
+}

+ 12 - 0
java110-core/src/main/java/com/java110/core/javassist/Java110CoreTemplateJavassist.java

@@ -0,0 +1,12 @@
+package com.java110.core.javassist;
+
+/**
+ * @ClassName CoreTemplateJavassist
+ * @Description TODO
+ * @Author wuxw
+ * @Date 2019/9/4 23:11
+ * @Version 1.0
+ * add by wuxw 2019/9/4
+ **/
+public class Java110CoreTemplateJavassist {
+}

+ 4 - 0
java110-service/pom.xml

@@ -42,6 +42,10 @@
             <groupId>org.beanshell</groupId>
             <artifactId>bsh-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.javassist</groupId>
+            <artifactId>javassist</artifactId>
+        </dependency>
 
 
         <!--<dependency>

+ 50 - 11
java110-service/src/main/java/com/java110/service/smo/impl/QueryServiceSMOImpl.java

@@ -16,7 +16,13 @@ import com.java110.entity.service.DataQuery;
 import com.java110.entity.service.ServiceSql;
 import com.java110.service.dao.IQueryServiceDAO;
 import com.java110.service.smo.IQueryServiceSMO;
+import javassist.ClassPool;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.ognl.Ognl;
+import org.apache.ibatis.ognl.OgnlException;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -186,11 +192,14 @@ public class QueryServiceSMOImpl extends LoggerEngine implements IQueryServiceSM
                 param = param.substring(0, param.length() - 1);
             }*/
 
+
+
+
             dataQuery.setResponseInfo(DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS,
                     "成功", JSONObject.parseObject(interpreter.eval("execute(" + dataQuery + ")").toString())));
         } catch (Exception e) {
             logger.error("数据交互异常:", e);
-            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "数据交互异常,"+e.getMessage());
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "数据交互异常," + e.getMessage());
         }
     }
 
@@ -252,7 +261,7 @@ public class QueryServiceSMOImpl extends LoggerEngine implements IQueryServiceSM
 
             String currentSql = sqlObj.getString(dataQuery.getTemplateKey());
             //处理 if 判断
-            currentSql = dealSqlIf(currentSql);
+            currentSql = dealSqlIf(currentSql, params);
 
             String[] sqls = currentSql.split("#");
             String currentSqlNew = "";
@@ -325,22 +334,52 @@ public class QueryServiceSMOImpl extends LoggerEngine implements IQueryServiceSM
 
     /**
      * 处理SQL语句
-     * @param oldSql
-     *              select * from s_a a
-     *              where if(name != null && name != ''){
-             *                  a.name = #name#
-             *             }
+     *
+     * @param oldSql select * from s_a a
+     *               where <if test="name != null && name != ''">
+     *               a.name = #name#
+     *               </if>
      * @return
      */
-    private String dealSqlIf(String oldSql){
-        String newSql = "";
+    public String dealSqlIf(String oldSql, JSONObject requestParams) throws DocumentException, OgnlException {
+        StringBuffer newSql = new StringBuffer();
+        String tmpSql = "";
+        Boolean conditionResult = false;
         // 未包含 条件语句
-        if(!oldSql.replace(" ","").contains("if(")){
+        if (!oldSql.contains("<if")) {
             return oldSql;
         }
 
+        String[] oSqls = oldSql.split("</if>");
+        for (String oSql : oSqls) {
+            if (!oSql.startsWith("<if")) {
+                newSql.append(oSql.substring(0, oSql.indexOf("<if")));
+            }
+
+            tmpSql = oSql.substring(oSql.indexOf("<if")) + "</if>";
+
+            Element root = DocumentHelper.parseText(tmpSql).getRootElement();
+
+            String condition = root.attribute("test").getValue();
+
+            Object condObj = Ognl.parseExpression(condition);
+
+            Object value = Ognl.getValue(condObj, requestParams);
+
+            if (value instanceof Boolean) {
+                conditionResult = (Boolean) value;
+            } else {
+                throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, "配置错误,if语句配置错误 " + condition);
+            }
+
+            if (conditionResult) {
+                newSql.append(root.getText());
+            }
+
+        }
+
 
-        return newSql;
+        return newSql.toString();
 
     }
 

+ 25 - 0
java110-service/src/test/java/com/java110/service/InterpreterTest.java

@@ -1,9 +1,16 @@
 package com.java110.service;
 
 import bsh.Interpreter;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.service.smo.impl.QueryServiceSMOImpl;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
+import org.apache.ibatis.ognl.OgnlException;
+import org.dom4j.DocumentException;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * Created by wuxw on 2018/4/23.
@@ -45,4 +52,22 @@ public class InterpreterTest extends TestCase {
         String param = "9,4";
         System.out.println(interpreter.eval("execute("+param+")").toString());
     }
+
+
+    public void testDealSqlIf() throws OgnlException, DocumentException {
+
+        String oldSql = "select * from s_a a\n" +
+                "                  where <if test=\"name != null and name != ''\">\n" +
+                "                          a.name = #name#\n" +
+                "                      </if>" +
+                "                       and a.sex = #name#" +
+                "                       <if test=\"id != null and id!= ''\"> and a.id = #id# </if>";
+
+        QueryServiceSMOImpl queryServiceSMO = new QueryServiceSMOImpl();
+        JSONObject params = new JSONObject();
+        params.put("id","123213");
+        params.put("name","123213");
+
+        System.out.println((queryServiceSMO.dealSqlIf(oldSql, params)));
+    }
 }

+ 36 - 0
java110-service/src/test/java/com/java110/service/smo/impl/QueryServiceSMOImplTest.java

@@ -0,0 +1,36 @@
+package com.java110.service.smo.impl;
+
+
+import javassist.CannotCompileException;
+import javassist.ClassClassPath;
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.CtMethod;
+import javassist.CtNewMethod;
+import junit.framework.TestCase;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public class QueryServiceSMOImplTest extends TestCase {
+
+
+    public void testJava() throws CannotCompileException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+        String javaCode = "public static void testJava2() {        System.out.println(\"123213\");\n}\n";
+                String    javaCode2 ="public static void testJava1() {     testJava2();   System.out.println(\"223213\");\n}";
+        ClassPool classPool = ClassPool.getDefault();
+        CtClass ctClass = classPool.makeClass("com.java110.service.smo.WuxwTest");
+        CtMethod helloM = CtNewMethod.make(javaCode, ctClass);
+        ctClass.addMethod(helloM);
+
+        CtMethod helloM1 = CtNewMethod.make(javaCode2, ctClass);
+        ctClass.addMethod(helloM1);
+        Class pc=ctClass.toClass();
+        Method move= pc.getMethod("testJava1",new Class[]{});
+
+        Constructor<?> con=pc.getConstructor(new Class[]{});
+
+        move.invoke(con);
+    }
+}

+ 7 - 0
pom.xml

@@ -398,6 +398,13 @@
                 <version>2.0b4</version>
             </dependency>
 
+            <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
+            <dependency>
+                <groupId>org.javassist</groupId>
+                <artifactId>javassist</artifactId>
+                <version>3.25.0-GA</version>
+            </dependency>
+
 
             <dependency>
                 <groupId>org.apache.zookeeper</groupId>