308 changed files with 19067 additions and 8277 deletions
@ -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 违例 |
|||
*/ |
|||
public void compileByIdForTest(String resourceId) throws Exception; |
|||
|
|||
/** |
|||
* 编译资源(测试) |
|||
* @param resourceCode 资源代码 |
|||
* @param version 资源版本 |
|||
* @throws Exception 违例 |
|||
*/ |
|||
public void compileByCodeForTest(String resourceCode,Integer version) throws Exception; |
|||
|
|||
/** |
|||
* 执行资源(测试) |
|||
* @param resourceId 资源唯一标识 |
|||
* @param map 需要提交给资源的参数 map |
|||
* @return 执行结果 |
|||
* @throws Exception 违例 |
|||
*/ |
|||
public ResourceResult executeByIdForTest(String resourceId,Map<String,Object> map) throws Exception; |
|||
|
|||
/** |
|||
* 执行资源(测试) |
|||
* @param resourceId 资源唯一标识 |
|||
* @param subModelCode 子模型代码 |
|||
* @param map 需要提交给资源的参数 map |
|||
* @return 执行结果 |
|||
* @throws Exception 违例 |
|||
*/ |
|||
public ResourceResult executeByIdForTest(String resourceId,String subModelCode,Map<String,Object> map) throws Exception; |
|||
|
|||
/** |
|||
* 执行资源(测试) |
|||
* @param resourceCode 资源代码 |
|||
* @param version 资源版本 |
|||
* @param map 需要提交给资源的参数 map |
|||
* @return 执行结果 |
|||
* @throws Exception 违例 |
|||
*/ |
|||
public ResourceResult executeByCodeForTest(String resourceCode,Integer version,Map<String,Object> map) throws Exception; |
|||
|
|||
/** |
|||
* 执行资源(测试) |
|||
* @param resourceCode 资源代码 |
|||
* @param version 资源版本 |
|||
* @param subModelCode 子模型代码 |
|||
* @param map 需要提交给资源的参数 map |
|||
* @return 执行结果 |
|||
* @throws Exception 违例 |
|||
*/ |
|||
public ResourceResult executeByCodeForTest(String resourceCode,Integer version,String subModelCode,Map<String,Object> map) throws Exception; |
|||
|
|||
/** |
|||
* 获取资源定义加载器 |
|||
* @return 资源定义加载器 |
|||
*/ |
|||
public Loader getLoader(); |
|||
|
|||
public void compile(String resourceId) throws Exception; |
|||
public void compile(String resourceCode,Integer version) throws Exception; |
|||
|
|||
public ResourceResult execute(String resourceId,Map<String,Object> map) throws Exception; |
|||
public ResourceResult execute(String resourceId, String json) 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; |
|||
|
|||
|
|||
public ResourceResult execute(String resourceCode,Integer version,Map<String,Object> map) throws Exception; |
|||
public ResourceResult execute(String resourceCode,Integer version,String json) throws Exception; |
|||
|
|||
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; |
|||
} |
|||
|
@ -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; |
|||
} |
|||
|
@ -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; |
|||
|
@ -1,4 +1,4 @@ |
|||
package io.sc.engine.rule.core.code.impl.support; |
|||
package io.sc.engine.rule.core; |
|||
|
|||
/** |
|||
* 模型摘要信息 |
@ -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; |
|||
|
@ -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; |
@ -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; |
@ -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; //是否触发
|
@ -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; //是否触发
|
@ -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; |
@ -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; |
@ -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; |
|||
} |
@ -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; |
@ -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; |
@ -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; |
|||
|
@ -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; |
|||
} |
|||
|
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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); |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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(); |
|||
} |
|||
} |
@ -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()); |
|||
} |
|||
} |
@ -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(); |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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(); |
|||
} |
|||
} |
@ -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); |
|||
} |
|||
} |
@ -1,60 +1,253 @@ |
|||
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 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("name",parameter.getName()); |
|||
variables.put("methodName", CodeReplacer.methodName(parameter.getCode())); |
|||
variables.put("type", parameter.getType().toString()); |
|||
sb.append(StringUtil.format(template,variables)); |
|||
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 generateExecuteMethods(Model model) throws Exception { |
|||
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)); |
|||
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(); |
|||
|
|||
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("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 generateMethodBodys(List<Parameter> parameters) throws Exception { |
|||
public static String generateToResult(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 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 generateToMap(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(); |
|||
|
|||
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(); |
|||
} |
|||
} |
|||
|
@ -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); |
|||
} |
|||
} |
@ -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(); |
|||
} |
|||
} |
@ -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); |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
@ -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; |
|||
} |
|||
} |
@ -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(); |
|||
} |
|||
} |
@ -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(); |
|||
} |
|||
} |
@ -1,10 +0,0 @@ |
|||
/******************************************************** |
|||
* Functions |
|||
********************************************************/ |
|||
#for(function : executeUnit.functions) |
|||
|
|||
/** |
|||
* #(function.description) |
|||
*/ |
|||
#(function.body) |
|||
#end |
@ -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 +0,0 @@ |
|||
package #(packageName); |
@ -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 |
@ -1,4 +0,0 @@ |
|||
//决策表 |
|||
${DecisionTable.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 决策表运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,4 +0,0 @@ |
|||
//简单决策表 |
|||
${DecisionTable2C.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 简单决策表运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -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)});} |
|||
|
@ -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> |
@ -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> |
@ -1,3 +0,0 @@ |
|||
<#if processor.groovyScript??> |
|||
${ExpressionReplacer.groovy(processor.groovyScript,null)} |
|||
</#if> |
@ -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)});} |
|||
|
@ -1,4 +0,0 @@ |
|||
//对象属性函数 |
|||
${ObjectProperty.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 对象属性函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -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> |
|||
|
@ -1,3 +0,0 @@ |
|||
<#if processor.pmml??> |
|||
arg.${CodeReplacer.fieldName(parameter.code)} =JpmmlEvaluator.evaluate('${parameter.id}_${processor.id}','''${processor.pmml}''',arg.toMap()); |
|||
</#if> |
@ -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> |
|||
|
@ -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)});} |
|||
|
@ -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)));} |
@ -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)));} |
@ -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)));} |
|||
|
@ -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) |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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(); |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
|
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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); |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
|
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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 |
@ -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 |
@ -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…
Reference in new issue