refactor: 修改脚本内组件的传递方式.

将传递脚本组件的方式由 Delegate 类属性改为 Binding, 以增加灵活性和可维护性.
This commit is contained in:
LamGC 2021-08-20 14:01:43 +08:00
parent 0dc44864cd
commit 3d249696a7
Signed by: LamGC
GPG Key ID: 6C5AE2A913941E1D
2 changed files with 20 additions and 8 deletions

View File

@ -16,17 +16,11 @@ import org.codehaus.groovy.runtime.DefaultGroovyMethods;
public class GroovyDslDelegate implements Script {
private final GroovyScriptInfo scriptInfo = new GroovyScriptInfo();
private final ScriptHttpClient HTTP;
private final ComputeInstanceManager InstanceManager;
/**
* 构建一个 DSL Delegate, 并传入可操作对象.
* @param httpClient Http 客户端.
* @param instanceManager 实例管理器.
*/
public GroovyDslDelegate(ScriptHttpClient httpClient, ComputeInstanceManager instanceManager) {
HTTP = httpClient;
InstanceManager = instanceManager;
public GroovyDslDelegate() {
}
/**

View File

@ -1,6 +1,7 @@
package net.lamgc.oracle.sentry.script.groovy;
import com.google.common.base.Throwables;
import groovy.lang.Binding;
import groovy.lang.GroovyClassLoader;
import groovy.util.DelegatingScript;
import net.lamgc.oracle.sentry.script.Script;
@ -14,6 +15,7 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -56,8 +58,9 @@ public class GroovyScriptLoader implements ScriptLoader {
Constructor<? extends DelegatingScript> constructor =
scriptClass.asSubclass(DelegatingScript.class).getConstructor();
DelegatingScript newScriptObject = constructor.newInstance();
GroovyDslDelegate dslDelegate = new GroovyDslDelegate(context.HTTP(), context.InstanceManager());
GroovyDslDelegate dslDelegate = new GroovyDslDelegate();
newScriptObject.setDelegate(dslDelegate);
newScriptObject.setBinding(createBinding(context));
newScriptObject.run();
scriptInfoMap.put(dslDelegate, dslDelegate.getScriptInfo());
return dslDelegate;
@ -71,4 +74,19 @@ public class GroovyScriptLoader implements ScriptLoader {
public ScriptInfo getScriptInfo(Script script) {
return scriptInfoMap.get(script);
}
private static Binding createBinding(ScriptComponents components) {
Binding binding = new Binding();
for (Field field : components.getClass().getDeclaredFields()) {
try {
String name = field.getName();
field.setAccessible(true);
Object o = field.get(components);
binding.setProperty(name, o);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return binding;
}
}