Browse Source

基础框架发布: 8.2.22

1) 规则引擎中, 对 java 执行引擎进行了优化
main
wangshaoping 2 months ago
parent
commit
86832f1a52
  1. 10
      app.platform/build.gradle
  2. 2
      app.platform/src/main/resources/app/platform/i18n/messages.properties
  3. 2
      app.platform/src/main/resources/app/platform/i18n/messages_tw_CN.properties
  4. 2
      app.platform/src/main/resources/app/platform/i18n/messages_zh_CN.properties
  5. 2
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/initializer/AutoCompileDeployedModelInitializer.java
  6. 3
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/ExecutorFactoryService.java
  7. 4
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/LocalLoader.java
  8. 8
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/ExecutorFactoryServiceImpl.java
  9. 111
      io.sc.engine.rule.client/build.gradle
  10. 9
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/ExecutorBuilder.java
  11. 5
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/ExecutorFactory.java
  12. 7
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java
  13. 8
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java
  14. 4
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteLoader.java
  15. 6
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/EngineRuntime.java
  16. 2
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/GroovyEngineRuntime.java
  17. 2
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/JavaEngineRuntime.java
  18. 6
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/java/JavaEngineServiceImpl.java
  19. 3
      io.sc.engine.rule.client/src/main/resources/META-INF/platform/plugins/directories.json
  20. 66
      io.sc.engine.rule.client/src/main/resources/META-INF/platform/plugins/exportable-resources.json
  21. 8
      io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test.java
  22. 3
      io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test2.java
  23. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/client/Executor.java
  24. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/client/ExecutorMode.java
  25. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/client/GeneratorType.java
  26. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/client/Loader.java
  27. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/client/LoaderMode.java
  28. 32
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java
  29. 3
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/import_render.tpl
  30. 17
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/initializer/UserFunctionInitializer.java
  31. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/service/impl/ResourceServiceImpl.java
  32. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java
  33. 2
      io.sc.engine.rule.server/src/main/resources/META-INF/platform/plugins/rule-engine-function.json
  34. 2
      io.sc.platform.app/build.gradle
  35. 7
      io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/Directory.java
  36. 7
      io.sc.platform.core/src/main/java/io/sc/platform/core/springboot/BeforeEnvironmentProcessor.java
  37. 2
      io.sc.platform.scheduler.manager/build.gradle
  38. 22
      io.sc.platform.util/src/main/java/io/sc/platform/util/OsUtil.java
  39. 59
      io.sc.platform.util/src/main/java/io/sc/platform/util/compiler/file/FileJavaCompiler.java

10
app.platform/build.gradle

@ -16,6 +16,9 @@ dependencies {
project(":io.sc.platform.developer"), project(":io.sc.platform.developer"),
project(":io.sc.standard"), project(":io.sc.standard"),
// security
project(":io.sc.platform.security.loginform"),
// ai // ai
project(":io.sc.platform.ai"), project(":io.sc.platform.ai"),
@ -57,11 +60,8 @@ dependencies {
* replace [application.version] in i18n message file * replace [application.version] in i18n message file
*/ */
processResources { processResources {
filesMatching('**/messages*.properties') { from 'src/main/resources/**/messages*.properties'
println 'replace ${version} in [' + it + ']' filter(org.apache.tools.ant.filters.ReplaceTokens,tokens: [version: '' + project.version])
filteringCharset = 'iso8859-1'
filter(org.apache.tools.ant.filters.ReplaceTokens, beginToken: '$version', endToken: '',tokens: [version: '' + project.version])
}
doLast{ doLast{
// eclipse idea ,: // eclipse idea ,:

2
app.platform/src/main/resources/app/platform/i18n/messages.properties

@ -1,3 +1,3 @@
application.title=Risk Manager Platform application.title=Risk Manager Platform
application.version=$version application.version=@version@
application.copyright=Copyright \u00A9 2019\u20132022 application.copyright=Copyright \u00A9 2019\u20132022

2
app.platform/src/main/resources/app/platform/i18n/messages_tw_CN.properties

@ -1,3 +1,3 @@
application.title=\u98A8\u96AA\u7BA1\u7406\u5E73\u53F0 application.title=\u98A8\u96AA\u7BA1\u7406\u5E73\u53F0
application.version=$version application.version=@version@
application.copyright=Copyright \u00A9 2019\u20132022 application.copyright=Copyright \u00A9 2019\u20132022

2
app.platform/src/main/resources/app/platform/i18n/messages_zh_CN.properties

@ -1,3 +1,3 @@
application.title=\u98CE\u9669\u7BA1\u7406\u5E73\u53F0 application.title=\u98CE\u9669\u7BA1\u7406\u5E73\u53F0
application.version=$version application.version=@version@
application.copyright=Copyright \u00A9 2019\u20132022 application.copyright=Copyright \u00A9 2019\u20132022

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

@ -1,8 +1,8 @@
package io.sc.engine.rule.client.spring.initializer; package io.sc.engine.rule.client.spring.initializer;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService; import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ResourceAbstract; import io.sc.engine.rule.core.ResourceAbstract;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.enums.DeployStatus; import io.sc.engine.rule.core.enums.DeployStatus;
import io.sc.platform.core.initializer.ApplicationInitializer; import io.sc.platform.core.initializer.ApplicationInitializer;
import io.sc.platform.core.initializer.ApplicationInitializerExecuteException; import io.sc.platform.core.initializer.ApplicationInitializerExecuteException;

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

@ -1,6 +1,7 @@
package io.sc.engine.rule.client.spring.service; package io.sc.engine.rule.client.spring.service;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.core.client.Executor;
/** /**
* Spring 环境中的决策引擎执行器工厂服务类 * Spring 环境中的决策引擎执行器工厂服务类

4
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/LocalLoader.java

@ -1,10 +1,10 @@
package io.sc.engine.rule.client.spring.service; package io.sc.engine.rule.client.spring.service;
import io.sc.engine.rule.client.Loader; import io.sc.engine.rule.core.client.Loader;
/** /**
* 本地资源定义加载器接口 * 本地资源定义加载器接口
*/ */
public interface LocalLoader extends Loader{ public interface LocalLoader extends Loader {
} }

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

@ -4,7 +4,10 @@ import java.util.Map;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import io.sc.engine.rule.client.enums.GeneratorType; import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.client.ExecutorMode;
import io.sc.engine.rule.core.client.GeneratorType;
import io.sc.engine.rule.core.client.LoaderMode;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator; import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator;
import io.sc.engine.rule.core.code.generator.JavaSourceCodeGenerator; import io.sc.engine.rule.core.code.generator.JavaSourceCodeGenerator;
import io.sc.platform.core.service.RuntimeService; import io.sc.platform.core.service.RuntimeService;
@ -14,10 +17,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.ExecutorBuilder; import io.sc.engine.rule.client.ExecutorBuilder;
import io.sc.engine.rule.client.enums.ExecutorMode;
import io.sc.engine.rule.client.enums.LoaderMode;
import io.sc.engine.rule.client.local.LocalExecutor; import io.sc.engine.rule.client.local.LocalExecutor;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService; import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.client.spring.service.LocalLoader; import io.sc.engine.rule.client.spring.service.LocalLoader;

111
io.sc.engine.rule.client/build.gradle

@ -1,6 +1,117 @@
dependencies { dependencies {
api( api(
project(":io.sc.engine.rule.core"), project(":io.sc.engine.rule.core"),
project(":io.sc.platform.util"),
project(":io.sc.platform.groovy"), project(":io.sc.platform.groovy"),
) )
} }
/**
* jar
* 1. io.sc.engine.rule.core-xxx.jar
* 2. io.sc.platform.util-xxx.jar
*/
tasks.register('copyDependenciesProjectJars') {
dependsOn ':io.sc.engine.rule.core:jar',':io.sc.platform.util:jar',':io.sc.creditreport.core:jar',':io.sc.engine.rule.client.spring:jar'
doLast {
println('copy dependencies project jar ......');
def targetDir =file('src/main/resources/io/sc/engine/rule/client/jars/').absolutePath;
delete targetDir;
file(targetDir).mkdirs();
project.getRootProject().subprojects { dependedProject ->
if( dependedProject.name=='io.sc.engine.rule.core'
|| dependedProject.name=='io.sc.platform.util'
|| dependedProject.name=='io.sc.creditreport.core'
|| dependedProject.name=='io.sc.engine.rule.client.spring'
){
def dir =dependedProject.getBuildDir().absolutePath + '/libs';
def source =dir + '/' + dependedProject.name + '-' + dependedProject.version + '.jar';
if(file(source).exists() && file(source).isFile()){
copy {
from dir + '/' + dependedProject.name + '-' + dependedProject.version + '.jar'
into targetDir
}
}else{
println('>>>>>>>>');
}
}
}
}
}
/**
* jar
*/
tasks.register('copyRuntimeClasspathJars') {
dependsOn 'copyDependenciesProjectJars'
doLast {
configurations.runtimeClasspath.each(r ->{
println r
});
println('copy runtimeClasspath jar ......');
copy {
from configurations.runtimeClasspath
into 'src/main/resources/io/sc/engine/rule/client/jars'
include(
'jackson-annotations-*.jar',
'jackson-core-*.jar',
'jackson-databind-*.jar',
'slf4j-api-*.jar',
'jaxb-api-*.jar'
)
}
}
}
/**
* ,
*/
tasks.register('replaceExportableResourcesPlugins') {
dependsOn 'copyRuntimeClasspathJars'
doLast {
println('replace exportable-resources.json ......');
File file =file('src/main/resources/META-INF/platform/plugins/exportable-resources.json');
String content =file.text;
// replace io.sc.engine.rule.core-xx.xx.xx.jar
java.util.regex.Pattern corePattern =java.util.regex.Pattern.compile('io\\.sc\\.engine\\.rule\\.core-(.*)?\\.jar');
java.util.regex.Matcher coreMatcher = corePattern.matcher(content);
while (coreMatcher.find()) {
content =content.replace(coreMatcher.group(0),"io.sc.engine.rule.core-" + project.version + ".jar");
}
// replace io.sc.platform.util-xx.xx.xx.jar
java.util.regex.Pattern utilPattern =java.util.regex.Pattern.compile('io\\.sc\\.platform\\.util-(.*)?\\.jar');
java.util.regex.Matcher utilMatcher = utilPattern.matcher(content);
while (utilMatcher.find()) {
content =content.replace(utilMatcher.group(0),"io.sc.platform.util-" + project.version + ".jar");
}
// replace io.sc.creditreport.core-xx.xx.xx.jar
java.util.regex.Pattern creditreportPattern =java.util.regex.Pattern.compile('io\\.sc\\.creditreport\\.core-(.*)?\\.jar');
java.util.regex.Matcher creditreportMatcher = creditreportPattern.matcher(content);
while (creditreportMatcher.find()) {
content =content.replace(creditreportMatcher.group(0),"io.sc.creditreport.core-" + project.version + ".jar");
}
// replace io.sc.engine.rule.client.spring-xx.xx.xx.jar
java.util.regex.Pattern clientSpringPattern =java.util.regex.Pattern.compile('io\\.sc\\.engine\\.rule\\.client\\.spring-(.*)?\\.jar');
java.util.regex.Matcher clientSpringMatcher = clientSpringPattern.matcher(content);
while (clientSpringMatcher.find()) {
content =content.replace(clientSpringMatcher.group(0),"io.sc.engine.rule.client.spring-" + project.version + ".jar");
}
file.write(content);
}
}
/**
* ,
*/
tasks.register('sync') {
dependsOn 'replaceExportableResourcesPlugins'
}
processResources {
dependsOn sync
}

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

@ -1,13 +1,12 @@
package io.sc.engine.rule.client; package io.sc.engine.rule.client;
import io.sc.engine.rule.client.enums.ExecutorMode;
import io.sc.engine.rule.client.enums.LoaderMode;
import io.sc.engine.rule.client.enums.GeneratorType;
import io.sc.engine.rule.client.local.LocalExecutor; import io.sc.engine.rule.client.local.LocalExecutor;
import io.sc.engine.rule.client.remote.RemoteExecutor; import io.sc.engine.rule.client.remote.RemoteExecutor;
import io.sc.engine.rule.client.remote.RemoteLoader; import io.sc.engine.rule.client.remote.RemoteLoader;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator; import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.code.generator.JavaSourceCodeGenerator; import io.sc.engine.rule.core.client.ExecutorMode;
import io.sc.engine.rule.core.client.GeneratorType;
import io.sc.engine.rule.core.client.LoaderMode;
/** /**
* 执行器构建器 * 执行器构建器

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

@ -1,13 +1,16 @@
package io.sc.engine.rule.client; package io.sc.engine.rule.client;
import io.sc.engine.rule.core.client.Executor;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
/** /**
* 执行器工厂用于缓存执行器 * 执行器工厂用于缓存执行器
*/ */
public class ExecutorFactory { public class ExecutorFactory {
private static Map<String,Executor> cache =new ConcurrentHashMap<String,Executor>(); private static Map<String, Executor> cache =new ConcurrentHashMap<String,Executor>();
/** /**
* 注册执行器 * 注册执行器

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

@ -1,12 +1,11 @@
package io.sc.engine.rule.client.local; package io.sc.engine.rule.client.local;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.Loader;
import io.sc.engine.rule.client.enums.GeneratorType;
import io.sc.engine.rule.client.runtime.EngineRuntime; import io.sc.engine.rule.client.runtime.EngineRuntime;
import io.sc.engine.rule.core.ExecuteResult; import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.client.GeneratorType;
import io.sc.engine.rule.core.client.Loader;
import io.sc.engine.rule.core.code.ExecuteUnit; import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.SourceCodeGenerator;
import java.util.Map; import java.util.Map;

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

@ -1,9 +1,9 @@
package io.sc.engine.rule.client.remote; package io.sc.engine.rule.client.remote;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.Loader;
import io.sc.engine.rule.client.enums.GeneratorType;
import io.sc.engine.rule.core.ExecuteResult; import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.client.GeneratorType;
import io.sc.engine.rule.core.client.Loader;
import io.sc.engine.rule.core.code.SourceCodeGenerator; import io.sc.engine.rule.core.code.SourceCodeGenerator;
import io.sc.engine.rule.core.util.HttpRequestUtil; import io.sc.engine.rule.core.util.HttpRequestUtil;
import io.sc.platform.util.ObjectMapperUtil; import io.sc.platform.util.ObjectMapperUtil;
@ -13,7 +13,7 @@ import java.util.Map;
/** /**
* 远程执行客户端 * 远程执行客户端
*/ */
public class RemoteExecutor implements Executor{ public class RemoteExecutor implements Executor {
private String remoteApiUrl; private String remoteApiUrl;
private Loader loader; private Loader loader;

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

@ -1,6 +1,6 @@
package io.sc.engine.rule.client.remote; package io.sc.engine.rule.client.remote;
import io.sc.engine.rule.client.Loader; import io.sc.engine.rule.core.client.Loader;
import io.sc.engine.rule.core.code.ExecuteUnit; import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.util.HttpRequestUtil; import io.sc.engine.rule.core.util.HttpRequestUtil;
import io.sc.platform.util.ObjectMapperUtil; import io.sc.platform.util.ObjectMapperUtil;
@ -10,7 +10,7 @@ import org.slf4j.LoggerFactory;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class RemoteLoader implements Loader{ public class RemoteLoader implements Loader {
private static final Logger log =LoggerFactory.getLogger(RemoteLoader.class); private static final Logger log =LoggerFactory.getLogger(RemoteLoader.class);
private String remoteApiUrl; private String remoteApiUrl;
private Map<String, ExecuteUnit> cache =new ConcurrentHashMap<>(); private Map<String, ExecuteUnit> cache =new ConcurrentHashMap<>();

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

@ -1,16 +1,14 @@
package io.sc.engine.rule.client.runtime; package io.sc.engine.rule.client.runtime;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.enums.GeneratorType;
import io.sc.engine.rule.client.runtime.impl.GroovyEngineRuntime; import io.sc.engine.rule.client.runtime.impl.GroovyEngineRuntime;
import io.sc.engine.rule.client.runtime.impl.JavaEngineRuntime; import io.sc.engine.rule.client.runtime.impl.JavaEngineRuntime;
import io.sc.engine.rule.core.ExecuteResult; import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.client.GeneratorType;
import io.sc.engine.rule.core.code.ExecuteUnit; import io.sc.engine.rule.core.code.ExecuteUnit;
import java.util.Map; import java.util.Map;
import static io.sc.engine.rule.client.enums.GeneratorType.GROOVY;
public abstract class EngineRuntime { public abstract class EngineRuntime {
public static EngineRuntime getInstance(GeneratorType generatorType) { public static EngineRuntime getInstance(GeneratorType generatorType) {
switch (generatorType){ switch (generatorType){

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

@ -1,10 +1,10 @@
package io.sc.engine.rule.client.runtime.impl; package io.sc.engine.rule.client.runtime.impl;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.runtime.EngineRuntime; import io.sc.engine.rule.client.runtime.EngineRuntime;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService; import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl; import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl;
import io.sc.engine.rule.core.ExecuteResult; import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.code.*; import io.sc.engine.rule.core.code.*;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator; import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator;
import io.sc.engine.rule.core.po.lib.Lib; import io.sc.engine.rule.core.po.lib.Lib;

2
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/JavaEngineRuntime.java

@ -1,10 +1,10 @@
package io.sc.engine.rule.client.runtime.impl; package io.sc.engine.rule.client.runtime.impl;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.runtime.EngineRuntime; import io.sc.engine.rule.client.runtime.EngineRuntime;
import io.sc.engine.rule.client.runtime.impl.java.JavaEngineService; import io.sc.engine.rule.client.runtime.impl.java.JavaEngineService;
import io.sc.engine.rule.client.runtime.impl.java.JavaEngineServiceImpl; import io.sc.engine.rule.client.runtime.impl.java.JavaEngineServiceImpl;
import io.sc.engine.rule.core.ExecuteResult; import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.code.*; import io.sc.engine.rule.core.code.*;
import io.sc.engine.rule.core.code.generator.JavaSourceCodeGenerator; import io.sc.engine.rule.core.code.generator.JavaSourceCodeGenerator;
import io.sc.engine.rule.core.po.lib.Lib; import io.sc.engine.rule.core.po.lib.Lib;

6
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/java/JavaEngineServiceImpl.java

@ -7,6 +7,7 @@ import io.sc.platform.util.compiler.file.FileJavaCompiler;
import io.sc.platform.util.compiler.memory.JavaCompileException; import io.sc.platform.util.compiler.memory.JavaCompileException;
import io.sc.platform.util.compiler.memory.MemoryJavaCompiler; import io.sc.platform.util.compiler.memory.MemoryJavaCompiler;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.MalformedURLException; import java.net.MalformedURLException;
@ -18,6 +19,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class JavaEngineServiceImpl implements JavaEngineService { public class JavaEngineServiceImpl implements JavaEngineService {
private static final String targetDir =DirectoryManager.getInstance().getByName("dir.engine.rule.compiler"); private static final String targetDir =DirectoryManager.getInstance().getByName("dir.engine.rule.compiler");
private static final String classPathDir =DirectoryManager.getInstance().getByName("dir.engine.rule.classpath");
private Map<String, URLClassLoader> classLoaderMap =new ConcurrentHashMap<>(); private Map<String, URLClassLoader> classLoaderMap =new ConcurrentHashMap<>();
@Override @Override
@ -54,8 +56,10 @@ public class JavaEngineServiceImpl implements JavaEngineService {
private URLClassLoader compile(SourceCode sourceCode) throws JavaCompileException, IOException { private URLClassLoader compile(SourceCode sourceCode) throws JavaCompileException, IOException {
String outputDir =targetDir + "/" + sourceCode.getClassName() + "/"; String outputDir =targetDir + "/" + sourceCode.getClassName() + "/";
FileUtil.deldirs(outputDir); FileUtil.deldirs(outputDir);
FileJavaCompiler fileJavaCompiler =new FileJavaCompiler(); new File(outputDir).mkdirs();
FileJavaCompiler fileJavaCompiler =new FileJavaCompiler(classPathDir);
fileJavaCompiler.compile(sourceCode.getQualifiedClassName(),sourceCode.getSource(),outputDir); fileJavaCompiler.compile(sourceCode.getQualifiedClassName(),sourceCode.getSource(),outputDir);
return new URLClassLoader(new URL[]{ new URL("file",null,outputDir) }); return new URLClassLoader(new URL[]{ new URL("file",null,outputDir) });
} }

3
io.sc.engine.rule.client/src/main/resources/META-INF/platform/plugins/directories.json

@ -1,3 +1,4 @@
[ [
{"name":"dir.engine.rule.compiler","path":"/work/engine/rule/compiler","autoCreate":true} {"name":"dir.engine.rule.compiler","path":"/work/engine/rule/compiler","autoCreate":true},
{"name":"dir.engine.rule.classpath","path":"/work/engine/rule/jars","autoCreate":true, "deleteFirst":true}
] ]

66
io.sc.engine.rule.client/src/main/resources/META-INF/platform/plugins/exportable-resources.json

@ -0,0 +1,66 @@
[
{
"type" :"file",
"name" :"jackson-annotations-2.13.5.jar",
"description" :"jackson-annotations-2.13.5.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/jackson-annotations-2.13.5.jar"],
"target" :"${dir.engine.rule.classpath}/jackson-annotations-2.13.5.jar"
},
{
"type" :"file",
"name" :"jackson-core-2.13.5.jar",
"description" :"jackson-core-2.13.5.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/jackson-core-2.13.5.jar"],
"target" :"${dir.engine.rule.classpath}/jackson-core-2.13.5.jar"
},
{
"type" :"file",
"name" :"jackson-databind-2.13.5.jar",
"description" :"jackson-databind-2.13.5.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/jackson-databind-2.13.5.jar"],
"target" :"${dir.engine.rule.classpath}/jackson-databind-2.13.5.jar"
},
{
"type" :"file",
"name" :"slf4j-api-1.7.36.jar",
"description" :"slf4j-api-1.7.36.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/slf4j-api-1.7.36.jar"],
"target" :"${dir.engine.rule.classpath}/slf4j-api-1.7.36.jar"
},
{
"type" :"file",
"name" :"io.sc.engine.rule.core-8.2.22.jar",
"description" :"io.sc.engine.rule.core-8.2.22.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.engine.rule.core-8.2.22.jar"],
"target" :"${dir.engine.rule.classpath}/io.sc.engine.rule.core-8.2.22.jar"
},
{
"type" :"file",
"name" :"io.sc.platform.util-8.2.22.jar",
"description" :"io.sc.platform.util-8.2.22.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.platform.util-8.2.22.jar"],
"target" :"${dir.engine.rule.classpath}/io.sc.platform.util-8.2.22.jar"
},
{
"type" :"file",
"name" :"io.sc.creditreport.core-8.2.22.jar",
"description" :"io.sc.creditreport.core-8.2.22.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.creditreport.core-8.2.22.jar"],
"target" :"${dir.engine.rule.classpath}/io.sc.creditreport.core-8.2.22.jar"
},
{
"type" :"file",
"name" :"io.sc.engine.rule.client.spring-8.2.22.jar",
"description" :"io.sc.engine.rule.client.spring-8.2.22.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.engine.rule.client.spring-8.2.22.jar"],
"target" :"${dir.engine.rule.classpath}/io.sc.engine.rule.client.spring-8.2.22.jar"
},
{
"type" :"file",
"name" :"jaxb-api-2.3.1.jar",
"description" :"jaxb-api-2.3.1.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jarsother/jaxb-api-2.3.1.jar"],
"target" :"${dir.engine.rule.classpath}/jaxb-api-2.3.1.jar"
}
]

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

@ -1,12 +1,12 @@
package io.sc.engine.rule.client.test; package io.sc.engine.rule.client.test;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.ExecutorBuilder; import io.sc.engine.rule.client.ExecutorBuilder;
import io.sc.engine.rule.client.enums.ExecutorMode;
import io.sc.engine.rule.client.enums.LoaderMode;
import io.sc.engine.rule.client.enums.GeneratorType;
import io.sc.engine.rule.core.ExecuteResult; import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.ParameterResult; import io.sc.engine.rule.core.ParameterResult;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.client.ExecutorMode;
import io.sc.engine.rule.core.client.GeneratorType;
import io.sc.engine.rule.core.client.LoaderMode;
import io.sc.platform.util.TimeMonitor; import io.sc.platform.util.TimeMonitor;
import java.util.HashMap; import java.util.HashMap;

3
io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test2.java

@ -15,6 +15,7 @@ import java.util.Map;
public class Test2 { public class Test2 {
private static final String outputDir ="/Users/wangshaoping/Desktop/class"; private static final String outputDir ="/Users/wangshaoping/Desktop/class";
private static final String classPathDir="/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/app.platform/work/engine/rule/jars";
private static final String[] scriptUrls =new String[]{ private static final String[] scriptUrls =new String[]{
"/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/generated/M1734935254414_V1.java" "/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/generated/M1734935254414_V1.java"
}; };
@ -27,7 +28,7 @@ public class Test2 {
String script = FileUtil.readString(ins); String script = FileUtil.readString(ins);
long tm =new Date().getTime(); long tm =new Date().getTime();
FileJavaCompiler fileJavaCompiler =new FileJavaCompiler(); FileJavaCompiler fileJavaCompiler =new FileJavaCompiler(classPathDir);
fileJavaCompiler.compile(className,script,outputDir); fileJavaCompiler.compile(className,script,outputDir);
System.out.println(new Date().getTime() - tm); System.out.println(new Date().getTime() - tm);

3
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/client/Executor.java

@ -1,6 +1,5 @@
package io.sc.engine.rule.client; package io.sc.engine.rule.core.client;
import io.sc.engine.rule.client.enums.GeneratorType;
import io.sc.engine.rule.core.ExecuteResult; import io.sc.engine.rule.core.ExecuteResult;
import java.util.Map; import java.util.Map;

2
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/enums/ExecutorMode.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/client/ExecutorMode.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.client.enums; package io.sc.engine.rule.core.client;
/** /**
* 执行器模式 * 执行器模式

2
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/enums/GeneratorType.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/client/GeneratorType.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.client.enums; package io.sc.engine.rule.core.client;
public enum GeneratorType { public enum GeneratorType {
GROOVY, GROOVY,

2
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Loader.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/client/Loader.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.client; package io.sc.engine.rule.core.client;
import io.sc.engine.rule.core.code.ExecuteUnit; import io.sc.engine.rule.core.code.ExecuteUnit;

2
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/enums/LoaderMode.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/client/LoaderMode.java

@ -1,4 +1,4 @@
package io.sc.engine.rule.client.enums; package io.sc.engine.rule.core.client;
/** /**
* 模型定义加载器模式 * 模型定义加载器模式

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

@ -12,6 +12,7 @@ import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer; import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil; import io.sc.engine.rule.core.util.ValueTypeUtil;
import io.sc.platform.util.CollectionUtil; import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.StringUtil; import io.sc.platform.util.StringUtil;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -45,9 +46,15 @@ public class IndicatorGenerator {
} else { //非列表 } else { //非列表
if (ValueTypeUtil.isBase(valueType)) { // 基本类型 if (ValueTypeUtil.isBase(valueType)) { // 基本类型
if (ValueTypeUtil.isString(valueType)) { // 字符串 if (ValueTypeUtil.isString(valueType)) { // 字符串
String tpl ="String ${fieldName} =\"\"\"${defaultValue}\"\"\"; //${name}"; String tpl ="String ${fieldName} =\"${defaultValue}\"; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n"); sb.append(StringUtil.format(tpl,variables)).append("\n");
} else { // 非字符串 }else if (ValueTypeUtil.isLong(valueType)) { // 字符串
String tpl ="Long ${fieldName} =Long.valueOf(${defaultValue}); //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if (ValueTypeUtil.isDecimal(valueType)) { // 字符串
String tpl ="Double ${fieldName} =new Double(${defaultValue}); //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else { // 非字符串
variables.put("className", IdReplacer.className(valueType, valueTypeVersion)); variables.put("className", IdReplacer.className(valueType, valueTypeVersion));
String tpl = "${className} ${fieldName} =${defaultValue}; //${name}"; String tpl = "${className} ${fieldName} =${defaultValue}; //${name}";
sb.append(StringUtil.format(tpl, variables)).append("\n"); sb.append(StringUtil.format(tpl, variables)).append("\n");
@ -66,8 +73,16 @@ public class IndicatorGenerator {
}else { }else {
variables.put("className", IdReplacer.className(valueType, valueTypeVersion)); variables.put("className", IdReplacer.className(valueType, valueTypeVersion));
if (ValueTypeUtil.isBase(valueType)) { // 基本类型 if (ValueTypeUtil.isBase(valueType)) { // 基本类型
if(ValueTypeUtil.isLong(valueType)){
String tpl = "Long ${fieldName}; //${name}";
sb.append(StringUtil.format(tpl, variables)).append("\n");
}else if(ValueTypeUtil.isDecimal(valueType)){
String tpl = "Double ${fieldName}; //${name}";
sb.append(StringUtil.format(tpl, variables)).append("\n");
}else {
String tpl = "${className} ${fieldName}; //${name}"; String tpl = "${className} ${fieldName}; //${name}";
sb.append(StringUtil.format(tpl, variables)).append("\n"); sb.append(StringUtil.format(tpl, variables)).append("\n");
}
} else { } else {
String tpl = "${className} ${fieldName} =new ${className}(); //${name}"; String tpl = "${className} ${fieldName} =new ${className}(); //${name}";
sb.append(StringUtil.format(tpl, variables)).append("\n"); sb.append(StringUtil.format(tpl, variables)).append("\n");
@ -100,9 +115,22 @@ public class IndicatorGenerator {
sb.append(StringUtil.format(tpl,variables)); sb.append(StringUtil.format(tpl,variables));
} else { } else {
sb.append(StringUtil.format("if (map.get(\"${code}\")!=null) {",variables)); sb.append(StringUtil.format("if (map.get(\"${code}\")!=null) {",variables));
if(ValueTypeUtil.isBase(valueType)){
if(ValueTypeUtil.isLong(valueType)){
String tpl =" arg.${fieldName} =TypeConvertor.getValue(map.get(\"${code}\"),Long.class); } //${name}\n";
sb.append(StringUtil.format(tpl,variables));
}else if(ValueTypeUtil.isDecimal(valueType)){
String tpl =" arg.${fieldName} =TypeConvertor.getValue(map.get(\"${code}\"),Double.class); } //${name}\n";
sb.append(StringUtil.format(tpl,variables));
}else {
String tpl =" arg.${fieldName} =TypeConvertor.getValue(map.get(\"${code}\"),${className}.class); } //${name}\n"; String tpl =" arg.${fieldName} =TypeConvertor.getValue(map.get(\"${code}\"),${className}.class); } //${name}\n";
sb.append(StringUtil.format(tpl,variables)); sb.append(StringUtil.format(tpl,variables));
} }
}else{
String tpl =" arg.${fieldName} =ObjectMapperUtil.json().readValue(map.get(\"${code}\").toString(),${className}.class); } //${name}\n";
sb.append(StringUtil.format(tpl,variables));
}
}
} }
return sb.toString(); return sb.toString();
} }

3
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/import_render.tpl

@ -1,8 +1,7 @@
#define renderImport() #define renderImport()
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import groovy.transform.Canonical; import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.core.ResourceAbstract; import io.sc.engine.rule.core.ResourceAbstract;
import io.sc.engine.rule.core.RuleSetResult; import io.sc.engine.rule.core.RuleSetResult;
import io.sc.engine.rule.core.SingleRuleResult; import io.sc.engine.rule.core.SingleRuleResult;

17
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/initializer/UserFunctionInitializer.java

@ -1,9 +1,9 @@
package io.sc.engine.rule.server.common.initializer; package io.sc.engine.rule.server.common.initializer;
import io.sc.engine.rule.server.function.entity.FunctionEntity;
import io.sc.engine.rule.server.function.service.FunctionService;
import io.sc.engine.rule.server.common.plugins.PluginManager; import io.sc.engine.rule.server.common.plugins.PluginManager;
import io.sc.engine.rule.server.common.plugins.item.FunctionItem; import io.sc.engine.rule.server.common.plugins.item.FunctionItem;
import io.sc.engine.rule.server.function.entity.FunctionEntity;
import io.sc.engine.rule.server.function.service.FunctionService;
import io.sc.platform.core.initializer.ApplicationInitializer; import io.sc.platform.core.initializer.ApplicationInitializer;
import io.sc.platform.core.initializer.ApplicationInitializerExecuteException; import io.sc.platform.core.initializer.ApplicationInitializerExecuteException;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -11,9 +11,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
public class UserFunctionInitializer implements ApplicationInitializer{ public class UserFunctionInitializer implements ApplicationInitializer{
private static final Logger log =LoggerFactory.getLogger(UserFunctionInitializer.class); private static final Logger log =LoggerFactory.getLogger(UserFunctionInitializer.class);
@ -36,6 +34,13 @@ public class UserFunctionInitializer implements ApplicationInitializer{
if(isInitialized!=null) { if(isInitialized!=null) {
return isInitialized; return isInitialized;
} }
if(functionService.getRepository().count()<=0){
isInitialized =false;
}else{
isInitialized =true;
}
return isInitialized;
/*
// 插件定义的函数 // 插件定义的函数
List<FunctionItem> functionItems =PluginManager.getInstance().getFunctionItemEntries(); List<FunctionItem> functionItems =PluginManager.getInstance().getFunctionItemEntries();
Map<String,FunctionItem> cache =new HashMap<>(); Map<String,FunctionItem> cache =new HashMap<>();
@ -77,12 +82,14 @@ public class UserFunctionInitializer implements ApplicationInitializer{
isInitialized = true; isInitialized = true;
} }
return isInitialized; return isInitialized;
*/
} }
@Override @Override
public void execute() throws ApplicationInitializerExecuteException { public void execute() throws ApplicationInitializerExecuteException {
try { try {
for(FunctionItem item : this.needAddedFunctions){ List<FunctionItem> functionItems = PluginManager.getInstance().getFunctionItemEntries();
for(FunctionItem item : functionItems){
FunctionEntity entity =new FunctionEntity(); FunctionEntity entity =new FunctionEntity();
entity.setEnable(item.getEnable()); entity.setEnable(item.getEnable());
entity.setName(item.getName()); entity.setName(item.getName());

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/service/impl/ResourceServiceImpl.java

@ -2,9 +2,9 @@ package io.sc.engine.rule.server.resource.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.client.enums.GeneratorType;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService; import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ResourceAbstract; import io.sc.engine.rule.core.ResourceAbstract;
import io.sc.engine.rule.core.client.GeneratorType;
import io.sc.engine.rule.core.code.*; import io.sc.engine.rule.core.code.*;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator; import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator;
import io.sc.engine.rule.core.code.generator.JavaSourceCodeGenerator; import io.sc.engine.rule.core.code.generator.JavaSourceCodeGenerator;

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java

@ -1,10 +1,10 @@
package io.sc.engine.rule.server.testcase.service.impl; package io.sc.engine.rule.server.testcase.service.impl;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService; import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl; import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService; import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.*; import io.sc.engine.rule.core.*;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.code.ExecuteUnit; import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.ExecuteUnit4Resource; import io.sc.engine.rule.core.code.ExecuteUnit4Resource;
import io.sc.engine.rule.core.code.SourceCode; import io.sc.engine.rule.core.code.SourceCode;

2
io.sc.engine.rule.server/src/main/resources/META-INF/platform/plugins/rule-engine-function.json

@ -5,6 +5,6 @@
"description" : "特殊除法, a 除以 b, 用于处理分母为零", "description" : "特殊除法, a 除以 b, 用于处理分母为零",
"enable" : true, "enable" : true,
"mathXml" : "<mspace></mspace>\n<mrow>\n <mo>UDF.DIV</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>a</mi>\n <mspace></mspace>\n <mo>,</mo>\n <mspace></mspace>\n <mi>b</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>", "mathXml" : "<mspace></mspace>\n<mrow>\n <mo>UDF.DIV</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>a</mi>\n <mspace></mspace>\n <mo>,</mo>\n <mspace></mspace>\n <mi>b</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>",
"body" : "def static DIV(Double a, Double b){\n if(b==0){\n if(a>0){\n return 999;\n }else if(a<0){\n return -999;\n }else{\n return 0;\n }\n }\n}" "body" : "static Double DIV(Double a, Double b){\n if(b==0){\n if(a>0){\n return 999d;\n }else if(a<0){\n return -999d;\n }else{\n return 0d;\n }\n }\n return a/b;\n}"
} }
] ]

2
io.sc.platform.app/build.gradle

@ -10,7 +10,7 @@ dependencies {
project(":io.sc.platform.lcdp"), project(":io.sc.platform.lcdp"),
project(":io.sc.platform.orm.mybatis"), project(":io.sc.platform.orm.mybatis"),
project(":io.sc.platform.poi"), project(":io.sc.platform.poi"),
project(":io.sc.platform.security.loginform"), project(":io.sc.platform.security"),
project(":io.sc.platform.system"), project(":io.sc.platform.system"),
project(":io.sc.platform.ws.cxf"), project(":io.sc.platform.ws.cxf"),
project(":io.sc.webjars"), project(":io.sc.webjars"),

7
io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/Directory.java

@ -7,6 +7,7 @@ public class Directory {
private String name; //名称 private String name; //名称
private String path; //目录路径 private String path; //目录路径
private boolean autoCreate =true; //是否自动创建(如果目录不存在) private boolean autoCreate =true; //是否自动创建(如果目录不存在)
private boolean deleteFirst =false; //是否首先删除(如果目录存在)
//附加属性 //附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置 private String configurationFileUrl; //菜单贡献项配置文件位置
@ -29,6 +30,12 @@ public class Directory {
public void setAutoCreate(boolean autoCreate) { public void setAutoCreate(boolean autoCreate) {
this.autoCreate = autoCreate; this.autoCreate = autoCreate;
} }
public boolean isDeleteFirst() {
return deleteFirst;
}
public void setDeleteFirst(boolean deleteFirst) {
this.deleteFirst = deleteFirst;
}
public String getConfigurationFileUrl() { public String getConfigurationFileUrl() {
return configurationFileUrl; return configurationFileUrl;
} }

7
io.sc.platform.core/src/main/java/io/sc/platform/core/springboot/BeforeEnvironmentProcessor.java

@ -85,6 +85,13 @@ public class BeforeEnvironmentProcessor implements EnvironmentPostProcessor, Ord
String path =applicationHomeDir + directory.getPath(); String path =applicationHomeDir + directory.getPath();
platformProperties.put(directory.getName(), path); platformProperties.put(directory.getName(), path);
File dir =new File(path); File dir =new File(path);
if(dir.exists() && dir.isDirectory() && directory.isDeleteFirst()){
try{
FileUtil.deldirs(dir);
} catch (IOException e) {
e.printStackTrace();
}
}
if(!dir.isDirectory() || !dir.exists()){ if(!dir.isDirectory() || !dir.exists()){
dir.mkdirs(); dir.mkdirs();
} }

2
io.sc.platform.scheduler.manager/build.gradle

@ -5,7 +5,7 @@ dependencies {
project(":io.sc.platform.core"), project(":io.sc.platform.core"),
project(":io.sc.platform.orm"), project(":io.sc.platform.orm"),
project(":io.sc.platform.mvc"), project(":io.sc.platform.mvc"),
project(":io.sc.platform.security.loginform"), project(":io.sc.platform.security"),
project(":io.sc.platform.system"), project(":io.sc.platform.system"),
project(":io.sc.platform.jdbc.liquibase"), project(":io.sc.platform.jdbc.liquibase"),
project(":io.sc.platform.jdbc.schemacrawler"), project(":io.sc.platform.jdbc.schemacrawler"),

22
io.sc.platform.util/src/main/java/io/sc/platform/util/OsUtil.java

@ -0,0 +1,22 @@
package io.sc.platform.util;
public class OsUtil {
public static boolean isWindows(){
String osName = getOsName();
return osName != null && osName.startsWith("Windows");
}
public static boolean isMacOs() {
String osName = getOsName();
return osName != null && osName.startsWith("Mac");
}
public static boolean isLinux() {
String osName = getOsName();
return (osName != null && osName.startsWith("Linux")) || (!isWindows() && !isMacOs());
}
public static String getOsName() {
return System.getProperty("os.name");
}
}

59
io.sc.platform.util/src/main/java/io/sc/platform/util/compiler/file/FileJavaCompiler.java

@ -1,37 +1,70 @@
package io.sc.platform.util.compiler.file; package io.sc.platform.util.compiler.file;
import io.sc.platform.util.OsUtil;
import io.sc.platform.util.compiler.memory.JavaCompileException; import io.sc.platform.util.compiler.memory.JavaCompileException;
import io.sc.platform.util.compiler.memory.MemoryJavaFileObject; import org.springframework.util.StringUtils;
import javax.tools.*; import javax.tools.*;
import java.io.File; import java.io.File;
import java.util.Arrays; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class FileJavaCompiler { public class FileJavaCompiler {
private javax.tools.JavaCompiler compiler; private javax.tools.JavaCompiler compiler;
private StandardJavaFileManager standardFileManager; private StandardJavaFileManager standardFileManager;
private String classpathJarFileDir;
public FileJavaCompiler() { public FileJavaCompiler(String classpathJarFileDir) {
this.compiler = ToolProvider.getSystemJavaCompiler(); this.compiler = ToolProvider.getSystemJavaCompiler();
this.standardFileManager = compiler.getStandardFileManager(null, null, null); this.standardFileManager = compiler.getStandardFileManager(null, null, null);
this.classpathJarFileDir =classpathJarFileDir;
} }
public void compile(String className, String sourceCode,String targetDir) throws JavaCompileException { public void compile(String className, String sourceCode,String targetDir) throws JavaCompileException {
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
JavaCompiler.CompilationTask task = compiler.getTask(
null, String classpath =getClassPath();
standardFileManager, // 编译选项
diagnostics, List<String> options =new ArrayList<>();
Arrays.asList("-d", targetDir), options.add("-d");
null, options.add(targetDir);
Arrays.asList(new StringJavaFileObject(className,sourceCode)) if(StringUtils.hasText(classpath)){
); options.add("-cp");
options.add(classpath);
}
// 编译部件
List<JavaFileObject> units =new ArrayList<>();
units.add(new StringJavaFileObject(className,sourceCode));
JavaCompiler.CompilationTask task = compiler.getTask(null,standardFileManager,diagnostics,options,null,units);
try {
Boolean result = task.call(); Boolean result = task.call();
if (result == null || !result.booleanValue()) { if (!result) {
StringBuilder sb =new StringBuilder(); StringBuilder sb = new StringBuilder();
diagnostics.getDiagnostics().forEach(d -> sb.append(String.valueOf(d))); diagnostics.getDiagnostics().forEach(d -> sb.append(String.valueOf(d)));
throw new JavaCompileException(sb.toString()); throw new JavaCompileException(sb.toString());
} }
} catch (Exception e) {
throw new JavaCompileException(e);
}
}
private String getClassPath(){
File dir =new File(classpathJarFileDir);
if(dir.exists() && dir.isDirectory()) {
File[] jars = dir.listFiles();
if(jars!=null && jars.length>0) {
List<String> paths =new ArrayList<>(jars.length);
for(File jar : jars){
paths.add(jar.getAbsolutePath());
}
if(OsUtil.isWindows()) {
return String.join(";", paths);
}else{
return String.join(":", paths);
}
}
}
return null;
} }
} }

Loading…
Cancel
Save