From 2f225d27fee3cc05a25faa0ba50765d386756568 Mon Sep 17 00:00:00 2001 From: LamGC Date: Thu, 2 Sep 2021 14:23:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20ScriptComponentFac?= =?UTF-8?q?tory=20=E4=BB=A5=E5=85=81=E8=AE=B8=E9=80=9A=E8=BF=87=E8=AF=A5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AE=9E=E4=BE=8B=E5=8A=A8=E6=80=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E8=84=9A=E6=9C=AC=E7=BB=84=E4=BB=B6.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 通过 ScriptComponentFactory 接口, 可以根据脚本信息动态得构造一些特定于脚本的组件, 例如日志. 本次提交同时调整了 Groovy 脚本的初始化过程, 让 ScriptInfo 的初始化能够更先于脚本 Trigger 的运行. --- .../sentry/script/ScriptComponentFactory.java | 22 ++++++++ .../script/groovy/GroovyDslDelegate.java | 18 +++++-- .../script/groovy/GroovyScriptLoader.java | 52 ++++++++++++++++--- 3 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 src/main/java/net/lamgc/oracle/sentry/script/ScriptComponentFactory.java diff --git a/src/main/java/net/lamgc/oracle/sentry/script/ScriptComponentFactory.java b/src/main/java/net/lamgc/oracle/sentry/script/ScriptComponentFactory.java new file mode 100644 index 0000000..4c4ba71 --- /dev/null +++ b/src/main/java/net/lamgc/oracle/sentry/script/ScriptComponentFactory.java @@ -0,0 +1,22 @@ +package net.lamgc.oracle.sentry.script; + +/** + * 脚本组件工厂. + * @author LamGC + */ +public interface ScriptComponentFactory { + + /** + * 创建并获取实例. + * @param info 脚本信息. + * @return 返回对象. + */ + T getInstance(ScriptInfo info); + + /** + * 对象属性名. + * @return 返回建议的对象属性名, {@link ScriptLoader} 并不一定遵守. + */ + String getPropertyName(); + +} diff --git a/src/main/java/net/lamgc/oracle/sentry/script/groovy/GroovyDslDelegate.java b/src/main/java/net/lamgc/oracle/sentry/script/groovy/GroovyDslDelegate.java index a778004..2f41feb 100644 --- a/src/main/java/net/lamgc/oracle/sentry/script/groovy/GroovyDslDelegate.java +++ b/src/main/java/net/lamgc/oracle/sentry/script/groovy/GroovyDslDelegate.java @@ -2,12 +2,15 @@ package net.lamgc.oracle.sentry.script.groovy; import groovy.lang.Closure; import groovy.lang.DelegatesTo; -import net.lamgc.oracle.sentry.ComputeInstanceManager; import net.lamgc.oracle.sentry.script.Script; import net.lamgc.oracle.sentry.script.ScriptInfo; -import net.lamgc.oracle.sentry.script.tools.http.ScriptHttpClient; +import net.lamgc.oracle.sentry.script.groovy.trigger.GroovyTrigger; import org.codehaus.groovy.runtime.DefaultGroovyMethods; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; + /** * Groovy DSL 脚本的父类. * @author LamGC @@ -16,11 +19,14 @@ import org.codehaus.groovy.runtime.DefaultGroovyMethods; public class GroovyDslDelegate implements Script { private final GroovyScriptInfo scriptInfo = new GroovyScriptInfo(); + private final GroovyScriptLoader scriptLoader; /** * 构建一个 DSL Delegate, 并传入可操作对象. + * @param scriptLoader 该脚本所属的加载器. */ - public GroovyDslDelegate() { + public GroovyDslDelegate(GroovyScriptLoader scriptLoader) { + this.scriptLoader = scriptLoader; } /** @@ -29,7 +35,11 @@ public class GroovyDslDelegate implements Script { * @param closure 待执行闭包. */ private void trigger(String triggerName, Closure closure){ - DefaultGroovyMethods.with(GroovyTriggerProvider.INSTANCE.getTriggerByName(triggerName), closure); + if (!scriptLoader.isInitialed(this)) { + return; + } + GroovyTrigger trigger = GroovyTriggerProvider.INSTANCE.getTriggerByName(triggerName); + DefaultGroovyMethods.with(trigger, closure); } /** diff --git a/src/main/java/net/lamgc/oracle/sentry/script/groovy/GroovyScriptLoader.java b/src/main/java/net/lamgc/oracle/sentry/script/groovy/GroovyScriptLoader.java index 6d65b11..26ee52b 100644 --- a/src/main/java/net/lamgc/oracle/sentry/script/groovy/GroovyScriptLoader.java +++ b/src/main/java/net/lamgc/oracle/sentry/script/groovy/GroovyScriptLoader.java @@ -1,5 +1,6 @@ package net.lamgc.oracle.sentry.script.groovy; +import com.google.common.base.Strings; import com.google.common.base.Throwables; import groovy.lang.Binding; import groovy.lang.GroovyClassLoader; @@ -8,6 +9,7 @@ import net.lamgc.oracle.sentry.script.Script; import net.lamgc.oracle.sentry.script.ScriptComponents; import net.lamgc.oracle.sentry.script.ScriptInfo; import net.lamgc.oracle.sentry.script.ScriptLoader; +import net.lamgc.oracle.sentry.script.ScriptComponentFactory; import org.codehaus.groovy.control.CompilerConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,7 +19,9 @@ import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** @@ -30,8 +34,8 @@ public class GroovyScriptLoader implements ScriptLoader { private final static Logger log = LoggerFactory.getLogger(GroovyScriptLoader.class); private final GroovyClassLoader scriptClassLoader; - private final Map scriptInfoMap = new ConcurrentHashMap<>(); + private final Set