Browse Source

前端 8.2.8

main
wangshaoping 5 months ago
parent
commit
af26b0059c
  1. 4
      erm.frontend/package.json
  2. 5
      erm.frontend/src/views/kpi/Indicator.vue
  3. 3
      erm.frontend/src/views/kpi/Lib.vue
  4. 6
      gradle.properties
  5. 4
      io.sc.engine.mv.frontend/package.json
  6. 9
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/initializer/AutoCompileDeployedModelInitializer.java
  7. 36
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/LocalLoaderImpl.java
  8. 166
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java
  9. 38
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Loader.java
  10. 114
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java
  11. 81
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java
  12. 38
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteLoader.java
  13. 24
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/EngineRuntime.java
  14. 65
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/GroovyEngineRuntime.java
  15. 8
      io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test.java
  16. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ExecuteResult.java
  17. 66
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/FieldValidator.java
  18. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ModelAbstract.java
  19. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ParameterResult.java
  20. 8
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ResourceAbstract.java
  21. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ResourceResult.java
  22. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/Rule.java
  23. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/RuleResult.java
  24. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/SingleRuleResult.java
  25. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ValidateField.java
  26. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ValidateResult.java
  27. 29
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/CodeGenerator.java
  28. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit.java
  29. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit4Lib.java
  30. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit4Resource.java
  31. 5
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/SourceCodeGenerator.java
  32. 53
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4LibGenerator.java
  33. 49
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4ResourceGenerator.java
  34. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnitGenerator.java
  35. 27
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/GroovySourceCodeGenerator.java
  36. 9
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ArgumentClassGenerator.java
  37. 13
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/CommonImportGenerator.java
  38. 11
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/DictionaryClassGenerator.java
  39. 75
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/DictionaryGenerator.java
  40. 29
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/FunctionGenerator.java
  41. 256
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java
  42. 12
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/LibClassGenerator.java
  43. 57
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ModelGenerator.java
  44. 15
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/PackageGenerator.java
  45. 251
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java
  46. 23
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterMethodGenerator.java
  47. 37
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ResourceClassGenerator.java
  48. 33
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/Arithmetic.java
  49. 91
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ConditionRange.java
  50. 137
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTable.java
  51. 74
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTable2C.java
  52. 33
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java
  53. 39
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ExecutionFlow.java
  54. 31
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/MathFormula.java
  55. 133
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/NumberRange.java
  56. 113
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ObjectProperty.java
  57. 52
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/OptionValue.java
  58. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ScoreCardItem.java
  59. 89
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/SqlFieldMapping.java
  60. 43
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/Ternary.java
  61. 51
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/WhenThen.java
  62. 10
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/functions.tpl
  63. 28
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/model.tpl
  64. 1
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/package.tpl
  65. 37
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/parameter.tpl
  66. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/DECISION_TABLE.ftl
  67. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/DECISION_TABLE_2C.ftl
  68. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/DECISION_TREE.ftl
  69. 13
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/DECISION_TREE_FUNCTION.ftl
  70. 13
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/EXECUTION_FLOW_FUNCTION.ftl
  71. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/GROOVY_SCRIPT.ftl
  72. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/MATH_FORMULA.ftl
  73. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/OBJECT_PROPERTIES.ftl
  74. 34
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/OPTION_VALUE.ftl
  75. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/PMML.ftl
  76. 17
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/SQL.ftl
  77. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/TERNARY.ftl
  78. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/arithmetic.tpl
  79. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/conditionRange.ftl
  80. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/numberRange.ftl
  81. 118
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/resource.tpl
  82. 128
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/GroovySourceCodeGenerator.java
  83. 24
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/JavaSourceCodeGenerator.java
  84. 40
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper.java
  85. 43
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper4Lib.java
  86. 52
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper4Resource.java
  87. 54
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/lib/LibUtil.java
  88. 9
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/parameter/ParameterGroovyCodeContributionItem.java
  89. 125
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/ConditionRange.java
  90. 94
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/DecisionTable.java
  91. 66
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/DecisionTable2C.java
  92. 187
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/NumberRange.java
  93. 146
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/ObjectProperty.java
  94. 54
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/Option.java
  95. 145
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/Rule.java
  96. 117
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/SingleRule.java
  97. 81
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/SqlFieldMapping.java
  98. 49
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/argument_render.tpl
  99. 13
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/dictionary_render.tpl
  100. 6
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/functions_render.tpl

4
erm.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "erm.frontend",
"version": "8.1.50",
"version": "8.2.1",
"description": "",
"private": false,
"keywords": [],
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.0",
"platform-core": "8.2.7",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

5
erm.frontend/src/views/kpi/Indicator.vue

@ -4,8 +4,8 @@
:title="$t('erm.kpi.indicator.grid.title')"
:config-button="true"
selection="multiple"
:checkbox-selection="true"
:sticky-num="2"
:checkbox-selection="true"
:data-url="Environment.apiContextPath('/api/erm/kpi/indicator')"
:query-form-cols-num="4"
:query-form-fields="[
@ -133,7 +133,6 @@
:editor="{
dialog: {
width: '800px',
height: '650px',
},
form: {
colsNum: 3,
@ -248,7 +247,7 @@
import 'tailwindcss/utilities.css';
import { ref } from 'vue';
import { Environment, DictionaryTools, Formater, Options, Tools } from 'platform-core';
import IndicatorStatus from './IndicatorStatus';
//import IndicatorStatus from './IndicatorStatus';
const gridRef = ref();

3
erm.frontend/src/views/kpi/Lib.vue

@ -20,11 +20,11 @@
:toolbar-actions="[
'refresh',
'separator',
'expand',
[
{ extend: 'addTop', label: $t('erm.kpi.lib.grid.toolbar.addTop') },
{ extend: 'addChild', label: $t('erm.kpi.lib.grid.toolbar.addChild') },
],
'expand',
'edit',
'remove',
'separator',
@ -42,7 +42,6 @@
:editor="{
dialog: {
width: '600px',
height: '300px',
},
form: {
colsNum: 1,

6
gradle.properties

@ -36,9 +36,9 @@ application_version=1.0.0
# platform
######################################gra#####################
platform_group=io.sc
platform_version=8.1.50
platform_plugin_version=8.1.50
platform_core_frontend_version=8.2.0
platform_version=8.2.1
platform_plugin_version=8.2.1
platform_core_frontend_version=8.2.7
###########################################################
# dependencies version

4
io.sc.engine.mv.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.engine.mv.frontend",
"version": "8.1.50",
"version": "8.2.1",
"description": "",
"private": false,
"keywords": [],
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.0",
"platform-core": "8.2.7",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

9
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/initializer/AutoCompileDeployedModelInitializer.java

@ -2,7 +2,7 @@ package io.sc.engine.rule.client.spring.initializer;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.classes.ResourceAbstract;
import io.sc.engine.rule.core.ResourceAbstract;
import io.sc.engine.rule.core.enums.DeployStatus;
import io.sc.platform.core.initializer.ApplicationInitializer;
import io.sc.platform.core.initializer.ApplicationInitializerExecuteException;
@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -54,7 +55,7 @@ public class AutoCompileDeployedModelInitializer implements ApplicationInitializ
Executor executor=executorFactoryService.getExecutor();
if(executor!=null) {
try {
List<ResourceAbstract> resources =executor.getLoader().getAllReleasableResourceAbstract();
List<ResourceAbstract> resources =new ArrayList<>();//executor.getLoader().getAllReleasableResourceAbstract();
if(resources!=null && resources.size()>0) {
if ("deployed".equalsIgnoreCase(autoCompile)) {
@ -83,7 +84,7 @@ public class AutoCompileDeployedModelInitializer implements ApplicationInitializ
for(ResourceAbstract resource : resources) {
if(DeployStatus.ON_LINE.equals(resource.getStatus())) {
log.info("auto compile deployed resource {}_V{}({}) ......",resource.getCode(),resource.getVersion(),resource.getName());
executor.compileByCode(resource.getCode(), resource.getVersion());
executor.compile(resource.getCode(), resource.getVersion());
}
}
}
@ -107,7 +108,7 @@ public class AutoCompileDeployedModelInitializer implements ApplicationInitializ
for(Entry<String, ResourceAbstract> entry : last.entrySet()) {
ResourceAbstract resource =entry.getValue();
log.info("auto compile deployed resource {}_V{}({}) ......",resource.getCode(),resource.getVersion(),resource.getName());
executor.compileByCode(resource.getCode(), resource.getVersion());
executor.compile(resource.getCode(), resource.getVersion());
}
}
}

36
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/LocalLoaderImpl.java

@ -1,14 +1,12 @@
package io.sc.engine.rule.client.spring.service.impl;
import io.sc.engine.rule.client.spring.service.LocalLoader;
import io.sc.engine.rule.core.classes.ResourceAbstract;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
import io.sc.engine.rule.core.code.ExecuteUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -16,43 +14,38 @@ import java.util.concurrent.ConcurrentHashMap;
public class LocalLoaderImpl implements LocalLoader{
private static final String RESOURCE_SERVICE_BEAN_NAME ="io.sc.engine.rule.server.resource.service.impl.ResourceServiceImpl";
@Autowired private ApplicationContext applicationContext;
private Map<String,ResourceWrapper> cache =new ConcurrentHashMap<String,ResourceWrapper>();
private Map<String, ExecuteUnit> cache =new ConcurrentHashMap<>();
@Override
public void cleanCache() throws Exception {
cache.clear();
}
@Override
public ResourceWrapper getResourceById(String resourceId) throws Exception {
public ExecuteUnit load(String resourceId) throws Exception {
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getDefineById", String.class);
ResourceWrapper result =(ResourceWrapper)method.invoke(bean, resourceId);
ExecuteUnit result =(ExecuteUnit)method.invoke(bean, resourceId);
return result;
}
return null;
}
@Override
public ResourceWrapper getResourceByCode(String resourceCode, Integer version) throws Exception {
public ExecuteUnit load(String resourceCode, Integer version) throws Exception {
if(version==null) {//未指定版本时,不缓存,加载最新的
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getDefineByCode", String.class,Integer.class);
return (ResourceWrapper)method.invoke(bean, resourceCode,version);
return (ExecuteUnit)method.invoke(bean, resourceCode,version);
}
}else {//指定版本时,缓存
if(resourceCode!=null && !"".equals(resourceCode.trim())) {
String key =getCacheKey(resourceCode,version);
ResourceWrapper wrapper =cache.get(key);
ExecuteUnit wrapper =cache.get(key);
if(wrapper!=null) {
return wrapper;
}else {
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getDefineByCode", String.class,Integer.class);
wrapper =(ResourceWrapper)method.invoke(bean, resourceCode,version);
wrapper =(ExecuteUnit)method.invoke(bean, resourceCode,version);
if(wrapper!=null) {
key =getCacheKey(resourceCode,version);
if(key!=null && !"".equals(key.trim())) {
@ -69,19 +62,6 @@ public class LocalLoaderImpl implements LocalLoader{
return null;
}
@Override
@SuppressWarnings("unchecked")
public List<ResourceAbstract> getAllReleasableResourceAbstract() throws Exception {
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getAllReleasableResourceAbstract");
if(method!=null) {
return (List<ResourceAbstract>)method.invoke(bean);
}
}
return null;
}
private String getCacheKey(String code,Integer version) {
String result ="";
if(code!=null && !"".equals(code.trim())) {

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

@ -1,169 +1,33 @@
package io.sc.engine.rule.client;
import io.sc.engine.rule.core.ResourceResult;
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 违例
* 获取资源定义加载器
* @return 资源定义加载器
*/
public void compileByIdForTest(String resourceId) throws Exception;
public Loader getLoader();
/**
* 编译资源(测试)
* @param resourceCode 资源代码
* @param version 资源版本
* @throws Exception 违例
*/
public void compileByCodeForTest(String resourceCode,Integer version) throws Exception;
public void compile(String resourceId) throws Exception;
public void compile(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;
public ResourceResult execute(String resourceId,Map<String,Object> map) throws Exception;
public ResourceResult execute(String resourceId, String json) 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;
public ResourceResult execute(String resourceId,String subModelCode,Map<String,Object> map) throws Exception;
public ResourceResult execute(String resourceId,String subModelCode,String json) 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;
public ResourceResult execute(String resourceCode,Integer version,Map<String,Object> map) throws Exception;
public ResourceResult execute(String resourceCode,Integer version,String json) throws Exception;
/**
* 获取资源定义加载器
* @return 资源定义加载器
*/
public Loader getLoader();
public ResourceResult execute(String resourceCode,Integer version,String subModelCode,Map<String,Object> map) throws Exception;
public ResourceResult execute(String resourceCode,Integer version,String subModelCode,String json) throws Exception;
}

38
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Loader.java

@ -1,44 +1,12 @@
package io.sc.engine.rule.client;
import io.sc.engine.rule.core.classes.ResourceAbstract;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
import java.util.List;
import io.sc.engine.rule.core.code.ExecuteUnit;
/**
* 客户端模型定义加载器接口
*/
public interface Loader {
/**
* 获取资源定义
* 说明: 通过 ID 加载资源定义时系统不做缓存
* @param resourceId 资源唯一标识
* @return 资源定义 PO 对象
* @throws Exception 违例
*/
public ResourceWrapper getResourceById(String resourceId) throws Exception;
/**
* 获取资源定义
* 说明: 通过代码和版本加载资源定义时,如果有版本则缓存反之不缓存
* @param resourceCode 资源代码
* @param version 资源版本
* @return 资源定义 PO 对象
* @throws Exception 违例
*/
public ResourceWrapper getResourceByCode(String resourceCode,Integer version) throws Exception;
/**
* 获取所有顶级资源摘要信息
* @return 所有顶级资源摘要信息
* @throws Exception 违例
*/
public List<ResourceAbstract> getAllReleasableResourceAbstract() throws Exception;
/**
* 清除已经加载的模型定义缓存
* @throws Exception 违例
*/
public void cleanCache() throws Exception;
public ExecuteUnit load(String resourceId) throws Exception;
public ExecuteUnit load(String resourceCode,Integer version) throws Exception;
}

114
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java

@ -3,8 +3,8 @@ package io.sc.engine.rule.client.local;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.Loader;
import io.sc.engine.rule.client.runtime.EngineRuntime;
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.ResourceResult;
import io.sc.engine.rule.core.code.ExecuteUnit;
import java.util.Map;
@ -22,113 +22,67 @@ public class LocalExecutor implements Executor {
}
@Override
public void compileById(String resourceId) throws Exception {
ResourceWrapper wrapper =loader.getResourceById(resourceId);
EngineRuntime.getInstance().compileById(resourceId,wrapper);
}
@Override
public void compileByCode(String resourceCode, Integer version) throws Exception {
ResourceWrapper wrapper =loader.getResourceByCode(resourceCode,version);
EngineRuntime.getInstance().compileByCode(resourceCode,version,wrapper);
}
@Override
public ResourceResult executeById(String resourceId, String json) throws Exception {
ResourceWrapper wrapper =loader.getResourceById(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,wrapper, json);
}
@Override
public ResourceResult executeById(String resourceId, String subModelCode, String json) throws Exception {
ResourceWrapper wrapper =loader.getResourceById(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,wrapper,subModelCode,json);
}
@Override
public ResourceResult executeById(String resourceId, Map<String, Object> map) throws Exception {
ResourceWrapper wrapper =loader.getResourceById(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,wrapper, map);
}
@Override
public ResourceResult executeById(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
ResourceWrapper wrapper =loader.getResourceById(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,wrapper,subModelCode,map);
public Loader getLoader() {
return loader;
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String json) throws Exception {
ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper, json);
public void compile(String resourceId) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
EngineRuntime.getInstance().compileById(resourceId,executeUnit);
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper,subModelCode,json);
public void compile(String resourceCode, Integer version) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode,version);
EngineRuntime.getInstance().compileByCode(resourceCode,version,executeUnit);
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper, map);
public ResourceResult execute(String resourceId, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit, map);
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper,subModelCode,map);
public ResourceResult execute(String resourceId, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit, json);
}
@Override
public void compileByIdForTest(String resourceId) throws Exception {
ResourceWrapper wrapper =loader.getResourceById(resourceId);
wrapper.setIsExecuteTestCase(true);
EngineRuntime.getInstance().compileById(resourceId,wrapper);
public ResourceResult execute(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit,subModelCode,map);
}
@Override
public void compileByCodeForTest(String resourceCode, Integer version) throws Exception {
ResourceWrapper wrapper =loader.getResourceByCode(resourceCode,version);
wrapper.setIsExecuteTestCase(true);
EngineRuntime.getInstance().compileByCode(resourceCode,version,wrapper);
public ResourceResult execute(String resourceId, String subModelCode, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit,subModelCode,json);
}
@Override
public ResourceResult executeByIdForTest(String resourceId, Map<String, Object> map) throws Exception {
ResourceWrapper wrapper =loader.getResourceById(resourceId);
wrapper.setIsExecuteTestCase(true);
return EngineRuntime.getInstance().executeById(this,resourceId,wrapper, map);
public ResourceResult execute(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,executeUnit, map);
}
@Override
public ResourceResult executeByIdForTest(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
ResourceWrapper wrapper =loader.getResourceById(resourceId);
wrapper.setIsExecuteTestCase(true);
return EngineRuntime.getInstance().executeById(this,resourceId,wrapper,subModelCode,map);
public ResourceResult execute(String resourceCode, Integer version, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,executeUnit, json);
}
@Override
public ResourceResult executeByCodeForTest(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version);
wrapper.setIsExecuteTestCase(true);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper, map);
public ResourceResult execute(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,executeUnit,subModelCode,map);
}
@Override
public ResourceResult executeByCodeForTest(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version);
wrapper.setIsExecuteTestCase(true);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper,subModelCode,map);
}
public Loader getLoader() {
return loader;
}
public void setLoader(Loader loader) {
this.loader = loader;
public ResourceResult execute(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,executeUnit,subModelCode,json);
}
}

81
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java

@ -2,7 +2,7 @@ package io.sc.engine.rule.client.remote;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.Loader;
import io.sc.engine.rule.core.code.impl.support.ResourceResult;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.util.HttpRequestUtil;
import io.sc.platform.util.ObjectMapperUtil;
@ -22,85 +22,62 @@ public class RemoteExecutor implements Executor{
}
@Override
public void compileById(String resourceId) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported compile!");
public Loader getLoader() {
return loader;
}
@Override
public void compileByCode(String resourceCode, Integer version) throws Exception {
public void compile(String resourceId) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported compile!");
}
@Override
public ResourceResult executeById(String resourceId,String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlById(resourceId), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
}
@Override
public ResourceResult executeById(String resourceId, String subModelCode, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlById(resourceId,subModelCode), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
}
@Override
public ResourceResult executeById(String resourceId, Map<String, Object> map) throws Exception {
return executeById(resourceId,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
public ResourceResult executeById(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
return executeById(resourceId,subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
public void compile(String resourceCode, Integer version) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported compile!");
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version,String json) throws Exception{
return executeByCode(resourceCode,version,null,json);
public ResourceResult execute(String resourceId, Map<String, Object> map) throws Exception {
return execute(resourceId,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlByCode(resourceCode,version,subModelCode), "",json);
public ResourceResult execute(String resourceId, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlById(resourceId), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
return executeByCode(resourceCode,version,ObjectMapperUtil.json().writeValueAsString(map));
public ResourceResult execute(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
return execute(resourceId, subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
return executeByCode(resourceCode,version,subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
public void compileByIdForTest(String resourceId) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported test mode compile!");
}
@Override
public void compileByCodeForTest(String resourceCode, Integer version) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported test mode compile!");
public ResourceResult execute(String resourceId, String subModelCode, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlById(resourceId,subModelCode), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
}
@Override
public ResourceResult executeByIdForTest(String resourceId, Map<String, Object> map) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported test mode execute!");
public ResourceResult execute(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
return execute(resourceCode,version,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
public ResourceResult executeByIdForTest(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported test mode execute!");
public ResourceResult execute(String resourceCode, Integer version, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlByCode(resourceCode,version,null), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
}
@Override
public ResourceResult executeByCodeForTest(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported test mode execute!");
public ResourceResult execute(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
return execute(resourceCode,version,subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
public ResourceResult executeByCodeForTest(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported test mode execute!");
public ResourceResult execute(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlByCode(resourceCode,version,subModelCode), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
}
public String getRemoteApiUrl() {
@ -110,14 +87,6 @@ public class RemoteExecutor implements Executor{
this.remoteApiUrl = remoteApiUrl;
}
public Loader getLoader() {
return loader;
}
public void setLoader(Loader loader) {
this.loader = loader;
}
private String getApiUrlById(String resourceId) {
return remoteApiUrl + "/executeById?resourceId=" + resourceId;
}

38
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteLoader.java

@ -1,22 +1,19 @@
package io.sc.engine.rule.client.remote;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.client.Loader;
import io.sc.engine.rule.core.classes.ResourceAbstract;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.util.HttpRequestUtil;
import io.sc.platform.util.ObjectMapperUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class RemoteLoader implements Loader{
private static final Logger log =LoggerFactory.getLogger(RemoteLoader.class);
private String remoteApiUrl;
private Map<String,ResourceWrapper> cache =new ConcurrentHashMap<String,ResourceWrapper>();
private Map<String, ExecuteUnit> cache =new ConcurrentHashMap<>();
public RemoteLoader() {}
public RemoteLoader(String remoteApiUrl) {
@ -24,35 +21,31 @@ public class RemoteLoader implements Loader{
}
@Override
public void cleanCache() throws Exception {
cache.clear();
}
@Override
public ResourceWrapper getResourceById(String resourceId) throws Exception {
public ExecuteUnit load(String resourceId) throws Exception {
if(resourceId!=null && !"".equals(resourceId.trim())) {
String json =HttpRequestUtil.get(getApiUrlById(resourceId));
return ObjectMapperUtil.json().readValue(json, ResourceWrapper.class);
return ObjectMapperUtil.json().readValue(json, ExecuteUnit.class);
}
return null;
}
@Override
public ResourceWrapper getResourceByCode(String resourceCode, Integer version) throws Exception {
public ExecuteUnit load(String resourceCode, Integer version) throws Exception {
if(version==null) {//未指定版本时,不缓存,加载最新的
String json =HttpRequestUtil.get(getApiUrlByCode(resourceCode,version));
if(log.isDebugEnabled()) {log.debug("remote resource json:\n{}",json);}
ResourceWrapper wrapper =ObjectMapperUtil.json().readValue(json, ResourceWrapper.class);
ExecuteUnit wrapper =ObjectMapperUtil.json().readValue(json, ExecuteUnit.class);
if(log.isDebugEnabled()) {log.debug("resource json:\n{}",ObjectMapperUtil.json().writeValueAsString(wrapper));}
return wrapper;
}else {//指定版本时,缓存
if(resourceCode!=null && !"".equals(resourceCode.trim())) {
String key =getCacheKey(resourceCode,version);
ResourceWrapper wrapper =cache.get(key);
ExecuteUnit wrapper =cache.get(key);
if(wrapper!=null) {
return wrapper;
}else {
String json =HttpRequestUtil.get(getApiUrlByCode(resourceCode,version));
wrapper =ObjectMapperUtil.json().readValue(json, ResourceWrapper.class);
wrapper =ObjectMapperUtil.json().readValue(json, ExecuteUnit.class);
if(wrapper!=null) {
key =getCacheKey(resourceCode,version);
if(key!=null && !"".equals(key.trim())) {
@ -66,15 +59,6 @@ public class RemoteLoader implements Loader{
}
}
@Override
public List<ResourceAbstract> getAllReleasableResourceAbstract() throws Exception {
String json =HttpRequestUtil.get(getAllReleasableResourceAbstractApiUrl());
if(json!=null && !"".equals(json)) {
return ObjectMapperUtil.json().readValue(json,new TypeReference<List<ResourceAbstract>>(){});
}
return null;
}
public String getRemoteApiUrl() {
return remoteApiUrl;
}
@ -94,10 +78,6 @@ public class RemoteLoader implements Loader{
}
}
private String getAllReleasableResourceAbstractApiUrl() {
return remoteApiUrl + "/getAllReleasableResourceAbstract";
}
private String getCacheKey(String code,Integer version) {
String result ="";
if(code!=null && !"".equals(code.trim())) {

24
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/EngineRuntime.java

@ -4,8 +4,8 @@ import java.util.Map;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.runtime.impl.GroovyEngineRuntime;
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.ResourceResult;
import io.sc.engine.rule.core.code.ExecuteUnit;
public abstract class EngineRuntime {
public static final String GROOVY ="groovy";
@ -22,18 +22,18 @@ public abstract class EngineRuntime {
return getInstance(GROOVY);
}
public abstract ResourceResult executeById(Executor executor,String resourceId,ResourceWrapper wrapper,String json) throws Exception;
public abstract ResourceResult executeById(Executor executor,String resourceId,ResourceWrapper wrapper,String subModelCode,String json) throws Exception;
public abstract ResourceResult executeById(Executor executor, String resourceId, ExecuteUnit wrapper, String json) throws Exception;
public abstract ResourceResult executeById(Executor executor,String resourceId,ExecuteUnit wrapper,String subModelCode,String json) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ResourceWrapper wrapper,String json) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ResourceWrapper wrapper,String subModelCode,String json) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ExecuteUnit wrapper,String json) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ExecuteUnit wrapper,String subModelCode,String json) throws Exception;
public abstract ResourceResult executeById(Executor executor,String resourceId,ResourceWrapper wrapper,Map<String,Object> map) throws Exception;
public abstract ResourceResult executeById(Executor executor,String resourceId,ResourceWrapper wrapper,String subModelCode,Map<String,Object> map) throws Exception;
public abstract ResourceResult executeById(Executor executor,String resourceId,ExecuteUnit wrapper,Map<String,Object> map) throws Exception;
public abstract ResourceResult executeById(Executor executor,String resourceId,ExecuteUnit wrapper,String subModelCode,Map<String,Object> map) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ResourceWrapper wrapper,Map<String,Object> map) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ResourceWrapper wrapper,String subModelCode,Map<String,Object> map) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ExecuteUnit wrapper,Map<String,Object> map) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ExecuteUnit wrapper,String subModelCode,Map<String,Object> map) throws Exception;
public abstract void compileById(String resourceId,ResourceWrapper wrapper) throws Exception;
public abstract void compileByCode(String resourceCode,Integer version,ResourceWrapper wrapper) throws Exception;
public abstract void compileById(String resourceId,ExecuteUnit wrapper) throws Exception;
public abstract void compileByCode(String resourceCode,Integer version,ExecuteUnit wrapper) throws Exception;
}

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

@ -3,19 +3,15 @@ package io.sc.engine.rule.client.runtime.impl;
import java.util.HashMap;
import java.util.Map;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.code.*;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator;
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;
@ -23,7 +19,7 @@ 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 SourceCodeGenerator generator =new GroovySourceCodeGenerator();
private GroovyEngineRuntime() {}
@ -32,15 +28,15 @@ public class GroovyEngineRuntime extends EngineRuntime{
}
@Override
public void compileById(String resourceId, ResourceWrapper wrapper) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeById(resourceId, wrapper);
public void compileById(String resourceId, ExecuteUnit executeUnit) throws Exception {
SourceCode code = generator.generate(resourceId, executeUnit);
String resourceName =null;
if("RESOURCE".equals(wrapper.getType())){
ResourceWrapper4Resource _wrapper =(ResourceWrapper4Resource)wrapper;
if("RESOURCE".equals(executeUnit.getType())){
ExecuteUnit4Resource _wrapper =(ExecuteUnit4Resource)executeUnit;
Resource resource =_wrapper.getResource();
resourceName =resource.getName();
}else if("LIB".equals(wrapper.getType())) {
ResourceWrapper4Lib _wrapper =(ResourceWrapper4Lib)wrapper;
}else if("LIB".equals(executeUnit.getType())) {
ExecuteUnit4Lib _wrapper =(ExecuteUnit4Lib)executeUnit;
Lib lib =_wrapper.getLib();
resourceName =lib.getName();
}
@ -48,19 +44,20 @@ public class GroovyEngineRuntime extends EngineRuntime{
service.validate(code.getSource());
} catch (Exception e) {
log.error("Compile Error for " + resourceName + "(resourceId=" + resourceId + ")",e);
throw e;
}
}
@Override
public void compileByCode(String resourceCode, Integer version, ResourceWrapper wrapper) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeByCode(resourceCode, version, wrapper);
public void compileByCode(String resourceCode, Integer version, ExecuteUnit wrapper) throws Exception {
SourceCode code = generator.generate(resourceCode, version, wrapper);
String resourceName =null;
if("RESOURCE".equals(wrapper.getType())){
ResourceWrapper4Resource _wrapper =(ResourceWrapper4Resource)wrapper;
ExecuteUnit4Resource _wrapper =(ExecuteUnit4Resource)wrapper;
Resource resource =_wrapper.getResource();
resourceName =resource.getName();
}else if("LIB".equals(wrapper.getType())) {
ResourceWrapper4Lib _wrapper =(ResourceWrapper4Lib)wrapper;
ExecuteUnit4Lib _wrapper =(ExecuteUnit4Lib)wrapper;
Lib lib =_wrapper.getLib();
resourceName =lib.getName();
}
@ -72,64 +69,64 @@ public class GroovyEngineRuntime extends EngineRuntime{
}
@Override
public ResourceResult executeById(Executor executor,String resourceId, ResourceWrapper wrapper, String json) throws Exception {
SourceCode code =codeGenerator.generateSourceCodeById(resourceId,wrapper);
public ResourceResult executeById(Executor executor, String resourceId, ExecuteUnit wrapper, String json) throws Exception {
SourceCode code = generator.generate(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);
public ResourceResult executeById(Executor executor,String resourceId, ExecuteUnit wrapper, String subModelCode, String json) throws Exception {
SourceCode code = generator.generate(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);
public ResourceResult executeById(Executor executor,String resourceId, ExecuteUnit wrapper, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(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);
public ResourceResult executeById(Executor executor,String resourceId, ExecuteUnit wrapper, String subModelCode, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(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);
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ExecuteUnit wrapper, String json) throws Exception {
SourceCode code = generator.generate(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);
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, String json) throws Exception {
SourceCode code = generator.generate(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);
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ExecuteUnit wrapper,Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(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);
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(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;

8
io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test.java

@ -5,8 +5,8 @@ import io.sc.engine.rule.client.ExecutorBuilder;
import io.sc.engine.rule.client.ExecutorFactory;
import io.sc.engine.rule.client.enums.ExecutorMode;
import io.sc.engine.rule.client.enums.LoaderMode;
import io.sc.engine.rule.core.code.impl.support.ParameterResult;
import io.sc.engine.rule.core.code.impl.support.ResourceResult;
import io.sc.engine.rule.core.ParameterResult;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.platform.util.TimeMonitor;
import java.util.HashMap;
@ -36,7 +36,7 @@ public class Test {
//第一次执行,消除缓存对性能对比测试的影响
//executor.executeByCode(MODEL_CODE, MODEL_VERSION,JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(prepareData()));
ResourceResult result =executor.executeByCode(MODEL_CODE, MODEL_VERSION,prepareData());
ResourceResult result =executor.execute(MODEL_CODE, MODEL_VERSION,prepareData());
List<ParameterResult> parameters =result.getData();
for(ParameterResult parameter : parameters) {
System.out.println(parameter);
@ -57,7 +57,7 @@ public class Test {
//准备执行的数据(输入参数)
Map<String,Object> data =prepareData();
//executor.getLoader().getResourceByCode(MODEL_CODE, MODEL_VERSION);
executor.executeByCode(MODEL_CODE, MODEL_VERSION,data);
executor.execute(MODEL_CODE, MODEL_VERSION,data);
}
tracer.info("执行完毕(采用 map 对象作为参数)");
tracer.info("采用 map 对象作为输入参数将执行效率提高 20+ 倍!!!");

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ExecuteResult.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ExecuteResult.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.core.code.impl.support;
package io.sc.engine.rule.core;
import io.sc.engine.rule.core.enums.ParameterType;

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

@ -1,4 +1,6 @@
package io.sc.engine.rule.core.code.impl.support;
package io.sc.engine.rule.core;
import io.sc.platform.util.StringUtil;
import java.util.Date;
import java.util.regex.Matcher;
@ -60,16 +62,25 @@ public class FieldValidator {
return false;
}
public static boolean integerRange(String fieldCode,String fieldName,Object obj,Integer min,Integer max,ValidateResult result) {
public static boolean integerRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Integer min,Integer max,Boolean maxInclude,ValidateResult result) {
if(obj instanceof Integer) {
if(min==null && max==null) {
return true;
}
String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude);
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");
result.error(fieldCode,fieldName, StringUtil.format("integer ${0} can been accepted",errorMessage));
return false;
}else {
if((minInclude==null || !minInclude) && value==min){
result.error(fieldCode,fieldName, StringUtil.format("integer ${0} can been accepted",errorMessage));
return false;
}
if((maxInclude!=null || !maxInclude) && value==max){
result.error(fieldCode,fieldName, StringUtil.format("integer ${0} can been accepted",errorMessage));
return false;
}
return true;
}
}
@ -77,16 +88,25 @@ public class FieldValidator {
return false;
}
public static boolean decimalRange(String fieldCode,String fieldName,Object obj,Double min,Double max,ValidateResult result) {
public static boolean decimalRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Double min,Double max,Boolean maxInclude,ValidateResult result) {
if(obj instanceof Double) {
if(min==null && max==null) {
return true;
}
String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude);
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");
result.error(fieldCode,fieldName, StringUtil.format("decimal ${0} can been accepted",errorMessage));
return false;
}else {
if((minInclude==null || !minInclude) && value==min){
result.error(fieldCode,fieldName, StringUtil.format("decimal ${0} can been accepted",errorMessage));
return false;
}
if((maxInclude!=null || !maxInclude) && value==max){
result.error(fieldCode,fieldName, StringUtil.format("decimal ${0} can been accepted",errorMessage));
return false;
}
return true;
}
}
@ -94,16 +114,25 @@ public class FieldValidator {
return false;
}
public static boolean lengthRange(String fieldCode,String fieldName,Object obj,Integer min,Integer max,ValidateResult result) {
public static boolean lengthRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Integer min,Integer max,Boolean maxInclude,ValidateResult result) {
if(obj instanceof String) {
if(min==null && max==null) {
return true;
}
String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude);
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");
result.error(fieldCode,fieldName, StringUtil.format("length ${0} can been accepted",errorMessage));
return false;
}else {
if((minInclude==null || !minInclude) && value.length()==min){
result.error(fieldCode,fieldName, StringUtil.format("length ${0} can been accepted",errorMessage));
return false;
}
if((maxInclude!=null || !maxInclude) && value.length()==max){
result.error(fieldCode,fieldName, StringUtil.format("length ${0} can been accepted",errorMessage));
return false;
}
return true;
}
}
@ -111,16 +140,25 @@ public class FieldValidator {
return false;
}
public static boolean dateRange(String fieldCode,String fieldName,Object obj,Date min,Date max,ValidateResult result) {
public static boolean dateRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Date min,Date max,Boolean maxInclude,ValidateResult result) {
if(obj instanceof Date) {
if(min==null && max==null) {
return true;
}
String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude);
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");
result.error(fieldCode,fieldName, StringUtil.format("date ${0} can been accepted",errorMessage));
return false;
}else {
if((minInclude==null || !minInclude) && value.getTime()==min.getTime()){
result.error(fieldCode,fieldName, StringUtil.format("date ${0} can been accepted",errorMessage));
return false;
}
if((maxInclude!=null || !maxInclude) && value.getTime()==max.getTime()){
result.error(fieldCode,fieldName, StringUtil.format("date ${0} can been accepted",errorMessage));
return false;
}
return true;
}
}
@ -158,4 +196,14 @@ public class FieldValidator {
result.error(fieldCode,fieldName, "only string value can been accepted");
return false;
}
private static String getRangeRestrictionMessage(Boolean minInclude,Object min,Object max,Boolean maxInclude){
StringBuilder sb =new StringBuilder();
sb.append(min==null?"":min).append(" ");
sb.append((minInclude==null || !minInclude)?"<":"<=");
sb.append(" value ");
sb.append((maxInclude==null || !maxInclude)?"<":"<=").append(" ");
sb.append(max==null?"":max);
return sb.toString();
}
}

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ModelAbstract.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ModelAbstract.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.core.code.impl.support;
package io.sc.engine.rule.core;
/**
* 模型摘要信息

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ParameterResult.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ParameterResult.java

@ -1,8 +1,6 @@
package io.sc.engine.rule.core.code.impl.support;
package io.sc.engine.rule.core;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.sc.engine.rule.core.classes.RuleResult;
import io.sc.engine.rule.core.classes.SingleRuleResult;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.platform.util.ObjectMapperUtil;

8
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/ResourceAbstract.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ResourceAbstract.java

@ -1,13 +1,11 @@
package io.sc.engine.rule.core.classes;
import java.util.Date;
package io.sc.engine.rule.core;
import io.sc.engine.rule.core.enums.DeployStatus;
import java.util.Date;
/**
* 资源摘要信息
* @author wangshaoping
*
*/
public class ResourceAbstract {
private String id;

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceResult.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ResourceResult.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.core.code.impl.support;
package io.sc.engine.rule.core;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.sc.engine.rule.core.enums.ParameterType;

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/Rule.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/Rule.java

@ -1,9 +1,7 @@
package io.sc.engine.rule.core.classes;
package io.sc.engine.rule.core;
/**
* 规则信息
* @author wangshaoping
*
*/
public class Rule {
private boolean isTriggered; //是否触发

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/RuleResult.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/RuleResult.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.core.classes;
package io.sc.engine.rule.core;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.sc.platform.util.ObjectMapperUtil;
@ -8,8 +8,6 @@ import java.util.List;
/**
* 规则结果值
* @author wangshaoping
*
*/
public class RuleResult {
private boolean triggered; //是否触发

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/SingleRuleResult.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/SingleRuleResult.java

@ -1,12 +1,10 @@
package io.sc.engine.rule.core.classes;
package io.sc.engine.rule.core;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.sc.platform.util.ObjectMapperUtil;
/**
* 单规则结果值
* @author wangshaoping
*
*/
public class SingleRuleResult {
private boolean triggered; //是否触发

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ValidateField.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ValidateField.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.core.code.impl.support;
package io.sc.engine.rule.core;
public class ValidateField {
private String fieldCode;

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ValidateResult.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ValidateResult.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.core.code.impl.support;
package io.sc.engine.rule.core;
import java.util.ArrayList;
import java.util.List;

29
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/CodeGenerator.java

@ -1,29 +0,0 @@
package io.sc.engine.rule.core.code;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
/**
* 代码生成器接口
* @author wangshaoping
*
*/
public interface CodeGenerator {
/**
* 生成可执行的源代码
* @param resourceId 资源ID
* @param wrapper 资源封装器对象
* @return 源代码封装对象
* @throws Exception 违例
*/
public SourceCode generateSourceCodeById(String resourceId,ResourceWrapper wrapper) throws Exception;
/**
* 生成可执行的源代码
* @param resourceCode 资源代码
* @param version 模型版本
* @param wrapper 资源封装器对象
* @return 源代码封装对象
* @throws Exception 违例
*/
public SourceCode generateSourceCodeByCode(String resourceCode,Integer version,ResourceWrapper wrapper) throws Exception;
}

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ExecuteUnit.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.core.code.impl.support;
package io.sc.engine.rule.core.code;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ExecuteUnit4Lib.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit4Lib.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.core.code.impl.support;
package io.sc.engine.rule.core.code;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import io.sc.engine.rule.core.po.lib.Lib;

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ExecuteUnit4Resource.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit4Resource.java

@ -1,10 +1,8 @@
package io.sc.engine.rule.core.code.impl.support;
package io.sc.engine.rule.core.code;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import io.sc.engine.rule.core.po.lib.Lib;
import io.sc.engine.rule.core.po.model.Model;
import io.sc.engine.rule.core.po.resource.Resource;
import io.sc.engine.rule.core.vo.resource.ModelResource;
import java.util.List;

5
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/SourceCodeGenerator.java

@ -1,7 +1,8 @@
package io.sc.engine.rule.core.code;
import io.sc.engine.rule.core.code.impl.support.ExecuteUnit;
public interface SourceCodeGenerator {
public SourceCode generateSourceCode(ExecuteUnit executeUnit) throws Exception;
public SourceCode generate(ExecuteUnit executeUnit) throws Exception;
public SourceCode generate(String resourceId,ExecuteUnit executeUnit) throws Exception;
public SourceCode generate(String resourceCode,Integer version,ExecuteUnit executeUnit) throws Exception;
}

53
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4LibGenerator.java

@ -1,11 +1,20 @@
package io.sc.engine.rule.core.code.generator;
import io.sc.engine.rule.core.code.SourceCode;
import io.sc.engine.rule.core.code.impl.support.ExecuteUnit;
import io.sc.engine.rule.core.code.impl.support.ExecuteUnit4Lib;
import io.sc.engine.rule.core.code.impl.support.ExecuteUnit4Resource;
import com.jfinal.template.Engine;
import com.jfinal.template.Template;
import io.sc.engine.rule.core.code.ExecuteUnit4Lib;
import io.sc.engine.rule.core.code.generator.impl.DictionaryGenerator;
import io.sc.engine.rule.core.code.generator.impl.IndicatorGenerator;
import io.sc.engine.rule.core.code.generator.impl.ParameterGenerator;
import io.sc.engine.rule.core.code.generator.impl.processor.*;
import io.sc.engine.rule.core.util.IdReplacer;
import java.util.HashMap;
import java.util.Map;
public class ExecuteUnit4LibGenerator extends ExecuteUnitGenerator {
private static final String template_location = "/io/sc/engine/rule/core/code/template/impl/lib.tpl";
private ExecuteUnit4Lib executeUnit;
public ExecuteUnit4LibGenerator(ExecuteUnit4Lib executeUnit) {
@ -14,13 +23,43 @@ public class ExecuteUnit4LibGenerator extends ExecuteUnitGenerator {
@Override
public String getClassName() {
return executeUnit.getLib().getCode() + "_V" + executeUnit.getLib().getVersion();
return IdReplacer.className(executeUnit.getLib().getCode(),executeUnit.getLib().getVersion());
}
@Override
public String generate() throws Exception {
StringBuilder sb =new StringBuilder();
Engine engine = new Engine(Engine.MAIN_ENGINE_NAME);
engine.setDevMode(true);
engine.setToClassPathSourceFactory();
engine.setStaticFieldExpression(true);
engine.setStaticMethodExpression(true);
engine.addSharedStaticMethod(IdReplacer.class);
//engine.addSharedStaticMethod(ExpressionReplacer.class);
//
engine.addSharedObject("DictionaryGenerator",new DictionaryGenerator());
engine.addSharedObject("ParameterGenerator",new ParameterGenerator());
engine.addSharedObject("IndicatorGenerator",new IndicatorGenerator());
engine.addSharedObject("Arithmetic",new Arithmetic());
engine.addSharedObject("ConditionRange",new ConditionRange());
engine.addSharedObject("DecisionTable",new DecisionTable());
engine.addSharedObject("DecisionTable2C",new DecisionTable2C());
engine.addSharedObject("DecisionTree",new DecisionTree());
engine.addSharedObject("ExecutionFlow",new ExecutionFlow());
engine.addSharedObject("MathFormula",new MathFormula());
engine.addSharedObject("NumberRange",new NumberRange());
engine.addSharedObject("ObjectProperty",new ObjectProperty());
engine.addSharedObject("OptionValue",new OptionValue());
engine.addSharedObject("SqlFieldMapping",new SqlFieldMapping());
engine.addSharedObject("Ternary",new Ternary());
engine.addSharedObject("WhenThen",new WhenThen());
return sb.toString();
Map<String,Object> data =new HashMap<>();
data.put("packageName",this.getPackageName());
data.put("executeUnit",executeUnit);
Template template =engine.getTemplate(template_location);
return template.renderToString(data).trim();
}
}

49
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4ResourceGenerator.java

@ -2,17 +2,20 @@ package io.sc.engine.rule.core.code.generator;
import com.jfinal.template.Engine;
import com.jfinal.template.Template;
import io.sc.engine.rule.core.code.impl.support.ExecuteUnit4Resource;
import io.sc.engine.rule.core.code.ExecuteUnit4Resource;
import io.sc.engine.rule.core.code.generator.impl.DictionaryGenerator;
import io.sc.engine.rule.core.code.generator.impl.IndicatorGenerator;
import io.sc.engine.rule.core.code.generator.impl.ParameterGenerator;
import io.sc.engine.rule.core.code.generator.impl.processor.*;
import io.sc.engine.rule.core.po.resource.ModelResource;
import io.sc.engine.rule.core.po.resource.Resource;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import java.util.HashMap;
import java.util.Map;
public class ExecuteUnit4ResourceGenerator extends ExecuteUnitGenerator {
private static final String template_location = "/io/sc/engine/rule/core/code/generator/template/resource.tpl";
private static final String template_location = "/io/sc/engine/rule/core/code/template/impl/resource.tpl";
private ExecuteUnit4Resource executeUnit;
public ExecuteUnit4ResourceGenerator(ExecuteUnit4Resource executeUnit) {
@ -25,7 +28,7 @@ public class ExecuteUnit4ResourceGenerator extends ExecuteUnitGenerator {
@Override
public String getClassName() {
return executeUnit.getResource().getCode() + "_V" + executeUnit.getResource().getVersion();
return IdReplacer.className(executeUnit.getResource().getCode(),executeUnit.getResource().getVersion());
}
@Override
@ -36,24 +39,32 @@ public class ExecuteUnit4ResourceGenerator extends ExecuteUnitGenerator {
engine.setStaticFieldExpression(true);
engine.setStaticMethodExpression(true);
engine.addSharedStaticMethod(CodeReplacer.class);
engine.addSharedStaticMethod(ExpressionReplacer.class);
//engine.addSharedObject("TC",new CodeReplacer());
engine.addSharedStaticMethod(IdReplacer.class);
//engine.addSharedStaticMethod(ExpressionReplacer.class);
//
engine.addSharedObject("DictionaryGenerator",new DictionaryGenerator());
engine.addSharedObject("ParameterGenerator",new ParameterGenerator());
engine.addSharedObject("IndicatorGenerator",new IndicatorGenerator());
engine.addSharedObject("Arithmetic",new Arithmetic());
engine.addSharedObject("ConditionRange",new ConditionRange());
engine.addSharedObject("DecisionTable",new DecisionTable());
engine.addSharedObject("DecisionTable2C",new DecisionTable2C());
engine.addSharedObject("DecisionTree",new DecisionTree());
engine.addSharedObject("ExecutionFlow",new ExecutionFlow());
engine.addSharedObject("MathFormula",new MathFormula());
engine.addSharedObject("NumberRange",new NumberRange());
engine.addSharedObject("ObjectProperty",new ObjectProperty());
engine.addSharedObject("OptionValue",new OptionValue());
engine.addSharedObject("SqlFieldMapping",new SqlFieldMapping());
engine.addSharedObject("Ternary",new Ternary());
engine.addSharedObject("WhenThen",new WhenThen());
Map<String,Object> data =new HashMap<>();
data.put("packageName",this.getPackageName());
data.put("executeUnit",executeUnit);
Template template =engine.getTemplate(template_location);
return template.renderToString(data);
// StringBuilder sb =new StringBuilder();
// sb.append(PackageGenerator.generate(getPackageName())).append("\n");
// sb.append(CommonImportGenerator.generate()).append("\n");
// sb.append(FunctionGenerator.generate(executeUnit.getFunctions())).append("\n");
// sb.append(ResourceClassGenerator.generate(executeUnit.getResource())).append("\n");
// sb.append(ArgumentClassGenerator.generate(executeUnit.getResource())).append("\n");
// sb.append(DictionaryClassGenerator.generate(executeUnit.getDictionaries())).append("\n");
// sb.append(LibClassGenerator.generate(executeUnit.getLibs())).append("\n");
// return sb.toString();
return template.renderToString(data).trim();
}
}

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnitGenerator.java

@ -1,8 +1,6 @@
package io.sc.engine.rule.core.code.generator;
import io.sc.engine.rule.core.code.SourceCode;
import io.sc.engine.rule.core.code.generator.impl.CommonImportGenerator;
import io.sc.engine.rule.core.code.generator.impl.PackageGenerator;
public abstract class ExecuteUnitGenerator {
public SourceCode generateSourceCode() throws Exception {
@ -14,7 +12,7 @@ public abstract class ExecuteUnitGenerator {
}
public String getPackageName() {
return "io.sc.engine.rule.core.code";
return "io.sc.engine.rule.generated";
}
public abstract String getClassName();

27
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/GroovySourceCodeGenerator.java

@ -0,0 +1,27 @@
package io.sc.engine.rule.core.code.generator;
import io.sc.engine.rule.core.code.*;
public class GroovySourceCodeGenerator implements SourceCodeGenerator {
@Override
public SourceCode generate(ExecuteUnit executeUnit) throws Exception {
if(executeUnit instanceof ExecuteUnit4Resource){
ExecuteUnitGenerator generator =new ExecuteUnit4ResourceGenerator((ExecuteUnit4Resource)executeUnit);
return generator.generateSourceCode();
}else if(executeUnit instanceof ExecuteUnit4Lib){
ExecuteUnitGenerator generator =new ExecuteUnit4LibGenerator((ExecuteUnit4Lib)executeUnit);
return generator.generateSourceCode();
}
return null;
}
@Override
public SourceCode generate(String resourceId, ExecuteUnit executeUnit) throws Exception {
return generate(executeUnit);
}
@Override
public SourceCode generate(String resourceCode, Integer version, ExecuteUnit executeUnit) throws Exception {
return null;
}
}

9
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ArgumentClassGenerator.java

@ -1,9 +0,0 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.po.resource.Resource;
public class ArgumentClassGenerator {
public static String generate(Resource resource) {
return null;
}
}

13
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/CommonImportGenerator.java

@ -1,13 +0,0 @@
package io.sc.engine.rule.core.code.generator.impl;
import org.springframework.util.StreamUtils;
import java.nio.charset.StandardCharsets;
public class CommonImportGenerator {
private static final String TEMPLATE_CLASSPATH = "/io/sc/engine/rule/core/code/generator/template/Import.tpl";
public static String generate() throws Exception{
return StreamUtils.copyToString(ResourceClassGenerator.class.getResourceAsStream(TEMPLATE_CLASSPATH), StandardCharsets.UTF_8);
}
}

11
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/DictionaryClassGenerator.java

@ -1,11 +0,0 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.po.dictionary.Dictionary;
import java.util.List;
public class DictionaryClassGenerator {
public static String generate(List<Dictionary> dictionaries) {
return null;
}
}

75
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/DictionaryGenerator.java

@ -0,0 +1,75 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.po.dictionary.Dictionary;
import io.sc.engine.rule.core.po.dictionary.UserDefinedJavaClassField;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.StringUtil;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DictionaryGenerator {
public String generateFields(List<UserDefinedJavaClassField> fields){
if(!CollectionUtil.hasElements(fields)){ return null; }
StringBuilder sb =new StringBuilder("");
for(UserDefinedJavaClassField field : fields){
String code =field.getCode();
String name =field.getName();
String valueType =field.getValueType();
Integer valueTypeVersion =field.getValueTypeVersion();
String defaultValue =field.getDefaultValue();
Map<String,Object> variables =new HashMap<>();
variables.put("name",name);
variables.put("fieldName", IdReplacer.fieldName(code));
variables.put("defaultValue",defaultValue);
if(ValueTypeUtil.isString(valueType)){
if(StringUtils.hasText(defaultValue)){
String tpl ="String ${fieldName} =\"\"\"${defaultValue}\"\"\"; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{
String tpl ="String ${fieldName}; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}else{
if(StringUtils.hasText(defaultValue)){
variables.put("className",IdReplacer.className(valueType,valueTypeVersion));
String tpl ="${className} ${fieldName} =${defaultValue}; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{
variables.put("className",IdReplacer.className(valueType,valueTypeVersion));
String tpl ="${className} ${fieldName}; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
}
return sb.toString();
}
public String generateInits(List<UserDefinedJavaClassField> fields){
if(!CollectionUtil.hasElements(fields)){ return null; }
StringBuilder sb =new StringBuilder("");
for(UserDefinedJavaClassField field : fields){
String code =field.getCode();
String name =field.getName();
String valueCalculation =field.getValueCalculation();
if(StringUtils.hasText(valueCalculation)) {
Map<String, Object> variables = new HashMap<>();
variables.put("name", name);
variables.put("fieldName", IdReplacer.fieldName(code));
variables.put("expression", GroovyExpressionReplacer.groovy(valueCalculation));
String tpl = "${fieldName} =${expression}; //${name}";
sb.append(StringUtil.format(tpl, variables)).append("\n");
}
}
return sb.toString();
}
}

29
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/FunctionGenerator.java

@ -1,29 +0,0 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.po.function.Function;
import io.sc.platform.util.StringUtil;
import org.springframework.util.StreamUtils;
import java.nio.charset.StandardCharsets;
import java.util.List;
public class FunctionGenerator {
private static final String TEMPLATE_CLASSPATH = "/io/sc/engine/rule/core/code/generator/template/Function.tpl";
public static String generate(List<Function> functions) throws Exception{
String template =StreamUtils.copyToString(ResourceClassGenerator.class.getResourceAsStream(TEMPLATE_CLASSPATH), StandardCharsets.UTF_8);
StringBuilder sb =new StringBuilder("");
if(functions!=null && !functions.isEmpty()){
for(Function function : functions){
String[] pattern =new String[]{
"/**",
" * {0}",
" */",
};
sb.append(StringUtil.format(pattern,function.getDescription()));
sb.append(function.getBody()).append("\n\n");
}
}
return StringUtil.format(template,sb.toString());
}
}

256
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java

@ -0,0 +1,256 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.IndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.*;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.ParameterValidator;
import io.sc.engine.rule.core.po.model.validator.*;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.StringUtil;
import org.springframework.util.StringUtils;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class IndicatorGenerator {
public String generateFields(List<Indicator> indicators){
if(!CollectionUtil.hasElements(indicators)){ return null; }
StringBuilder sb =new StringBuilder("");
for(Indicator indicator : indicators){
String code =indicator.getCode();
String name =indicator.getName();
String valueType =indicator.getValueType();
Integer valueTypeVersion =indicator.getValueTypeVersion();
String defaultValue =indicator.getDefaultValue();
Map<String,Object> variables =new HashMap<>();
variables.put("name",name);
variables.put("fieldName", IdReplacer.fieldName(code));
variables.put("defaultValue",defaultValue);
if(ValueTypeUtil.isString(valueType)){
if(StringUtils.hasText(defaultValue)){
String tpl ="String ${fieldName} =\"\"\"${defaultValue}\"\"\"; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{
String tpl ="String ${fieldName}; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}else{
if(StringUtils.hasText(defaultValue)){
variables.put("className",IdReplacer.className(valueType,valueTypeVersion));
String tpl ="${className} ${fieldName} =${defaultValue}; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{
variables.put("className",IdReplacer.className(valueType,valueTypeVersion));
String tpl ="${className} ${fieldName}; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
}
return sb.toString();
}
public static String generateConvertorFromMap(List<Indicator> indicators) {
if (!CollectionUtil.hasElements(indicators)) {
return null;
}
StringBuilder sb = new StringBuilder("");
for (Indicator indicator : indicators) {
String code = indicator.getCode();
String name = indicator.getName();
String valueType = indicator.getValueType();
Integer valueTypeVersion = indicator.getValueTypeVersion();
Map<String,Object> variables =new HashMap<>();
variables.put("code",code);
variables.put("name",name);
variables.put("fieldName",IdReplacer.fieldName(code));
variables.put("className",IdReplacer.className(valueType,valueTypeVersion));
if (indicator.getValueTypeIsList()) {
String tpl ="arg.${fieldName} =TypeConvertor.getValue(map.get('${code}'),new TypeReference<List<${className}>>(){}); //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
} else {
String tpl ="arg.${fieldName} =TypeConvertor.getValue(map.get('${code}'),${className}.class); //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
if (!ValueTypeUtil.isBase(valueType)) {
String tpl ="if(arg.${fieldName}!=null) { arg.${fieldName}.init(); }";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
return sb.toString();
}
public static String generateConvertorFromJson(List<Indicator> indicators) {
if (!CollectionUtil.hasElements(indicators)) {
return null;
}
StringBuilder sb = new StringBuilder("");
for (Indicator indicator : indicators) {
String code = indicator.getCode();
String name = indicator.getName();
String valueType = indicator.getValueType();
Map<String,Object> variables =new HashMap<>();
variables.put("fieldName",IdReplacer.fieldName(code));
variables.put("name",name);
if (!ValueTypeUtil.isBase(valueType)) {
String tpl ="if(arg.${fieldName}!=null) { arg.${fieldName}.init(); } //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
return sb.toString();
}
public static String generateValidator(List<Indicator> indicators) {
if (!CollectionUtil.hasElements(indicators)) {
return null;
}
StringBuilder sb = new StringBuilder("");
for (Indicator indicator : indicators) {
String code =indicator.getCode();
String name =indicator.getName();
if(CollectionUtil.hasElements(indicator.getValidators())){
for(IndicatorValidator validator : indicator.getValidators()){
Map<String,Object> variables =new HashMap<>();
variables.put("code",code);
variables.put("name",name);
variables.put("fieldName",IdReplacer.fieldName(code));
if(validator instanceof EmptyIndicatorValidator){
String tpl ="FieldValidator.empty('${code}','${name}',this.${fieldName},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof NotEmptyIndicatorValidator){
String tpl ="FieldValidator.notEmpty('${code}','${name}',this.${fieldName},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof TrueIndicatorValidator){
String tpl ="FieldValidator.trueValue('${code}','${name}',this.${fieldName},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof FalseIndicatorValidator){
String tpl ="FieldValidator.falseValue('${code}','${name}',this.${fieldName},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof EmailIndicatorValidator){
String tpl ="FieldValidator.mail('${code}','${name}',this.${fieldName},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof IntegerRangeIndicatorValidator){
IntegerRangeIndicatorValidator integerRangeIndicatorValidator =(IntegerRangeIndicatorValidator)validator;
variables.put("minInclude",integerRangeIndicatorValidator.getMinInclude());
variables.put("min",StringUtils.hasText(integerRangeIndicatorValidator.getMinValue())?integerRangeIndicatorValidator.getMinValue():"null");
variables.put("max",StringUtils.hasText(integerRangeIndicatorValidator.getMaxValue())?integerRangeIndicatorValidator.getMaxValue():"null");
variables.put("maxInclude",integerRangeIndicatorValidator.getMaxInclude());
String tpl ="FieldValidator.integerRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof DecimalRangeIndicatorValidator){
DecimalRangeIndicatorValidator decimalRangeIndicatorValidator =(DecimalRangeIndicatorValidator)validator;
variables.put("minInclude",decimalRangeIndicatorValidator.getMinInclude());
variables.put("min",StringUtils.hasText(decimalRangeIndicatorValidator.getMinValue())?decimalRangeIndicatorValidator.getMinValue():"null");
variables.put("max",StringUtils.hasText(decimalRangeIndicatorValidator.getMaxValue())?decimalRangeIndicatorValidator.getMaxValue():"null");
variables.put("maxInclude",decimalRangeIndicatorValidator.getMaxInclude());
String tpl ="FieldValidator.decimalRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof LengthRangeIndicatorValidator){
LengthRangeIndicatorValidator lengthRangeIndicatorValidator =(LengthRangeIndicatorValidator)validator;
variables.put("minInclude",lengthRangeIndicatorValidator.getMinInclude());
variables.put("min",StringUtils.hasText(lengthRangeIndicatorValidator.getMinValue())?lengthRangeIndicatorValidator.getMinValue():"null");
variables.put("max",StringUtils.hasText(lengthRangeIndicatorValidator.getMaxValue())?lengthRangeIndicatorValidator.getMaxValue():"null");
variables.put("maxInclude",lengthRangeIndicatorValidator.getMaxInclude());
String tpl ="FieldValidator.lengthRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof DateRangeIndicatorValidator){
DateRangeIndicatorValidator dateRangeIndicatorValidator =(DateRangeIndicatorValidator)validator;
variables.put("minInclude",dateRangeIndicatorValidator.getMinInclude());
variables.put("min",StringUtils.hasText(dateRangeIndicatorValidator.getMinValue())?"DateUtil.parseDate(\"" + dateRangeIndicatorValidator.getMinValue() + "\",DateUtil.yyyy_MM_dd_HH_mm_ss)":"null");
variables.put("max",StringUtils.hasText(dateRangeIndicatorValidator.getMaxValue())?"DateUtil.parseDate(\"" + dateRangeIndicatorValidator.getMaxValue() + "\",DateUtil.yyyy_MM_dd_HH_mm_ss)":"null");
variables.put("maxInclude",dateRangeIndicatorValidator.getMaxInclude());
String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof PatternIndicatorValidator){
PatternIndicatorValidator patternIndicatorValidator =(PatternIndicatorValidator)validator;
variables.put("pattern",StringUtils.hasText(patternIndicatorValidator.getPattern())?patternIndicatorValidator.getPattern():"null");
String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},'${pattern}',result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
}
}
return sb.toString();
}
public static String generateToResult(List<Indicator> indicators) {
if(!CollectionUtil.hasElements(indicators)){ return null; }
StringBuilder sb =new StringBuilder("");
for(Indicator indicator : indicators){
String type =indicator.getType().toString();
String code =indicator.getCode();
String name =indicator.getName();
String valueType =indicator.getValueType();
Integer valueScale =indicator.getValueScale();
RoundingMode valueRoundingMode =indicator.getValueRoundingMode();
Map<String,Object> variables =new HashMap<>();
variables.put("type",type);
variables.put("code",code);
variables.put("name",name);
variables.put("valueType",valueType);
variables.put("valueScale",valueScale==null?8:valueScale);
variables.put("valueRoundingMode",valueRoundingMode==null?RoundingMode.HALF_UP:valueRoundingMode);
variables.put("fieldName",IdReplacer.fieldName(code));
if(ParameterType.INDICATOR.equals(indicator.getType()) || ParameterType.OUT.equals(indicator.getType()) || ParameterType.INTERMEDIATE.equals(indicator.getType())){
if(ValueTypeUtil.isDecimal(indicator.getValueType())){
String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',${valueScale},RoundingMode.${valueRoundingMode},this.${fieldName}==null?null:this.${fieldName}.setScale(${valueScale},RoundingMode.${valueRoundingMode})));";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(ValueTypeUtil.isBase(indicator.getValueType())){
String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',null,null,this.${fieldName}==null?null:this.${fieldName}));";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{
String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',null,null,this.${fieldName}==null?null:ObjectMapperUtil.json().writeValueAsString(this.${fieldName})));";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
}
return sb.toString();
}
public static String generateToMap(List<Indicator> indicators) {
if(!CollectionUtil.hasElements(indicators)){ return null; }
StringBuilder sb =new StringBuilder("");
for(Indicator indicator : indicators){
String code =indicator.getCode();
String name =indicator.getName();
Map<String,Object> variables =new HashMap<>();
variables.put("code",code);
variables.put("name",name);
variables.put("fieldName",IdReplacer.fieldName(code));
String tpl ="map.put('${code}',this.${fieldName}); //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
return sb.toString();
}
public static String generateMergeResult(List<Indicator> indicators) {
if(!CollectionUtil.hasElements(indicators)){ return null; }
StringBuilder sb =new StringBuilder("");
for(Indicator indicator : indicators){
String code =indicator.getCode();
String valueType = indicator.getValueType();
Map<String,Object> variables =new HashMap<>();
variables.put("code",code);
variables.put("valueType",valueType);
if(ValueTypeUtil.isBase(valueType)){
String tpl ="if(result.exists('${code}')){ this.${code}=TypeConvertor.getValue(result.getValueByParameterCode('${code}'),${valueType}.class); }";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{
String tpl ="if(result.exists('${code}')){ this.${code}=result.getValueByParameterCode('${code}'); }";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
return sb.toString();
}
}

12
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/LibClassGenerator.java

@ -1,12 +0,0 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.po.dictionary.Dictionary;
import io.sc.engine.rule.core.po.lib.Lib;
import java.util.List;
public class LibClassGenerator {
public static String generate(List<Lib> libs) {
return null;
}
}

57
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ModelGenerator.java

@ -1,57 +0,0 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.po.model.Model;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.FileUtil;
import io.sc.platform.util.StringUtil;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ModelGenerator {
private static final String MODEL_TEMPLATE_CLASSPATH ="classpath:/io/sc/engine/rule/core/code/generator/templates/Model.tpl";
private static final String MODEL_EXECUTE_METHOD_TEMPLATE_CLASSPATH ="classpath:/io/sc/engine/rule/core/code/generator/templates/ModelExecuteMethod.tpl";
public static String generate(Model model) throws Exception{
String template = FileUtil.readString(MODEL_TEMPLATE_CLASSPATH);
StringBuilder sb =new StringBuilder();
Map<String,Object> variables =new HashMap<>();
variables.put("enable",model.getEnable());
variables.put("name",model.getName());
variables.put("methodName", CodeReplacer.methodName(model.getCode()));
variables.put("executeMode",model.getExecuteMode().toString());
variables.put("executeModelMethods",generateExecuteMethods(model));
variables.put("executeParameterMethods",ParameterGenerator.generateExecuteMethods(model));
variables.put("modelMethodBodys",generateMethodBodys(model.getChildren()));
variables.put("parameterMethodBodys",ParameterGenerator.generateMethodBodys(model.getAllParameters()));
sb.append(StringUtil.format(template,variables));
return sb.toString();
}
public static String generateExecuteMethods(Model model) throws Exception {
StringBuilder sb =new StringBuilder("");
if(CollectionUtil.hasElements(model.getChildren())){
String template = FileUtil.readString(MODEL_EXECUTE_METHOD_TEMPLATE_CLASSPATH);
for(Model subModel : model.getChildren()) {
Map<String,Object> variables =new HashMap<>();
variables.put("methodName", CodeReplacer.methodName(subModel.getCode()));
variables.put("comments",subModel.getName());
sb.append(StringUtil.format(template,variables));
}
}
return sb.toString();
}
public static String generateMethodBodys(List<Model> models) throws Exception {
StringBuilder sb =new StringBuilder("");
if(CollectionUtil.hasElements(models)){
for(Model model : models) {
sb.append(generate(model));
}
}
return sb.toString();
}
}

15
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/PackageGenerator.java

@ -1,15 +0,0 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.platform.util.StringUtil;
import org.springframework.util.StreamUtils;
import java.nio.charset.StandardCharsets;
public class PackageGenerator {
private static final String TEMPLATE_CLASSPATH = "/io/sc/engine/rule/core/code/generator/template/Package.tpl";
public static String generate(String packageName) throws Exception{
String template =StreamUtils.copyToString(ResourceClassGenerator.class.getResourceAsStream(TEMPLATE_CLASSPATH), StandardCharsets.UTF_8);
return StringUtil.format(template,packageName);
}
}

251
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java

@ -1,58 +1,251 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.po.model.Model;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.parameter.IntermediateParameter;
import io.sc.engine.rule.core.po.model.parameter.OutParameter;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.po.model.ParameterValidator;
import io.sc.engine.rule.core.po.model.validator.*;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.FileUtil;
import io.sc.platform.util.StringUtil;
import org.springframework.util.StringUtils;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ParameterGenerator {
private static final String PARAMETER_TEMPLATE_CLASSPATH ="classpath:/io/sc/engine/rule/core/code/generator/templates/Parameter.tpl";
private static final String PARAMETER_EXECUTE_METHOD_TEMPLATE_CLASSPATH ="classpath:/io/sc/engine/rule/core/code/generator/templates/ParameterExecuteMethod.tpl";
public String generateFields(List<Parameter> parameters){
if(!CollectionUtil.hasElements(parameters)){ return null; }
StringBuilder sb =new StringBuilder("");
for(Parameter parameter : parameters){
String code =parameter.getCode();
String name =parameter.getName();
String valueType =parameter.getValueType();
Integer valueTypeVersion =parameter.getValueTypeVersion();
String defaultValue =parameter.getDefaultValue();
Map<String,Object> variables =new HashMap<>();
variables.put("name",name);
variables.put("fieldName",IdReplacer.fieldName(code));
variables.put("defaultValue",defaultValue);
if(ValueTypeUtil.isString(valueType)){
if(StringUtils.hasText(defaultValue)){
String tpl ="String ${fieldName} =\"\"\"${defaultValue}\"\"\"; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{
String tpl ="String ${fieldName}; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}else{
if(StringUtils.hasText(defaultValue)){
variables.put("className",IdReplacer.className(valueType,valueTypeVersion));
String tpl ="${className} ${fieldName} =${defaultValue}; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{
variables.put("className",IdReplacer.className(valueType,valueTypeVersion));
String tpl ="${className} ${fieldName}; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
}
return sb.toString();
}
public static String generateConvertorFromMap(List<Parameter> parameters) {
if (!CollectionUtil.hasElements(parameters)) {
return null;
}
StringBuilder sb = new StringBuilder("");
for (Parameter parameter : parameters) {
String code = parameter.getCode();
String name = parameter.getName();
String valueType = parameter.getValueType();
Integer valueTypeVersion = parameter.getValueTypeVersion();
Map<String,Object> variables =new HashMap<>();
variables.put("code",code);
variables.put("name",name);
variables.put("fieldName",IdReplacer.fieldName(code));
variables.put("className",IdReplacer.className(valueType,valueTypeVersion));
if (parameter.getValueTypeIsList()) {
String tpl ="arg.${fieldName} =TypeConvertor.getValue(map.get('${code}'),new TypeReference<List<${className}>>(){}); //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
} else {
String tpl ="arg.${fieldName} =TypeConvertor.getValue(map.get('${code}'),${className}.class); //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
if (!ValueTypeUtil.isBase(valueType)) {
String tpl ="if(arg.${fieldName}!=null) { arg.${fieldName}.init(); }";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
return sb.toString();
}
public static String generateConvertorFromJson(List<Parameter> parameters) {
if (!CollectionUtil.hasElements(parameters)) {
return null;
}
StringBuilder sb = new StringBuilder("");
for (Parameter parameter : parameters) {
String code = parameter.getCode();
String name = parameter.getName();
String valueType = parameter.getValueType();
public static String generate(Parameter parameter) throws Exception{
String template = FileUtil.readString(PARAMETER_TEMPLATE_CLASSPATH);
StringBuilder sb =new StringBuilder();
Map<String,Object> variables =new HashMap<>();
variables.put("fieldName",IdReplacer.fieldName(code));
variables.put("name",name);
if (!ValueTypeUtil.isBase(valueType)) {
String tpl ="if(arg.${fieldName}!=null) { arg.${fieldName}.init(); } //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
return sb.toString();
}
public static String generateValidator(List<Parameter> parameters) {
if (!CollectionUtil.hasElements(parameters)) {
return null;
}
StringBuilder sb = new StringBuilder("");
for (Parameter parameter : parameters) {
String code =parameter.getCode();
String name =parameter.getName();
if(CollectionUtil.hasElements(parameter.getValidators())){
for(ParameterValidator validator : parameter.getValidators()){
Map<String,Object> variables =new HashMap<>();
variables.put("name",parameter.getName());
variables.put("methodName", CodeReplacer.methodName(parameter.getCode()));
variables.put("type", parameter.getType().toString());
sb.append(StringUtil.format(template,variables));
variables.put("code",code);
variables.put("name",name);
variables.put("fieldName",IdReplacer.fieldName(code));
if(validator instanceof EmptyParameterValidator){
String tpl ="FieldValidator.empty('${code}','${name}',this.${fieldName},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof NotEmptyParameterValidator){
String tpl ="FieldValidator.notEmpty('${code}','${name}',this.${fieldName},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof TrueParameterValidator){
String tpl ="FieldValidator.trueValue('${code}','${name}',this.${fieldName},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof FalseParameterValidator){
String tpl ="FieldValidator.falseValue('${code}','${name}',this.${fieldName},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof EmailParameterValidator){
String tpl ="FieldValidator.mail('${code}','${name}',this.${fieldName},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof IntegerRangeParameterValidator){
IntegerRangeParameterValidator integerRangeParameterValidator =(IntegerRangeParameterValidator)validator;
variables.put("minInclude",integerRangeParameterValidator.getMinInclude());
variables.put("min",StringUtils.hasText(integerRangeParameterValidator.getMinValue())?integerRangeParameterValidator.getMinValue():"null");
variables.put("max",StringUtils.hasText(integerRangeParameterValidator.getMaxValue())?integerRangeParameterValidator.getMaxValue():"null");
variables.put("maxInclude",integerRangeParameterValidator.getMaxInclude());
String tpl ="FieldValidator.integerRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof DecimalRangeParameterValidator){
DecimalRangeParameterValidator decimalRangeParameterValidator =(DecimalRangeParameterValidator)validator;
variables.put("minInclude",decimalRangeParameterValidator.getMinInclude());
variables.put("min",StringUtils.hasText(decimalRangeParameterValidator.getMinValue())?decimalRangeParameterValidator.getMinValue():"null");
variables.put("max",StringUtils.hasText(decimalRangeParameterValidator.getMaxValue())?decimalRangeParameterValidator.getMaxValue():"null");
variables.put("maxInclude",decimalRangeParameterValidator.getMaxInclude());
String tpl ="FieldValidator.decimalRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof LengthRangeParameterValidator){
LengthRangeParameterValidator lengthRangeParameterValidator =(LengthRangeParameterValidator)validator;
variables.put("minInclude",lengthRangeParameterValidator.getMinInclude());
variables.put("min",StringUtils.hasText(lengthRangeParameterValidator.getMinValue())?lengthRangeParameterValidator.getMinValue():"null");
variables.put("max",StringUtils.hasText(lengthRangeParameterValidator.getMaxValue())?lengthRangeParameterValidator.getMaxValue():"null");
variables.put("maxInclude",lengthRangeParameterValidator.getMaxInclude());
String tpl ="FieldValidator.lengthRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof DateRangeParameterValidator){
DateRangeParameterValidator dateRangeParameterValidator =(DateRangeParameterValidator)validator;
variables.put("minInclude",dateRangeParameterValidator.getMinInclude());
variables.put("min",StringUtils.hasText(dateRangeParameterValidator.getMinValue())?"DateUtil.parseDate(\"" + dateRangeParameterValidator.getMinValue() + "\",DateUtil.yyyy_MM_dd_HH_mm_ss)":"null");
variables.put("max",StringUtils.hasText(dateRangeParameterValidator.getMaxValue())?"DateUtil.parseDate(\"" + dateRangeParameterValidator.getMaxValue() + "\",DateUtil.yyyy_MM_dd_HH_mm_ss)":"null");
variables.put("maxInclude",dateRangeParameterValidator.getMaxInclude());
String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(validator instanceof PatternParameterValidator){
PatternParameterValidator patternParameterValidator =(PatternParameterValidator)validator;
variables.put("pattern",StringUtils.hasText(patternParameterValidator.getPattern())?patternParameterValidator.getPattern():"null");
String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},'${pattern}',result);";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
}
}
return sb.toString();
}
public static String generateExecuteMethods(Model model) throws Exception {
public static String generateToResult(List<Parameter> parameters) {
if(!CollectionUtil.hasElements(parameters)){ return null; }
StringBuilder sb =new StringBuilder("");
if(CollectionUtil.hasElements(model.getParameters())){
String template = FileUtil.readString(PARAMETER_EXECUTE_METHOD_TEMPLATE_CLASSPATH);
for(Parameter parameter : model.getParameters()) {
if(parameter instanceof IntermediateParameter || parameter instanceof OutParameter) {
Map<String, Object> variables = new HashMap<>();
variables.put("methodName", CodeReplacer.methodName(parameter.getCode()));
variables.put("name", parameter.getName());
variables.put("type", parameter.getType().toString());
sb.append(StringUtil.format(template, variables));
for(Parameter parameter : parameters){
String type =parameter.getType().toString();
String code =parameter.getCode();
String name =parameter.getName();
String valueType =parameter.getValueType();
Integer valueScale =parameter.getValueScale();
RoundingMode valueRoundingMode =parameter.getValueRoundingMode();
Map<String,Object> variables =new HashMap<>();
variables.put("type",type);
variables.put("code",code);
variables.put("name",name);
variables.put("valueType",valueType);
variables.put("valueScale",valueScale==null?8:valueScale);
variables.put("valueRoundingMode",valueRoundingMode==null?RoundingMode.HALF_UP:valueRoundingMode);
variables.put("fieldName",IdReplacer.fieldName(code));
if(ParameterType.INDICATOR.equals(parameter.getType()) || ParameterType.OUT.equals(parameter.getType()) || ParameterType.INTERMEDIATE.equals(parameter.getType())){
if(ValueTypeUtil.isDecimal(parameter.getValueType())){
String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',${valueScale},RoundingMode.${valueRoundingMode},this.${fieldName}==null?null:this.${fieldName}.setScale(${valueScale},RoundingMode.${valueRoundingMode})));";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(ValueTypeUtil.isBase(parameter.getValueType())){
String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',null,null,this.${fieldName}==null?null:this.${fieldName}));";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{
String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',null,null,this.${fieldName}==null?null:ObjectMapperUtil.json().writeValueAsString(this.${fieldName})));";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
}
return sb.toString();
}
public static String generateMethodBodys(List<Parameter> parameters) throws Exception {
public static String generateToMap(List<Parameter> parameters) {
if(!CollectionUtil.hasElements(parameters)){ return null; }
StringBuilder sb =new StringBuilder("");
if(CollectionUtil.hasElements(parameters)){
for(Parameter parameter : parameters) {
if(parameter instanceof IntermediateParameter || parameter instanceof OutParameter) {
sb.append(generate(parameter));
for(Parameter parameter : parameters){
String code =parameter.getCode();
String name =parameter.getName();
Map<String,Object> variables =new HashMap<>();
variables.put("code",code);
variables.put("name",name);
variables.put("fieldName",IdReplacer.fieldName(code));
String tpl ="map.put('${code}',this.${fieldName}); //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
return sb.toString();
}
public static String generateMergeResult(List<Parameter> parameters) {
if(!CollectionUtil.hasElements(parameters)){ return null; }
StringBuilder sb =new StringBuilder("");
for(Parameter parameter : parameters){
String code =parameter.getCode();
String valueType = parameter.getValueType();
Map<String,Object> variables =new HashMap<>();
variables.put("code",code);
variables.put("valueType",valueType);
if(ValueTypeUtil.isBase(valueType)){
String tpl ="if(result.exists('${code}')){ this.${code}=TypeConvertor.getValue(result.getValueByParameterCode('${code}'),${valueType}.class); }";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{
String tpl ="if(result.exists('${code}')){ this.${code}=result.getValueByParameterCode('${code}'); }";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}
}
return sb.toString();

23
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterMethodGenerator.java

@ -1,23 +0,0 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.platform.util.FileUtil;
import io.sc.platform.util.StringUtil;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ParameterMethodGenerator {
private static final String TEMPLATE_CLASSPATH ="classpath:/io/sc/engine/rule/core/code/generator/templates/ParameterMethod.tpl";
public static String generate(Parameter parameter) throws Exception{
List<String> templates = FileUtil.readStringAsList(TEMPLATE_CLASSPATH);
Map<String,Object> variables =new HashMap<>();
variables.put("code",parameter.getCode());
variables.put("name",parameter.getName());
return StringUtil.format(templates,variables);
}
}

37
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ResourceClassGenerator.java

@ -1,37 +0,0 @@
package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.po.model.Model;
import io.sc.engine.rule.core.po.resource.ModelResource;
import io.sc.engine.rule.core.po.resource.Resource;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.platform.util.FileUtil;
import io.sc.platform.util.StringUtil;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ResourceClassGenerator {
private static final String TEMPLATE_CLASSPATH ="classpath:/io/sc/engine/rule/core/code/generator/templates/Resource.tpl";
public static String generate(Resource resource) throws Exception{
StringBuilder sb =new StringBuilder("");
if(resource!=null){
List<String> templates = FileUtil.readStringAsList(TEMPLATE_CLASSPATH);
Map<String,Object> variables =new HashMap<>();
variables.put("resourceClassName", CodeReplacer.className(resource.getCode(),resource.getVersion()));
variables.put("resourceName",resource.getName());
variables.put("resourceVersion",resource.getVersion());
if(resource instanceof ModelResource) {
Model model =((ModelResource)resource).getModel();
variables.put("topModelName", model.getName());
variables.put("topModelMethodName", CodeReplacer.methodName(model.getCode()));
variables.put("topModelMethod", ModelGenerator.generate(model));
}
sb.append(StringUtil.format(templates,variables));
}
return sb.toString();
}
}

33
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/Arithmetic.java

@ -0,0 +1,33 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.ArithmeticIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.ArithmeticParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import org.springframework.util.StringUtils;
public class Arithmetic {
public String groovy(Parameter parameter, ArithmeticParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
return groovy(parameter.getCode(),parameter.getValueType(),processor.getArithmetic());
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s Arithmetic groovy source code.", e);
}
}
public String groovy(Indicator indicator, ArithmeticIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){ return null; }
try{
return groovy(indicator.getCode(),indicator.getValueType(),processor.getArithmetic());
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s Arithmetic groovy source code.", e);
}
}
private String groovy(String code, String valueType,String arthmetic) {
if(!StringUtils.hasText(arthmetic)){ return null; }
return GroovyExpressionReplacer.groovy(arthmetic,valueType);
}
}

91
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ConditionRange.java

@ -0,0 +1,91 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.ConditionRangeIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.ConditionRangeParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class ConditionRange {
private String condition;
private String value;
public List<ConditionRange> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<ConditionRange>>(){});
}
public String groovy(Parameter parameter,ConditionRangeParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
List<ConditionRange> conditionRanges =parse(processor.getConditionRange());
return groovy(parameter.getCode(),parameter.getValueType(),conditionRanges);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s ConditionRange groovy source code.", e);
}
}
public String groovy(Indicator indicator, ConditionRangeIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){ return null; }
try{
List<ConditionRange> conditionRanges =parse(processor.getConditionRange());
return groovy(indicator.getCode(),indicator.getValueType(),conditionRanges);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s ConditionRange groovy source code.", e);
}
}
private String groovy(String code, String valueType,List<ConditionRange> conditionRanges){
if(!CollectionUtil.hasElements(conditionRanges)){ return null; }
List<ConditionRange> _conditionRanges =new ArrayList<ConditionRange>();
//移除没有填写条件的条件范围
for(ConditionRange conditionRange : conditionRanges) {
if(StringUtils.hasText(conditionRange.getCondition())) {
_conditionRanges.add(conditionRange);
}
}
if(_conditionRanges.isEmpty()){
return null;
}
StringBuilder sb =new StringBuilder();
int size =_conditionRanges.size();
for(int i=0;i<size;i++) {
ConditionRange conditionRange =_conditionRanges.get(i);
if(i==0) {
sb.append("if(");
}else {
sb.append("else if(");
}
sb.append(GroovyExpressionReplacer.groovy(conditionRange.condition));
sb.append(")").append("{").append("\n");
if(!StringUtils.hasText(conditionRange.value)){
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append(" =null;\n");
}else {
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append(" =").append(GroovyExpressionReplacer.groovy(conditionRange.value,valueType)).append(";\n");
}
sb.append("}");
}
return sb.toString();
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

137
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTable.java

@ -0,0 +1,137 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.DecisionTableParameterProcessor;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.StringUtil;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class DecisionTable {
public List<Map<String,Object>> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<Map<String,Object>>>(){});
}
public String groovy(Parameter parameter, DecisionTableParameterProcessor processor,List<Parameter> parameters) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
List<Map<String,Object>> decisionTables =parse(processor.getDecisionTable());
return groovy(parameter.getCode(),parameter.getValueType(),decisionTables,parameters);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s DecisionTable groovy source code.", e);
}
}
private String groovy(String code, String valueType,List<Map<String,Object>> decisionTables,List<Parameter> parameters){
if(!CollectionUtil.hasElements(decisionTables)){ return null;}
StringBuilder sb =new StringBuilder();
int conditionRowCount =getConditionRowCount(decisionTables);
int resultRowCount =getResultRowCount(decisionTables);
int colCount =getColCount(decisionTables);
for(int i=1;i<colCount;i++) {//一列一列生成
List<String> conditions =new ArrayList<>();
for(int j=0;j<conditionRowCount;j++) {
String condition =decisionTables.get(j).get("C0").toString();
String conditionResult =decisionTables.get(j).get("C"+i)==null?"":decisionTables.get(j).get("C"+i).toString();
if("Y".equalsIgnoreCase(conditionResult) || "T".equalsIgnoreCase(conditionResult)) {
conditions.add("(" + GroovyExpressionReplacer.groovy(condition) + ")");
}
if(!StringUtils.hasText(conditionResult) || "N".equalsIgnoreCase(conditionResult) || "F".equalsIgnoreCase(conditionResult)){
conditions.add("!(" + GroovyExpressionReplacer.groovy(condition) + ")");
}
}
sb.append("if (").append(StringUtil.combine(" && ",conditions)).append("){").append("\n");
for(int l=conditionRowCount;l<(conditionRowCount+resultRowCount);l++) {
String resultParameterCode =decisionTables.get(l).get("C0").toString();
String resultParameterValueType ="";
for(Parameter param : parameters){
if(("${" + param.getCode() + "}").equalsIgnoreCase(resultParameterCode)){
resultParameterValueType =param.getValueType();
break;
}
}
sb.append("\t").append(GroovyExpressionReplacer.groovy(resultParameterCode)).append(" =");
String expression =(String)decisionTables.get(l).get("C"+i);
sb.append(GroovyExpressionReplacer.groovy(expression, resultParameterValueType));
sb.append(";");
sb.append("\n");
}
sb.append("}").append("\n");
}
return sb.toString();
}
private String groovy2(String code, String valueType,List<Map<String,Object>> decisionTables){
if(!CollectionUtil.hasElements(decisionTables)){ return null;}
StringBuilder sb =new StringBuilder();
int conditionRowCount =getConditionRowCount(decisionTables);
int resultRowCount =getResultRowCount(decisionTables);
int colCount =getColCount(decisionTables);
sb.append("if (true){").append("\n");
sb.append("}");
for(int j=1;j<colCount;j++) {//一列一列生成
sb.append("else if (true");
for(int i=0;i<conditionRowCount;i++) {
String condition =decisionTables.get(i).get("C"+j)==null?"":decisionTables.get(i).get("C"+j).toString();
if("Y".equalsIgnoreCase(condition) || "T".equalsIgnoreCase(condition)) {
sb.append(" && ").append("(").append(ExpressionReplacer.groovy((String)decisionTables.get(i).get("C0"),null)).append(")");
}
}
sb.append("){").append("\n");
for(int l=conditionRowCount;l<(conditionRowCount+resultRowCount);l++) {
sb.append("\t\t\t").append(ExpressionReplacer.groovy((String)decisionTables.get(l).get("C0"),null)).append(" =");
String expression =(String)decisionTables.get(l).get("C"+j);
sb.append(ExpressionReplacer.groovy(expression, valueType));
sb.append(";");
sb.append("\n");
}
sb.append("\t\t}");
}
return StringUtil.tabs(sb.toString(),2);
}
private int getColCount(List<Map<String,Object>> decisionTables) {
if(decisionTables!=null && decisionTables.size()>0) {
Map<String,Object> row =decisionTables.get(0);
if(row!=null && row.size()>0) {
int index =0;
while(row.containsKey("C"+index)) {
index++;
}
return index;
}
}
return 0;
}
private int getConditionRowCount(List<Map<String,Object>> decisionTables) {
if(decisionTables!=null && decisionTables.size()>0) {
int index =0;
while("condition".equalsIgnoreCase((String)decisionTables.get(index).get("type"))) {
index++;
}
return index;
}
return 0;
}
private int getResultRowCount(List<Map<String,Object>> decisionTables) {
if(decisionTables!=null && decisionTables.size()>0) {
int index =0;
for(Map<String,Object> map : decisionTables) {
if("result".equalsIgnoreCase((String)map.get("type"))) {
index++;
}
}
return index;
}
return 0;
}
}

74
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTable2C.java

@ -0,0 +1,74 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.DecisionTable2CParameterProcessor;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import java.util.List;
import java.util.Map;
public class DecisionTable2C {
public List<Map<String,Object>> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<Map<String,Object>>>(){});
}
public String groovy(Parameter parameter, DecisionTable2CParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
List<Map<String,Object>> decisionTable2Cs =parse(processor.getDecisionTable2C());
return groovy(parameter.getCode(),parameter.getValueType(),decisionTable2Cs);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s DecisionTable2C groovy source code.", e);
}
}
private String groovy(String code, String valueType,List<Map<String,Object>> decisionTable2Cs){
if(!CollectionUtil.hasElements(decisionTable2Cs)){ return null;}
StringBuilder sb =new StringBuilder();
int rowCount =decisionTable2Cs.size();
int colCount =getColCount(decisionTable2Cs);
boolean isFirstCondition =true;
for(int i=1;i<rowCount;i++) {
for(int j=1;j<colCount;j++) {
if(isFirstCondition) {
sb.append("if (");
isFirstCondition =false;
}else{
sb.append("else if (");
}
sb.append("(").append(GroovyExpressionReplacer.groovy(decisionTable2Cs.get(i).get("C0").toString())).append(")");
sb.append(" && ");
sb.append("(").append(GroovyExpressionReplacer.groovy((String)decisionTable2Cs.get(0).get("C"+j))).append(")");
sb.append(") {").append("\n");
Object obj =decisionTable2Cs.get(i).get("C"+j);
if(obj!=null) {
sb.append("\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append(" =");
String expression =obj.toString();
sb.append(GroovyExpressionReplacer.groovy(expression, valueType)).append(";\n");
}
sb.append("}");
}
}
sb.append("\n");
return sb.toString();
}
private int getColCount(List<Map<String,Object>> decisionTable2Cs) {
if(decisionTable2Cs!=null && decisionTable2Cs.size()>0) {
Map<String,Object> row =decisionTable2Cs.get(0);
if(row!=null && row.size()>0) {
int index =0;
while(row.containsKey("C"+index)) {
index++;
}
return index;
}
}
return 0;
}
}

33
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/DecisionTree.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java

@ -1,18 +1,19 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
package io.sc.engine.rule.core.code.generator.impl.processor;
import io.sc.engine.rule.core.mxgraph.parser.DecisionTreeParser;
import io.sc.engine.rule.core.mxgraph.po.*;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.DecisionTreeParameterProcessor;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.platform.util.StringUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DecisionTree {
public static GraphNode parse(String json) throws Exception{
public GraphNode parse(String json) throws Exception{
if(json!=null && json.trim().length()>1) {
DecisionTreeParser parser =new DecisionTreeParser();
GraphNode result =parser.parse(json);
@ -27,7 +28,7 @@ public class DecisionTree {
* @return groovy 代码
* @throws Exception 违例
*/
public static String generateGroovyCode(Parameter parameter,DecisionTreeParameterProcessor processor) throws Exception{
public String groovy(Parameter parameter,DecisionTreeParameterProcessor processor) throws Exception{
try {
Map<String,String> methodNameCache =new HashMap<String,String>();
GraphNode node =parse(processor.getDecisionTree());
@ -44,8 +45,8 @@ public class DecisionTree {
* @param node 决策树第一个有效节点(即第一个条件节点)
* @return groovy 代码
*/
private static String _generateGroovyCode(Map<String,String> methodNameCache,Parameter parameter,GraphNode node) {
if(node!=null) {
private String _generateGroovyCode(Map<String,String> methodNameCache,Parameter parameter,GraphNode node) {
if(node==null){ return null; }
StringBuilder sb =new StringBuilder();
String methodName ="Tree_" + parameter.getCode() + "_" + node.getId();
if(node instanceof ConditionNode) {
@ -67,9 +68,7 @@ public class DecisionTree {
methodNameCache.put(methodName, null);
}
}
return sb.toString();
}
return null;
return StringUtil.tabs(sb.toString(),2);
}
/**
@ -80,7 +79,7 @@ public class DecisionTree {
* @param methodName 方法名
* @return groovy 代码
*/
private static String generateConditionGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConditionNode conditionNode,String methodName) {
private String generateConditionGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConditionNode conditionNode,String methodName) {
StringBuilder sb =new StringBuilder();
sb.append("\tprivate static ").append(parameter.getValueType()).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//条件判断").append("\n");
List<GraphNode> branches =conditionNode.getOuts(); //获取条件的所有出口边
@ -128,7 +127,7 @@ public class DecisionTree {
* @param methodName 方法名
* @return 代码
*/
private static String generateExpressionGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ExpressionNode expressionNode,String methodName) {
private String generateExpressionGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ExpressionNode expressionNode,String methodName) {
StringBuilder sb =new StringBuilder();
sb.append("\tprivate static ").append(parameter.getValueType()).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//表达式").append("\n");
String expression =expressionNode.getExpression();
@ -150,7 +149,7 @@ public class DecisionTree {
* @param methodName 方法名
* @return 代码
*/
private static String generateResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ResourceAbstractNode expressionNode,String methodName) {
private String generateResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ResourceAbstractNode expressionNode,String methodName) {
StringBuilder sb =new StringBuilder();
sb.append("\tprivate static ").append(parameter.getValueType()).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//资源").append("\n");
String code =ExpressionReplacer.groovy(expressionNode.getCode(),String.class.getName());
@ -169,7 +168,7 @@ public class DecisionTree {
* @param nodes 条件边
* @return 排序后的条件边
*/
private static List<GraphNode> orderEdges(List<GraphNode> nodes){
private List<GraphNode> orderEdges(List<GraphNode> nodes){
List<GraphNode> result =new ArrayList<GraphNode>();
for(GraphNode node : nodes) {
if(node instanceof EdgeConditionBranchNode) {

39
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/ExecutionFlow.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ExecutionFlow.java

@ -1,19 +1,20 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
package io.sc.engine.rule.core.code.generator.impl.processor;
import io.sc.engine.rule.core.mxgraph.parser.ExecutionFlowParser;
import io.sc.engine.rule.core.mxgraph.po.*;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.ExecutionFlowParameterProcessor;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.platform.util.StringUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ExecutionFlow {
public static GraphNode parse(String json) throws Exception{
public GraphNode parse(String json) throws Exception{
if(json!=null && json.trim().length()>1) {
ExecutionFlowParser parser =new ExecutionFlowParser();
GraphNode result =parser.parse(json);
@ -29,7 +30,7 @@ public class ExecutionFlow {
* @return groovy 代码
* @throws Exception 违例
*/
public static String generateGroovyCode(Parameter parameter,ExecutionFlowParameterProcessor processor) throws Exception{
public String groovy(Parameter parameter,ExecutionFlowParameterProcessor processor) throws Exception{
try {
Map<String,String> methodNameCache =new HashMap<String,String>();
GraphNode node =parse(processor.getExecutionFlow());
@ -46,8 +47,8 @@ public class ExecutionFlow {
* @param node 决策树第一个有效节点(即第一个条件节点)
* @return groovy 代码
*/
private static String _generateGroovyCode(Map<String,String> methodNameCache,Parameter parameter,GraphNode node) {
if(node!=null) {
private String _generateGroovyCode(Map<String,String> methodNameCache,Parameter parameter,GraphNode node) {
if(node==null) { return null; }
StringBuilder sb =new StringBuilder();
String methodName ="Flow_" + parameter.getCode() + "_" + node.getId();
if(node instanceof ConditionNode) {
@ -87,9 +88,7 @@ public class ExecutionFlow {
methodNameCache.put(methodName, null);
}
}
return sb.toString();
}
return null;
return StringUtil.tabs(sb.toString(),1);
}
/**
@ -100,7 +99,7 @@ public class ExecutionFlow {
* @param methodName 方法名
* @return groovy 代码
*/
private static String generateConditionGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConditionNode node,String methodName) {
private String generateConditionGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConditionNode node,String methodName) {
StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//条件判断").append("\n");
List<GraphNode> branches =node.getOuts(); //获取条件的所有出口边
@ -148,7 +147,7 @@ public class ExecutionFlow {
* @param methodName 方法名
* @return groovy 代码
*/
private static String generateParallelGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ParallelNode node,String methodName) {
private String generateParallelGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ParallelNode node,String methodName) {
StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//并发网关").append("\n");
List<GraphNode> outs =node.getOuts(); //获取条件的所有出口边
@ -176,7 +175,7 @@ public class ExecutionFlow {
* @param methodName 方法名
* @return 代码
*/
private static String generateCommandSetGroovyCode(Map<String,String> methodNameCache,Parameter parameter,CommandSetNode node,String methodName) {
private String generateCommandSetGroovyCode(Map<String,String> methodNameCache,Parameter parameter,CommandSetNode node,String methodName) {
StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//指令集").append("\n");
String commands =node.getCommands();
@ -212,7 +211,7 @@ public class ExecutionFlow {
* @param methodName 方法名
* @return 代码
*/
private static String generateResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ResourceAbstractNode node,String methodName) {
private String generateResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ResourceAbstractNode node,String methodName) {
StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//资源").append("\n");
String code =node.getCode();
@ -251,7 +250,7 @@ public class ExecutionFlow {
* @param methodName 方法名
* @return 代码
*/
private static String generateConfigurableResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConfigurableResourceAbstractNode node,String methodName) {
private String generateConfigurableResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConfigurableResourceAbstractNode node,String methodName) {
StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//可配置资源").append("\n");
String code =node.getCode();
@ -300,7 +299,7 @@ public class ExecutionFlow {
* @param methodName 方法名
* @return 代码
*/
private static String generateModelAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,SubModelAbstractNode node,String methodName) {
private String generateModelAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,SubModelAbstractNode node,String methodName) {
StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//模型").append("\n");
String code =node.getCode();
@ -332,7 +331,7 @@ public class ExecutionFlow {
* @param nodes 条件边
* @return 排序后的条件边
*/
private static List<GraphNode> orderEdges(List<GraphNode> nodes){
private List<GraphNode> orderEdges(List<GraphNode> nodes){
List<GraphNode> result =new ArrayList<GraphNode>();
for(GraphNode node : nodes) {
if(node instanceof EdgeConditionBranchNode) {

31
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/MathFormula.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/MathFormula.java

@ -1,11 +1,12 @@
package io.sc.engine.rule.core.code.impl.support.processor;
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.MathFormulaIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.MathFormulaParameterProcessor;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.platform.util.StringUtil;
import org.springframework.util.StringUtils;
import javax.xml.stream.XMLEventReader;
@ -19,8 +20,8 @@ import java.util.ArrayDeque;
@JsonIgnoreProperties(ignoreUnknown=true)
public class MathFormula {
public static String generateGroovyCode(Indicator indicator, MathFormulaIndicatorProcessor processor) throws Exception {
if (indicator == null || processor == null) {
public String groovy(Parameter parameter, MathFormulaParameterProcessor processor) throws Exception{
if (parameter == null || processor == null) {
return null;
}
String mathXml =processor.getMathFormula();
@ -31,11 +32,11 @@ public class MathFormula {
if(!mathXml.startsWith("<math>") && !mathXml.endsWith("</math>")){
mathXml ="<math>" + mathXml + "</math>";
}
return ExpressionReplacer.groovy(buildGroovyCode(mathXml),null);
return StringUtil.tabs(GroovyExpressionReplacer.groovy(buildGroovyCode(mathXml)),2);
}
public static String generateGroovyCode(Parameter parameter, MathFormulaParameterProcessor processor) throws Exception{
if (parameter == null || processor == null) {
public String groovy(Indicator indicator, MathFormulaIndicatorProcessor processor) throws Exception {
if (indicator == null || processor == null) {
return null;
}
String mathXml =processor.getMathFormula();
@ -46,10 +47,11 @@ public class MathFormula {
if(!mathXml.startsWith("<math>") && !mathXml.endsWith("</math>")){
mathXml ="<math>" + mathXml + "</math>";
}
return ExpressionReplacer.groovy(buildGroovyCode(mathXml),null);
//return StringUtil.tabs(buildGroovyCode(mathXml),2);
return StringUtil.tabs(GroovyExpressionReplacer.groovy(buildGroovyCode(mathXml)),2);
}
private static String buildGroovyCode(String mathXml) throws Exception{
private String buildGroovyCode(String mathXml) throws Exception{
Reader reader = new StringReader(mathXml);
XMLInputFactory xmlInputFactory =XMLInputFactory.newFactory();
XMLEventReader xmlEventReader =xmlInputFactory.createXMLEventReader(reader);
@ -79,11 +81,7 @@ public class MathFormula {
String text =characters.getData().trim();
String tagName =tagNameDeque.peek();
if("mi".equalsIgnoreCase(tagName)){
if("(".equalsIgnoreCase(text) || ")".equalsIgnoreCase(text)){
sb.append(text);
}else{
sb.append("${").append(text);
}
}else if("mo".equalsIgnoreCase(tagName)){
if("×".equalsIgnoreCase(text)){
sb.append("*");
@ -113,12 +111,7 @@ public class MathFormula {
if("mspace".equalsIgnoreCase(tagName)){
}else if("mi".equalsIgnoreCase(tagName)){
String lastText =sb.substring(sb.length()-1);
if("(".equalsIgnoreCase(lastText) || ")".equalsIgnoreCase(lastText)){
}else{
sb.append("}");
}
}else if("mrow".equalsIgnoreCase(tagName)){
sb.append(")");
if(
@ -211,6 +204,6 @@ public class MathFormula {
" <mspace/>\n" +
"</math>";
System.out.println(MathFormula.buildGroovyCode(xml));
System.out.println(new MathFormula().buildGroovyCode(xml));
}
}

133
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/NumberRange.java

@ -0,0 +1,133 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.NumberRangeIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.NumberRangeParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class NumberRange {
private Boolean minIncluded;
private BigDecimal min;
private BigDecimal max;
private Boolean maxIncluded;
private String value;
public List<NumberRange> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<NumberRange>>(){});
}
public String groovy(Parameter parameter,NumberRangeParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
List<NumberRange> numberRanges = parse(processor.getNumberRange());
return groovy(parameter.getCode(),parameter.getValueType(),processor.getNumberRangeVar(),numberRanges);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s NumberRange groovy source code.", e);
}
}
public String groovy(Indicator indicator,NumberRangeIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){ return null; }
try {
List<NumberRange> numberRanges = parse(processor.getNumberRange());
return groovy(indicator.getCode(),indicator.getValueType(),processor.getNumberRangeVar(),numberRanges);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s NumberRange groovy source code.", e);
}
}
public String groovy(String code, String valueType,String var,List<NumberRange> numberRanges){
if(!CollectionUtil.hasElements(numberRanges)){ return null; }
List<NumberRange> _numberRanges =new ArrayList<NumberRange>();
//移除空行
if(numberRanges!=null && numberRanges.size()>0) {
for(NumberRange numberRange : numberRanges) {
if(numberRange.min!=null || numberRange.max!=null || numberRange.value!=null) {
_numberRanges.add(numberRange);
}
}
}
if(_numberRanges.isEmpty()){
return null;
}
if (var == null || "".equals(var.trim())) {
var = GroovyExpressionReplacer.ARGUMENT_NAME + "." + code;
}
StringBuilder sb = new StringBuilder();
int size = _numberRanges.size();
for (int i = 0; i < size; i++) {
NumberRange numberRange = _numberRanges.get(i);
if (i == 0) {
sb.append("if(");
} else {
sb.append("else if(");
}
if (numberRange.min == null && numberRange.max == null) {
sb.append(GroovyExpressionReplacer.groovy(var)).append("==null");
} else if (numberRange.min != null) {
if (numberRange.minIncluded != null && numberRange.minIncluded) {
sb.append(GroovyExpressionReplacer.groovy(var)).append(">=").append(numberRange.min);
} else {
sb.append(GroovyExpressionReplacer.groovy(var)).append(">").append(numberRange.min);
}
}
if (numberRange.min != null && numberRange.max != null) {
sb.append(" && ");
}
if (numberRange.max != null) {
if (numberRange.maxIncluded != null && numberRange.maxIncluded) {
sb.append(GroovyExpressionReplacer.groovy(var)).append("<=").append(numberRange.max);
} else {
sb.append(GroovyExpressionReplacer.groovy(var)).append("<").append(numberRange.max);
}
}
sb.append(")").append("{").append("\n");
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(code).append(" =").append(GroovyExpressionReplacer.groovy(numberRange.value, valueType)).append(";\n");
sb.append("}");
}
return sb.toString();
}
public Boolean getMinIncluded() {
return minIncluded;
}
public void setMinIncluded(Boolean minIncluded) {
this.minIncluded = minIncluded;
}
public BigDecimal getMin() {
return min;
}
public void setMin(BigDecimal min) {
this.min = min;
}
public BigDecimal getMax() {
return max;
}
public void setMax(BigDecimal max) {
this.max = max;
}
public Boolean getMaxIncluded() {
return maxIncluded;
}
public void setMaxIncluded(Boolean maxIncluded) {
this.maxIncluded = maxIncluded;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

113
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ObjectProperty.java

@ -0,0 +1,113 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.ObjectPropertiesIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.ObjectPropertiesParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.PlaceHolderExpressionUtil;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class ObjectProperty {
private String code;
private String name;
private String expression;
public ObjectProperty(){}
public ObjectProperty(String code, String name){
this.code =code;
this.name =name;
}
public List<ObjectProperty> parse(String json) throws Exception {
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<ObjectProperty>>(){});
}
public String groovy(Parameter parameter, ObjectPropertiesParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
List<ObjectProperty> objectProperties =parse(processor.getObjectProperties());
return groovy(parameter.getCode(),parameter.getValueType(),parameter.getValueTypeVersion(),processor.getObjectCondition(),objectProperties);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s ObjectProperty groovy source code.", e);
}
}
public String groovy(Indicator indicator, ObjectPropertiesIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){ return null; }
try {
List<ObjectProperty> objectProperties =parse(processor.getObjectProperties());
return groovy(indicator.getCode(),indicator.getValueType(),indicator.getValueTypeVersion(),processor.getObjectCondition(),objectProperties);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s ObjectProperty groovy source code.", e);
}
}
public String groovy(String code, String valueType, Integer valueTypeVersion,String condition,List<ObjectProperty> objectProperties) throws Exception{
if(!CollectionUtil.hasElements(objectProperties)){ return null; }
List<ObjectProperty> _objectProperties =new ArrayList<>();
//移除没有填写表达式的对象属性
if(objectProperties!=null && objectProperties.size()>0) {
for(ObjectProperty objectProperty : objectProperties) {
if(StringUtils.hasText(objectProperty.getExpression())){
_objectProperties.add(objectProperty);
}
}
}
if(_objectProperties.isEmpty()){
return null;
}
StringBuilder sb =new StringBuilder();
if(StringUtils.hasText(condition)){
sb.append("if (").append(GroovyExpressionReplacer.groovy(condition)).append("){").append("\n");
}else{
sb.append("if (true) {").append("\n");
}
sb.append("\tif (").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append("==null) {").append("\n");
sb.append("t\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append(" =new ").append(valueType).append("_V").append(valueTypeVersion).append("();").append("\n");
sb.append("\t}").append("\n");
int size =_objectProperties.size();
for(int i=0;i<size;i++) {
ObjectProperty objectProperty =_objectProperties.get(i);
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append(".").append(objectProperty.getCode());
sb.append(" =").append(PlaceHolderExpressionUtil.replace(objectProperty.getExpression(),"arg.","")).append(";");
sb.append("//").append(objectProperty.getName()).append("\n");
}
sb.append("}").append("\n");
return sb.toString();
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
}

52
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/OptionValue.java

@ -0,0 +1,52 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import io.sc.engine.rule.core.po.model.Model;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.ParameterInOptionItem;
import io.sc.engine.rule.core.po.model.parameter.InOptionParameter;
import io.sc.engine.rule.core.po.model.processor.OptionValueParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.PlaceHolderExpressionUtil;
import java.util.List;
public class OptionValue {
public String groovy(Parameter parameter, OptionValueParameterProcessor processor, Model model) throws Exception{
if(parameter==null || processor==null){ return null; }
Parameter optionParameter =model.getParameterByOptionParameterCode(PlaceHolderExpressionUtil.replace(processor.getOptionCode(),"",""));
if(optionParameter==null){ return null; }
if(optionParameter instanceof InOptionParameter){
InOptionParameter inOptionParameter =(InOptionParameter)optionParameter;
List<ParameterInOptionItem> items = inOptionParameter.getOptions();
if(!CollectionUtil.hasElements(items)){ return null; }
StringBuilder sb =new StringBuilder();
int size =items.size();
for(int i=0;i<size;i++){
ParameterInOptionItem item =items.get(i);
if(i==0){
sb.append("if(");
}else{
sb.append("else if(");
}
sb.append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(inOptionParameter.getCode()));
sb.append("==");
if(ValueTypeUtil.isString(inOptionParameter.getValueType())){
sb.append(GroovyExpressionReplacer.groovy(item.getInputValue(),"java.lang.String"));
}else{
sb.append(GroovyExpressionReplacer.groovy(item.getInputValue()));
}
sb.append("){").append("\n");
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(parameter.getCode()));
sb.append("=");
sb.append(GroovyExpressionReplacer.groovy(item.getInputValue(),parameter.getValueType()));
sb.append("\n");
sb.append("}");
}
return sb.toString();
}
return null;
}
}

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/ScoreCardItem.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ScoreCardItem.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.core.code.impl.support.processor;
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.sc.engine.rule.core.enums.ProcessorType;

89
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/SqlFieldMapping.java

@ -0,0 +1,89 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.SqlIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.SqlParameterProcessor;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.StringUtil;
import org.springframework.util.StringUtils;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class SqlFieldMapping {
private String parameter;
private String field;
public List<SqlFieldMapping> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<SqlFieldMapping>>(){});
}
public String groovy(Parameter parameter,SqlParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
List<SqlFieldMapping> sqlFieldMappings =parse(processor.getSqlFieldMapping());
return groovy(parameter.getCode(),parameter.getValueType(),processor.getSqlDatasourceName(),processor.getSql(),sqlFieldMappings);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s SqlFieldMapping groovy source code.", e);
}
}
public String groovy(Indicator indicator,SqlIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){ return null; }
try {
List<SqlFieldMapping> sqlFieldMappings =parse(processor.getSqlFieldMapping());
return groovy(indicator.getCode(),indicator.getValueType(),processor.getSqlDatasourceName(),processor.getSql(),sqlFieldMappings);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s SqlFieldMapping groovy source code.", e);
}
}
private String groovy(String code, String valueType,String sqlDatasourceName,String sql,List<SqlFieldMapping> sqlFieldMappings){
if(!StringUtils.hasText(sql) || !CollectionUtil.hasElements(sqlFieldMappings)){
return null;
}
StringBuilder sb =new StringBuilder();
if(StringUtils.hasText(sqlDatasourceName)){
sb.append(StringUtil.format("javax.sql.DataSource ds =io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil.getDataSource('${0}');",sqlDatasourceName)).append("\n");
}else{
sb.append("javax.sql.DataSource ds =io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil.getDefaultDataSource();").append("\n");
}
sb.append(StringUtil.format("String sql =${0};", GroovyExpressionReplacer.groovy(sql,String.class.getName()))).append("\n");
sb.append("ESql.withInstance(ds){ db->").append("\n");
sb.append("\t").append("db.query(sql) { rs ->").append("\n");
sb.append("\t\t").append("if (rs.next()) {").append("\n");
for(SqlFieldMapping sqlFieldMapping : sqlFieldMappings) {
sb.append("\t\t\t")
.append(ExpressionReplacer.groovy(IdReplacer.fieldName(sqlFieldMapping.parameter), null))
.append(" =")
.append("rs.getObject(\"").append(sqlFieldMapping.getField()).append("\");").append("\n");
}
sb.append("\t\t}").append("\n");
sb.append("\t}").append("\n");
sb.append("}").append("\n");
return sb.toString();
}
public String getParameter() {
return parameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}

43
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/Ternary.java

@ -0,0 +1,43 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.TernaryIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.TernaryParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import org.springframework.util.StringUtils;
public class Ternary {
public String groovy(Parameter parameter, TernaryParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
return groovy(parameter.getCode(),parameter.getValueType(),processor.getTernaryCondition(),processor.getTernaryTrue(),processor.getTernaryFalse());
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s Ternary groovy source code.", e);
}
}
public String groovy(Indicator indicator, TernaryIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){ return null; }
try{
return groovy(indicator.getCode(),indicator.getValueType(),processor.getTernaryCondition(),processor.getTernaryTrue(),processor.getTernaryFalse());
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s Ternary groovy source code.", e);
}
}
private String groovy(String code, String valueType,String condition,String trueExpression,String falseExpression) {
if(!StringUtils.hasText(condition) || !StringUtils.hasText(trueExpression) || !StringUtils.hasText(falseExpression)){
return null;
}
StringBuilder sb =new StringBuilder();
sb.append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append(" =");
sb.append("(").append(GroovyExpressionReplacer.groovy(condition)).append(")?");
sb.append("(").append(GroovyExpressionReplacer.groovy(trueExpression,valueType)).append(")");
sb.append(" : ");
sb.append("(").append(GroovyExpressionReplacer.groovy(falseExpression,valueType)).append(")");
sb.append(";\n");
return sb.toString();
}
}

51
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/WhenThen.java

@ -0,0 +1,51 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.WhenThenIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.WhenThenParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.platform.util.StringUtil;
import org.springframework.util.StringUtils;
public class WhenThen {
public String groovy(Parameter parameter, WhenThenParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
return groovy(parameter.getCode(),parameter.getValueType(),processor.getWhen(),processor.getThen(),processor.getIsWhenThenShorted());
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s Ternary groovy source code.", e);
}
}
public String groovy(Indicator indicator, WhenThenIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){ return null; }
try{
return groovy(indicator.getCode(),indicator.getValueType(),processor.getWhen(),processor.getThen(),processor.getIsWhenThenShorted());
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s Ternary groovy source code.", e);
}
}
private String groovy(String code, String valueType,String when,String then,Boolean isShorted) {
if(!StringUtils.hasText(when) || !StringUtils.hasText(then)){
return null;
}
StringBuilder sb =new StringBuilder();
sb.append("if (").append(GroovyExpressionReplacer.groovy(when)).append(") {").append("\n");
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code));
sb.append(" = ");
sb.append(GroovyExpressionReplacer.groovy(then,valueType)).append(";").append("\n");
String debug =StringUtil.format("if(log.isDebugEnabled()){log.debug(\" WhenThen 运算结果 : {}\",${0});}",GroovyExpressionReplacer.ARGUMENT_NAME + "." + IdReplacer.fieldName(code));
sb.append("\t").append(debug).append("\n");
if(isShorted!=null && isShorted){
sb.append("\t").append("if(log.isDebugEnabled()){log.debug(\" WhenThen 短路!!!\");}").append("\n");
debug =StringUtil.format("if(log.isDebugEnabled()){log.debug(\" 参数结果值 : {}\",${0});}",GroovyExpressionReplacer.ARGUMENT_NAME + "." + IdReplacer.fieldName(code));
sb.append("\t").append(debug).append("\n");
sb.append("\t").append("return;").append("\n");
}
sb.append("}").append("\n");
return sb.toString();
}
}

10
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/functions.tpl

@ -1,10 +0,0 @@
/********************************************************
* Functions
********************************************************/
#for(function : executeUnit.functions)
/**
* #(function.description)
*/
#(function.body)
#end

28
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/model.tpl

@ -1,28 +0,0 @@
#define renderModel(model)
//模型(#(model.fullName))
private static void #(methodName(model.code))(Executor executor,Argument argument){
if(log.isDebugEnabled()){log.debug("开始调用模型: {}","#(model.fullName)");}
#if(!model.enable)
if(log.isDebugEnabled()){log.debug("开始调用模型: enable==false");}
#end
#if(model.executeMode.toString()=="DOWN_UP")
//模型的执行模式为:自下而上,首先执行子模型
#for(subModel : model.children)
#(methodName(subModel.code))(executor,argument);//#(subModel.name)
#end
#end
//处理模型的中间值和结果值
#for(parameter : model.parameters)
#if(parameter.type.toString()=="INTERMEDIATE" || parameter.type.toString()=="OUT")
#(methodName(parameter.code))(executor,argument);//#(parameter.name),#(parameter.type)
#end
#end
}
#for(subModel : model.children)
#@renderModel(subModel)
#end
#@renderParameter(model)
#end

1
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/package.tpl

@ -1 +0,0 @@
package #(packageName);

37
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/parameter.tpl

@ -1,37 +0,0 @@
#define renderParameter(model)
#for(parameter : model.allParameters)
//参数处理器, #(parameter.name)(#(parameter.type))
private static void #(methodName(parameter.code))(Executor executor,Argument argument) {
if(log.isDebugEnabled()){log.debug(" {}","#(parameter.name)(#(parameter.type))");}
#for(processor : parameter.processors)
#if(processor.enable)
#switch (processor.type.toString())
#case ("ARITHMETIC")
#include("/io/sc/engine/rule/core/code/generator/template/processor/arithmetic.tpl")
#case ("CONDITION_RANGE")
#include("/io/sc/engine/rule/core/code/generator/template/processor/conditionRange.ftl")
#case ("DECISION_TABLE")
#case ("DECISION_TABLE_2C")
#case ("DECISION_TREE")
#case ("EXECUTION_FLOW")
#case ("GROOVY_SCRIPT")
#case ("HTTP_REQUEST")
#case ("MATH_FORMULA")
#case ("NUMBER_RANGE")
#include("/io/sc/engine/rule/core/code/generator/template/processor/numberRange.ftl")
#case ("OBJECT_PROPERTIES")
#case ("OPTION_VALUE")
#case ("PMML")
#case ("RULE")
#case ("SCORE_CARD")
#case ("SINGLE_RULE")
#case ("SQL")
#case ("TERNARY")
#case ("WHEN_THEN")
#end
#end
#end
if(log.isDebugEnabled()){log.debug(" 参数结果值 : {}",argument.#(fieldName(parameter.code)));}
}
#end
#end

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/DECISION_TABLE.ftl

@ -1,4 +0,0 @@
//决策表
${DecisionTable.generateGroovyCode(parameter,processor)}
if(log.isDebugEnabled()){log.debug(" 决策表运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});}

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/DECISION_TABLE_2C.ftl

@ -1,4 +0,0 @@
//简单决策表
${DecisionTable2C.generateGroovyCode(parameter,processor)}
if(log.isDebugEnabled()){log.debug(" 简单决策表运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});}

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/DECISION_TREE.ftl

@ -1,4 +0,0 @@
//决策树(此处只是入口,真正的决策树计算逻辑在后面通过一系列方法完成)
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =Tree_${CodeReplacer.fieldName(parameter.code)}_${DecisionTree.parse(processor.decisionTree).id}(executor,${ExpressionReplacer.ARGUMENT_NAME});
if(log.isDebugEnabled()){log.debug(" 决策树运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});}

13
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/DECISION_TREE_FUNCTION.ftl

@ -1,13 +0,0 @@
/*-------------------------------------------------------------------------------*
* 决策树函数 *
*-------------------------------------------------------------------------------*/
<#list (model.getAllParameters())! as parameter><#-- 循环将每个参数处理生成一个方法 -->
<#if ("INTERMEDIATE"==parameter.type || "OUT"==parameter.type)>
<#list (parameter.processors)! as processor>
<#if "DECISION_TREE"==processor.type>
//${parameter.name}(${parameter.type})
${DecisionTree.generateGroovyCode(parameter,processor)}
</#if>
</#list>
</#if>
</#list>

13
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/EXECUTION_FLOW_FUNCTION.ftl

@ -1,13 +0,0 @@
/*-------------------------------------------------------------------------------*
* 执行流函数 *
*-------------------------------------------------------------------------------*/
<#list (model.getAllParameters())! as parameter><#-- 循环将每个参数处理生成一个方法 -->
<#if ("INTERMEDIATE"==parameter.type || "OUT"==parameter.type)>
<#list (parameter.processors)! as processor>
<#if "EXECUTION_FLOW"==processor.type>
//${parameter.name}(${parameter.type})
${ExecutionFlow.generateGroovyCode(parameter,processor)}
</#if>
</#list>
</#if>
</#list>

3
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/GROOVY_SCRIPT.ftl

@ -1,3 +0,0 @@
<#if processor.groovyScript??>
${ExpressionReplacer.groovy(processor.groovyScript,null)}
</#if>

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/MATH_FORMULA.ftl

@ -1,4 +0,0 @@
//数学公式
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${MathFormula.generateGroovyCode(parameter,processor)};
if(log.isDebugEnabled()){log.debug(" 数学公式运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});}

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/OBJECT_PROPERTIES.ftl

@ -1,4 +0,0 @@
//对象属性函数
${ObjectProperty.generateGroovyCode(parameter,processor)}
if(log.isDebugEnabled()){log.debug(" 对象属性函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});}

34
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/OPTION_VALUE.ftl

@ -1,34 +0,0 @@
//选项值运算
<#assign optionParameter=model.getParameterByOptionParameterCode(processor.optionCode)>
<#if optionParameter??>
if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}!=null){
<#list model.getParameterOptionsByOptionParameterCode(processor.optionCode) as option>
<#if option_index==0>
<#if optionParameter.valueType=='java.lang.String'>
if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}=="""${option.inputValue}"""){
<#else>
if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}==${option.inputValue}){
</#if>
<#else>
<#if optionParameter.valueType=='java.lang.String'>
}else if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}=="""${option.inputValue}"""){
<#else>
}else if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}==${option.inputValue}){
</#if>
</#if>
<#if parameter.valueType=='java.lang.String'>
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} ="""${option.value}""";
if(log.isDebugEnabled()){log.debug(" 选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});}
<#else>
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${option.value};
if(log.isDebugEnabled()){log.debug(" 选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});}
</#if>
</#list>
}else{
if(log.isDebugEnabled()){log.debug(" !!!未匹配到选项列表,选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});}
}
}else{
if(log.isDebugEnabled()){log.debug(" !!!未提供选项输入值,选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});}
}
</#if>

3
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/PMML.ftl

@ -1,3 +0,0 @@
<#if processor.pmml??>
arg.${CodeReplacer.fieldName(parameter.code)} =JpmmlEvaluator.evaluate('${parameter.id}_${processor.id}','''${processor.pmml}''',arg.toMap());
</#if>

17
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/SQL.ftl

@ -1,17 +0,0 @@
//SQL 运算
<#if processor.sqlDatasourceName??>
javax.sql.DataSource ds =io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil.getDataSource('${processor.sqlDatasourceName}');
<#else>
javax.sql.DataSource ds =io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil.getDefaultDataSource();
</#if>
String sql =${ExpressionReplacer.groovy("\n"+processor.sql,"java.lang.String")};
<#if processor.sql??>
ESql.withInstance(ds){ db->
db.query(sql) { rs ->
if (rs.next()) {
${SqlFieldMapping.generateGroovyCode(parameter,processor)}
}
}
}
</#if>

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/TERNARY.ftl

@ -1,4 +0,0 @@
//三元运算
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =(${ExpressionReplacer.groovy(processor.ternaryCondition,null)}) ? (${ExpressionReplacer.groovy(processor.ternaryTrue,parameter.valueType)}) : (${ExpressionReplacer.groovy(processor.ternaryFalse,parameter.valueType)});
if(log.isDebugEnabled()){log.debug(" 三元运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});}

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/arithmetic.tpl

@ -1,4 +0,0 @@
//算数运算
argument.#(fieldName(parameter.code)) =#(groovy(processor.arithmetic,parameter.valueType));//#(parameter.type), #(parameter.name)
if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",argument.#(fieldName(parameter.code)));}

3
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/conditionRange.ftl

@ -1,3 +0,0 @@
//条件分段函数
#(io.sc.engine.rule.core.code.impl.support.processor.ConditionRange::generateGroovyCode(parameter,processor))
if(log.isDebugEnabled()){log.debug(" 条件分段函数运算结果 : {}",argument.#(fieldName(parameter.code)));}

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/processor/numberRange.ftl

@ -1,4 +0,0 @@
//数值分段函数
#(io.sc.engine.rule.core.code.impl.support.processor.NumberRange::generateGroovyCode(parameter,processor))
if(log.isDebugEnabled()){log.debug(" 数值分段函数运算结果 : {}",argument.#(fieldName(parameter.code)));}

118
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/template/resource.tpl

@ -1,118 +0,0 @@
#include("package.tpl")
#include("import.tpl")
#include("functions.tpl")
#set(resource = executeUnit.resource)
#set(libs =executeUnit.libs)
#set(model = resource.model)
/********************************************************
* Execute Unit
********************************************************/
/**
* type: #(executeUnit.type)
* code: #(resource.code),
* name: #(resource.name),
* version: #(resource.version)
*/
class #(className(resource.code,resource.version)) {
private static final Logger log =LoggerFactory.getLogger(#(className(resource.code,resource.version)).class);
/**
* 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数)
* @param map 输入参数封装器
* @return 执行结果
*/
public static ResourceResult execute(Map<String,Object> map) throws Exception{
return execute(map["executor"],map["subModelCode"],map["argument"]);
}
/**
* 执行方法
* @param executor 执行器对象
* @param subModelCode 子模型代码
* @param data 输入参数
* @return 执行结果
*/
public static ResourceResult execute(Executor executor,String subModelCode,Object data) throws Exception{
if(log.isDebugEnabled()){log.debug("开始执行: #(resource.name)");}
if(data instanceof Map){
if(log.isDebugEnabled()){log.debug("显示输入参数(Map)=================================================\n{}",ObjectMapperUtil.json().writeValueAsString(data));}
}else if(data instanceof String){
if(log.isDebugEnabled()){log.debug("显示输入参数(Json字符串)=================================================\n{}",data);}
}
//初始化指标库
#for(lib : libs)
if(log.isDebugEnabled()){log.debug("初始化指标库 : #(lib.name)_V#(lib.version)");}
#(className(lib.code,lib.version)) #(varName(lib.code,lib.version)) =new #(className)();
#(className(lib.code,lib.version)).convertArgument(data);
#end
//初始化模型参数
if(log.isDebugEnabled()){log.debug("从 {} 初始化模型参数","java.lang.String"==data.class?"Json":"Map");}
Argument argument =Argument.convertArgument(data);
//输入参数合法性检查
ValidateResult validateResult =new ValidateResult();
//输入参数合法性检查(指标库)
#for(lib : libs)
if(log.isDebugEnabled()){log.debug("开始检查输入参数数据合法性(指标库: #(lib.name)_V#(lib.version))");}
#(varName(lib.code,lib.version)).validate(validateResult);
if(validateResult.hasError()){
if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");}
ResourceResult result =new ResourceResult();
result.setValidateResult(validateResult);
return result;
}
if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");}
#end
//输入参数合法性检查(模型)
if(log.isDebugEnabled()){log.debug("开始检查模型输入参数数据合法性");}
argument.validate(validateResult);
if(validateResult.hasError()){
if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");}
ResourceResult result =new ResourceResult();
result.setValidateResult(validateResult);
return result;
}
if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");}
//执行指标库
#for(lib : executeUnit.getLibs())
if(log.isDebugEnabled()){log.debug("开始执行指标库: #(lib.name)_V#(lib.version)");}
#(varName(lib.code,lib.version)).execute();
</#list>
#end
//合并指标库指标
if(log.isDebugEnabled()){log.debug("开始合并指标库指标");}
Map<String,Object> indicatorLibs =new HashMap<String,Object>();
#for(lib : executeUnit.getLibs())
indicatorLibs.put("#(varName(lib.code,lib.version))",#(varName(lib.code,lib.version)));
#end
argument.mergeParameterValueFromIndicatorLib(indicatorLibs);
if(log.isDebugEnabled()){log.debug("显示合并后输入参数:\n{}",ObjectMapperUtil.json().writeValueAsString(argument));}
//执行模型
if(subModelCode){
subModelCode =CodeReplacer.methodName(subModelCode);
"${subModelCode}"(executor,argument);//调用子模型
}else{
#(methodName(model.code))(executor,argument);//调用顶级模型(#(model.name))
}
//返回结果
ResourceResult result =argument.toResult();
if(log.isDebugEnabled()){log.debug("模型调用成功,返回结果:\n{}",ObjectMapperUtil.json().writeValueAsString(result));}
return result;
}
#include("parameter.tpl")
#include("model.tpl")
#@renderModel(model)

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

@ -1,128 +0,0 @@
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_32);
cfg.setTemplateLoader(new ClassTemplateLoader(GroovySourceCodeGenerator.class,"/io/sc/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("ObjectProperty", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.ObjectProperty"));
root.put("MathFormula", getStaticMethod("io.sc.engine.rule.core.code.impl.support.processor.MathFormula"));
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;
}
}

24
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/JavaSourceCodeGenerator.java

@ -1,24 +0,0 @@
package io.sc.engine.rule.core.code.impl;
import io.sc.engine.rule.core.code.SourceCode;
import io.sc.engine.rule.core.code.SourceCodeGenerator;
import io.sc.engine.rule.core.code.generator.ExecuteUnit4LibGenerator;
import io.sc.engine.rule.core.code.generator.ExecuteUnit4ResourceGenerator;
import io.sc.engine.rule.core.code.generator.ExecuteUnitGenerator;
import io.sc.engine.rule.core.code.impl.support.ExecuteUnit;
import io.sc.engine.rule.core.code.impl.support.ExecuteUnit4Lib;
import io.sc.engine.rule.core.code.impl.support.ExecuteUnit4Resource;
public class JavaSourceCodeGenerator implements SourceCodeGenerator {
@Override
public SourceCode generateSourceCode(ExecuteUnit executeUnit) throws Exception {
if(executeUnit instanceof ExecuteUnit4Resource){
ExecuteUnitGenerator generator =new ExecuteUnit4ResourceGenerator((ExecuteUnit4Resource)executeUnit);
return generator.generateSourceCode();
}else if(executeUnit instanceof ExecuteUnit4Lib){
ExecuteUnitGenerator generator =new ExecuteUnit4LibGenerator((ExecuteUnit4Lib)executeUnit);
return generator.generateSourceCode();
}
return null;
}
}

40
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper.java

@ -1,40 +0,0 @@
package io.sc.engine.rule.core.code.impl.support;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.sc.engine.rule.core.po.function.Function;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=ResourceWrapper4Resource.class)
@JsonSubTypes({
@JsonSubTypes.Type(value=ResourceWrapper4Resource.class),
@JsonSubTypes.Type(value=ResourceWrapper4Lib.class)
})
public abstract class ResourceWrapper {
protected boolean isExecuteTestCase;
protected List<Function> functions;
public boolean getIsExecuteTestCase() {
return isExecuteTestCase;
}
public void setIsExecuteTestCase(boolean isExecuteTestCase) {
this.isExecuteTestCase = isExecuteTestCase;
}
public List<Function> getFunctions() {
return functions;
}
public void setFunctions(List<Function> functions) {
this.functions = functions;
}
@JsonIgnore
public abstract String getType();
}

43
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper4Lib.java

@ -1,43 +0,0 @@
package io.sc.engine.rule.core.code.impl.support;
import java.util.List;
import io.sc.engine.rule.core.po.dictionary.Dictionary;
import io.sc.engine.rule.core.po.lib.Lib;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("LIB")
@JsonIgnoreProperties(ignoreUnknown=true)
public class ResourceWrapper4Lib extends ResourceWrapper{
private List<Dictionary> dictionaries;
private Lib lib;
@Override
@JsonIgnore
public String getType() {
return "LIB";
}
public List<Dictionary> getDictionaries() {
return dictionaries;
}
public void setDictionaries(List<Dictionary> dictionaries) {
this.dictionaries = dictionaries;
}
public Lib getLib() {
return lib;
}
public void setLib(Lib lib) {
this.lib = lib;
}
}

52
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper4Resource.java

@ -1,52 +0,0 @@
package io.sc.engine.rule.core.code.impl.support;
import java.util.List;
import io.sc.engine.rule.core.po.dictionary.Dictionary;
import io.sc.engine.rule.core.po.lib.Lib;
import io.sc.engine.rule.core.po.resource.Resource;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("RESOURCE")
@JsonIgnoreProperties(ignoreUnknown=true)
public class ResourceWrapper4Resource extends ResourceWrapper{
private Resource resource;
private List<Dictionary> dictionaries;
private List<Lib> libs;
@Override
@JsonIgnore
public String getType() {
return "RESOURCE";
}
public Resource getResource() {
return resource;
}
public void setResource(Resource resource) {
this.resource = resource;
}
public List<Dictionary> getDictionaries() {
return dictionaries;
}
public void setDictionaries(List<Dictionary> dictionaries) {
this.dictionaries = dictionaries;
}
public List<Lib> getLibs() {
return libs;
}
public void setLibs(List<Lib> libs) {
this.libs = libs;
}
}

54
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/lib/LibUtil.java

@ -1,54 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.lib;
import java.util.List;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.IndicatorLib;
import io.sc.engine.rule.core.po.lib.Lib;
/**
* 库辅助类
* @author wangshaoping
*
*/
public class LibUtil {
/**
* 查找指标
* @param libs 库列表
* @param libCode 被查找的指标所属库代码
* @param libVersion 被查找的指标所属库版本
* @param indicatorCode 被查找的指标代码
* @return 指标对象
*/
public static Indicator findIndicator(List<Lib> libs,String libCode,Integer libVersion,String indicatorCode) {
if(libs==null || libs.size()==0) {
return null;
}
if(libCode==null || "".equals(libCode.trim())) {
return null;
}
if(libVersion==null) {
return null;
}
if(indicatorCode==null || "".equals(indicatorCode.trim())) {
return null;
}
for(Lib lib : libs) {
if(lib instanceof IndicatorLib) {
IndicatorLib indicatorLib =(IndicatorLib)lib;
if(libCode.equals(indicatorLib.getCode()) && libVersion.equals(indicatorLib.getVersion())) {
List<Indicator> indicators =indicatorLib.getIndicators();
if(indicators!=null && indicators.size()>0) {
for(Indicator indicator : indicators) {
if(indicatorCode.equals(indicator.getCode())) {
return indicator;
}
}
}
}
}
}
return null;
}
}

9
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/parameter/ParameterGroovyCodeContributionItem.java

@ -1,9 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.parameter;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
public interface ParameterGroovyCodeContributionItem {
public String forArgumentField(ResourceWrapper wrapper);
public String forConvertArgumentFromMap(ResourceWrapper wrapper,String targetVarName);
public String forConvertArgumentFromJson(ResourceWrapper wrapper,String targetVarName);
}

125
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/ConditionRange.java

@ -1,125 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.ConditionRangeIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.ConditionRangeParameterProcessor;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.platform.util.ObjectMapperUtil;
import java.util.ArrayList;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class ConditionRange {
private String condition;
private String value;
public static List<ConditionRange> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<ConditionRange>>(){});
}
public static String generateGroovyCode(Indicator indicator, ConditionRangeIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){
return null;
}
try {
List<ConditionRange> conditionRanges =parse(processor.getConditionRange());
List<ConditionRange> _conditionRanges =new ArrayList<ConditionRange>();
//移除没有填写条件的条件范围
if(conditionRanges!=null && conditionRanges.size()>0) {
for(ConditionRange conditionRange : conditionRanges) {
if(conditionRange.getCondition()!=null && !"".equals(conditionRange.getCondition().trim())) {
_conditionRanges.add(conditionRange);
}
}
}
if(_conditionRanges!=null && _conditionRanges.size()>0) {
StringBuilder sb =new StringBuilder();
int size =_conditionRanges.size();
for(int i=0;i<size;i++) {
ConditionRange conditionRange =_conditionRanges.get(i);
if(i==0) {
sb.append("if(");
}else {
sb.append("else if(");
}
sb.append(ExpressionReplacer.groovy(conditionRange.condition, null));
sb.append(")").append("{").append("\n");
if(conditionRange.value==null || conditionRange.value.trim().isEmpty()){
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(indicator.getCode())).append(" =null;\n");
}else {
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(indicator.getCode())).append(" =").append(ExpressionReplacer.groovy(conditionRange.value,indicator.getValueType())).append(";\n");
}
sb.append("\t\t}");
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s ConditionRange groovy source code.", e);
}
return null;
}
public static String generateGroovyCode(Parameter parameter,ConditionRangeParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){
return null;
}
try {
List<ConditionRange> conditionRanges =parse(processor.getConditionRange());
List<ConditionRange> _conditionRanges =new ArrayList<ConditionRange>();
//移除没有填写条件的条件范围
if(conditionRanges!=null && conditionRanges.size()>0) {
for(ConditionRange conditionRange : conditionRanges) {
if(conditionRange.getCondition()!=null && !"".equals(conditionRange.getCondition().trim())) {
_conditionRanges.add(conditionRange);
}
}
}
if(_conditionRanges!=null && _conditionRanges.size()>0) {
StringBuilder sb =new StringBuilder();
int size =_conditionRanges.size();
for(int i=0;i<size;i++) {
ConditionRange conditionRange =_conditionRanges.get(i);
if(i==0) {
sb.append("if(");
}else {
sb.append("else if(");
}
sb.append(ExpressionReplacer.groovy(conditionRange.condition, null));
sb.append(")").append("{").append("\n");
if(conditionRange.value==null || conditionRange.value.trim().isEmpty()){
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(parameter.getCode())).append(" =null;\n");
}else {
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(parameter.getCode())).append(" =").append(ExpressionReplacer.groovy(conditionRange.value,parameter.getValueType())).append(";\n");
}
sb.append("\t\t}");
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s ConditionRange groovy source code.", e);
}
return null;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

94
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/DecisionTable.java

@ -1,94 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.DecisionTableParameterProcessor;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.platform.util.ObjectMapperUtil;
import java.util.List;
import java.util.Map;
public class DecisionTable {
public static List<Map<String,Object>> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<Map<String,Object>>>(){});
}
public static String generateGroovyCode(Parameter parameter,DecisionTableParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){
return null;
}
try {
List<Map<String,Object>> decisionTables =parse(processor.getDecisionTable());
if(decisionTables!=null && decisionTables.size()>0) {
StringBuilder sb =new StringBuilder();
int conditionRowCount =getConditionRowCount(decisionTables);
int resultRowCount =getResultRowCount(decisionTables);
int colCount =getColCount(decisionTables);
sb.append("if (1==2){").append("\n");
sb.append("\t\t}");
for(int j=1;j<colCount;j++) {//一列一列生成
sb.append("else if (true");
for(int i=0;i<conditionRowCount;i++) {
String condition =decisionTables.get(i).get("C"+j)==null?"":decisionTables.get(i).get("C"+j).toString();
if("Y".equalsIgnoreCase(condition) || "T".equalsIgnoreCase(condition)) {
sb.append(" && ").append("(").append(ExpressionReplacer.groovy((String)decisionTables.get(i).get("C0"),null)).append(")");
}
}
sb.append("){").append("\n");
for(int l=conditionRowCount;l<(conditionRowCount+resultRowCount);l++) {
sb.append("\t\t\t").append(ExpressionReplacer.groovy((String)decisionTables.get(l).get("C0"),null)).append(" =");
String expression =(String)decisionTables.get(l).get("C"+j);
sb.append(ExpressionReplacer.groovy(expression, parameter.getValueType()));
sb.append(";");
sb.append("\n");
}
sb.append("\t\t}");
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s DecisionTable groovy source code.", e);
}
return null;
}
private static int getColCount(List<Map<String,Object>> decisionTables) {
if(decisionTables!=null && decisionTables.size()>0) {
Map<String,Object> row =decisionTables.get(0);
if(row!=null && row.size()>0) {
int index =0;
while(row.containsKey("C"+index)) {
index++;
}
return index;
}
}
return 0;
}
private static int getConditionRowCount(List<Map<String,Object>> decisionTables) {
if(decisionTables!=null && decisionTables.size()>0) {
int index =0;
while("condition".equalsIgnoreCase((String)decisionTables.get(index).get("type"))) {
index++;
}
return index;
}
return 0;
}
private static int getResultRowCount(List<Map<String,Object>> decisionTables) {
if(decisionTables!=null && decisionTables.size()>0) {
int index =0;
for(Map<String,Object> map : decisionTables) {
if("result".equalsIgnoreCase((String)map.get("type"))) {
index++;
}
}
return index;
}
return 0;
}
}

66
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/DecisionTable2C.java

@ -1,66 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.DecisionTable2CParameterProcessor;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.platform.util.ObjectMapperUtil;
import java.util.List;
import java.util.Map;
public class DecisionTable2C {
public static List<Map<String,Object>> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<Map<String,Object>>>(){});
}
public static String generateGroovyCode(Parameter parameter,DecisionTable2CParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){
return null;
}
try {
List<Map<String,Object>> decisionTable2Cs =parse(processor.getDecisionTable2C());
if(decisionTable2Cs!=null && decisionTable2Cs.size()>0) {
StringBuilder sb =new StringBuilder();
int rowCount =decisionTable2Cs.size();
int colCount =getColCount(decisionTable2Cs);
sb.append("if (1==2){").append("\n");
sb.append("\t\t}");
for(int i=1;i<rowCount;i++) {
for(int j=1;j<colCount;j++) {
sb.append("else if (");
sb.append("(").append(ExpressionReplacer.groovy((String)decisionTable2Cs.get(i).get("C0"),null)).append(") && (").append(ExpressionReplacer.groovy((String)decisionTable2Cs.get(0).get("C"+j),null)).append(")");
sb.append("){").append("\n");
Object obj =decisionTable2Cs.get(i).get("C"+j);
if(obj!=null) {
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(parameter.getCode())).append(" =");
String expression =obj.toString();
sb.append(ExpressionReplacer.groovy(expression, parameter.getValueType())).append(";\n");
}
sb.append("\t\t}");
}
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s DecisionTable2C groovy source code.", e);
}
return null;
}
private static int getColCount(List<Map<String,Object>> decisionTable2Cs) {
if(decisionTable2Cs!=null && decisionTable2Cs.size()>0) {
Map<String,Object> row =decisionTable2Cs.get(0);
if(row!=null && row.size()>0) {
int index =0;
while(row.containsKey("C"+index)) {
index++;
}
return index;
}
}
return 0;
}
}

187
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/NumberRange.java

@ -1,187 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.NumberRangeIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.NumberRangeParameterProcessor;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.platform.util.ObjectMapperUtil;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class NumberRange {
private Boolean minIncluded;
private BigDecimal min;
private BigDecimal max;
private Boolean maxIncluded;
private String value;
public static List<NumberRange> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<NumberRange>>(){});
}
public static String generateGroovyCode(Parameter parameter,NumberRangeParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){
return null;
}
try {
List<NumberRange> numberRanges =parse(processor.getNumberRange());
List<NumberRange> _numberRanges =new ArrayList<NumberRange>();
//移除空行
if(numberRanges!=null && numberRanges.size()>0) {
for(NumberRange numberRange : numberRanges) {
if(numberRange.min!=null || numberRange.max!=null || numberRange.value!=null) {
_numberRanges.add(numberRange);
}
}
}
String parameterName =CodeReplacer.fieldName(parameter.getCode());
String var =processor.getNumberRangeVar();
String valueType =parameter.getValueType();
if(_numberRanges!=null && _numberRanges.size()>0) {
if(var==null || "".equals(var.trim())) {
var =ExpressionReplacer.ARGUMENT_NAME + "." + parameterName;
}
StringBuilder sb =new StringBuilder();
int size =_numberRanges.size();
for(int i=0;i<size;i++) {
NumberRange numberRange =_numberRanges.get(i);
if(i==0) {
sb.append("if(");
}else {
sb.append("else if(");
}
if(numberRange.min==null && numberRange.max==null) {
sb.append(ExpressionReplacer.groovy(var, null)).append("==null");
}else if(numberRange.min!=null) {
if(numberRange.minIncluded!=null && numberRange.minIncluded) {
sb.append(ExpressionReplacer.groovy(var, null)).append(">=").append(numberRange.min);
}else {
sb.append(ExpressionReplacer.groovy(var, null)).append(">").append(numberRange.min);
}
}
if(numberRange.min!=null && numberRange.max!=null) {
sb.append(" && ");
}
if(numberRange.max!=null) {
if(numberRange.maxIncluded!=null && numberRange.maxIncluded) {
sb.append(ExpressionReplacer.groovy(var, null)).append("<=").append(numberRange.max);
}else {
sb.append(ExpressionReplacer.groovy(var, null)).append("<").append(numberRange.max);
}
}
sb.append(")").append("{").append("\n");
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(parameterName).append(" =").append(ExpressionReplacer.groovy(numberRange.value, valueType)).append(";\n");
sb.append("\t\t}");
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s NumberRange groovy source code.", e);
}
return null;
}
public static String generateGroovyCode(Indicator indicator,NumberRangeIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){
return null;
}
try {
List<NumberRange> numberRanges =parse(processor.getNumberRange());
List<NumberRange> _numberRanges =new ArrayList<NumberRange>();
//移除空行
if(numberRanges!=null && numberRanges.size()>0) {
for(NumberRange numberRange : numberRanges) {
if(numberRange.min!=null || numberRange.max!=null || numberRange.value!=null) {
_numberRanges.add(numberRange);
}
}
}
String parameterName =CodeReplacer.fieldName(indicator.getCode());
String var =processor.getNumberRangeVar();
String valueType =indicator.getValueType();
if(_numberRanges!=null && _numberRanges.size()>0) {
if(var==null || "".equals(var.trim())) {
var =ExpressionReplacer.ARGUMENT_NAME + "." + parameterName;
}
StringBuilder sb =new StringBuilder();
int size =_numberRanges.size();
for(int i=0;i<size;i++) {
NumberRange numberRange =_numberRanges.get(i);
if(i==0) {
sb.append("if(");
}else {
sb.append("else if(");
}
if(numberRange.min==null && numberRange.max==null) {
sb.append(ExpressionReplacer.groovy(var, null)).append("==null");
}else if(numberRange.min!=null) {
if(numberRange.minIncluded!=null && numberRange.minIncluded) {
sb.append(ExpressionReplacer.groovy(var, null)).append(">=").append(numberRange.min);
}else {
sb.append(ExpressionReplacer.groovy(var, null)).append(">").append(numberRange.min);
}
}
if(numberRange.min!=null && numberRange.max!=null) {
sb.append(" && ");
}
if(numberRange.max!=null) {
if(numberRange.maxIncluded!=null && numberRange.maxIncluded) {
sb.append(ExpressionReplacer.groovy(var, null)).append("<=").append(numberRange.max);
}else {
sb.append(ExpressionReplacer.groovy(var, null)).append("<").append(numberRange.max);
}
}
sb.append(")").append("{").append("\n");
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(parameterName).append(" =").append(ExpressionReplacer.groovy(numberRange.value, valueType)).append(";\n");
sb.append("\t\t}");
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s NumberRange groovy source code.", e);
}
return null;
}
public Boolean getMinIncluded() {
return minIncluded;
}
public void setMinIncluded(Boolean minIncluded) {
this.minIncluded = minIncluded;
}
public BigDecimal getMin() {
return min;
}
public void setMin(BigDecimal min) {
this.min = min;
}
public BigDecimal getMax() {
return max;
}
public void setMax(BigDecimal max) {
this.max = max;
}
public Boolean getMaxIncluded() {
return maxIncluded;
}
public void setMaxIncluded(Boolean maxIncluded) {
this.maxIncluded = maxIncluded;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

146
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/ObjectProperty.java

@ -1,146 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.ObjectPropertiesIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.ObjectPropertiesParameterProcessor;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.platform.util.ObjectMapperUtil;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class ObjectProperty {
private String code;
private String name;
private String expression;
public static List<ObjectProperty> parse(String json) throws Exception {
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<ObjectProperty>>(){});
}
public static String generateGroovyCode(Indicator indicator, ObjectPropertiesIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){
return null;
}
try {
String objectCondition =processor.getObjectCondition();
List<ObjectProperty> objectProperties =parse(processor.getObjectProperties());
List<ObjectProperty> _objectProperties =new ArrayList<>();
//移除没有填写表达式的对象属性
if(objectProperties!=null && objectProperties.size()>0) {
for(ObjectProperty objectProperty : objectProperties) {
if(StringUtils.hasText(objectProperty.getExpression())){
_objectProperties.add(objectProperty);
}
}
}
if(_objectProperties!=null && !_objectProperties.isEmpty()) {
StringBuilder sb =new StringBuilder();
if(StringUtils.hasText(objectCondition)){
sb.append("if (").append(ExpressionReplacer.groovy(objectCondition, null)).append("){").append("\n");
}
sb.append("\t\t\tif (").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(indicator.getCode())).append("==null) {").append("\n");
sb.append("\t\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(indicator.getCode())).append(" =new ").append(indicator.getValueType()).append("_V").append(indicator.getValueTypeVersion()).append("();").append("\n");
sb.append("\t\t\t}").append("\n");
int size =_objectProperties.size();
for(int i=0;i<size;i++) {
ObjectProperty objectProperty =_objectProperties.get(i);
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(indicator.getCode())).append(".").append(objectProperty.getCode());
sb.append(" =").append(ExpressionReplacer.groovy(objectProperty.getExpression(), null)).append(";");
sb.append("//").append(objectProperty.getName()).append("\n");
}
if(StringUtils.hasText(objectCondition)){
sb.append("\t\t}").append("\n");
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s ObjectProperty groovy source code.", e);
}
return null;
}
public static String generateGroovyCode(Parameter parameter, ObjectPropertiesParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){
return null;
}
try {
String objectCondition =processor.getObjectCondition();
List<ObjectProperty> objectProperties =parse(processor.getObjectProperties());
List<ObjectProperty> _objectProperties =new ArrayList<>();
//移除没有填写表达式的对象属性
if(objectProperties!=null && objectProperties.size()>0) {
for(ObjectProperty objectProperty : objectProperties) {
if(StringUtils.hasText(objectProperty.getExpression())){
_objectProperties.add(objectProperty);
}
}
}
if(_objectProperties!=null && !_objectProperties.isEmpty()) {
StringBuilder sb =new StringBuilder();
if(StringUtils.hasText(objectCondition)){
sb.append("if (").append(ExpressionReplacer.groovy(objectCondition, null)).append("){").append("\n");
}
int size =_objectProperties.size();
for(int i=0;i<size;i++) {
if(i!=0){
sb.append("\t\t");
}
ObjectProperty objectProperty =_objectProperties.get(i);
sb.append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(parameter.getCode())).append(".").append(objectProperty.getCode());
sb.append(" =").append(ExpressionReplacer.groovy(objectProperty.getExpression(), null)).append(";");
sb.append("//").append(objectProperty.getName()).append("\n");
}
if(StringUtils.hasText(objectCondition)){
sb.append("}").append("\n");
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s ObjectProperty groovy source code.", e);
}
return null;
}
public ObjectProperty(){
}
public ObjectProperty(String code, String name){
this.code =code;
this.name =name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
}

54
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/Option.java

@ -1,54 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.platform.util.ObjectMapperUtil;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class Option {
private String uuid;
private String value;
private String title;
private String description;
private String score;
public static List<Option> parse(String json) throws Exception{
if(json!=null && !"".equals(json.trim())) {
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<Option>>(){});
}
return null;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
}

145
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/Rule.java

@ -1,145 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.RuleParameterProcessor;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.platform.util.ObjectMapperUtil;
import java.util.ArrayList;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class Rule {
private String category;
private Integer level;
private String code;
private String name;
private String condition;
private String value;
private String message;
public static List<Rule> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<Rule>>(){});
}
public static String generateGroovyCode(Parameter parameter,RuleParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){
return null;
}
try {
List<Rule> rules =parse(processor.getRule());
List<Rule> _rules =new ArrayList<Rule>();
//移除没有填写条件的条件范围
if(rules!=null && rules.size()>0) {
for(Rule rule : rules) {
if(rule.getCondition()!=null && !"".equals(rule.getCondition().trim())) {
_rules.add(rule);
}
}
}
if(_rules!=null && _rules.size()>0) {
StringBuilder sb =new StringBuilder();
int size =_rules.size();
for(int i=0;i<size;i++) {
Rule rule =_rules.get(i);
sb.append("\t\tif(");
sb.append(ExpressionReplacer.groovy(rule.condition, null));
sb.append(")").append("{").append("\n");
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(parameter.getCode())).append(".addRule(");
sb.append("true,");
sb.append(rule.level).append(",");
sb.append("'''" + rule.code + "''',");
sb.append("'''" + rule.name + "''',");
if(rule.category!=null && !"".equals(rule.category)) {
sb.append("'''" + rule.category + "''',");
}else {
sb.append("null,");
}
sb.append(ExpressionReplacer.groovy(rule.value, "java.lang.String")).append(",");
sb.append(ExpressionReplacer.groovy(rule.message, "java.lang.String"));
sb.append(")").append(";\n");
sb.append("\t\t}else{").append("\n");
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(parameter.getCode())).append(".addRule(");
sb.append("false,");
sb.append(rule.level).append(",");
sb.append("'''" + rule.code + "''',");
sb.append("'''" + rule.name + "''',");
if(rule.category!=null && !"".equals(rule.category)) {
sb.append("'''" + rule.category + "''',");
}else {
sb.append("null,");
}
sb.append(ExpressionReplacer.groovy(rule.value, "java.lang.String")).append(",");
sb.append(ExpressionReplacer.groovy(rule.message, "java.lang.String"));
sb.append(")").append(";\n");
sb.append("\t\t}\n");
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s Rule groovy source code.", e);
}
return null;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

117
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/SingleRule.java

@ -1,117 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.SingleRuleParameterProcessor;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.platform.util.ObjectMapperUtil;
import java.util.ArrayList;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class SingleRule {
private String category;
private Integer level;
private String condition;
private String value;
private String message;
public static List<SingleRule> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<SingleRule>>(){});
}
public static String generateGroovyCode(Parameter parameter,SingleRuleParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){
return null;
}
try {
List<SingleRule> rules =parse(processor.getSingleRule());
List<SingleRule> _rules =new ArrayList<SingleRule>();
//移除没有填写条件的条件范围
if(rules!=null && rules.size()>0) {
for(SingleRule rule : rules) {
if(rule.getCondition()!=null && !"".equals(rule.getCondition().trim())) {
_rules.add(rule);
}
}
}
if(_rules!=null && _rules.size()>0) {
StringBuilder sb =new StringBuilder();
sb.append("\t\tSingleRuleResult result =new SingleRuleResult();").append("\n");
int size =_rules.size();
for(int i=0;i<size;i++) {
SingleRule rule =_rules.get(i);
sb.append("\t\tif(");
sb.append(ExpressionReplacer.groovy(rule.condition, null));
sb.append(")").append("{").append("\n");
sb.append("\t\t\t").append("SingleRuleResult temp =new SingleRuleResult(");
sb.append("true,");
sb.append(rule.level).append(",");
if(rule.category!=null && !"".equals(rule.category)) {
sb.append("'''" + rule.category + "''',");
}else {
sb.append("null,");
}
sb.append(ExpressionReplacer.groovy(rule.value, "java.lang.String")).append(",");
sb.append(ExpressionReplacer.groovy(rule.message, "java.lang.String"));
sb.append(")").append(";\n");
sb.append("\t\t\tif(!result.isTriggered() || result.getLevel()>temp.getLevel()){").append("\n");
sb.append("\t\t\t\t").append("result =temp;").append("\n");
sb.append("\t\t\t}").append("\n");
sb.append("\t\t}\n");
}
sb.append("\n");
sb.append("\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(CodeReplacer.fieldName(parameter.getCode())).append(" =result;").append("\n");
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s Single Rule groovy source code.", e);
}
return null;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

81
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/SqlFieldMapping.java

@ -1,81 +0,0 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.SqlIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.SqlParameterProcessor;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.platform.util.ObjectMapperUtil;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class SqlFieldMapping {
private String parameter;
private String field;
public static List<SqlFieldMapping> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<SqlFieldMapping>>(){});
}
public static String generateGroovyCode(Indicator indicator,SqlIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){
return null;
}
try {
StringBuilder sb =new StringBuilder();
List<SqlFieldMapping> mappings =parse(processor.getSqlFieldMapping());
if(mappings!=null && mappings.size()>0) {
for(SqlFieldMapping mapping : mappings) {
sb.append("\t\t\t\t\t")
.append(ExpressionReplacer.groovy(CodeReplacer.fieldName(mapping.parameter), null))
.append(" =")
.append("rs.getObject(\"").append(mapping.getField()).append("\");");
}
}
return sb.toString();
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s Rule groovy source code.", e);
}
}
public static String generateGroovyCode(Parameter parameter,SqlParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){
return null;
}
try {
StringBuilder sb =new StringBuilder();
List<SqlFieldMapping> mappings =parse(processor.getSqlFieldMapping());
if(mappings!=null && mappings.size()>0) {
for(SqlFieldMapping mapping : mappings) {
sb.append("\t\t\t\t\t")
.append(ExpressionReplacer.groovy(CodeReplacer.fieldName(mapping.parameter), null))
.append(" =")
.append("rs.getObject(\"").append(mapping.getField()).append("\");");
}
}
return sb.toString();
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s Rule groovy source code.", e);
}
}
public String getParameter() {
return parameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}

49
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/argument_render.tpl

@ -0,0 +1,49 @@
#define renderArgument(model)
@JsonIgnoreProperties(ignoreUnknown=true)
class Argument {
#(tabs(ParameterGenerator.generateFields(model.getAllParameters()),1))
public static Argument convertArgument(Map<String,Object> map){
if(map!=null){
Argument arg =new Argument();
#(tabs(ParameterGenerator.generateConvertorFromMap(model.getAllParameters()),3))
return arg;
}
return null;
}
public static Argument convertArgument(String json){
if(json!=null && !"".equals(json.trim())){
Argument arg =ObjectMapperUtil.json().readValue(json, Argument.class);
#(tabs(ParameterGenerator.generateConvertorFromJson(model.getAllParameters()),3))
return arg;
}
}
public void validate(ValidateResult result) {
#(tabs(ParameterGenerator.generateValidator(model.getAllParameters()),2))
}
public void mergeParameterValueFromIndicatorLib(Map<String,Object> libs){
}
public ResourceResult toResult(){
ResourceResult result =new ResourceResult();
#(tabs(ParameterGenerator.generateToResult(model.getAllParameters()),2))
return result;
}
public Map<String,Object> toMap(){
Map<String,Object> map =new HashMap<String,Object>();
#(tabs(ParameterGenerator.generateToMap(model.getAllParameters()),2))
return map;
}
public void mergeResult(ResourceResult result){
if(result!=null){
#(tabs(ParameterGenerator.generateMergeResult(model.getAllParameters()),3))
}
}
}
#end

13
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/dictionary_render.tpl

@ -0,0 +1,13 @@
#define renderDictionary(dictionary)
/**
* #(dictionary.name)
*/
@JsonIgnoreProperties(ignoreUnknown=true)
class #(className(dictionary.code,dictionary.version)) {
#(tabs(DictionaryGenerator.generateFields(dictionary.getFields()),1))
public void init(){
#(tabs(DictionaryGenerator.generateInits(dictionary.getFields()),2))
}
}
#end

6
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/functions_render.tpl

@ -0,0 +1,6 @@
#define renderFunction(function)
/**
* #(function.description)
*/
#(function.body)
#end

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save