From d092f2f09955673f42560a85aebecbc0907d3dec Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Sat, 30 Jan 2021 21:31:00 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90groovy=E3=80=91=E5=A2=9E=E5=8A=A0groov?= =?UTF-8?q?y=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel-d-groovy/README.md | 3 ++ kernel-d-groovy/groovy-api/README.md | 1 + kernel-d-groovy/groovy-api/pom.xml | 22 +++++++++ .../roses/kernel/groovy/api/GroovyApi.java | 41 +++++++++++++++++ .../groovy/api/constants/GroovyConstants.java | 21 +++++++++ .../groovy/api/exception/GroovyException.java | 23 ++++++++++ .../exception/enums/GroovyExceptionEnum.java | 37 +++++++++++++++ kernel-d-groovy/groovy-sdk/README.md | 1 + kernel-d-groovy/groovy-sdk/pom.xml | 35 ++++++++++++++ .../roses/kernel/groovy/GroovyOperator.java | 46 +++++++++++++++++++ .../groovy-spring-boot-starter/README.md | 1 + .../groovy-spring-boot-starter/pom.xml | 29 ++++++++++++ .../starter/GunsGroovyAutoConfiguration.java | 30 ++++++++++++ .../main/resources/META-INF/spring.factories | 2 + kernel-d-groovy/pom.xml | 35 ++++++++++++++ pom.xml | 12 +++++ 16 files changed, 339 insertions(+) create mode 100644 kernel-d-groovy/README.md create mode 100644 kernel-d-groovy/groovy-api/README.md create mode 100644 kernel-d-groovy/groovy-api/pom.xml create mode 100644 kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/GroovyApi.java create mode 100644 kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/constants/GroovyConstants.java create mode 100644 kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/exception/GroovyException.java create mode 100644 kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/exception/enums/GroovyExceptionEnum.java create mode 100644 kernel-d-groovy/groovy-sdk/README.md create mode 100644 kernel-d-groovy/groovy-sdk/pom.xml create mode 100644 kernel-d-groovy/groovy-sdk/src/main/java/cn/stylefeng/roses/kernel/groovy/GroovyOperator.java create mode 100644 kernel-d-groovy/groovy-spring-boot-starter/README.md create mode 100644 kernel-d-groovy/groovy-spring-boot-starter/pom.xml create mode 100644 kernel-d-groovy/groovy-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/groovy/starter/GunsGroovyAutoConfiguration.java create mode 100644 kernel-d-groovy/groovy-spring-boot-starter/src/main/resources/META-INF/spring.factories create mode 100644 kernel-d-groovy/pom.xml diff --git a/kernel-d-groovy/README.md b/kernel-d-groovy/README.md new file mode 100644 index 000000000..e3e5b2f2d --- /dev/null +++ b/kernel-d-groovy/README.md @@ -0,0 +1,3 @@ +# groovy模块 + +动态执行java代码 \ No newline at end of file diff --git a/kernel-d-groovy/groovy-api/README.md b/kernel-d-groovy/groovy-api/README.md new file mode 100644 index 000000000..f080c585d --- /dev/null +++ b/kernel-d-groovy/groovy-api/README.md @@ -0,0 +1 @@ +groovy的api模块 \ No newline at end of file diff --git a/kernel-d-groovy/groovy-api/pom.xml b/kernel-d-groovy/groovy-api/pom.xml new file mode 100644 index 000000000..ba56eaa94 --- /dev/null +++ b/kernel-d-groovy/groovy-api/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + + cn.stylefeng.roses + kernel-d-groovy + 1.0.0 + ../pom.xml + + + groovy-api + + jar + + + + + + diff --git a/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/GroovyApi.java b/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/GroovyApi.java new file mode 100644 index 000000000..0fa958001 --- /dev/null +++ b/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/GroovyApi.java @@ -0,0 +1,41 @@ +package cn.stylefeng.roses.kernel.groovy.api; + +/** + * groovy动态脚本操作api + * + * @author fengshuonan + * @date 2021/1/22 16:29 + */ +public interface GroovyApi { + + /** + * 将文本形式的java类转换成class对象 + * + * @param javaClassCode java类的文本信息 + * @author fengshuonan + * @date 2021/1/22 16:30 + */ + Class textToClass(String javaClassCode); + + /** + * 执行java语句 + * + * @param javaCode java语句的文本信息 + * @author fengshuonan + * @date 2021/1/22 16:31 + */ + Object executeShell(String javaCode); + + /** + * 将java类代码转换成class,并执行某个方法 + * + * @param javaClassCode java类的代码 + * @param method java类中某个方法名 + * @param parameterTypes 参数类型集合 + * @param args 参数的具体对象 + * @author fengshuonan + * @date 2021/1/22 16:31 + */ + Object executeClassMethod(String javaClassCode, String method, Class[] parameterTypes, Object[] args); + +} diff --git a/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/constants/GroovyConstants.java b/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/constants/GroovyConstants.java new file mode 100644 index 000000000..4a185a698 --- /dev/null +++ b/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/constants/GroovyConstants.java @@ -0,0 +1,21 @@ +package cn.stylefeng.roses.kernel.groovy.api.constants; + +/** + * groovy常量 + * + * @author fengshuonan + * @date 2021/1/22 16:38 + */ +public interface GroovyConstants { + + /** + * groovy模块的名称 + */ + String GROOVY_MODULE_NAME = "kernel-d-groovy"; + + /** + * 异常枚举的步进值 + */ + String GROOVY_EXCEPTION_STEP_CODE = "26"; + +} diff --git a/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/exception/GroovyException.java b/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/exception/GroovyException.java new file mode 100644 index 000000000..ecd2cb17e --- /dev/null +++ b/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/exception/GroovyException.java @@ -0,0 +1,23 @@ +package cn.stylefeng.roses.kernel.groovy.api.exception; + +import cn.stylefeng.roses.kernel.groovy.api.constants.GroovyConstants; +import cn.stylefeng.roses.kernel.rule.abstracts.AbstractExceptionEnum; +import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; + +/** + * groovy脚本执行异常 + * + * @author fengshuonan + * @date 2021/1/22 16:36 + */ +public class GroovyException extends ServiceException { + + public GroovyException(AbstractExceptionEnum exception, String userTip) { + super(GroovyConstants.GROOVY_MODULE_NAME, exception.getErrorCode(), userTip); + } + + public GroovyException(AbstractExceptionEnum exception) { + super(GroovyConstants.GROOVY_MODULE_NAME, exception); + } + +} diff --git a/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/exception/enums/GroovyExceptionEnum.java b/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/exception/enums/GroovyExceptionEnum.java new file mode 100644 index 000000000..bb1fc59c1 --- /dev/null +++ b/kernel-d-groovy/groovy-api/src/main/java/cn/stylefeng/roses/kernel/groovy/api/exception/enums/GroovyExceptionEnum.java @@ -0,0 +1,37 @@ +package cn.stylefeng.roses.kernel.groovy.api.exception.enums; + +import cn.stylefeng.roses.kernel.groovy.api.constants.GroovyConstants; +import cn.stylefeng.roses.kernel.rule.abstracts.AbstractExceptionEnum; +import cn.stylefeng.roses.kernel.rule.constants.RuleConstants; +import lombok.Getter; + +/** + * groovy脚本执行异常的枚举 + * + * @author fengshuonan + * @date 2021/1/22 16:36 + */ +@Getter +public enum GroovyExceptionEnum implements AbstractExceptionEnum { + + /** + * groovy脚本执行异常的枚举 + */ + GROOVY_EXE_ERROR(RuleConstants.BUSINESS_ERROR_TYPE_CODE + GroovyConstants.GROOVY_EXCEPTION_STEP_CODE + "01", "执行groovy类中方法出错"); + + /** + * 错误编码 + */ + private final String errorCode; + + /** + * 提示用户信息 + */ + private final String userTip; + + GroovyExceptionEnum(String errorCode, String userTip) { + this.errorCode = errorCode; + this.userTip = userTip; + } + +} diff --git a/kernel-d-groovy/groovy-sdk/README.md b/kernel-d-groovy/groovy-sdk/README.md new file mode 100644 index 000000000..24bfcc4c4 --- /dev/null +++ b/kernel-d-groovy/groovy-sdk/README.md @@ -0,0 +1 @@ +groovy模块的实现 \ No newline at end of file diff --git a/kernel-d-groovy/groovy-sdk/pom.xml b/kernel-d-groovy/groovy-sdk/pom.xml new file mode 100644 index 000000000..ad1c8dfd3 --- /dev/null +++ b/kernel-d-groovy/groovy-sdk/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + + cn.stylefeng.roses + kernel-d-groovy + 1.0.0 + ../pom.xml + + + groovy-sdk + + jar + + + + + + cn.stylefeng.roses + groovy-api + 1.0.0 + + + + + org.codehaus.groovy + groovy + + + + + diff --git a/kernel-d-groovy/groovy-sdk/src/main/java/cn/stylefeng/roses/kernel/groovy/GroovyOperator.java b/kernel-d-groovy/groovy-sdk/src/main/java/cn/stylefeng/roses/kernel/groovy/GroovyOperator.java new file mode 100644 index 000000000..1023b5497 --- /dev/null +++ b/kernel-d-groovy/groovy-sdk/src/main/java/cn/stylefeng/roses/kernel/groovy/GroovyOperator.java @@ -0,0 +1,46 @@ +package cn.stylefeng.roses.kernel.groovy; + +import cn.stylefeng.roses.kernel.groovy.api.GroovyApi; +import cn.stylefeng.roses.kernel.groovy.api.exception.GroovyException; +import cn.stylefeng.roses.kernel.groovy.api.exception.enums.GroovyExceptionEnum; +import groovy.lang.GroovyClassLoader; +import groovy.lang.GroovyShell; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Method; + +/** + * groovy动态脚本操作实现 + * + * @author fengshuonan + * @date 2021/1/22 16:28 + */ +@Slf4j +public class GroovyOperator implements GroovyApi { + + @Override + public Class textToClass(String javaClassCode) { + GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); + return (Class) groovyClassLoader.parseClass(javaClassCode); + } + + @Override + public Object executeShell(String javaCode) { + GroovyShell shell = new GroovyShell(); + return shell.evaluate(javaCode); + } + + @Override + public Object executeClassMethod(String javaClassCode, String method, Class[] parameterTypes, Object[] args) { + try { + Class clazz = this.textToClass(javaClassCode); + Method clazzMethod = clazz.getMethod(method, parameterTypes); + Object obj = clazz.newInstance(); + return clazzMethod.invoke(obj, args); + } catch (Exception e) { + log.error("执行groovy类中方法出错!", e); + throw new GroovyException(GroovyExceptionEnum.GROOVY_EXE_ERROR); + } + } + +} diff --git a/kernel-d-groovy/groovy-spring-boot-starter/README.md b/kernel-d-groovy/groovy-spring-boot-starter/README.md new file mode 100644 index 000000000..3f1f3a04a --- /dev/null +++ b/kernel-d-groovy/groovy-spring-boot-starter/README.md @@ -0,0 +1 @@ +groovy的spring boot自动加载模块 \ No newline at end of file diff --git a/kernel-d-groovy/groovy-spring-boot-starter/pom.xml b/kernel-d-groovy/groovy-spring-boot-starter/pom.xml new file mode 100644 index 000000000..e19827f19 --- /dev/null +++ b/kernel-d-groovy/groovy-spring-boot-starter/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + cn.stylefeng.roses + kernel-d-groovy + 1.0.0 + ../pom.xml + + + groovy-spring-boot-starter + + jar + + + + + + cn.stylefeng.roses + groovy-sdk + 1.0.0 + + + + + diff --git a/kernel-d-groovy/groovy-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/groovy/starter/GunsGroovyAutoConfiguration.java b/kernel-d-groovy/groovy-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/groovy/starter/GunsGroovyAutoConfiguration.java new file mode 100644 index 000000000..9d4fd5b4d --- /dev/null +++ b/kernel-d-groovy/groovy-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/groovy/starter/GunsGroovyAutoConfiguration.java @@ -0,0 +1,30 @@ +package cn.stylefeng.roses.kernel.groovy.starter; + +import cn.stylefeng.roses.kernel.groovy.GroovyOperator; +import cn.stylefeng.roses.kernel.groovy.api.GroovyApi; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Groovy的自动配置 + * + * @author fengshuonan + * @date 2021/1/29 11:23 + */ +@Configuration +public class GunsGroovyAutoConfiguration { + + /** + * Groovy的操作类 + * + * @author fengshuonan + * @date 2021/1/29 11:23 + */ + @Bean + @ConditionalOnMissingBean(GroovyApi.class) + public GroovyApi fileOperatorApi() { + return new GroovyOperator(); + } + +} diff --git a/kernel-d-groovy/groovy-spring-boot-starter/src/main/resources/META-INF/spring.factories b/kernel-d-groovy/groovy-spring-boot-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..fe69a9729 --- /dev/null +++ b/kernel-d-groovy/groovy-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + cn.stylefeng.roses.kernel.groovy.starter.GunsGroovyAutoConfiguration diff --git a/kernel-d-groovy/pom.xml b/kernel-d-groovy/pom.xml new file mode 100644 index 000000000..fd8069446 --- /dev/null +++ b/kernel-d-groovy/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + + cn.stylefeng.roses + roses-kernel + 1.0.0 + ../pom.xml + + + kernel-d-groovy + + pom + + + groovy-api + groovy-sdk + groovy-spring-boot-starter + + + + + + + cn.stylefeng.roses + kernel-a-rule + 1.0.0 + + + + + diff --git a/pom.xml b/pom.xml index db4791b8f..01a41ba3d 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,9 @@ kernel-d-file + + kernel-d-groovy + kernel-d-i18n @@ -110,6 +113,7 @@ 3.0.10 4.5.2 1.6.2 + 3.0.7 @@ -254,6 +258,14 @@ ${easy.captcha} + + + org.codehaus.groovy + groovy-all + ${groovy.version} + pom + +