Browse Source

update

main
wangshaoping 11 months ago
parent
commit
546d1fa3b2
  1. 4
      gradle.properties
  2. 0
      io.sc.engine.rule.client.spring/gradle.properties
  3. 14
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/ExecutorFactoryService.java
  4. 112
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/ExecutorFactoryServiceImpl.java
  5. 0
      io.sc.engine.rule.client/gradle.properties
  6. 169
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java
  7. 78
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/ExecutorBuilder.java
  8. 29
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/ExecutorFactory.java
  9. 18
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/enums/ExecutorMode.java
  10. 145
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/GroovyEngineRuntime.java
  11. 90
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/groovy/GroovyScriptEngineService.java
  12. 54
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/groovy/GroovyScriptEngineServiceImpl.java
  13. 201
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/groovy/GroovyScriptExecutor.java
  14. 3
      io.sc.engine.rule.core/gradle.properties
  15. 126
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/GroovySourceCodeGenerator.java
  16. 161
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/FieldValidator.java
  17. 8
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/HttpAuthorizationType.java
  18. 10
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/HttpMethodType.java
  19. 185
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/parser/ExecutionFlowParser.java
  20. 52
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/po/ExpressionNode.java
  21. 82
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/po/GraphNode.java
  22. 10
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/dictionary/FolderDictionary.java
  23. 10
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/FolderLib.java
  24. 33
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/processor/GroovyScriptIndicatorProcessor.java
  25. 109
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/processor/HttpRequestIndicatorProcessor.java
  26. 21
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/validator/FalseIndicatorValidator.java
  27. 31
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/processor/GroovyScriptParameterProcessor.java
  28. 109
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/processor/HttpRequestParameterProcessor.java
  29. 17
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/FalseParameterValidator.java
  30. 15
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/FolderResource.java
  31. 190
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ExpressionReplacer.java
  32. 635
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/FileUtil.java
  33. 227
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/HttpRequestUtil.java
  34. 7
      io.sc.engine.rule.frontend/frontend-register.json
  35. 5
      io.sc.engine.rule.frontend/public/favicon.svg
  36. BIN
      io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/HanaleiFill-Regular.ttf
  37. BIN
      io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/FontAwesome.otf
  38. BIN
      io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.eot
  39. 2671
      io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.svg
  40. BIN
      io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.ttf
  41. BIN
      io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.woff
  42. BIN
      io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.woff2
  43. BIN
      io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/plugins/images/icon_dropCell.png
  44. 0
      io.sc.engine.rule.sample/gradle.properties
  45. 49
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/entity/FolderDictionaryEntity.java
  46. 26
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/exception/FolderAlreadyExistsException.java
  47. 18
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/vo/FolderDictionaryVo.java
  48. 52
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/FolderLibEntity.java
  49. 58
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/processor/GroovyScriptIndicatorProcessorEntity.java
  50. 229
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/processor/HttpRequestIndicatorProcessorEntity.java
  51. 30
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/validator/FalseIndicatorValidatorEntity.java
  52. 26
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/exception/FolderAlreadyExistsException.java
  53. 13
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/FolderLibVo.java
  54. 25
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/processor/GroovyScriptIndicatorProcessorVo.java
  55. 167
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/processor/HttpRequestIndicatorProcessorVo.java
  56. 14
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/validator/FalseIndicatorValidatorVo.java
  57. 59
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/ExecutionFlowParameterProcessorEntity.java
  58. 57
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/GroovyScriptParameterProcessorEntity.java
  59. 227
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/HttpRequestParameterProcessorEntity.java
  60. 29
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/validator/FalseParameterValidatorEntity.java
  61. 26
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/processor/ExecutionFlowParameterProcessorVo.java
  62. 26
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/processor/GroovyScriptParameterProcessorVo.java
  63. 167
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/processor/HttpRequestParameterProcessorVo.java
  64. 14
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/validator/FalseParameterValidatorVo.java
  65. 52
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/entity/FolderResourceEntity.java
  66. 30
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/exception/FolderAlreadyExistsException.java
  67. 13
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/vo/FolderResourceVo.java
  68. 43
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/i18n/graph/graph_editor.properties
  69. 42
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/i18n/graph/graph_editor_zh_CN.properties
  70. 3
      io.sc.platform.attachment/gradle.properties
  71. 303
      io.sc.platform.core.frontend/template-project/src/views/FormElements.vue
  72. 41
      io.sc.platform.core/src/main/java/io/sc/platform/core/util/FileUtil.java
  73. 4
      io.sc.platform.gradle/templates/pgp/setup/gradle.properties

4
gradle.properties

@ -36,9 +36,9 @@ application_version=1.0.0
# platform
###########################################################
platform_group=io.sc
platform_version=8.1.27
platform_version=8.1.28
platform_plugin_version=8.1.13
platform_core_frontend_version=8.1.145
platform_core_frontend_version=8.1.149
###########################################################
# dependencies version

0
io.sc.engine.rule.client.spring/gradle.properties

14
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/ExecutorFactoryService.java

@ -0,0 +1,14 @@
package io.sc.engine.rule.client.spring.service;
import io.sc.engine.rule.client.Executor;
/**
* Spring 环境中的决策引擎执行器工厂服务类
*/
public interface ExecutorFactoryService {
/**
* 获取执行器
* @return 执行器
*/
public Executor getExecutor();
}

112
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/ExecutorFactoryServiceImpl.java

@ -0,0 +1,112 @@
package io.sc.engine.rule.client.spring.service.impl;
import java.util.Map;
import javax.annotation.PostConstruct;
import io.sc.platform.core.service.RuntimeService;
import io.sc.platform.mvc.service.SystemParameterService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.ExecutorBuilder;
import io.sc.engine.rule.client.enums.ExecutorMode;
import io.sc.engine.rule.client.enums.LoaderMode;
import io.sc.engine.rule.client.local.LocalExecutor;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.client.spring.service.LocalLoader;
import io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil;
@Service("reExecutorFactoryService")
public class ExecutorFactoryServiceImpl implements ExecutorFactoryService{
private static final Logger log =LoggerFactory.getLogger(ExecutorFactoryServiceImpl.class);
private static final String EXECUTOR_MODE_KEY ="parameter.re.client.executorMode";
private static final String LOADER_MODE_KEY ="parameter.re.client.loaderMode";
private static final String REMOTE_API_URL_KEY ="parameter.re.client.remoteApiUrl";
@Autowired private RuntimeService runtimeService;
@Autowired private SystemParameterService systemParameterService;
@Autowired private LocalLoader localLoader;
@Autowired private ApplicationContext applicationContext;
private ExecutorMode lastExecutorMode; //上一次保存的执行器执行模式
private LoaderMode lastLoaderMode; //上一次保存的加载器执行模式
private String lastRemoteApiUrl; //上一次保存的远程服务器 api url 地址
private Executor executor;
@PostConstruct
public void init() {
try {
EngineSpringApplicationContextUtil.setApplicationContext(applicationContext);
executor =buildExecutor();
} catch (Exception e) {
log.error("",e);
}
}
@Override
public Executor getExecutor() {
if(!runtimeService.isReady()) {
return null;
}
if(executor!=null) return executor;
try {
Map<String,String> parameters =systemParameterService.getParameters(new String[] {
EXECUTOR_MODE_KEY,
LOADER_MODE_KEY,
REMOTE_API_URL_KEY
});
ExecutorMode executorMode =ExecutorMode.parse(parameters.get(EXECUTOR_MODE_KEY));
LoaderMode loaderMode =LoaderMode.parse(parameters.get(LOADER_MODE_KEY));
String remoteApiUrl =parameters.get(REMOTE_API_URL_KEY);
if(
executorMode!=null && executorMode.equals(lastExecutorMode)
&& loaderMode!=null && loaderMode.equals(lastLoaderMode)
&& remoteApiUrl!=null && remoteApiUrl.equals(lastRemoteApiUrl)
) {
return executor;
}else {
if(ExecutorMode.LOCAL.equals(executorMode) && LoaderMode.LOCAL.equals(loaderMode)) {
executor =new LocalExecutor(localLoader);
}else {
executor =new ExecutorBuilder().build(executorMode, loaderMode, remoteApiUrl);
}
lastExecutorMode =executorMode;
lastLoaderMode =loaderMode;
lastRemoteApiUrl =remoteApiUrl;
return executor;
}
} catch (Exception e) {
log.error("",e);
return null;
}
}
private Executor buildExecutor() throws Exception{
if(!runtimeService.isReady()) {
return null;
}
Map<String,String> parameters =systemParameterService.getParameters(new String[] {
EXECUTOR_MODE_KEY,
LOADER_MODE_KEY,
REMOTE_API_URL_KEY
});
ExecutorMode executorMode =ExecutorMode.parse(parameters.get(EXECUTOR_MODE_KEY));
LoaderMode loaderMode =LoaderMode.parse(parameters.get(LOADER_MODE_KEY));
String remoteApiUrl =parameters.get(REMOTE_API_URL_KEY);
if(ExecutorMode.LOCAL.equals(executorMode) && LoaderMode.LOCAL.equals(loaderMode)) {
return new LocalExecutor(localLoader);
}else {
return new ExecutorBuilder().build(executorMode, loaderMode, remoteApiUrl);
}
}
}

0
io.sc.engine.rule.client/gradle.properties

169
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java

@ -0,0 +1,169 @@
package io.sc.engine.rule.client;
import java.util.Map;
import io.sc.engine.rule.core.code.impl.support.ResourceResult;
/**
* 客户端执行器接口
*/
public interface Executor {
/**
* 编译资源
* @param resourceId 资源唯一标识
* @throws Exception 违例
*/
public void compileById(String resourceId) throws Exception;
/**
* 编译资源
* @param resourceCode 资源代码
* @param version 资源版本
* @throws Exception 违例
*/
public void compileByCode(String resourceCode,Integer version) throws Exception;
/**
* 执行资源
* @param resourceId 资源唯一标识
* @param json 需要提交给资源的参数 json 字符串
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeById(String resourceId,String json) throws Exception;
/**
* 执行资源
* @param resourceId 资源唯一标识
* @param subModelCode 子模型代码
* @param json 需要提交给资源的参数 json 字符串
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeById(String resourceId,String subModelCode,String json) throws Exception;
/**
* 执行资源
* @param resourceId 资源唯一标识
* @param map 需要提交给资源的参数 map
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeById(String resourceId,Map<String,Object> map) throws Exception;
/**
* 执行资源
* @param resourceId 资源唯一标识
* @param subModelCode 子模型代码
* @param map 需要提交给资源的参数 map
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeById(String resourceId,String subModelCode,Map<String,Object> map) throws Exception;
/**
* 执行资源
* @param resourceCode 资源代码
* @param version 资源版本
* @param json 需要提交给资源的参数 json 字符串
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeByCode(String resourceCode,Integer version,String json) throws Exception;
/**
* 执行资源
* @param resourceCode 资源代码
* @param version 资源版本
* @param subModelCode 子模型代码
* @param json 需要提交给资源的参数 json 字符串
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeByCode(String resourceCode,Integer version,String subModelCode,String json) throws Exception;
/**
* 执行资源
* @param resourceCode 资源代码
* @param version 资源版本
* @param map 需要提交给资源的参数 map
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeByCode(String resourceCode,Integer version,Map<String,Object> map) throws Exception;
/**
* 执行资源
* @param resourceCode 资源代码
* @param version 资源版本
* @param subModelCode 子模型代码
* @param map 需要提交给资源的参数 map
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeByCode(String resourceCode,Integer version,String subModelCode,Map<String,Object> map) throws Exception;
/**
* 编译资源(测试)
* @param resourceId 资源唯一标识
* @throws Exception 违例
*/
public void compileByIdForTest(String resourceId) throws Exception;
/**
* 编译资源(测试)
* @param resourceCode 资源代码
* @param version 资源版本
* @throws Exception 违例
*/
public void compileByCodeForTest(String resourceCode,Integer version) throws Exception;
/**
* 执行资源(测试)
* @param resourceId 资源唯一标识
* @param map 需要提交给资源的参数 map
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeByIdForTest(String resourceId,Map<String,Object> map) throws Exception;
/**
* 执行资源(测试)
* @param resourceId 资源唯一标识
* @param subModelCode 子模型代码
* @param map 需要提交给资源的参数 map
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeByIdForTest(String resourceId,String subModelCode,Map<String,Object> map) throws Exception;
/**
* 执行资源(测试)
* @param resourceCode 资源代码
* @param version 资源版本
* @param map 需要提交给资源的参数 map
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeByCodeForTest(String resourceCode,Integer version,Map<String,Object> map) throws Exception;
/**
* 执行资源(测试)
* @param resourceCode 资源代码
* @param version 资源版本
* @param subModelCode 子模型代码
* @param map 需要提交给资源的参数 map
* @return 执行结果
* @throws Exception 违例
*/
public ResourceResult executeByCodeForTest(String resourceCode,Integer version,String subModelCode,Map<String,Object> map) throws Exception;
/**
* 获取资源定义加载器
* @return 资源定义加载器
*/
public Loader getLoader();
}

78
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/ExecutorBuilder.java

@ -0,0 +1,78 @@
package io.sc.engine.rule.client;
import io.sc.engine.rule.client.enums.ExecutorMode;
import io.sc.engine.rule.client.enums.LoaderMode;
import io.sc.engine.rule.client.local.LocalExecutor;
import io.sc.engine.rule.client.remote.RemoteExecutor;
import io.sc.engine.rule.client.remote.RemoteLoader;
/**
* 执行器构建器
*/
public class ExecutorBuilder {
private ExecutorMode executorMode =ExecutorMode.LOCAL;
private LoaderMode loaderMode =LoaderMode.REMOTE;
private String url;
public ExecutorBuilder loader(LoaderMode loaderMode) {
this.loaderMode =loaderMode;
return this;
}
public ExecutorBuilder executor(ExecutorMode executorMode) {
this.executorMode =executorMode;
return this;
}
public ExecutorBuilder url(String url) {
this.url =url;
return this;
}
/**
* 快捷构建执行器
* @param executorMode 执行模式
* @param loaderMode 模型定义加载模式
* @param url 模型引擎服务器 url
* @return 执行器
*/
public Executor build(ExecutorMode executorMode,LoaderMode loaderMode,String url) {
this.executorMode =executorMode;
this.loaderMode =loaderMode;
this.url =url;
return build();
}
/**
* 构建执行器
* @return 执行器
*/
public Executor build(){
//检查组合是否有效
//如果采用远程执行,必须指定 url
if(executorMode==ExecutorMode.REMOTE && (url==null || "".equals(url.trim()))) {
throw new RuntimeException("REMOTE executor mode MUST set the url");
}
//如果采用远程加载模型定义,必须指定 url
if(loaderMode==LoaderMode.REMOTE && (url==null || "".equals(url.trim()))) {
throw new RuntimeException("REMOTE loader mode MUST set the url");
}
//不支持本地执行,本地加载模型定义
if(executorMode==ExecutorMode.LOCAL && loaderMode==LoaderMode.LOCAL) {
throw new RuntimeException("LOCAL loader and LOCAL executor NOT Supported!");
}
//只支持以下两种方式:
//1. 本地执行,远程加载模型定义
if(loaderMode==LoaderMode.REMOTE && executorMode==ExecutorMode.LOCAL) {
return new LocalExecutor(new RemoteLoader(url));
}
//2. 远程执行
if(executorMode==ExecutorMode.REMOTE) {
return new RemoteExecutor(url);
}
return null;
}
}

29
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/ExecutorFactory.java

@ -0,0 +1,29 @@
package io.sc.engine.rule.client;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 执行器工厂用于缓存执行器
*/
public class ExecutorFactory {
private static Map<String,Executor> cache =new ConcurrentHashMap<String,Executor>();
/**
* 注册执行器
* @param name 执行器名称
* @param executor 执行器
*/
public static void register(String name,Executor executor) {
cache.put(name, executor);
}
/**
* 获取执行器
* @param name 执行器名称
* @return 执行器
*/
public static Executor getExecutor(String name) {
return cache.get(name);
}
}

18
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/enums/ExecutorMode.java

@ -0,0 +1,18 @@
package io.sc.engine.rule.client.enums;
/**
* 执行器模式
*/
public enum ExecutorMode {
LOCAL, //本地
REMOTE; //远程
public static ExecutorMode parse(String str) {
if("LOCAL".equalsIgnoreCase(str)) {
return ExecutorMode.LOCAL;
}else if("REMOTE".equalsIgnoreCase(str)) {
return ExecutorMode.REMOTE;
}
return null;
}
}

145
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/GroovyEngineRuntime.java

@ -0,0 +1,145 @@
package io.sc.engine.rule.client.runtime.impl;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.runtime.EngineRuntime;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl;
import io.sc.engine.rule.core.code.CodeGenerator;
import io.sc.engine.rule.core.code.SourceCode;
import io.sc.engine.rule.core.code.impl.GroovySourceCodeGenerator;
import io.sc.engine.rule.core.code.impl.support.ResourceResult;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper4Lib;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper4Resource;
import io.sc.engine.rule.core.po.lib.Lib;
import io.sc.engine.rule.core.po.resource.Resource;
public class GroovyEngineRuntime extends EngineRuntime{
private static final Logger log =LoggerFactory.getLogger(GroovyEngineRuntime.class);
private static GroovyEngineRuntime instance =new GroovyEngineRuntime();
private GroovyScriptEngineService service =new GroovyScriptEngineServiceImpl();
private CodeGenerator codeGenerator =new GroovySourceCodeGenerator();
private GroovyEngineRuntime() {}
public static GroovyEngineRuntime getInstance() {
return instance;
}
@Override
public void compileById(String resourceId, ResourceWrapper wrapper) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeById(resourceId, wrapper);
String resourceName =null;
if("RESOURCE".equals(wrapper.getType())){
ResourceWrapper4Resource _wrapper =(ResourceWrapper4Resource)wrapper;
Resource resource =_wrapper.getResource();
resourceName =resource.getName();
}else if("LIB".equals(wrapper.getType())) {
ResourceWrapper4Lib _wrapper =(ResourceWrapper4Lib)wrapper;
Lib lib =_wrapper.getLib();
resourceName =lib.getName();
}
try {
service.validate(code.getSource());
} catch (Exception e) {
log.error("Compile Error for " + resourceName + "(resourceId=" + resourceId + ")",e);
}
}
@Override
public void compileByCode(String resourceCode, Integer version, ResourceWrapper wrapper) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeByCode(resourceCode, version, wrapper);
String resourceName =null;
if("RESOURCE".equals(wrapper.getType())){
ResourceWrapper4Resource _wrapper =(ResourceWrapper4Resource)wrapper;
Resource resource =_wrapper.getResource();
resourceName =resource.getName();
}else if("LIB".equals(wrapper.getType())) {
ResourceWrapper4Lib _wrapper =(ResourceWrapper4Lib)wrapper;
Lib lib =_wrapper.getLib();
resourceName =lib.getName();
}
try {
service.validate(code.getSource());
} catch (Exception e) {
log.error("Compile Error for " + resourceName + "(code=" + resourceCode + ",verion=" + version + ")",e);
}
}
@Override
public ResourceResult executeById(Executor executor,String resourceId, ResourceWrapper wrapper, String json) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeById(resourceId,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,json));
return result;
}
@Override
public ResourceResult executeById(Executor executor,String resourceId, ResourceWrapper wrapper, String subModelCode, String json) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeById(resourceId,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,json));
return result;
}
@Override
public ResourceResult executeById(Executor executor,String resourceId, ResourceWrapper wrapper, Map<String, Object> map) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeById(resourceId,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,map));
return result;
}
@Override
public ResourceResult executeById(Executor executor,String resourceId, ResourceWrapper wrapper, String subModelCode, Map<String, Object> map) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeById(resourceId,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,map));
return result;
}
@Override
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ResourceWrapper wrapper, String json) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeByCode(resourceCode,version,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,json));
return result;
}
@Override
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ResourceWrapper wrapper, String subModelCode, String json) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeByCode(resourceCode,version,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,json));
return result;
}
@Override
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ResourceWrapper wrapper,Map<String, Object> map) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeByCode(resourceCode,version,wrapper);
//if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,map));
return result;
}
@Override
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ResourceWrapper wrapper, String subModelCode, Map<String, Object> map) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeByCode(resourceCode,version,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,map));
return result;
}
private Map<String,Object> prepareParameter(Executor executor,String subModelCode, Object argument){
Map<String,Object> parameter =new HashMap<String,Object>(2);
parameter.put("executor", executor);
parameter.put("subModelCode", subModelCode);
parameter.put("argument", argument);
return parameter;
}
}

90
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/groovy/GroovyScriptEngineService.java

@ -0,0 +1,90 @@
package io.sc.engine.rule.client.runtime.impl.groovy;
import java.util.Map;
import groovy.lang.Binding;
/**
* Groovy 脚本执行引擎服务
*/
public interface GroovyScriptEngineService {
/**
* 对脚本进行语法验证
* @param script 需要验证的脚本内容
* @return 是否验证通过
* @throws Exception 违例
*/
public boolean validate(String script) throws Exception;
/**
* 执行脚本
* @param script 脚本内容
* @return 执行后的单值结果
* @throws Exception 违例
*/
public Object eval(String script) throws Exception;
/**
* 执行脚本
* @param script 脚本内容
* @param key 传入的单值参数名称
* @param value 传入的单值参数值
* @return 执行后的单值结果
* @throws Exception 违例
*/
public Object eval(String script, String key, Object value) throws Exception;
/**
* 执行脚本
* @param script 脚本内容
* @param context 传入参数集合
* @return 执行后的单值结果
* @throws Exception 违例
*/
public Object eval(String script, Map<String, Object> context) throws Exception;
/**
* 执行脚本
* @param script 脚本内容
* @param binding 传入参数 groovy binding 对象
* @return 执行后的单值结果
* @throws Exception 违例
*/
public Object eval(String script, Binding binding) throws Exception;
/**
* 执行脚本
* @param script 脚本内容
* @return 执行后的多值结果
* @throws Exception 违例
*/
public Map<String, Object> execute(String script) throws Exception;
/**
* 执行脚本
* @param script 脚本内容
* @param key 传入的单值参数名称
* @param value 传入的单值参数值
* @return 执行后的多值结果
* @throws Exception 违例
*/
public Map<String, Object> execute(String script, String key, Object value) throws Exception;
/**
* 执行脚本
* @param script 脚本内容
* @param context 传入参数集合
* @return 执行后的多值结果
* @throws Exception 违例
*/
public Map<String, Object> execute(String script, Map<String, Object> context) throws Exception;
/**
* 执行脚本
* @param script 脚本内容
* @param binding 传入参数 groovy binding 对象
* @return 执行后的多值结果
* @throws Exception 违例
*/
public Map<String, Object> execute(String script, Binding binding) throws Exception;
}

54
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/groovy/GroovyScriptEngineServiceImpl.java

@ -0,0 +1,54 @@
package io.sc.engine.rule.client.runtime.impl.groovy;
import java.util.Map;
import groovy.lang.Binding;
public class GroovyScriptEngineServiceImpl implements GroovyScriptEngineService{
private GroovyScriptExecutor engine =new GroovyScriptExecutor();
@Override
public boolean validate(String script) throws Exception {
return engine.validate(script);
}
@Override
public Object eval(String script) throws Exception {
return engine.eval(script);
}
@Override
public Object eval(String script, String key, Object value) throws Exception {
return engine.eval(script,key,value);
}
@Override
public Object eval(String script, Map<String, Object> context) throws Exception {
return engine.eval(script,context);
}
@Override
public Object eval(String script, Binding binding) throws Exception {
return engine.eval(script,binding);
}
@Override
public Map<String, Object> execute(String script) throws Exception {
return engine.execute(script);
}
@Override
public Map<String, Object> execute(String script, String key, Object value) throws Exception {
return engine.execute(script,key,value);
}
@Override
public Map<String, Object> execute(String script, Map<String, Object> context) throws Exception {
return engine.execute(script,context);
}
@Override
public Map<String, Object> execute(String script, Binding binding) throws Exception {
return engine.execute(script,binding);
}
}

201
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/groovy/GroovyScriptExecutor.java

@ -0,0 +1,201 @@
package io.sc.engine.rule.client.runtime.impl.groovy;
import java.util.Map;
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;
import groovy.lang.Binding;
/**
* Groovy 脚本执行引擎服务类
*/
public class GroovyScriptExecutor {
private Compilable compilableEngine;
public GroovyScriptExecutor(){
ScriptEngineManager manager =new ScriptEngineManager();
ScriptEngine engine =manager.getEngineByName("groovy");
compilableEngine =(Compilable)engine;
}
/**
* 编译验证 groovy 脚本的语法是否正确
* @param script groovy 脚本
* @return 是否通过编译验证
* @throws Exception 违例
*/
public boolean validate(String script) throws Exception{
compilableEngine.compile(script);
return true;
}
/**
* 执行 groovy 脚本单返回值
* @param script groovy 脚本
* @return 执行结果
* @throws Exception 违例
*/
public Object eval(String script) throws Exception {
CompiledScript compiledScript =getCompiledScript(script);
if(compiledScript!=null){
return compiledScript.eval();
}
return null;
}
/**
* 执行 groovy 脚本单参数单返回值
* @param script groovy 脚本
* @param key 参数名
* @param value 参数值
* @return 执行结果
* @throws Exception 违例
*/
public Object eval(String script, String key, Object value) throws Exception {
CompiledScript compiledScript =getCompiledScript(script);
if(compiledScript!=null){
Bindings bindings =new SimpleBindings();
if(key!=null && !"".equals(key.trim())){
bindings.put(key,value);
}
return compiledScript.eval(bindings);
}
return null;
}
/**
* 执行 groovy 脚本多参数单返回值
* @param script groovy 脚本
* @param context 参数集合
* @return 执行结果
* @throws Exception 违例
*/
public Object eval(String script, Map<String, Object> context) throws Exception {
CompiledScript compiledScript =getCompiledScript(script);
if(compiledScript!=null){
Bindings bindings =new SimpleBindings();
if(context!=null && context.size()>0){
bindings.putAll(context);
}
return compiledScript.eval(bindings);
}
return null;
}
/**
* 执行 groovy 脚本单返回值
* @param script script groovy 脚本
* @param binding Groovy Bindings 对象
* @return 执行结果
* @throws Exception 违例
*/
@SuppressWarnings("unchecked")
public Object eval(String script, Binding binding) throws Exception {
CompiledScript compiledScript =getCompiledScript(script);
if(compiledScript!=null){
Bindings bindings =new SimpleBindings();
if(binding!=null && binding.getVariables().size()>0){
bindings.putAll(binding.getVariables());
}
return compiledScript.eval(bindings);
}
return null;
}
/**
* 执行 groovy 脚本多返回值
* @param script groovy 脚本
* @return 执行结果
* @throws Exception 违例
*/
public Map<String, Object> execute(String script) throws Exception {
CompiledScript compiledScript =getCompiledScript(script);
if(compiledScript!=null){
Bindings bindings =new SimpleBindings();
compiledScript.eval(bindings);
return (Map<String,Object>)bindings;
}
return null;
}
/**
* 执行 groovy 脚本单参数多返回值
* @param script groovy 脚本
* @param key 参数名
* @param value 参数值
* @return 执行结果
* @throws Exception 违例
*/
public Map<String, Object> execute(String script, String key, Object value) throws Exception {
CompiledScript compiledScript =getCompiledScript(script);
if(compiledScript!=null){
Bindings bindings =new SimpleBindings();
if(key!=null && !"".equals(key.trim())){
bindings.put(key,value);
}
compiledScript.eval(bindings);
return (Map<String,Object>)bindings;
}
return null;
}
/**
* 执行 groovy 脚本多参数多返回值
* @param script groovy 脚本
* @param context 参数集合
* @return 执行结果
* @throws Exception 违例
*/
public Map<String, Object> execute(String script, Map<String, Object> context) throws Exception {
CompiledScript compiledScript =getCompiledScript(script);
if(compiledScript!=null){
Bindings bindings =new SimpleBindings();
if(context!=null){
bindings.putAll(context);
}
compiledScript.eval(bindings);
return (Map<String,Object>)bindings;
}
return null;
}
/**
* 执行 groovy 脚本多返回值
* @param script groovy 脚本
* @param binding Groovy Bindings 对象
* @return 执行结果
* @throws Exception 违例
*/
@SuppressWarnings("unchecked")
public Map<String, Object> execute(String script, Binding binding) throws Exception {
CompiledScript compiledScript =getCompiledScript(script);
if(compiledScript!=null){
Bindings bindings =new SimpleBindings();
if(binding!=null){
bindings.putAll(binding.getVariables());
}
compiledScript.eval(bindings);
return (Map<String,Object>)bindings;
}
return null;
}
/**
* 编译 groovy 脚本
* 由于 groovy Compilable 实现已经实现了缓存编译后的脚本对象即对相同的文本不会进行重复编译所以应用无需进行缓存
* @param script 脚本文本字符串
* @return 编译后的脚本对象
* @throws Exception 违例
*/
private CompiledScript getCompiledScript(String script) throws Exception{
if(script!=null && !"".equals(script.trim())){
return compilableEngine.compile(script);
}
return null;
}
}

3
io.sc.engine.rule.core/gradle.properties

@ -0,0 +1,3 @@
commons_math3_version=3.6.1
mxgraph_version=4.2.2.1
jpmml_version=1.4.9

126
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/GroovySourceCodeGenerator.java

@ -0,0 +1,126 @@
package io.sc.engine.rule.core.code.impl;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import io.sc.engine.rule.core.code.CodeGenerator;
import io.sc.engine.rule.core.code.SourceCode;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper4Lib;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper4Resource;
import io.sc.engine.rule.core.enums.ResourceType;
import io.sc.engine.rule.core.po.lib.Lib;
import io.sc.engine.rule.core.po.resource.ModelResource;
import io.sc.engine.rule.core.po.resource.Resource;
import freemarker.cache.ClassTemplateLoader;
import freemarker.ext.beans.BeansWrapper;
import freemarker.ext.beans.BeansWrapperBuilder;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import freemarker.template.TemplateHashModel;
public class GroovySourceCodeGenerator implements CodeGenerator{
private static final String PACKAGE_NAME ="io.sc.engine.rule.core.code.generated";
private Map<String,SourceCode> cache =new ConcurrentHashMap<String,SourceCode>();
@Override
public SourceCode generateSourceCodeById(String resourceId, ResourceWrapper wrapper) throws Exception {
if(wrapper!=null) {
return _generateSourceCode(wrapper);
}
return null;
}
@Override
public SourceCode generateSourceCodeByCode(String resourceCode, Integer version, ResourceWrapper wrapper) throws Exception {
if(wrapper!=null) {
if(version==null) { //未指定版本,不缓存
return _generateSourceCode(wrapper);
}else { //指定了版本,缓存
String key =getCacheKey(resourceCode,version);
SourceCode sourceCode =cache.get(key);
if(sourceCode==null) {
sourceCode =_generateSourceCode(wrapper);
cache.put(key, sourceCode);
return sourceCode;
}else {
return sourceCode;
}
}
}
return null;
}
private SourceCode _generateSourceCode(ResourceWrapper wrapper) throws Exception{
Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
cfg.setTemplateLoader(new ClassTemplateLoader(GroovySourceCodeGenerator.class,"/org/wsp/engine/rule/core/code/template/groovy"));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setLogTemplateExceptions(false);
cfg.setWrapUncheckedExceptions(true);
Map<String,Object> root = new HashMap<String,Object>();
String wrapperCode =null;
if("RESOURCE".equals(wrapper.getType())){
ResourceWrapper4Resource _wrapper =(ResourceWrapper4Resource)wrapper;
Resource resource =_wrapper.getResource();
wrapperCode =resource.getCode();
if(ResourceType.MODEL.equals(resource.getType())) {
ModelResource modelResource =(ModelResource)resource;
modelResource.getModel().buildFullName();
}
}else if("LIB".equals(wrapper.getType())) {
ResourceWrapper4Lib _wrapper =(ResourceWrapper4Lib)wrapper;
Lib lib =_wrapper.getLib();
wrapperCode =lib.getCode();
}
root.put("$wrapper", wrapper);
root.put("CodeReplacer", getStaticMethod("io.sc.engine.rule.core.util.CodeReplacer"));
root.put("ExpressionReplacer", getStaticMethod("io.sc.engine.rule.core.util.ExpressionReplacer"));
root.put("ValueType", getStaticMethod("io.sc.engine.rule.core.enums.ValueType"));
root.put("ConditionRange", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.ConditionRange"));
root.put("NumberRange", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.NumberRange"));
root.put("DecisionTable2C", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.DecisionTable2C"));
root.put("DecisionTable", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.DecisionTable"));
root.put("DecisionTree", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.DecisionTree"));
root.put("ExecutionFlow", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.ExecutionFlow"));
root.put("Option", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.Option"));
root.put("Rule", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.Rule"));
root.put("SingleRule", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.SingleRule"));
root.put("SqlFieldMapping", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.SqlFieldMapping"));
root.put("LibUtil", getStaticMethod("io.sc.engine.rule.core.code.impl.support.lib.LibUtil"));
Template template =cfg.getTemplate("groovy.ftl");
StringWriter out =new StringWriter();
template.process(root, out);
out.close();
return new SourceCode(PACKAGE_NAME,wrapperCode,out.toString());
}
private TemplateHashModel getStaticMethod(String className) throws Exception{
BeansWrapper wrapper =new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS).build();
TemplateHashModel staticModels = wrapper.getStaticModels();
return (TemplateHashModel)staticModels.get(className);
}
private String getCacheKey(String code,Integer version) {
String result ="";
if(code!=null && !"".equals(code.trim())) {
result +=code;
}
if(version!=null) {
result +="_" + version;
}
return result;
}
}

161
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/FieldValidator.java

@ -0,0 +1,161 @@
package io.sc.engine.rule.core.code.impl.support;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 验证器
* @author wangshaoping
*
*/
public class FieldValidator {
private static final Pattern EMAIL_PATTERN = Pattern.compile("[a-zA-Z0-9_\\\\-\\\\.]+@[a-zA-Z0-9]+(\\\\.(com))");
public static boolean empty(String fieldCode,String fieldName,Object obj,ValidateResult result) {
if(obj!=null) {
result.error(fieldCode,fieldName, "only null or empty string value can been accepted");
return false;
}
return true;
}
public static boolean notEmpty(String fieldCode,String fieldName,Object obj,ValidateResult result) {
if(obj==null) {
result.error(fieldCode,fieldName, "not null value can been accepted");
return false;
}
if(obj instanceof String) {
if(obj.toString().isEmpty()) {
result.error(fieldCode,fieldName, "not empty string value can been accepted");
return false;
}
}
return true;
}
public static boolean trueValue(String fieldCode,String fieldName,Object obj,ValidateResult result) {
if(obj instanceof Boolean) {
if(!((Boolean)obj)) {
result.error(fieldCode,fieldName, "true value can been accepted");
return false;
}else {
return true;
}
}
result.error(fieldCode,fieldName, "only boolean value can been accepted");
return false;
}
public static boolean falseValue(String fieldCode,String fieldName,Object obj,ValidateResult result) {
if(obj instanceof Boolean) {
if(((Boolean)obj)) {
result.error(fieldCode,fieldName, "false value can been accepted");
return false;
}else {
return true;
}
}
result.error(fieldCode,fieldName, "only boolean value can been accepted");
return false;
}
public static boolean integerRange(String fieldCode,String fieldName,Object obj,Integer min,Integer max,ValidateResult result) {
if(obj instanceof Integer) {
if(min==null && max==null) {
return true;
}
Integer value =(Integer)obj;
if((min!=null && value<min) || (max!=null && value>max)) {
result.error(fieldCode,fieldName, "integer value between " + min + " and " + max + " can been accepted");
return false;
}else {
return true;
}
}
result.error(fieldCode,fieldName, "only integer value can been accepted");
return false;
}
public static boolean decimalRange(String fieldCode,String fieldName,Object obj,Double min,Double max,ValidateResult result) {
if(obj instanceof Double) {
if(min==null && max==null) {
return true;
}
Double value =(Double)obj;
if((min!=null && value<min) || (max!=null && value>max)) {
result.error(fieldCode,fieldName, "double value between " + min + " and " + max + " can been accepted");
return false;
}else {
return true;
}
}
result.error(fieldCode,fieldName, "only double value can been accepted");
return false;
}
public static boolean lengthRange(String fieldCode,String fieldName,Object obj,Integer min,Integer max,ValidateResult result) {
if(obj instanceof String) {
if(min==null && max==null) {
return true;
}
String value =(String)obj;
if((min!=null && value.length()<min) || (max!=null && value.length()>max)) {
result.error(fieldCode,fieldName, "string value's length between " + min + " and " + max + " can been accepted");
return false;
}else {
return true;
}
}
result.error(fieldCode,fieldName, "only string value can been accepted");
return false;
}
public static boolean dateRange(String fieldCode,String fieldName,Object obj,Date min,Date max,ValidateResult result) {
if(obj instanceof Date) {
if(min==null && max==null) {
return true;
}
Date value =(Date)obj;
if((min!=null && value.getTime()<min.getTime()) || (max!=null && value.getTime()>max.getTime())) {
result.error(fieldCode,fieldName, "date value's length between " + min + " and " + max + " can been accepted");
return false;
}else {
return true;
}
}
result.error(fieldCode,fieldName, "only date value can been accepted");
return false;
}
public static boolean mail(String fieldCode,String fieldName,Object obj,ValidateResult result) {
if(obj instanceof String) {
String value =(String)obj;
Matcher m = EMAIL_PATTERN.matcher(value);
if(!m.matches()) {
result.error(fieldCode,fieldName, "only email address can been accepted");
return false;
}else {
return true;
}
}
result.error(fieldCode,fieldName, "only string value can been accepted");
return false;
}
public static boolean pattern(String fieldCode,String fieldName,Object obj,String pattern,ValidateResult result) {
if(obj instanceof String) {
String value =(String)obj;
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(value);
if(!m.matches()) {
result.error(fieldCode,fieldName, "only string value matched " + pattern + " pattern can been accepted");
return false;
}else {
return true;
}
}
result.error(fieldCode,fieldName, "only string value can been accepted");
return false;
}
}

8
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/HttpAuthorizationType.java

@ -0,0 +1,8 @@
package io.sc.engine.rule.core.enums;
public enum HttpAuthorizationType {
NONE,
API_KEY,
BASIC_AUTH,
BEARER
}

10
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/HttpMethodType.java

@ -0,0 +1,10 @@
package io.sc.engine.rule.core.enums;
/**
* HTTP 请求方法类型
* @author wangshaoping
*
*/
public enum HttpMethodType {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

185
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/parser/ExecutionFlowParser.java

@ -0,0 +1,185 @@
package io.sc.engine.rule.core.mxgraph.parser;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import org.w3c.dom.Document;
import io.sc.engine.rule.core.mxgraph.po.CommandSetNode;
import io.sc.engine.rule.core.mxgraph.po.ConditionNode;
import io.sc.engine.rule.core.mxgraph.po.ConfigurableResourceAbstractNode;
import io.sc.engine.rule.core.mxgraph.po.EdgeNode;
import io.sc.engine.rule.core.mxgraph.po.GraphNode;
import io.sc.engine.rule.core.mxgraph.po.ParallelNode;
import io.sc.engine.rule.core.mxgraph.po.ResourceAbstractNode;
import io.sc.engine.rule.core.mxgraph.po.StartNode;
import io.sc.engine.rule.core.mxgraph.po.SubModelAbstractNode;
import io.sc.engine.rule.core.mxgraph.support.ExecutionFlowMxGraph;
import com.mxgraph.io.mxCodec;
import com.mxgraph.model.mxCell;
import com.mxgraph.model.mxGraphModel;
import com.mxgraph.model.mxICell;
import com.mxgraph.util.mxCellRenderer;
import com.mxgraph.util.mxConstants;
import com.mxgraph.util.mxXmlUtils;
import com.mxgraph.view.mxGraph;
/**
* 决策树解析器
* @author wangshaoping
*
*/
public class ExecutionFlowParser {
/**
* xml 解析成决策树对象,返回第一个有效节点
* 使用者可通过该节点遍历整个决策树
* @param xml mxgraph xml
* @return 决策树第一个有效节点
*/
public GraphNode parse(String xml) {
Map<String,GraphNode> nodes =parseNodes(xml);
return buildAndGetFirstEffectiveNode(nodes);
}
/**
* 生成图片
* @param xml mxgraph xml
* @param outputStream 输出流
* @param format 图片格式
* @throws IOException 违例
*/
public synchronized void generateImage(String xml,OutputStream outputStream,String format) throws IOException {
Document doc = mxXmlUtils.parseXml(xml);
mxCodec codec = new mxCodec(doc);
mxGraphModel model =(mxGraphModel)codec.decode(doc.getDocumentElement());
mxGraph graph = new ExecutionFlowMxGraph(model);
//graph.setHtmlLabels(true);
//设置默认样式
Map<String, Object> style = graph.getStylesheet().getDefaultVertexStyle();
style.put(mxConstants.STYLE_GRADIENTCOLOR, "#FFFFFF");
style.put(mxConstants.STYLE_ROUNDED, true);
style.put(mxConstants.STYLE_SHADOW, true);
BufferedImage image = mxCellRenderer.createBufferedImage(graph, null,1, Color.WHITE, true, null);
if(image!=null) {
ImageIO.write(image, format, outputStream);
}
}
private Map<String,GraphNode> parseNodes(String xml){
Document doc = mxXmlUtils.parseXml(xml);
mxCodec codec = new mxCodec(doc);
mxGraphModel model =(mxGraphModel)codec.decode(doc.getDocumentElement());
mxCell root =(mxCell)model.getRoot(); //获取根(<root> 标签对应的节点)
mxICell container =root.getChildAt(0);//.getChildAt(0); //获取包含自定义图形的容器
Map<String,GraphNode> result =new HashMap<String,GraphNode>();
int childCount =container.getChildCount();
for(int i=0;i<childCount;i++) {
mxCell cell =(mxCell)container.getChildAt(i);
String id =cell.getId();
String label =cell.getAttribute("label");
String type =cell.getAttribute("type");
if(GraphNode.START.equalsIgnoreCase(type)) {
StartNode node =new StartNode();
node.setId(id);
node.setLabel(label);
result.put(id, node);
}else if(GraphNode.PARALLEL.equalsIgnoreCase(type)) {
ParallelNode node =new ParallelNode();
node.setId(id);
node.setLabel(label);
result.put(id, node);
}else if(GraphNode.CONDITION.equalsIgnoreCase(type)) {
ConditionNode node =new ConditionNode();
node.setId(id);
node.setLabel(label);
node.setCondition(cell.getAttribute("condition"));
result.put(id, node);
}else if(GraphNode.COMMAND_SET.equalsIgnoreCase(type)) {
CommandSetNode node =new CommandSetNode();
node.setId(id);
node.setLabel(label);
node.setCommands(cell.getAttribute("commands"));
result.put(id, node);
}else if(GraphNode.RESOURCE_ABSTRACT.equalsIgnoreCase(type)) {
ResourceAbstractNode node =new ResourceAbstractNode();
node.setId(id);
node.setLabel(label);
node.setCode(cell.getAttribute("code"));
node.setVersion(cell.getAttribute("version"));
result.put(id, node);
}else if(GraphNode.CONFIGURABLE_RESOURCE_ABSTRACT.equalsIgnoreCase(type)) {
ConfigurableResourceAbstractNode node =new ConfigurableResourceAbstractNode();
node.setId(id);
node.setLabel(label);
node.setCode(cell.getAttribute("code"));
node.setVersion(cell.getAttribute("version"));
node.setInputCommands(cell.getAttribute("inputCommands"));
node.setOutputCommands(cell.getAttribute("outputCommands"));
result.put(id, node);
}else if(GraphNode.SUB_MODEL_ABSTRACT.equalsIgnoreCase(type)) {
SubModelAbstractNode node =new SubModelAbstractNode();
node.setId(id);
node.setLabel(label);
node.setCode(cell.getAttribute("code"));
result.put(id, node);
}else if(GraphNode.EDGE.equalsIgnoreCase(type)) {
EdgeNode node =new EdgeNode();
node.setId(id);
node.setLabel(label);
node.setValueType(cell.getAttribute("valueType"));
node.setValue(cell.getAttribute("value"));
node.setCommands(cell.getAttribute("commands"));
mxICell source =cell.getSource();
if(source!=null) {
node.setSourceId(source.getId());
}
mxICell target =cell.getTarget();
if(target!=null) {
node.setTargetId(target.getId());
}
result.put(id, node);
}
}
return result;
}
private GraphNode buildAndGetFirstEffectiveNode(Map<String,GraphNode> nodes) {
StartNode startNode =null;
for(String id : nodes.keySet()) {
GraphNode node =nodes.get(id);
if(node instanceof StartNode) {
startNode =(StartNode)node;
}else if(node instanceof EdgeNode) {
EdgeNode edgeNode =(EdgeNode)node;
String sourceId =edgeNode.getSourceId();
String targetId =edgeNode.getTargetId();
GraphNode source =nodes.get(sourceId);
GraphNode target =nodes.get(targetId);
if(source!=null) {
source.addOut(edgeNode);
edgeNode.addOut(target);
}
}
}
if(startNode!=null) {
List<GraphNode> edges =startNode.getOuts();
if(edges!=null && edges.size()>0) {
GraphNode edge =edges.get(0);
List<GraphNode> outs =edge.getOuts();
if(outs!=null && outs.size()>0) {
return outs.get(0);
}
}
}
return null;
}
}

52
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/po/ExpressionNode.java

@ -0,0 +1,52 @@
package io.sc.engine.rule.core.mxgraph.po;
/**
* 表达式节点
* @author wangshaoping
*
*/
public class ExpressionNode extends GraphNode{
private String expression; //表达式
private String commands; //附加指令
/**
* 获取表达式
* @return 表达式
*/
public String getExpression() {
return expression;
}
/**
* 设置表达式
* @param expression 表达式
*/
public void setExpression(String expression) {
this.expression = expression;
}
/**
* 获取附加指令
* @return 附加指令
*/
public String getCommands() {
return commands;
}
/**
* 设置附加指令
* @param commands 附加指令
*/
public void setCommands(String commands) {
this.commands = commands;
}
@Override
public String toString() {
return "ExpressionNode [id=" + id
+ ", label=" + label
+ ", expression=" + expression
+ ", commands=" + commands
+ ", outs=" + outs + "]";
}
}

82
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/po/GraphNode.java

@ -0,0 +1,82 @@
package io.sc.engine.rule.core.mxgraph.po;
import java.util.ArrayList;
import java.util.List;
/**
* 节点
* @author wangshaoping
*
*/
public class GraphNode {
public static final String START ="Start";
public static final String CONDITION ="Condition";
public static final String PARALLEL ="Parallel";
public static final String EXPRESSION ="Expression";
public static final String COMMAND_SET ="CommandSet";
public static final String RESOURCE_ABSTRACT ="ResourceAbstract";
public static final String CONFIGURABLE_RESOURCE_ABSTRACT ="ConfigurableResourceAbstract";
public static final String SUB_MODEL_ABSTRACT ="SubModelAbstract";
public static final String EDGE ="Edge";
protected String id;
protected String label;
protected List<GraphNode> outs =new ArrayList<GraphNode>(); //出口列表
/**
* 添加出口节点
* @param node 出口节点
*/
public void addOut(GraphNode node) {
outs.add(node);
}
/**
* 获取节点 ID
* @return 节点 ID
*/
public String getId() {
return id;
}
/**
* 设置节点 ID
* @param id 节点 ID
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取节点显示名称
* @return 节点显示名称
*/
public String getLabel() {
return label;
}
/**
* 设置节点显示名称
* @param label 节点显示名称
*/
public void setLabel(String label) {
this.label = label;
}
/**
* 获取出口节点列表
* @return 出口节点列表
*/
public List<GraphNode> getOuts() {
return outs;
}
/**
* 设置出口节点列表
* @param outs 出口节点列表
*/
public void setOuts(List<GraphNode> outs) {
this.outs = outs;
}
}

10
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/dictionary/FolderDictionary.java

@ -0,0 +1,10 @@
package io.sc.engine.rule.core.po.dictionary;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("FOLDER")
@JsonIgnoreProperties(ignoreUnknown=true)
public class FolderDictionary extends Dictionary{
}

10
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/FolderLib.java

@ -0,0 +1,10 @@
package io.sc.engine.rule.core.po.lib;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("FOLDER")
@JsonIgnoreProperties(ignoreUnknown=true)
public class FolderLib extends Lib{
}

33
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/processor/GroovyScriptIndicatorProcessor.java

@ -0,0 +1,33 @@
package io.sc.engine.rule.core.po.lib.processor;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.po.lib.IndicatorProcessor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 指标处理器脚本代码操作
* @author wangshaoping
*
*/
@JsonTypeName("GROOVY_SCRIPT")
@JsonIgnoreProperties(ignoreUnknown=true)
public class GroovyScriptIndicatorProcessor extends IndicatorProcessor {
private String groovyScript;//脚本代码
@Override
public ProcessorType getType() {
return ProcessorType.GROOVY_SCRIPT;
}
public String getGroovyScript() {
return groovyScript;
}
public void setGroovyScript(String groovyScript) {
this.groovyScript = groovyScript;
}
}

109
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/processor/HttpRequestIndicatorProcessor.java

@ -0,0 +1,109 @@
package io.sc.engine.rule.core.po.lib.processor;
import io.sc.engine.rule.core.enums.HttpAuthorizationType;
import io.sc.engine.rule.core.enums.HttpMethodType;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.po.lib.IndicatorProcessor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 指标处理器SQL赋值操作
* @author wangshaoping
*
*/
@JsonTypeName("HTTP_REQUEST")
@JsonIgnoreProperties(ignoreUnknown=true)
public class HttpRequestIndicatorProcessor extends IndicatorProcessor {
private HttpMethodType httpMethod;
private String httpUrl;
private HttpAuthorizationType httpAuthType;
private String httpAuthApikey;
private String httpAuthApiValue;
private String httpAuthApiAddTo;
private String httpAuthBasicUsername;
private String httpAuthBasicPassword;
private String httpAuthBearerToken;
private String httpParams;
private String httpBody;
private String httpResponseMapping;
@Override
public ProcessorType getType() {
return ProcessorType.HTTP_REQUEST;
}
public HttpMethodType getHttpMethod() {
return httpMethod;
}
public void setHttpMethod(HttpMethodType httpMethod) {
this.httpMethod = httpMethod;
}
public String getHttpUrl() {
return httpUrl;
}
public void setHttpUrl(String httpUrl) {
this.httpUrl = httpUrl;
}
public HttpAuthorizationType getHttpAuthType() {
return httpAuthType;
}
public void setHttpAuthType(HttpAuthorizationType httpAuthType) {
this.httpAuthType = httpAuthType;
}
public String getHttpAuthApikey() {
return httpAuthApikey;
}
public void setHttpAuthApikey(String httpAuthApikey) {
this.httpAuthApikey = httpAuthApikey;
}
public String getHttpAuthApiValue() {
return httpAuthApiValue;
}
public void setHttpAuthApiValue(String httpAuthApiValue) {
this.httpAuthApiValue = httpAuthApiValue;
}
public String getHttpAuthApiAddTo() {
return httpAuthApiAddTo;
}
public void setHttpAuthApiAddTo(String httpAuthApiAddTo) {
this.httpAuthApiAddTo = httpAuthApiAddTo;
}
public String getHttpAuthBasicUsername() {
return httpAuthBasicUsername;
}
public void setHttpAuthBasicUsername(String httpAuthBasicUsername) {
this.httpAuthBasicUsername = httpAuthBasicUsername;
}
public String getHttpAuthBasicPassword() {
return httpAuthBasicPassword;
}
public void setHttpAuthBasicPassword(String httpAuthBasicPassword) {
this.httpAuthBasicPassword = httpAuthBasicPassword;
}
public String getHttpAuthBearerToken() {
return httpAuthBearerToken;
}
public void setHttpAuthBearerToken(String httpAuthBearerToken) {
this.httpAuthBearerToken = httpAuthBearerToken;
}
public String getHttpParams() {
return httpParams;
}
public void setHttpParams(String httpParams) {
this.httpParams = httpParams;
}
public String getHttpBody() {
return httpBody;
}
public void setHttpBody(String httpBody) {
this.httpBody = httpBody;
}
public String getHttpResponseMapping() {
return httpResponseMapping;
}
public void setHttpResponseMapping(String httpResponseMapping) {
this.httpResponseMapping = httpResponseMapping;
}
}

21
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/validator/FalseIndicatorValidator.java

@ -0,0 +1,21 @@
package io.sc.engine.rule.core.po.lib.validator;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.core.po.lib.IndicatorValidator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 验证器
* @author wangshaoping
*
*/
@JsonTypeName("FALSE")
@JsonIgnoreProperties(ignoreUnknown=true)
public class FalseIndicatorValidator extends IndicatorValidator {
@Override
public ValidatorType getType() {
return ValidatorType.FALSE;
}
}

31
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/processor/GroovyScriptParameterProcessor.java

@ -0,0 +1,31 @@
package io.sc.engine.rule.core.po.model.processor;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.po.model.ParameterProcessor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 模型参数处理器脚本代码操作
* @author wangshaoping
*
*/
@JsonTypeName("GROOVY_SCRIPT")
@JsonIgnoreProperties(ignoreUnknown=true)
public class GroovyScriptParameterProcessor extends ParameterProcessor {
private String groovyScript;//脚本代码
@Override
public ProcessorType getType() {
return ProcessorType.GROOVY_SCRIPT;
}
public String getGroovyScript() {
return groovyScript;
}
public void setGroovyScript(String groovyScript) {
this.groovyScript = groovyScript;
}
}

109
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/processor/HttpRequestParameterProcessor.java

@ -0,0 +1,109 @@
package io.sc.engine.rule.core.po.model.processor;
import io.sc.engine.rule.core.enums.HttpAuthorizationType;
import io.sc.engine.rule.core.enums.HttpMethodType;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.po.model.ParameterProcessor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 模型参数处理器Http请求操作
* @author wangshaoping
*
*/
@JsonTypeName("HTTP_REQUEST")
@JsonIgnoreProperties(ignoreUnknown=true)
public class HttpRequestParameterProcessor extends ParameterProcessor {
private HttpMethodType httpMethod;
private String httpUrl;
private HttpAuthorizationType httpAuthType;
private String httpAuthApikey;
private String httpAuthApiValue;
private String httpAuthApiAddTo;
private String httpAuthBasicUsername;
private String httpAuthBasicPassword;
private String httpAuthBearerToken;
private String httpParams;
private String httpBody;
private String httpResponseMapping;
@Override
public ProcessorType getType() {
return ProcessorType.HTTP_REQUEST;
}
public HttpMethodType getHttpMethod() {
return httpMethod;
}
public void setHttpMethod(HttpMethodType httpMethod) {
this.httpMethod = httpMethod;
}
public String getHttpUrl() {
return httpUrl;
}
public void setHttpUrl(String httpUrl) {
this.httpUrl = httpUrl;
}
public HttpAuthorizationType getHttpAuthType() {
return httpAuthType;
}
public void setHttpAuthType(HttpAuthorizationType httpAuthType) {
this.httpAuthType = httpAuthType;
}
public String getHttpAuthApikey() {
return httpAuthApikey;
}
public void setHttpAuthApikey(String httpAuthApikey) {
this.httpAuthApikey = httpAuthApikey;
}
public String getHttpAuthApiValue() {
return httpAuthApiValue;
}
public void setHttpAuthApiValue(String httpAuthApiValue) {
this.httpAuthApiValue = httpAuthApiValue;
}
public String getHttpAuthApiAddTo() {
return httpAuthApiAddTo;
}
public void setHttpAuthApiAddTo(String httpAuthApiAddTo) {
this.httpAuthApiAddTo = httpAuthApiAddTo;
}
public String getHttpAuthBasicUsername() {
return httpAuthBasicUsername;
}
public void setHttpAuthBasicUsername(String httpAuthBasicUsername) {
this.httpAuthBasicUsername = httpAuthBasicUsername;
}
public String getHttpAuthBasicPassword() {
return httpAuthBasicPassword;
}
public void setHttpAuthBasicPassword(String httpAuthBasicPassword) {
this.httpAuthBasicPassword = httpAuthBasicPassword;
}
public String getHttpAuthBearerToken() {
return httpAuthBearerToken;
}
public void setHttpAuthBearerToken(String httpAuthBearerToken) {
this.httpAuthBearerToken = httpAuthBearerToken;
}
public String getHttpParams() {
return httpParams;
}
public void setHttpParams(String httpParams) {
this.httpParams = httpParams;
}
public String getHttpBody() {
return httpBody;
}
public void setHttpBody(String httpBody) {
this.httpBody = httpBody;
}
public String getHttpResponseMapping() {
return httpResponseMapping;
}
public void setHttpResponseMapping(String httpResponseMapping) {
this.httpResponseMapping = httpResponseMapping;
}
}

17
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/FalseParameterValidator.java

@ -0,0 +1,17 @@
package io.sc.engine.rule.core.po.model.validator;
import io.sc.engine.rule.core.po.model.ParameterValidator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 验证器
* @author wangshaoping
*
*/
@JsonTypeName("FALSE")
@JsonIgnoreProperties(ignoreUnknown=true)
public class FalseParameterValidator extends ParameterValidator {
}

15
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/FolderResource.java

@ -0,0 +1,15 @@
package io.sc.engine.rule.core.po.resource;
import io.sc.engine.rule.core.enums.ResourceType;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("FOLDER")
@JsonIgnoreProperties(ignoreUnknown=true)
public class FolderResource extends Resource{
@Override
public ResourceType getType() {
return ResourceType.FOLDER;
}
}

190
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ExpressionReplacer.java

@ -0,0 +1,190 @@
package io.sc.engine.rule.core.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import io.sc.engine.rule.core.enums.ValueType;
public class ExpressionReplacer {
/**
* 转为 groovy 脚本时变量所属参数名
*/
public static final String ARGUMENT_NAME ="arg";
/**
* 占位符正则表达式
* 采用非贪婪模式匹配
* 标记了两个组:
* 第一个组: ${xxx},
* 第二个组: xxx
*/
private static final Pattern PLACE_HOLDER_REGEX_PATTERN =Pattern.compile("(\\$\\{(.+?)\\})"); //${xxxx}
private static final Pattern PLACE_HOLDER_REGEX_PATTERN2 =Pattern.compile("(`(.+?)`)"); //`xxxx`
private static final Pattern VAR_NAME_REGEX_PATTERN =Pattern.compile("([A-Za-z0-9_]+)"); //变量名正则表达式:
//private static final String VAR_FIELD_NAME_REGEX ="([A-Za-z0-9_]+\\.[A-Za-z0-9_]+)"; //字段名正则表达式: a.b
/**
* 生成占位符字符串
* @param varName 变量名
* @param fieldName 字段名
* @return 占位符字符串
*/
public static String placeholder(String varName,String fieldName) {
if(varName!=null) {
if(fieldName!=null) {
return "${" + varName + "." + fieldName + "}";
}else {
return "${" + varName + "}";
}
}
return null;
}
/**
* 替换字符串
* @param expression 表达式
* @param target 被替换的字符串
* @param replacement 替换后的自妇产
* @return 替换后的字符串
*/
public static String replace(String expression,String target,String replacement) {
if(expression!=null && !expression.trim().isEmpty() && replacement!=null && !replacement.trim().isEmpty()) {
expression =expression.replace(target,replacement);
}
return expression;
}
/**
* 替换字符串
* @param expression 表达式
* @param mapping 被替换和替换字符串 Map(key:被替换的字符串;value:替换后的字符串)
* @return 替换后的字符串
*/
public static String replace(String expression,Map<String,String> mapping) {
if(expression!=null && !expression.trim().isEmpty() && mapping!=null && mapping.size()>0) {
for(String key : mapping.keySet()) {
expression =expression.replace(key,mapping.get(key));
}
return expression;
}
return expression;
}
/**
* 将表达式转换为 groovy 可执行的脚本代码
* groovy("${xxx} + ${yyy}", "java.lang.String");//结果: """${arg.xxx} + ${arg.yyy}"""
* groovy("${xxx} + ${yyy}", "java.lang.Double");//结果: arg.xxx + arg.yyy
* groovy("`${xxx} + ${yyy}`", "java.lang.String");//结果: """${arg.xxx + arg.yyy}"""
* groovy("`max(${xxx},${yyy})`", "java.lang.String");//结果: """${max(arg.xxx,arg.yyy)}"""
* @param expression 表达式
* @param valueType 表达式返回值类型
* @return groovy 可执行的脚本代码
*/
public static String groovy(String expression,String valueType) {
if(expression==null) return null;
if(ValueType.String.getJavaType().equals(valueType)) {
//查找占位符模式(`xxx`)
Matcher matcher =PLACE_HOLDER_REGEX_PATTERN2.matcher(expression);
Map<String,String> founds =new HashMap<String,String>();
while (matcher.find()) {
founds.put(matcher.group(1),matcher.group(2));
}
String result =expression;
if(founds!=null && founds.size()>0) {//1) 先处理 `xxxx` 里面的内容,将其中的 ${yyyy} 进行替换
for(String placeholder : founds.keySet()) {
String _expression =founds.get(placeholder);
_expression =replaceHolder(_expression,null,null);
result =result.replace(placeholder, "`" + _expression + "`");
}
}
//2)再对其他 ${zzzz} 形式的字符串进行替换
result =replaceHolder(result,"${","}");
//最后把 1) 替换后的字符再次替换
Matcher matcher2 =PLACE_HOLDER_REGEX_PATTERN2.matcher(result);
Map<String,String> founds2 =new HashMap<String,String>();
while (matcher2.find()) {
founds2.put(matcher2.group(1),matcher2.group(2));
}
if(founds2!=null && founds2.size()>0) {
for(String placeholder : founds2.keySet()) {
String _expression =founds2.get(placeholder);
result =result.replace(placeholder, "${" + _expression + "}");
}
}
return "\"\"\"" + result + "\"\"\"";
}else {
return replaceHolder(expression,null,null);
}
}
public static String groovyWithNoArgumentName(String expression,String valueType) {
if(expression==null) return null;
//查找占位符模式
Matcher matcher =PLACE_HOLDER_REGEX_PATTERN.matcher(expression);
Map<String,String> founds =new HashMap<String,String>();
while (matcher.find()) {
founds.put(matcher.group(1),matcher.group(2));
}
if(ValueType.String.getJavaType().equals(valueType)) {
String result =expression;
if(founds!=null && founds.size()>0) {
for(String placeholder : founds.keySet()) {
String _expression =founds.get(placeholder);
result =result.replace(placeholder, _replace(_expression));
}
}
return "\"" + result + "\"";
}else {
String result =expression;
if(founds!=null && founds.size()>0) {
for(String placeholder : founds.keySet()) {
String _expression =founds.get(placeholder);
result =result.replace(placeholder, _replace(_expression));
}
}
return result;
}
}
private static String replaceHolder(String expression,String wrapperPrefix,String wrapperSufix) {
if(expression==null) return null;
if(wrapperPrefix==null) wrapperPrefix ="";
if(wrapperSufix==null) wrapperSufix ="";
//查找占位符模式(${xxx})
Matcher matcher =PLACE_HOLDER_REGEX_PATTERN.matcher(expression);
Map<String,String> founds =new HashMap<String,String>();
while (matcher.find()) {
founds.put(matcher.group(1),matcher.group(2));
}
String result =expression;
if(founds!=null && founds.size()>0) {
for(String placeholder : founds.keySet()) {
String _expression =founds.get(placeholder);
result =result.replace(placeholder, wrapperPrefix + ARGUMENT_NAME + "." + _replace(_expression) + wrapperSufix);
}
}
return result;
}
private static String _replace(String expression) {
if(expression==null) return null;
Matcher matcher =VAR_NAME_REGEX_PATTERN.matcher(expression);
List<String> founds =new ArrayList<String>();
while (matcher.find()) {
founds.add(matcher.group(1));
}
for(String found : founds) {
expression =expression.replace(found, CodeReplacer.varName(found));
}
return expression;
}
}

635
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/FileUtil.java

@ -0,0 +1,635 @@
package io.sc.engine.rule.core.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class FileUtil {
private static final String NEW_LINE ="\n";
private static final String DEFAULT_ENCODING ="UTF-8";
/**
* 向一个文本文件追加文本内容采用默认字符编码
* @param fileName 文件名
* @param content 追加的内容
* @throws Exception 违例
*/
public static synchronized void append(String fileName,String content) throws Exception{
append(fileName,content,DEFAULT_ENCODING);
}
/**
* 向一个文本文件追加文本内容采用指定的字符编码
* @param fileName 文件名
* @param content 追加的内容
* @param encoding 追加内容字符编码
* @throws Exception 违例
*/
public static synchronized void append(String fileName,String content,String encoding) throws Exception{
RandomAccessFile raf =null;
FileChannel fc =null;
try {
raf =new RandomAccessFile(fileName,"rw");
fc =raf.getChannel();
ByteBuffer bb =ByteBuffer.wrap(content.getBytes(encoding));
fc.position(fc.size());
fc.write(bb);
} catch (Exception e) {
throw e;
}finally{
if(fc!=null){
fc.close();
}
if(raf!=null){
raf.close();
}
fc =null;
raf =null;
}
}
/**
* 向一个文本文件追加文本内容,采用默认字符编码
* @param fileName 文件名
* @param content 追加的内容
* @param header 文件头内容
* @param tail 文件尾内容
* @throws Exception 违例
*/
public static synchronized void append(String fileName,String content,String header,String tail) throws Exception{
append(fileName,content,header,tail,DEFAULT_ENCODING);
}
/**
* 向一个文本文件追加文本内容
* @param fileName 文件名
* @param content 追加的内容
* @param header 文件头内容
* @param tail 文件尾内容
* @param encoding 追加内容字符编码
* @throws Exception 违例
*/
public static synchronized void append(String fileName,String content,String header,String tail,String encoding) throws Exception{
RandomAccessFile raf =null;
FileChannel fc =null;
boolean isNewFile =false;
try {
raf =new RandomAccessFile(fileName,"rw");
fc =raf.getChannel();
if(fc.size()==0){
isNewFile =true;
}
ByteBuffer bb =ByteBuffer.wrap((content+tail).getBytes(encoding));
if(isNewFile){
fc.write(ByteBuffer.wrap(header.getBytes(encoding)));
fc.write(bb);
}else{
fc.position(fc.size()-tail.getBytes(encoding).length);
fc.write(bb);
}
} catch (Exception e) {
throw e;
}finally{
if(fc!=null){
fc.close();
}
if(raf!=null){
raf.close();
}
fc =null;
raf =null;
}
}
/**
* 读取一个文本文件的字符内容
* @param file 文件名
* @return 文件内容
* @throws FileNotFoundException 违例
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static String readString(String file) throws FileNotFoundException,UnsupportedEncodingException,IOException{
return readString(file,DEFAULT_ENCODING);
}
/**
* 读取一个文本文件的字符内容
* @param file 文件名
* @param encoding 文件字符编码
* @return 文件内容
* @throws FileNotFoundException 违例
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static String readString(String file,String encoding) throws FileNotFoundException,UnsupportedEncodingException,IOException{
return readString(new File(file),encoding);
}
/**
* 从文本文件中读取所有文本
* @param file 文件对象
* @return 文件内容
* @throws FileNotFoundException 违例
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static String readString(File file) throws FileNotFoundException,UnsupportedEncodingException,IOException{
return readString(new FileInputStream(file),DEFAULT_ENCODING);
}
/**
* 读取一个文本文件的字符内容
* @param file 文件名
* @param encoding 文件字符编码
* @param newLine 文本换行符
* @return 文件内容
* @throws FileNotFoundException 违例
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static String readString(String file,String encoding,String newLine) throws FileNotFoundException,UnsupportedEncodingException,IOException{
return readString(new File(file),encoding,newLine);
}
/**
* 从文本文件中读取所有文本
* @param file 文件对象
* @param encoding 文件字符编码
* @return 文件内容
* @throws FileNotFoundException 违例
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static String readString(File file,String encoding) throws FileNotFoundException,UnsupportedEncodingException,IOException{
return readString(new FileInputStream(file),encoding);
}
/**
* 从文本文件中读取所有文本
* @param file 文件对象
* @param encoding 文件字符编码
* @param newLine 换行符
* @return 文件内容
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static String readString(File file,String encoding,String newLine) throws UnsupportedEncodingException,IOException{
return readString(new FileInputStream(file),encoding,newLine);
}
/**
* 从文本输入流中读取所有文本
* @param inputstream 文本输入流
* @return 输入流中文本内容
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static String readString(InputStream inputstream) throws UnsupportedEncodingException,IOException{
return readString(inputstream,DEFAULT_ENCODING,NEW_LINE);
}
/**
* 从文本输入流中读取所有文本
* @param inputstream 文本输入流
* @param encoding 文件字符编码
* @return 输入流中文本内容
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static String readString(InputStream inputstream,String encoding) throws UnsupportedEncodingException,IOException{
return readString(inputstream,encoding,NEW_LINE);
}
/**
* 从文本输入流中读取所有文本
* @param inputstream 文本输入流
* @param encoding 文件字符编码
* @param newLine 换行符
* @return 输入流中文本内容
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static String readString(InputStream inputstream,String encoding,String newLine) throws UnsupportedEncodingException,IOException{
return readString(inputstream,encoding,NEW_LINE,true);
}
/**
* 从文本输入流中读取所有文本
* @param inputstream 文本输入流
* @param encoding 文件字符编码
* @param newLine 换行符
* @param isCloseInputStream 读取完毕后是否关闭输入流
* @return 输入流中文本内容
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static String readString(InputStream inputstream,String encoding,String newLine,boolean isCloseInputStream) throws UnsupportedEncodingException,IOException{
StringBuilder sb = new StringBuilder();
BufferedReader br =null;
try {
br = new BufferedReader(new InputStreamReader(inputstream,encoding));
String dataLine = "";
while (null != (dataLine = br.readLine())){
sb.append(dataLine);
sb.append(newLine==null?NEW_LINE:newLine);
}
return sb.toString();
} catch (UnsupportedEncodingException e) {
throw e;
} catch (IOException e) {
throw e;
}finally{
sb =null;
if(isCloseInputStream){
if(br!=null){
try {
br.close();
} catch (IOException e) {}
}
}
}
}
/**
* 采用默认字符编码从文件中读取所有文本列表列表中每个元素为一行
* @param file 文件名
* @return 所有文本列表
* @throws IOException 违例
*/
public static List<String> readStringAsList(String file) throws IOException{
return readStringAsList(new File(file),DEFAULT_ENCODING);
}
/**
* 采用指定字符编码从文件中读取所有文本列表列表中每个元素为一行
* @param file 文件名
* @param encoding 字符编码
* @return 所有文本列表
* @throws IOException 违例
*/
public static List<String> readStringAsList(String file,String encoding) throws IOException{
return readStringAsList(new File(file),encoding);
}
/**
* 采用默认字符编码从文件中读取所有文本列表列表中每个元素为一行
* @param file 文件对象
* @return 所有文本列表
* @throws IOException 违例
*/
public static List<String> readStringAsList(File file) throws IOException{
return readStringAsList(new FileInputStream(file),DEFAULT_ENCODING);
}
/**
* 采用指定字符编码从文件中读取所有文本列表列表中每个元素为一行
* @param file 文件对象
* @param encoding 字符编码
* @return 所有文本列表
* @throws IOException 违例
*/
public static List<String> readStringAsList(File file,String encoding) throws IOException{
return readStringAsList(new FileInputStream(file),encoding);
}
/**
* 采用默认字符编码从文本输入流中读取所有文本列表列表中每个元素为一行
* @param inputstream 文本输入流
* @return 所有文本列表
* @throws IOException 违例
*/
public static List<String> readStringAsList(InputStream inputstream) throws IOException{
return readStringAsList(inputstream,DEFAULT_ENCODING);
}
/**
* 采用指定字符编码从文本输入流中读取所有文本列表列表中每个元素为一行
* @param inputstream 文本输入流
* @param encoding 字符编码
* @return 所有文本列表
* @throws IOException 违例
*/
public static List<String> readStringAsList(InputStream inputstream,String encoding) throws IOException{
List<String> result =new ArrayList<String>();
BufferedReader br =null;
try {
br = new BufferedReader(new InputStreamReader(inputstream,encoding));
String dataLine = "";
while (null != (dataLine = br.readLine())){
result.add(dataLine);
}
return result;
} catch (IOException e) {
throw e;
}finally{
if(br!=null){
try {
br.close();
} catch (IOException e) {}
}
}
}
/**
* 读取文件最后多行数
* @param filename 文件名
* @param row 行数
* @return 文件最后多行数
* @throws Exception 违例
*/
public static String readStringAsLastRow(String filename,int row) throws Exception{
return readStringAsLastRow(new File(filename),row);
}
/**
* 读取文件最后行数
* @param file 文件名
* @param row 行数
* @return 文件最后行数
* @throws Exception 违例
*/
public static String readStringAsLastRow(File file,int row) throws Exception{
RandomAccessFile rf =null;
try {
rf = new RandomAccessFile(file, "r");
long len = rf.length();
if (len == 0) {
return "";
}
int _row = 0;
while (len > 0 && _row < row) {
len--;
rf.seek(len);
if (rf.readByte() == '\n') {
//pos=rf.getFilePointer();
_row++;
}
}
StringBuffer buffer = new StringBuffer();
String str = "";
while ((str = rf.readLine()) != null) {
buffer.append(new String(str.getBytes("ISO-8859-1"),"UTF-8")).append("\n");
}
return buffer.toString();
} catch (Exception e) {
throw e;
} finally{
if(rf!=null){
rf.close();
}
}
}
/**
* 将字符串以默认编码写入指定的文件中
* @param file 文件名
* @param content 写入内容
* @throws FileNotFoundException 违例
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static void writeString(String file,String content) throws FileNotFoundException,UnsupportedEncodingException,IOException{
writeString(file,content,DEFAULT_ENCODING);
}
/**
* 将字符串以特定编码写入指定的文件中
* @param file 文件名
* @param content 写入内容
* @param encoding 内容编码
* @throws FileNotFoundException 违例
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static void writeString(String file,String content,String encoding) throws FileNotFoundException,UnsupportedEncodingException,IOException{
writeString(new File(file),content,encoding);
}
/**
* 将字符串以特定编码写入指定的文件中
* @param file 文件对象
* @param content 写入内容
* @param encoding 内容编码
* @throws FileNotFoundException 违例
* @throws UnsupportedEncodingException 违例
* @throws IOException 违例
*/
public static void writeString(File file,String content,String encoding) throws FileNotFoundException,UnsupportedEncodingException,IOException{
OutputStreamWriter writer =null;
try {
writer =new OutputStreamWriter(new FileOutputStream(file),encoding);
writer.write(content);
} catch (UnsupportedEncodingException e) {
throw e;
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
throw e;
}finally{
if(writer!=null){
try {
writer.close();
} catch (IOException e) {}
}
}
}
/**
* 获取某个目录下的所有扩展名为includes的文件
* @param dir 路径
* @param includes 扩展名数组
* @return 所有文件集合
*/
public static List<File> listAllFile(File dir,String[] includes){
List<File> result =new ArrayList<File>();
File[] files =dir.listFiles();
if(files!=null && files.length>0) {
for(int i=0;i<files.length;i++){
File file =files[i];
if(file.isDirectory()){
result.addAll(listAllFile(file,includes));
}else{
for(String include : includes){
if(file.getName().endsWith(include)){
result.add(file);
break;
}
}
}
}
}
Collections.sort(result, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
return o1.getName().compareTo(o2.getName());
}
});
return result;
}
/**
* 移除目录路径的最后分隔符
* @param path 目录路径
* @return 无文件分隔符的文件路径
*/
public static String removePathEndSeparator(String path){
char lastChar =path.charAt(path.length()-1);
while(lastChar=='\\' || lastChar=='/'){
path =path.substring(0,path.length()-1);
lastChar =path.charAt(path.length()-1);
}
return path;
}
/**
* 创建目录可同时创建多级目录
* @param dir 目录路径能够
*/
public static void mkdirs(String dir){
File file =new File(dir);
if(!file.exists()){
file.mkdirs();
}
}
/**
* 递归删除文件夹及其子文件
* @param dir 文件夹
*/
public static void deldirs(String dir){
deldirs(new File(dir));
}
/**
* 递归删除文件夹及其子文件
* @param dir 文件夹
*/
public static void deldirs(File dir){
if(dir.isDirectory()){
File[] files =dir.listFiles();
if(files!=null && files.length>0){
for(File file : files){
deldirs(file);
}
}
dir.delete();
}else{
dir.delete();
}
}
/**
* 拷贝文件
* @param src 源文件
* @param target 目标文件
* @throws IOException 违例
*/
public static void copyFile(InputStream src,String target) throws IOException{
copyFile(src,new File(target));
}
/**
* 拷贝文件
* @param src 源输入流
* @param target 目标文件对象
* @throws IOException 违例
*/
public static void copyFile(InputStream src,File target) throws IOException{
File parentFile =target.getParentFile();
if(!parentFile.exists()){
parentFile.mkdirs();
}
OutputStream os =null;
byte[] buf = new byte[1024];
try {
os = new FileOutputStream(target);
int read =-1;
while ((read = src.read(buf)) != -1) {
os.write(buf, 0, read);
}
} catch (IOException e) {
throw e;
} finally{
try{if(src!=null)src.close();}catch(Exception e){throw new IOException(e);}
try{if(os!=null)os.close();}catch(Exception e){throw new IOException(e);}
buf =null;
}
}
/**
* 拷贝文件
* @param src 源输入流
* @param os 目标输出流
* @throws IOException 违例
*/
public static void copyFile(InputStream src,OutputStream os) throws IOException{
byte[] buf = new byte[1024];
try {
int read =-1;
while ((read = src.read(buf)) != -1) {
os.write(buf, 0, read);
}
} catch (IOException e) {
throw e;
} finally{
try{if(src!=null)src.close();}catch(Exception e){throw new IOException(e);}
try{if(os!=null)os.close();}catch(Exception e){throw new IOException(e);}
buf =null;
}
}
/**
* 拷贝文件
* @param src 源文件对象
* @param target 目标文件对象
* @throws IOException 违例
*/
public static void copyFile(File src,File target) throws IOException{
if(!target.getParentFile().exists()){
target.getParentFile().mkdirs();
}
InputStream is =new FileInputStream(src);
OutputStream os =new FileOutputStream(target);
byte[] buf = new byte[40960];
int read =-1;
try {
while ((read = is.read(buf)) != -1) {
os.write(buf, 0, read);
}
} catch (IOException e) {
throw e;
} finally{
try{if(is!=null)is.close();}catch(Exception e){throw new IOException(e);}
try{if(os!=null)os.close();}catch(Exception e){throw new IOException(e);}
buf =null;
}
}
/**
* 拷贝文件
* @param src 源文件
* @param target 目标文件
* @throws IOException 违例
*/
public static void copyFile(String src,String target) throws IOException{
copyFile(new File(src),new File(target));
}
}

227
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/HttpRequestUtil.java

@ -0,0 +1,227 @@
package io.sc.engine.rule.core.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Map;
/**
* 简单 HTTP 请求工具类
* @author wangshaoping
*
*/
public class HttpRequestUtil {
/**
* 发送 GET 请求
* @param url 请求URL
* @return 返回结果
* @throws Exception 违例
*/
public static String get(String url) throws Exception{
return get(url,"");
}
/**
* 发送 GET 请求
* @param url 请求URL
* @param key 参数名
* @param value 参数值
* @return 返回结果
* @throws Exception 违例
*/
public static String get(String url,String key,String value) throws Exception{
if(key!=null && key.trim().length()>0) {
if(value!=null && value.length()>0) {
return get(url,key + "=" + URLEncoder.encode(value, "UTF-8"));
}else {
return get(url,key + "=");
}
}
return get(url);
}
/**
* 发送 GET 请求
* @param url 请求URL
* @param parameters 请求参数
* @return 返回结果
* @throws Exception 违例
*/
public static String get(String url,Map<String,String> parameters) throws Exception{
StringBuilder sb =new StringBuilder();
if(parameters!=null && parameters.size()>0) {
for(String key : parameters.keySet()) {
String value =parameters.get(key);
if(value!=null && value.length()>0) {
sb.append(key).append("=").append(URLEncoder.encode(value, "UTF-8")).append("&");
}else {
sb.append(key).append("=").append("&");
}
}
if(sb.length()>0) {
sb.setLength(sb.length()-1);
}
}
return get(sb.toString());
}
/**
* 发送 GET 请求
* @param url 请求URL
* @param encodedParametersString 编码后的参数串
* @return 返回结果
* @throws Exception 违例
*/
public static String get(String url,String encodedParametersString) throws Exception{
if(url==null || url.trim().length()==0) {
throw new IllegalArgumentException("url is null");
}
BufferedReader in = null;
try {
URL getUrl =getEncodedUrl(url,encodedParametersString);
if(getUrl!=null) {
URLConnection connection = getUrl.openConnection();
connection.setRequestProperty("accept", "application/json");
connection.setRequestProperty("Accept-Charset", "utf-8");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
connection.connect();
in = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
StringBuilder sb =new StringBuilder();
String line =null;
while ((line = in.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
return null;
} catch (Exception e) {
throw e;
}
finally {
try {if (in != null) { in.close(); }} catch (IOException e) {}
}
}
/**
* 发送 POST 请求
* @param url 请求URL
* @param key 参数名
* @param value 参数值
* @param data post 数据
* @return 返回结果
* @throws Exception 违例
*/
public static String post(String url,String key,String value,String data) throws Exception{
if(key!=null && key.trim().length()>0) {
if(value!=null && value.length()>0) {
return post(url,key + "=" + URLEncoder.encode(value, "UTF-8"),data);
}else {
return post(url,key + "=",data);
}
}
return post(url,"",data);
}
/**
* 发送 POST 请求
* @param url 请求URL
* @param parameters URL请求参数
* @param data post 数据
* @return 返回结果
* @throws Exception 违例
*/
public static String post(String url,Map<String,String> parameters,String data) throws Exception{
StringBuilder sb =new StringBuilder();
if(parameters!=null && parameters.size()>0) {
for(String key : parameters.keySet()) {
String value =parameters.get(key);
if(value!=null && value.length()>0) {
sb.append(key).append("=").append(URLEncoder.encode(value, "UTF-8")).append("&");
}else {
sb.append(key).append("=").append("&");
}
}
if(sb.length()>0) {
sb.setLength(sb.length()-1);
}
}
return post(url,sb.toString(),data);
}
/**
* 发送 POST 请求
* @param url 请求URL
* @param encodedParametersString 编码后的参数串
* @param data post 数据
* @return 返回结果
* @throws Exception 违例
*/
public static String post(String url, String encodedParametersString,String data) throws Exception{
if(url==null || url.trim().length()==0) {
throw new IllegalArgumentException("url is null");
}
PrintWriter out = null;
BufferedReader in = null;
StringBuilder sb =new StringBuilder();
try {
URL postUrl =getEncodedUrl(url,encodedParametersString);
if(postUrl!=null) {
URLConnection conn = postUrl.openConnection();
conn.setRequestProperty("accept", "application/json");
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(data);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
}
} catch (Exception e) {
throw e;
}
//使用finally块来关闭输出流、输入流
finally{
try {if (in != null) { in.close(); }} catch (IOException e) {}
if(out!=null) {out.close();}
}
return sb.toString();
}
private static URL getEncodedUrl(String url, String encodedParametersString) throws MalformedURLException {
if(url!=null && url.length()>0) {
if(encodedParametersString!=null && encodedParametersString.length()>0) {
if(url.indexOf('?')>-1) {//url 中有 ?号
if(url.indexOf('?')==(url.length()-1)) {//最后一个是 ?号
return new URL(url + encodedParametersString);
}else {
return new URL(url + "&" + encodedParametersString);
}
}else {
return new URL(url + "?" + encodedParametersString);
}
}else {
return new URL(url);
}
}
return null;
}
}

7
io.sc.engine.rule.frontend/frontend-register.json

@ -0,0 +1,7 @@
{
"enable": false,
"protocol": "http",
"host": "localhost",
"port": 8080,
"path": "/api/mvc/frontend/regist"
}

5
io.sc.engine.rule.frontend/public/favicon.svg

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="blue" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M9.482 9.341c-.069.062-.17.153-.17.309 0 .162.107.325.3.456.877.613 2.521.54 2.592.538h.002c.667 0 1.32-.18 1.894-.519A3.838 3.838 0 0 0 16 6.819c.018-1.316-.44-2.218-.666-2.664l-.04-.08C13.963 1.487 11.106 0 8 0A8 8 0 0 0 .473 5.29C1.488 4.048 3.183 3.262 5 3.262c2.83 0 5.01 1.885 5.01 4.797h-.004v.002c0 .338-.168.832-.487 1.244l.006-.006a.594.594 0 0 1-.043.041Z"/>
<path d="M.01 7.753a8.137 8.137 0 0 0 .753 3.641 8 8 0 0 0 6.495 4.564 5.21 5.21 0 0 1-.785-.377h-.01l-.12-.075a5.45 5.45 0 0 1-1.56-1.463A5.543 5.543 0 0 1 6.81 5.8l.01-.004.025-.012c.208-.098.62-.292 1.167-.285.129.001.257.012.384.033a4.037 4.037 0 0 0-.993-.698l-.01-.005C6.348 4.282 5.199 4.263 5 4.263c-2.44 0-4.824 1.634-4.99 3.49Zm10.263 7.912c.088-.027.177-.054.265-.084-.102.032-.204.06-.307.086l.042-.002Z"/>
<path d="M10.228 15.667a5.21 5.21 0 0 0 .303-.086l.082-.025a8.019 8.019 0 0 0 4.162-3.3.25.25 0 0 0-.331-.35c-.215.112-.436.21-.663.294a6.367 6.367 0 0 1-2.243.4c-2.957 0-5.532-2.031-5.532-4.644.002-.135.017-.268.046-.399a4.543 4.543 0 0 0-.46 5.898l.003.005c.315.441.707.821 1.158 1.121h.003l.144.09c.877.55 1.721 1.078 3.328.996Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/HanaleiFill-Regular.ttf

Binary file not shown.

BIN
io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/FontAwesome.otf

Binary file not shown.

BIN
io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.eot

Binary file not shown.

2671
io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 434 KiB

BIN
io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.ttf

Binary file not shown.

BIN
io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.woff

Binary file not shown.

BIN
io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.woff2

Binary file not shown.

BIN
io.sc.engine.rule.frontend/public/webjars/luckysheet/2.1.13/plugins/images/icon_dropCell.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

0
io.sc.engine.rule.sample/gradle.properties

49
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/entity/FolderDictionaryEntity.java

@ -0,0 +1,49 @@
package io.sc.engine.rule.server.dictionary.entity;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.DictionaryType;
import io.sc.engine.rule.server.dictionary.vo.FolderDictionaryVo;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 文件夹实体类
*/
@Entity
@DiscriminatorValue("FOLDER")
@JsonTypeName("FOLDER")
public class FolderDictionaryEntity extends DictionaryEntity {
@Override
public FolderDictionaryVo toVo() {
FolderDictionaryVo vo =new FolderDictionaryVo();
super.toVo(vo);
return vo;
}
public FolderDictionaryEntity() {}
public FolderDictionaryEntity(String id) {
this.id =id;
}
@Override
public DictionaryType getType() {
return DictionaryType.FOLDER;
}
@Override
public String toString() {
return "FolderDictionaryEntity ["
+ " type=" + type
+ " id=" + id
+ ", code=" + code
+ ", name=" + name
+ ", description=" + description
+ ", order=" + order
+ ", creator=" + creator
+ ", createDate=" + createDate
+ ", lastModifier=" + lastModifier
+ ", lastModifyDate=" + lastModifyDate
+ "]";
}
}

26
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/exception/FolderAlreadyExistsException.java

@ -0,0 +1,26 @@
package io.sc.engine.rule.server.dictionary.exception;
/**
* 数据字典文件夹已经存在违例类
*/
public class FolderAlreadyExistsException extends RuntimeException{
public FolderAlreadyExistsException() {
super();
}
public FolderAlreadyExistsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public FolderAlreadyExistsException(String message, Throwable cause) {
super(message, cause);
}
public FolderAlreadyExistsException(String message) {
super(message);
}
public FolderAlreadyExistsException(Throwable cause) {
super(cause);
}
}

18
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/vo/FolderDictionaryVo.java

@ -0,0 +1,18 @@
package io.sc.engine.rule.server.dictionary.vo;
import io.sc.engine.rule.core.enums.DictionaryType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 文件夹 VO
*/
@Entity
@DiscriminatorValue("FOLDER")
public class FolderDictionaryVo extends DictionaryVo {
@Override
public DictionaryType getType() {
return DictionaryType.FOLDER;
}
}

52
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/FolderLibEntity.java

@ -0,0 +1,52 @@
package io.sc.engine.rule.server.lib.entity;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.LibType;
import io.sc.engine.rule.server.lib.vo.FolderLibVo;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 文件夹实体类
* @author wangshaoping
*
*/
@Entity
@DiscriminatorValue("FOLDER")
@JsonTypeName("FOLDER")
public class FolderLibEntity extends LibEntity {
@Override
public FolderLibVo toVo() {
FolderLibVo vo =new FolderLibVo();
super.toVo(vo);
return vo;
}
public FolderLibEntity() {}
public FolderLibEntity(String id) {
this.id =id;
}
@Override
public LibType getType() {
return LibType.FOLDER;
}
@Override
public String toString() {
return "FolderLibEntity ["
+ " type=" + type
+ " id=" + id
+ ", code=" + code
+ ", name=" + name
+ ", description=" + description
+ ", order=" + order
+ ", creator=" + creator
+ ", createDate=" + createDate
+ ", lastModifier=" + lastModifier
+ ", lastModifyDate=" + lastModifyDate
+ "]";
}
}

58
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/processor/GroovyScriptIndicatorProcessorEntity.java

@ -0,0 +1,58 @@
package io.sc.engine.rule.server.lib.entity.processor;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.server.lib.entity.IndicatorProcessorEntity;
import io.sc.engine.rule.server.lib.vo.processor.GroovyScriptIndicatorProcessorVo;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import java.util.Map;
/**
* 指标处理器脚本代码操作实体类
*/
@Entity
@DiscriminatorValue("GROOVY_SCRIPT")
@JsonTypeName("GROOVY_SCRIPT")
public class GroovyScriptIndicatorProcessorEntity extends IndicatorProcessorEntity {
//脚本代码
@Column(name="GROOVY_SCRIPT_")
private String groovyScript;
@Override
public GroovyScriptIndicatorProcessorVo toVo() {
GroovyScriptIndicatorProcessorVo vo =new GroovyScriptIndicatorProcessorVo();
super.toVo(vo);
vo.setType(this.getType());
vo.setGroovyScript(this.getGroovyScript());
return vo;
}
@Override
public ProcessorType getType() {
return ProcessorType.GROOVY_SCRIPT;
}
public String getGroovyScript() {
return groovyScript;
}
public void setGroovyScript(String groovyScript) {
this.groovyScript = groovyScript;
}
@Override
public boolean replace(Map<String, String> mapping) {
String replaced =ExpressionReplacer.replace(this.groovyScript, mapping);
replaced =(replaced==null?"":replaced);
boolean result =false;
if(!replaced.equals(this.groovyScript)) {
result =true;
}
this.groovyScript =replaced;
return result;
}
}

229
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/processor/HttpRequestIndicatorProcessorEntity.java

@ -0,0 +1,229 @@
package io.sc.engine.rule.server.lib.entity.processor;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.HttpAuthorizationType;
import io.sc.engine.rule.core.enums.HttpMethodType;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.server.lib.entity.IndicatorProcessorEntity;
import io.sc.engine.rule.server.lib.vo.processor.HttpRequestIndicatorProcessorVo;
import javax.persistence.*;
import java.util.Map;
/**
* 指标处理器Http请求操作实体类
*/
@Entity
@DiscriminatorValue("HTTP_REQUEST")
@JsonTypeName("HTTP_REQUEST")
public class HttpRequestIndicatorProcessorEntity extends IndicatorProcessorEntity {
// Method
@Column(name="HTTP_METHOD_")
@Enumerated(EnumType.STRING)
private HttpMethodType httpMethod;
// Url
@Column(name="HTTP_URL_")
private String httpUrl;
// 认证类型
@Column(name="HTTP_AUTH_TYPE_")
@Enumerated(EnumType.STRING)
private HttpAuthorizationType httpAuthType;
// Api Key's key
@Column(name="HTTP_AUTH_API_KEY_")
private String httpAuthApikey;
// Api Key's value
@Column(name="HTTP_AUTH_API_VALUE_")
private String httpAuthApiValue;
// Api Key's value
@Column(name="HTTP_AUTH_API_ADDTO_")
private String httpAuthApiAddTo;
@Column(name="HTTP_AUTH_BASIC_USERNAME_")
private String httpAuthBasicUsername;
@Column(name="HTTP_AUTH_BASIC_PASSWORD_")
private String httpAuthBasicPassword;
@Column(name="HTTP_AUTH_BEARER_TOKEN_")
private String httpAuthBearerToken;
@Column(name="HTTP_PARAMS_")
private String httpParams;
@Column(name="HTTP_BODY_")
private String httpBody;
@Column(name="HTTP_RESPONSE_MAPPING_")
private String httpResponseMapping;
@Override
public HttpRequestIndicatorProcessorVo toVo() {
HttpRequestIndicatorProcessorVo vo =new HttpRequestIndicatorProcessorVo();
super.toVo(vo);
vo.setType(this.getType());
vo.setHttpMethod(this.getHttpMethod());
vo.setHttpUrl(this.getHttpUrl());
vo.setHttpAuthType(this.getHttpAuthType());
vo.setHttpAuthApikey(this.getHttpAuthApikey());
vo.setHttpAuthApiValue(this.getHttpAuthApiValue());
vo.setHttpAuthApiAddTo(this.getHttpAuthApiAddTo());
vo.setHttpAuthBasicUsername(this.getHttpAuthBasicUsername());
vo.setHttpAuthBasicPassword(this.getHttpAuthBasicPassword());
vo.setHttpAuthBearerToken(this.getHttpAuthBearerToken());
vo.setHttpParams(this.getHttpParams());
vo.setHttpBody(this.getHttpBody());
vo.setHttpResponseMapping(this.getHttpResponseMapping());
return vo;
}
@Override
public ProcessorType getType() {
return ProcessorType.HTTP_REQUEST;
}
public HttpMethodType getHttpMethod() {
return httpMethod;
}
public void setHttpMethod(HttpMethodType httpMethod) {
this.httpMethod = httpMethod;
}
public String getHttpUrl() {
return httpUrl;
}
public void setHttpUrl(String httpUrl) {
this.httpUrl = httpUrl;
}
public HttpAuthorizationType getHttpAuthType() {
return httpAuthType;
}
public void setHttpAuthType(HttpAuthorizationType httpAuthType) {
this.httpAuthType = httpAuthType;
}
public String getHttpAuthApikey() {
return httpAuthApikey;
}
public void setHttpAuthApikey(String httpAuthApikey) {
this.httpAuthApikey = httpAuthApikey;
}
public String getHttpAuthApiValue() {
return httpAuthApiValue;
}
public void setHttpAuthApiValue(String httpAuthApiValue) {
this.httpAuthApiValue = httpAuthApiValue;
}
public String getHttpAuthApiAddTo() {
return httpAuthApiAddTo;
}
public void setHttpAuthApiAddTo(String httpAuthApiAddTo) {
this.httpAuthApiAddTo = httpAuthApiAddTo;
}
public String getHttpAuthBasicUsername() {
return httpAuthBasicUsername;
}
public void setHttpAuthBasicUsername(String httpAuthBasicUsername) {
this.httpAuthBasicUsername = httpAuthBasicUsername;
}
public String getHttpAuthBasicPassword() {
return httpAuthBasicPassword;
}
public void setHttpAuthBasicPassword(String httpAuthBasicPassword) {
this.httpAuthBasicPassword = httpAuthBasicPassword;
}
public String getHttpAuthBearerToken() {
return httpAuthBearerToken;
}
public void setHttpAuthBearerToken(String httpAuthBearerToken) {
this.httpAuthBearerToken = httpAuthBearerToken;
}
public String getHttpParams() {
return httpParams;
}
public void setHttpParams(String httpParams) {
this.httpParams = httpParams;
}
public String getHttpBody() {
return httpBody;
}
public void setHttpBody(String httpBody) {
this.httpBody = httpBody;
}
public String getHttpResponseMapping() {
return httpResponseMapping;
}
public void setHttpResponseMapping(String httpResponseMapping) {
this.httpResponseMapping = httpResponseMapping;
}
@Override
public boolean replace(Map<String, String> mapping) {
String replaced =ExpressionReplacer.replace(this.httpParams, mapping);
replaced =(replaced==null?"":replaced);
boolean result =false;
if(!replaced.equals(this.httpParams)) {
result =true;
}
this.httpParams =replaced;
replaced =ExpressionReplacer.replace(this.httpResponseMapping, mapping);
replaced =(replaced==null?"":replaced);
if(!replaced.equals(this.httpResponseMapping)) {
result =true;
}
this.httpResponseMapping =replaced;
return result;
}
}

30
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/validator/FalseIndicatorValidatorEntity.java

@ -0,0 +1,30 @@
package io.sc.engine.rule.server.lib.entity.validator;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.server.lib.entity.IndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.vo.validator.FalseIndicatorValidatorVo;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 验证器实体类
*/
@Entity
@DiscriminatorValue("FALSE")
@JsonTypeName("FALSE")
public class FalseIndicatorValidatorEntity extends IndicatorValidatorEntity {
@Override
public FalseIndicatorValidatorVo toVo() {
FalseIndicatorValidatorVo vo =new FalseIndicatorValidatorVo();
super.toVo(vo);
vo.setType(this.getType());
return vo;
}
@Override
public ValidatorType getType() {
return ValidatorType.FALSE;
}
}

26
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/exception/FolderAlreadyExistsException.java

@ -0,0 +1,26 @@
package io.sc.engine.rule.server.lib.exception;
/**
* 库文件夹已经存在违例类
*/
public class FolderAlreadyExistsException extends RuntimeException{
public FolderAlreadyExistsException() {
super();
}
public FolderAlreadyExistsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public FolderAlreadyExistsException(String message, Throwable cause) {
super(message, cause);
}
public FolderAlreadyExistsException(String message) {
super(message);
}
public FolderAlreadyExistsException(Throwable cause) {
super(cause);
}
}

13
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/FolderLibVo.java

@ -0,0 +1,13 @@
package io.sc.engine.rule.server.lib.vo;
import io.sc.engine.rule.core.enums.LibType;
/**
* 文件夹实体类
*/
public class FolderLibVo extends LibVo {
@Override
public LibType getType() {
return LibType.FOLDER;
}
}

25
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/processor/GroovyScriptIndicatorProcessorVo.java

@ -0,0 +1,25 @@
package io.sc.engine.rule.server.lib.vo.processor;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.server.lib.vo.IndicatorProcessorVo;
/**
* 指标处理器脚本代码操作Vo
*/
public class GroovyScriptIndicatorProcessorVo extends IndicatorProcessorVo {
//脚本代码
private String groovyScript;
@Override
public ProcessorType getType() {
return ProcessorType.GROOVY_SCRIPT;
}
public String getGroovyScript() {
return groovyScript;
}
public void setGroovyScript(String groovyScript) {
this.groovyScript = groovyScript;
}
}

167
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/processor/HttpRequestIndicatorProcessorVo.java

@ -0,0 +1,167 @@
package io.sc.engine.rule.server.lib.vo.processor;
import io.sc.engine.rule.core.enums.HttpAuthorizationType;
import io.sc.engine.rule.core.enums.HttpMethodType;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.server.lib.vo.IndicatorProcessorVo;
/**
* 指标处理器Http请求操作Vo
*/
public class HttpRequestIndicatorProcessorVo extends IndicatorProcessorVo {
// Method
private HttpMethodType httpMethod;
// Url
private String httpUrl;
// 认证类型
private HttpAuthorizationType httpAuthType;
// Api Key's key
private String httpAuthApikey;
// Api Key's value
private String httpAuthApiValue;
// Api Key's value
private String httpAuthApiAddTo;
private String httpAuthBasicUsername;
private String httpAuthBasicPassword;
private String httpAuthBearerToken;
private String httpParams;
private String httpBody;
private String httpResponseMapping;
@Override
public ProcessorType getType() {
return ProcessorType.HTTP_REQUEST;
}
public HttpMethodType getHttpMethod() {
return httpMethod;
}
public void setHttpMethod(HttpMethodType httpMethod) {
this.httpMethod = httpMethod;
}
public String getHttpUrl() {
return httpUrl;
}
public void setHttpUrl(String httpUrl) {
this.httpUrl = httpUrl;
}
public HttpAuthorizationType getHttpAuthType() {
return httpAuthType;
}
public void setHttpAuthType(HttpAuthorizationType httpAuthType) {
this.httpAuthType = httpAuthType;
}
public String getHttpAuthApikey() {
return httpAuthApikey;
}
public void setHttpAuthApikey(String httpAuthApikey) {
this.httpAuthApikey = httpAuthApikey;
}
public String getHttpAuthApiValue() {
return httpAuthApiValue;
}
public void setHttpAuthApiValue(String httpAuthApiValue) {
this.httpAuthApiValue = httpAuthApiValue;
}
public String getHttpAuthApiAddTo() {
return httpAuthApiAddTo;
}
public void setHttpAuthApiAddTo(String httpAuthApiAddTo) {
this.httpAuthApiAddTo = httpAuthApiAddTo;
}
public String getHttpAuthBasicUsername() {
return httpAuthBasicUsername;
}
public void setHttpAuthBasicUsername(String httpAuthBasicUsername) {
this.httpAuthBasicUsername = httpAuthBasicUsername;
}
public String getHttpAuthBasicPassword() {
return httpAuthBasicPassword;
}
public void setHttpAuthBasicPassword(String httpAuthBasicPassword) {
this.httpAuthBasicPassword = httpAuthBasicPassword;
}
public String getHttpAuthBearerToken() {
return httpAuthBearerToken;
}
public void setHttpAuthBearerToken(String httpAuthBearerToken) {
this.httpAuthBearerToken = httpAuthBearerToken;
}
public String getHttpParams() {
return httpParams;
}
public void setHttpParams(String httpParams) {
this.httpParams = httpParams;
}
public String getHttpBody() {
return httpBody;
}
public void setHttpBody(String httpBody) {
this.httpBody = httpBody;
}
public String getHttpResponseMapping() {
return httpResponseMapping;
}
public void setHttpResponseMapping(String httpResponseMapping) {
this.httpResponseMapping = httpResponseMapping;
}
}

14
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/validator/FalseIndicatorValidatorVo.java

@ -0,0 +1,14 @@
package io.sc.engine.rule.server.lib.vo.validator;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.server.lib.vo.IndicatorValidatorVo;
/**
* 验证器Vo
*/
public class FalseIndicatorValidatorVo extends IndicatorValidatorVo {
@Override
public ValidatorType getType() {
return ValidatorType.FALSE;
}
}

59
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/ExecutionFlowParameterProcessorEntity.java

@ -0,0 +1,59 @@
package io.sc.engine.rule.server.model.entity.processor;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity;
import io.sc.engine.rule.server.model.vo.processor.ExecutionFlowParameterProcessorVo;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import java.util.Map;
/**
* 模型参数处理器执行流实体类
* @author wangshaoping
*
*/
@Entity
@DiscriminatorValue("EXECUTION_FLOW")
@JsonTypeName("EXECUTION_FLOW")
public class ExecutionFlowParameterProcessorEntity extends ParameterProcessorEntity {
//执行流
@Column(name="EXECUTION_FLOW_")
private String executionFlow;
@Override
public ExecutionFlowParameterProcessorVo toVo() {
ExecutionFlowParameterProcessorVo vo =new ExecutionFlowParameterProcessorVo();
super.toVo(vo);
vo.setExecutionFlow(this.getExecutionFlow());
return vo;
}
@Override
public ProcessorType getType() {
return ProcessorType.EXECUTION_FLOW;
}
public String getExecutionFlow() {
return executionFlow;
}
public void setExecutionFlow(String executionFlow) {
this.executionFlow = executionFlow;
}
@Override
public boolean replace(Map<String, String> mapping) {
String replaced =ExpressionReplacer.replace(this.executionFlow, mapping);
replaced =(replaced==null?"":replaced);
boolean result =false;
if(!replaced.equals(this.executionFlow)) {
result =true;
}
this.executionFlow =replaced;
return result;
}
}

57
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/GroovyScriptParameterProcessorEntity.java

@ -0,0 +1,57 @@
package io.sc.engine.rule.server.model.entity.processor;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity;
import io.sc.engine.rule.server.model.vo.processor.GroovyScriptParameterProcessorVo;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import java.util.Map;
/**
* 模型参数处理器脚本代码操作实体类
*/
@Entity
@DiscriminatorValue("GROOVY_SCRIPT")
@JsonTypeName("GROOVY_SCRIPT")
public class GroovyScriptParameterProcessorEntity extends ParameterProcessorEntity {
//脚本代码
@Column(name="GROOVY_SCRIPT_")
private String groovyScript;
@Override
public GroovyScriptParameterProcessorVo toVo() {
GroovyScriptParameterProcessorVo vo =new GroovyScriptParameterProcessorVo();
super.toVo(vo);
vo.setGroovyScript(this.getGroovyScript());
return vo;
}
@Override
public ProcessorType getType() {
return ProcessorType.GROOVY_SCRIPT;
}
public String getGroovyScript() {
return groovyScript;
}
public void setGroovyScript(String groovyScript) {
this.groovyScript = groovyScript;
}
@Override
public boolean replace(Map<String, String> mapping) {
String replaced =ExpressionReplacer.replace(this.groovyScript, mapping);
replaced =(replaced==null?"":replaced);
boolean result =false;
if(!replaced.equals(this.groovyScript)) {
result =true;
}
this.groovyScript =replaced;
return result;
}
}

227
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/HttpRequestParameterProcessorEntity.java

@ -0,0 +1,227 @@
package io.sc.engine.rule.server.model.entity.processor;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.HttpAuthorizationType;
import io.sc.engine.rule.core.enums.HttpMethodType;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity;
import io.sc.engine.rule.server.model.vo.processor.HttpRequestParameterProcessorVo;
import javax.persistence.*;
import java.util.Map;
/**
* 模型参数处理器Http 请求操作实体类
*/
@Entity
@DiscriminatorValue("HTTP_REQUEST")
@JsonTypeName("HTTP_REQUEST")
public class HttpRequestParameterProcessorEntity extends ParameterProcessorEntity {
// Method
@Column(name="HTTP_METHOD_")
@Enumerated(EnumType.STRING)
private HttpMethodType httpMethod;
// Url
@Column(name="HTTP_URL_")
private String httpUrl;
// 认证类型
@Column(name="HTTP_AUTH_TYPE_")
@Enumerated(EnumType.STRING)
private HttpAuthorizationType httpAuthType;
// Api Key's key
@Column(name="HTTP_AUTH_API_KEY_")
private String httpAuthApikey;
// Api Key's value
@Column(name="HTTP_AUTH_API_VALUE_")
private String httpAuthApiValue;
// Api Key's value
@Column(name="HTTP_AUTH_API_ADDTO_")
private String httpAuthApiAddTo;
@Column(name="HTTP_AUTH_BASIC_USERNAME_")
private String httpAuthBasicUsername;
@Column(name="HTTP_AUTH_BASIC_PASSWORD_")
private String httpAuthBasicPassword;
@Column(name="HTTP_AUTH_BEARER_TOKEN_")
private String httpAuthBearerToken;
@Column(name="HTTP_PARAMS_")
private String httpParams;
@Column(name="HTTP_BODY_")
private String httpBody;
@Column(name="HTTP_RESPONSE_MAPPING_")
private String httpResponseMapping;
@Override
public HttpRequestParameterProcessorVo toVo() {
HttpRequestParameterProcessorVo vo =new HttpRequestParameterProcessorVo();
super.toVo(vo);
vo.setHttpUrl(this.getHttpUrl());
vo.setHttpAuthType(this.getHttpAuthType());
vo.setHttpAuthApikey(this.getHttpAuthApikey());
vo.setHttpAuthApiValue(this.getHttpAuthApiValue());
vo.setHttpAuthApiAddTo(this.getHttpAuthApiAddTo());
vo.setHttpAuthBasicUsername(this.getHttpAuthBasicUsername());
vo.setHttpAuthBasicPassword(this.getHttpAuthBasicPassword());
vo.setHttpAuthBearerToken(this.getHttpAuthBearerToken());
vo.setHttpParams(this.getHttpParams());
vo.setHttpBody(this.getHttpBody());
vo.setHttpResponseMapping(this.getHttpResponseMapping());
return vo;
}
@Override
public ProcessorType getType() {
return ProcessorType.HTTP_REQUEST;
}
public HttpMethodType getHttpMethod() {
return httpMethod;
}
public void setHttpMethod(HttpMethodType httpMethod) {
this.httpMethod = httpMethod;
}
public String getHttpUrl() {
return httpUrl;
}
public void setHttpUrl(String httpUrl) {
this.httpUrl = httpUrl;
}
public HttpAuthorizationType getHttpAuthType() {
return httpAuthType;
}
public void setHttpAuthType(HttpAuthorizationType httpAuthType) {
this.httpAuthType = httpAuthType;
}
public String getHttpAuthApikey() {
return httpAuthApikey;
}
public void setHttpAuthApikey(String httpAuthApikey) {
this.httpAuthApikey = httpAuthApikey;
}
public String getHttpAuthApiValue() {
return httpAuthApiValue;
}
public void setHttpAuthApiValue(String httpAuthApiValue) {
this.httpAuthApiValue = httpAuthApiValue;
}
public String getHttpAuthApiAddTo() {
return httpAuthApiAddTo;
}
public void setHttpAuthApiAddTo(String httpAuthApiAddTo) {
this.httpAuthApiAddTo = httpAuthApiAddTo;
}
public String getHttpAuthBasicUsername() {
return httpAuthBasicUsername;
}
public void setHttpAuthBasicUsername(String httpAuthBasicUsername) {
this.httpAuthBasicUsername = httpAuthBasicUsername;
}
public String getHttpAuthBasicPassword() {
return httpAuthBasicPassword;
}
public void setHttpAuthBasicPassword(String httpAuthBasicPassword) {
this.httpAuthBasicPassword = httpAuthBasicPassword;
}
public String getHttpAuthBearerToken() {
return httpAuthBearerToken;
}
public void setHttpAuthBearerToken(String httpAuthBearerToken) {
this.httpAuthBearerToken = httpAuthBearerToken;
}
public String getHttpParams() {
return httpParams;
}
public void setHttpParams(String httpParams) {
this.httpParams = httpParams;
}
public String getHttpBody() {
return httpBody;
}
public void setHttpBody(String httpBody) {
this.httpBody = httpBody;
}
public String getHttpResponseMapping() {
return httpResponseMapping;
}
public void setHttpResponseMapping(String httpResponseMapping) {
this.httpResponseMapping = httpResponseMapping;
}
@Override
public boolean replace(Map<String, String> mapping) {
String replaced =ExpressionReplacer.replace(this.httpParams, mapping);
replaced =(replaced==null?"":replaced);
boolean result =false;
if(!replaced.equals(this.httpParams)) {
result =true;
}
this.httpParams =replaced;
replaced =ExpressionReplacer.replace(this.httpResponseMapping, mapping);
replaced =(replaced==null?"":replaced);
if(!replaced.equals(this.httpResponseMapping)) {
result =true;
}
this.httpResponseMapping =replaced;
return result;
}
}

29
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/validator/FalseParameterValidatorEntity.java

@ -0,0 +1,29 @@
package io.sc.engine.rule.server.model.entity.validator;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.server.model.entity.ParameterValidatorEntity;
import io.sc.engine.rule.server.model.vo.validator.FalseParameterValidatorVo;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 验证器实体类
*/
@Entity
@DiscriminatorValue("FALSE")
@JsonTypeName("FALSE")
public class FalseParameterValidatorEntity extends ParameterValidatorEntity {
@Override
public FalseParameterValidatorVo toVo() {
FalseParameterValidatorVo vo =new FalseParameterValidatorVo();
super.toVo(vo);
return vo;
}
@Override
public ValidatorType getType() {
return ValidatorType.FALSE;
}
}

26
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/processor/ExecutionFlowParameterProcessorVo.java

@ -0,0 +1,26 @@
package io.sc.engine.rule.server.model.vo.processor;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.server.model.vo.ParameterProcessorVo;
/**
* 模型参数处理器执行流Vo
*/
public class ExecutionFlowParameterProcessorVo extends ParameterProcessorVo {
//执行流
private String executionFlow;
@Override
public ProcessorType getType() {
return ProcessorType.EXECUTION_FLOW;
}
public String getExecutionFlow() {
return executionFlow;
}
public void setExecutionFlow(String executionFlow) {
this.executionFlow = executionFlow;
}
}

26
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/processor/GroovyScriptParameterProcessorVo.java

@ -0,0 +1,26 @@
package io.sc.engine.rule.server.model.vo.processor;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.server.model.vo.ParameterProcessorVo;
/**
* 模型参数处理器脚本代码操作Vo
*/
public class GroovyScriptParameterProcessorVo extends ParameterProcessorVo {
//脚本代码
private String groovyScript;
@Override
public ProcessorType getType() {
return ProcessorType.GROOVY_SCRIPT;
}
public String getGroovyScript() {
return groovyScript;
}
public void setGroovyScript(String groovyScript) {
this.groovyScript = groovyScript;
}
}

167
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/processor/HttpRequestParameterProcessorVo.java

@ -0,0 +1,167 @@
package io.sc.engine.rule.server.model.vo.processor;
import io.sc.engine.rule.core.enums.HttpAuthorizationType;
import io.sc.engine.rule.core.enums.HttpMethodType;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.server.model.vo.ParameterProcessorVo;
/**
* 模型参数处理器Http 请求操作Vo
*/
public class HttpRequestParameterProcessorVo extends ParameterProcessorVo {
// Method
private HttpMethodType httpMethod;
// Url
private String httpUrl;
// 认证类型
private HttpAuthorizationType httpAuthType;
// Api Key's key
private String httpAuthApikey;
// Api Key's value
private String httpAuthApiValue;
// Api Key's value
private String httpAuthApiAddTo;
private String httpAuthBasicUsername;
private String httpAuthBasicPassword;
private String httpAuthBearerToken;
private String httpParams;
private String httpBody;
private String httpResponseMapping;
@Override
public ProcessorType getType() {
return ProcessorType.HTTP_REQUEST;
}
public HttpMethodType getHttpMethod() {
return httpMethod;
}
public void setHttpMethod(HttpMethodType httpMethod) {
this.httpMethod = httpMethod;
}
public String getHttpUrl() {
return httpUrl;
}
public void setHttpUrl(String httpUrl) {
this.httpUrl = httpUrl;
}
public HttpAuthorizationType getHttpAuthType() {
return httpAuthType;
}
public void setHttpAuthType(HttpAuthorizationType httpAuthType) {
this.httpAuthType = httpAuthType;
}
public String getHttpAuthApikey() {
return httpAuthApikey;
}
public void setHttpAuthApikey(String httpAuthApikey) {
this.httpAuthApikey = httpAuthApikey;
}
public String getHttpAuthApiValue() {
return httpAuthApiValue;
}
public void setHttpAuthApiValue(String httpAuthApiValue) {
this.httpAuthApiValue = httpAuthApiValue;
}
public String getHttpAuthApiAddTo() {
return httpAuthApiAddTo;
}
public void setHttpAuthApiAddTo(String httpAuthApiAddTo) {
this.httpAuthApiAddTo = httpAuthApiAddTo;
}
public String getHttpAuthBasicUsername() {
return httpAuthBasicUsername;
}
public void setHttpAuthBasicUsername(String httpAuthBasicUsername) {
this.httpAuthBasicUsername = httpAuthBasicUsername;
}
public String getHttpAuthBasicPassword() {
return httpAuthBasicPassword;
}
public void setHttpAuthBasicPassword(String httpAuthBasicPassword) {
this.httpAuthBasicPassword = httpAuthBasicPassword;
}
public String getHttpAuthBearerToken() {
return httpAuthBearerToken;
}
public void setHttpAuthBearerToken(String httpAuthBearerToken) {
this.httpAuthBearerToken = httpAuthBearerToken;
}
public String getHttpParams() {
return httpParams;
}
public void setHttpParams(String httpParams) {
this.httpParams = httpParams;
}
public String getHttpBody() {
return httpBody;
}
public void setHttpBody(String httpBody) {
this.httpBody = httpBody;
}
public String getHttpResponseMapping() {
return httpResponseMapping;
}
public void setHttpResponseMapping(String httpResponseMapping) {
this.httpResponseMapping = httpResponseMapping;
}
}

14
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/validator/FalseParameterValidatorVo.java

@ -0,0 +1,14 @@
package io.sc.engine.rule.server.model.vo.validator;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.server.model.vo.ParameterValidatorVo;
/**
* 验证器实体类
*/
public class FalseParameterValidatorVo extends ParameterValidatorVo {
@Override
public ValidatorType getType() {
return ValidatorType.FALSE;
}
}

52
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/entity/FolderResourceEntity.java

@ -0,0 +1,52 @@
package io.sc.engine.rule.server.resource.entity;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ResourceType;
import io.sc.engine.rule.server.resource.vo.FolderResourceVo;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 文件夹资源实体类
* @author wangshaoping
*
*/
@Entity
@DiscriminatorValue("FOLDER")
@JsonTypeName("FOLDER")
public class FolderResourceEntity extends ResourceEntity {
@Override
public FolderResourceVo toVo() {
FolderResourceVo vo =new FolderResourceVo();
super.toVo(vo);
vo.setType(this.getType());
return vo;
}
public FolderResourceEntity() {}
public FolderResourceEntity(String id) {
this.id =id;
}
@Override
public ResourceType getType() {
return ResourceType.FOLDER;
}
@Override
public String toString() {
return "FolderResourceEntity ["
+ " type=" + type
+ " id=" + id
+ ", code=" + code
+ ", name=" + name
+ ", description=" + description
+ ", order=" + order
+ ", creator=" + creator
+ ", createDate=" + createDate
+ ", lastModifier=" + lastModifier
+ ", lastModifyDate=" + lastModifyDate
+ "]";
}
}

30
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/exception/FolderAlreadyExistsException.java

@ -0,0 +1,30 @@
package io.sc.engine.rule.server.resource.exception;
/**
* 文件夹已经存在违例类
* @author wangshaoping
*
*/
public class FolderAlreadyExistsException extends RuntimeException{
private static final long serialVersionUID = -4300506761652664174L;
public FolderAlreadyExistsException() {
super();
}
public FolderAlreadyExistsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public FolderAlreadyExistsException(String message, Throwable cause) {
super(message, cause);
}
public FolderAlreadyExistsException(String message) {
super(message);
}
public FolderAlreadyExistsException(Throwable cause) {
super(cause);
}
}

13
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/vo/FolderResourceVo.java

@ -0,0 +1,13 @@
package io.sc.engine.rule.server.resource.vo;
import io.sc.engine.rule.core.enums.ResourceType;
/**
* 文件夹资源实体类
*/
public class FolderResourceVo extends ResourceVo {
@Override
public ResourceType getType() {
return ResourceType.FOLDER;
}
}

43
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/i18n/graph/graph_editor.properties

@ -0,0 +1,43 @@
# \u7ec4\u4ef6\u9762\u677f\u6807\u9898
mxgraph.re.editor.Palette.title=Available
# \u5f00\u59cb\u7ec4\u4ef6
mxgraph.re.editor.component.start.title=Start
# \u6761\u4ef6\u5224\u65ad\u7ec4\u4ef6
mxgraph.re.editor.component.condition.title=Condition
mxgraph.re.editor.component.condition.entity.condition=Condition
# \u5e76\u53d1\u7ec4\u4ef6
mxgraph.re.editor.component.parallel.title=Paralleler
# \u6761\u4ef6\u5206\u503c\u8fde\u7ebf\u7ec4\u4ef6
mxgraph.re.editor.component.condition.edge.conditionValue=Condition Value
mxgraph.re.editor.component.condition.edge.type=Value Type
mxgraph.re.editor.component.condition.edge.type.string=String
mxgraph.re.editor.component.condition.edge.type.number=Number
mxgraph.re.editor.component.condition.edge.type.boolean=Boolean
# \u8868\u8fbe\u5f0f\u7ec4\u4ef6
mxgraph.re.editor.component.expression.title=Expression
mxgraph.re.editor.component.expression.entity.expression=Expression
mxgraph.re.editor.component.expression.entity.commands=Commands
# \u6307\u4ee4\u96c6\u7ec4\u4ef6
mxgraph.re.editor.component.commandSet.title=Command Set
mxgraph.re.editor.component.commandSet.entity.commands=Command Set
# \u8d44\u6e90\u6458\u8981\u4fe1\u606f\u7ec4\u4ef6
mxgraph.re.editor.component.resourceAbstract.title=Resource
mxgraph.re.editor.component.resourceAbstract.entity.resource=Resource
# \u53ef\u914d\u7f6e\u8f93\u5165\u8f93\u51fa\u6307\u4ee4\u7684\u8d44\u6e90\u6458\u8981\u4fe1\u606f\u7ec4\u4ef6
mxgraph.re.editor.component.configurableResourceAbstract.title=Configurable Resource
mxgraph.re.editor.component.configurableResourceAbstract.entity.resource=Resource
mxgraph.re.editor.component.configurableResourceAbstract.entity.inputCommands=Input Command Set
mxgraph.re.editor.component.configurableResourceAbstract.entity.outputCommands=Output Command Set
# \u6a21\u578b\u7ec4\u4ef6
mxgraph.re.editor.component.submodel.title=Model
mxgraph.re.editor.component.submodel.entity.model=Model

42
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/i18n/graph/graph_editor_zh_CN.properties

@ -0,0 +1,42 @@
# \u7ec4\u4ef6\u9762\u677f\u6807\u9898
mxgraph.re.editor.Palette.title=\u53ef\u7528\u7ec4\u4ef6
# \u5f00\u59cb\u7ec4\u4ef6
mxgraph.re.editor.component.start.title=\u5f00\u59cb
# \u6761\u4ef6\u5224\u65ad\u7ec4\u4ef6
mxgraph.re.editor.component.condition.title=\u6761\u4ef6\u5224\u65ad
mxgraph.re.editor.component.condition.entity.condition=\u6761\u4ef6
# \u5e76\u53d1\u7ec4\u4ef6
mxgraph.re.editor.component.parallel.title=\u5e76\u53d1\u5668
# \u6761\u4ef6\u5206\u503c\u8fde\u7ebf\u7ec4\u4ef6
mxgraph.re.editor.component.condition.edge.conditionValue=\u6761\u4ef6\u503c
mxgraph.re.editor.component.condition.edge.type=\u503c\u7c7b\u578b
mxgraph.re.editor.component.condition.edge.type.string=\u5b57\u7b26\u4e32
mxgraph.re.editor.component.condition.edge.type.number=\u6570\u5b57
mxgraph.re.editor.component.condition.edge.type.boolean=\u5e03\u5c14
# \u8868\u8fbe\u5f0f\u7ec4\u4ef6
mxgraph.re.editor.component.expression.title=\u8868\u8fbe\u5f0f
mxgraph.re.editor.component.expression.entity.expression=\u8868\u8fbe\u5f0f
mxgraph.re.editor.component.expression.entity.commands=\u9644\u52a0\u6307\u4ee4\u96c6
# \u6307\u4ee4\u96c6\u7ec4\u4ef6
mxgraph.re.editor.component.commandSet.title=\u6307\u4ee4\u96c6
mxgraph.re.editor.component.commandSet.entity.commands=\u6307\u4ee4\u96c6
# \u8d44\u6e90\u6458\u8981\u4fe1\u606f\u7ec4\u4ef6
mxgraph.re.editor.component.resourceAbstract.title=\u8d44\u6e90
mxgraph.re.editor.component.resourceAbstract.entity.resource=\u8d44\u6e90
# \u53ef\u914d\u7f6e\u8f93\u5165\u8f93\u51fa\u6307\u4ee4\u7684\u8d44\u6e90\u6458\u8981\u4fe1\u606f\u7ec4\u4ef6
mxgraph.re.editor.component.configurableResourceAbstract.title=\u8f93\u5165\u8f93\u51fa\u6307\u4ee4\u8d44\u6e90
mxgraph.re.editor.component.configurableResourceAbstract.entity.resource=\u8d44\u6e90
mxgraph.re.editor.component.configurableResourceAbstract.entity.inputCommands=\u8f93\u5165\u6307\u4ee4\u96c6
mxgraph.re.editor.component.configurableResourceAbstract.entity.outputCommands=\u8f93\u51fa\u6307\u4ee4\u96c6
# \u6a21\u578b\u7ec4\u4ef6
mxgraph.re.editor.component.submodel.title=\u5b50\u6a21\u578b
mxgraph.re.editor.component.submodel.entity.model=\u5b50\u6a21\u578b

3
io.sc.platform.attachment/gradle.properties

@ -0,0 +1,3 @@
commons_math3_version=3.6.1
mxgraph_version=4.2.2.1
jpmml_version=1.4.9

303
io.sc.platform.core.frontend/template-project/src/views/FormElements.vue

@ -1,61 +1,258 @@
<template>
<w-v-expand-div>
<q-splitter v-model="splitWidthRef">
<template #before>
<q-tabs v-model="selectedTab" vertical no-caps>
<q-tab name="formElements" label="All Form Elements" />
<q-tab name="codemirror" label="code-mirror" />
</q-tabs>
<div class="q-pa-md">
<q-table flat bordered separator="cell" title="Treats" :rows="rows2" :columns="columns" row-key="name" hide-no-data>
<template v-if="rows && rows.length > 0" #header="props">
<q-tr :props="props">
<q-th v-for="col in props.cols" :key="col.name" :props="props" class="text-italic text-purple">
{{ col.label }}
</q-th>
</q-tr>
</template>
<template v-else #header="props">
<q-tr :props="props">
<q-th v-for="col in props.cols" :key="col.name" :props="props" class="text-italic text-purple">
{{ col.label }}
</q-th>
</q-tr>
<q-tr :props="props" style="height: 300px"> </q-tr>
</template>
<template #after>
<q-tab-panels v-model="selectedTab" animated swipeable vertical transition-prev="jump-up" transition-next="jump-up">
<q-tab-panel name="formElements">
<w-form
:cols-num="1"
:fields="[
{ name: 'color', label: 'please select color', type: 'color-input', outlined: true, dense: true },
{ name: 'colorPalette', label: 'please select color palette', type: 'color-input-palette', outlined: true, dense: true },
{
name: 'codemirror',
label: 'please input SQL',
type: 'code-mirror',
outlined: true,
lang: 'sql',
dense: true,
rows: 5,
readonlyIf: () => {
return true;
},
},
{ name: 'cron', label: 'please input cron expression', type: 'cron', outlined: true, dense: true },
{ name: 'position', label: 'please select position', type: 'position', outlined: true, dense: true, readOnly: true },
{ name: 'icon', label: 'please select icon', type: 'icon', outlined: true, dense: true },
{ name: 'dataComeFrom', label: '', type: 'select', options: Options.enum(DataComeFromEnums.DataComeFrom) },
{ name: 'dataComeFrom', label: '', type: 'select', options: Options.enum(DataComeFromEnums.UrlOpenType) },
]"
>
</w-form>
</q-tab-panel>
<q-tab-panel name="codemirror">
<q-input v-model="valueRef" label="please input number 1:" outlined dense clearable></q-input>
<w-code-mirror v-model="valueRef" label="please input SQL:" lang="sql" outlined dense></w-code-mirror>
<q-input v-model="valueRef" label="please input number 2:" outlined dense clearable></q-input>
<w-icon v-model="iconValueRef" label="please select icon:" lang="sql" outlined dense></w-icon>
</q-tab-panel>
</q-tab-panels>
<template #body="props">
<q-tr :props="props">
<q-td key="name" :props="props">
{{ props.row.name }}
</q-td>
<q-td key="calories" :props="props">
<q-badge color="green">
{{ props.row.calories }}
</q-badge>
</q-td>
<q-td key="fat" :props="props">
<q-badge color="purple">
{{ props.row.fat }}
</q-badge>
</q-td>
<q-td key="carbs" :props="props">
<q-badge color="orange">
{{ props.row.carbs }}
</q-badge>
</q-td>
<q-td key="protein" :props="props">
<q-badge color="primary">
{{ props.row.protein }}
</q-badge>
</q-td>
<q-td key="sodium" :props="props">
<q-badge color="teal">
{{ props.row.sodium }}
</q-badge>
</q-td>
<q-td key="calcium" :props="props">
<q-badge color="accent">
{{ props.row.calcium }}
</q-badge>
</q-td>
<q-td key="iron" :props="props">
<q-badge color="amber">
{{ props.row.iron }}
</q-badge>
</q-td>
</q-tr>
</template>
</q-splitter>
</w-v-expand-div>
</q-table>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { EnumTools, Options } from '@/platform';
const selectedTab = ref('codemirror');
const splitWidthRef = ref(20);
const valueRef = ref('xxxx');
const iconValueRef = ref('8k_plus');
<script>
import { ref } from 'vue';
const columns = [
{
name: 'name',
required: true,
label: 'Dessert (100g serving)',
align: 'left',
field: (row) => row.name,
format: (val) => `${val}`,
sortable: true,
},
{ name: 'calories', align: 'center', label: 'Calories', field: 'calories', sortable: true },
{ name: 'fat', label: 'Fat (g)', field: 'fat', sortable: true },
{ name: 'carbs', label: 'Carbs (g)', field: 'carbs' },
{ name: 'protein', label: 'Protein (g)', field: 'protein' },
{ name: 'sodium', label: 'Sodium (mg)', field: 'sodium' },
{ name: 'calcium', label: 'Calcium (%)', field: 'calcium', sortable: true, sort: (a, b) => parseInt(a, 10) - parseInt(b, 10) },
{ name: 'iron', label: 'Iron (%)', field: 'iron', sortable: true, sort: (a, b) => parseInt(a, 10) - parseInt(b, 10) },
];
const rows = [];
const rows2 = [
{
name: 'Frozen Yogurt',
calories: 159,
fat: 6.0,
carbs: 24,
protein: 4.0,
sodium: 87,
calcium: '14%',
iron: '1%',
},
{
name: 'Ice cream sandwich',
calories: 237,
fat: 9.0,
carbs: 37,
protein: 4.3,
sodium: 129,
calcium: '8%',
iron: '1%',
},
{
name: 'Eclair',
calories: 262,
fat: 16.0,
carbs: 23,
protein: 6.0,
sodium: 337,
calcium: '6%',
iron: '7%',
},
{
name: 'Cupcake',
calories: 305,
fat: 3.7,
carbs: 67,
protein: 4.3,
sodium: 413,
calcium: '3%',
iron: '8%',
},
{
name: 'Gingerbread',
calories: 356,
fat: 16.0,
carbs: 49,
protein: 3.9,
sodium: 327,
calcium: '7%',
iron: '16%',
},
{
name: 'Jelly bean',
calories: 375,
fat: 0.0,
carbs: 94,
protein: 0.0,
sodium: 50,
calcium: '0%',
iron: '0%',
},
{
name: 'Lollipop',
calories: 392,
fat: 0.2,
carbs: 98,
protein: 0,
sodium: 38,
calcium: '0%',
iron: '2%',
},
{
name: 'Honeycomb',
calories: 408,
fat: 3.2,
carbs: 87,
protein: 6.5,
sodium: 562,
calcium: '0%',
iron: '45%',
},
{
name: 'Donut',
calories: 452,
fat: 25.0,
carbs: 51,
protein: 4.9,
sodium: 326,
calcium: '2%',
iron: '22%',
},
{
name: 'KitKat',
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
sodium: 54,
calcium: '12%',
iron: '6%',
},
{
name: 'KitKat',
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
sodium: 54,
calcium: '12%',
iron: '6%',
},
{
name: 'KitKat',
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
sodium: 54,
calcium: '12%',
iron: '6%',
},
{
name: 'KitKat',
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
sodium: 54,
calcium: '12%',
iron: '6%',
},
{
name: 'KitKat',
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
sodium: 54,
calcium: '12%',
iron: '6%',
},
{
name: 'KitKat',
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
sodium: 54,
calcium: '12%',
iron: '6%',
},
{
name: 'KitKat',
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
sodium: 54,
calcium: '12%',
iron: '6%',
},
];
const DataComeFromEnums = await EnumTools.fetch(['io.sc.platform.orm.api.enums.DataComeFrom', 'io.sc.platform.system.enums.UrlOpenType']);
export default {
setup() {
return {
columns,
rows,
};
},
};
</script>

41
io.sc.platform.core/src/main/java/io/sc/platform/core/util/FileUtil.java

@ -2,7 +2,6 @@ package io.sc.platform.core.util;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
@ -19,9 +18,6 @@ import java.util.List;
public class FileUtil {
private FileUtil(){}
public static void main(String[] args) {
exists(null);
}
/**
* 判断资源文件是否存在
* @param url 资源文件 url
@ -522,4 +518,41 @@ public class FileUtil {
return o1.getName().compareTo(o2.getName());
};
}
/**
* 获取文件名称
* @param filePath 文件全路径
* @return 文件名称
*/
public static String getFileName(String filePath) {
if(filePath!=null && !"".equals(filePath.trim())) {
String _filePath =filePath.replace('\\', '/');
return new File(_filePath).getName();
}
return null;
}
/**
* 获取文件扩展名
* @param name 文件名称
* @return 扩展名
*/
public static String getFileExtName(String name) {
if(name!=null && !"".equals(name.trim()) && name.lastIndexOf('.')>-1) {
return name.substring(name.lastIndexOf('.'));
}
return null;
}
/**
* 获取文件基本名
* @param name 文件名称
* @return 文件基本名
*/
public static String getFileBaseName(String name) {
if(name!=null && !"".equals(name.trim()) && name.indexOf('.')>-1) {
return name.substring(0,name.indexOf('.'));
}
return null;
}
}

4
io.sc.platform.gradle/templates/pgp/setup/gradle.properties

@ -36,9 +36,9 @@ application_version=1.0.0
# platform
###########################################################
platform_group=io.sc
platform_version=8.1.26
platform_version=8.1.28
platform_plugin_version=8.1.13
platform_core_frontend_version=8.1.137
platform_core_frontend_version=8.1.149
###########################################################
# dependencies version

Loading…
Cancel
Save