diff --git a/.idea/.gitignore b/.idea/.gitignore index 35410cac..78b605e0 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -6,3 +6,4 @@ # Datasource local storage ignored files /dataSources/ /dataSources.local.xml +/inspectionProfiles/Project_Default.xml diff --git a/.xcodemap/config/xcodemap-class-filter.yaml b/.xcodemap/config/xcodemap-class-filter.yaml index 598c4a62..dd20cb7d 100644 --- a/.xcodemap/config/xcodemap-class-filter.yaml +++ b/.xcodemap/config/xcodemap-class-filter.yaml @@ -1,4 +1,5 @@ autoDetectedPackages: +- module - work.slhaf enableAutoDetect: true entryDisplayConfig: diff --git a/Partner-Api/pom.xml b/Partner-Api/pom.xml index 15b6ee64..1e162230 100644 --- a/Partner-Api/pom.xml +++ b/Partner-Api/pom.xml @@ -26,7 +26,6 @@ org.projectlombok lombok 1.18.36 - provided junit diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/Agent.java b/Partner-Api/src/main/java/work/slhaf/partner/api/Agent.java index 11a1a5e4..b80dfcb8 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/Agent.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/Agent.java @@ -1,8 +1,10 @@ package work.slhaf.partner.api; -import work.slhaf.partner.api.entity.AgentContext; +import work.slhaf.partner.api.exception.AgentLaunchFailedException; import work.slhaf.partner.api.factory.AgentRegisterFactory; +import work.slhaf.partner.api.factory.module.pojo.MetaModule; import work.slhaf.partner.api.flow.AgentInteraction; +import work.slhaf.partner.api.flow.entity.InteractionFlowContext; import java.util.ArrayList; import java.util.List; @@ -14,23 +16,38 @@ import java.util.concurrent.Executors; */ public class Agent { - private static final List runners = new ArrayList<>(); + private final List runners = new ArrayList<>(); + private final Class applicationClass; + private final InteractionFlowContext interactionContext; - public static void run(Class clazz) { - AgentContext context = AgentRegisterFactory.launch(clazz.getPackage().getName()); - AgentInteraction.launch(context); + private Agent(Class clazz, InteractionFlowContext interactionContext) { + this.applicationClass = clazz; + this.interactionContext = interactionContext; + } + + public static Agent newAgent(Class clazz, InteractionFlowContext interactionContext) { + if (clazz == null || interactionContext == null) { + throw new AgentLaunchFailedException("Agent class 和 interaction flow context 不能为 null"); + } + return new Agent(clazz, interactionContext); + } + + public void run() { + List moduleList = AgentRegisterFactory.launch(applicationClass.getPackage().getName()); + AgentInteraction.launch(moduleList, interactionContext); launchRunners(); } - private static void launchRunners() { + + private void launchRunners() { ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor(); for (Runnable runner : runners) { executorService.execute(runner); } - executorService.close(); } - public static void addRunner(Runnable runnable) { - runners.add(runnable); + public Agent addRunners(Runnable... runnable) { + runners.addAll(List.of(runnable)); + return this; } } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/entity/AgentContext.java b/Partner-Api/src/main/java/work/slhaf/partner/api/entity/AgentContext.java index 0a1b2012..c8c5dfc2 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/entity/AgentContext.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/entity/AgentContext.java @@ -1,8 +1,10 @@ package work.slhaf.partner.api.entity; import lombok.Data; +import work.slhaf.partner.api.factory.module.pojo.MetaModule; import java.util.HashMap; +import java.util.List; import java.util.Set; import java.util.function.Function; @@ -14,4 +16,5 @@ public class AgentContext { private HashMap, Object> capabilityHolderInstances; private Set> cores; private Set> capabilities; + private List moduleList; } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/exception/AgentLaunchFailedException.java b/Partner-Api/src/main/java/work/slhaf/partner/api/exception/AgentLaunchFailedException.java new file mode 100644 index 00000000..77b41aff --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/exception/AgentLaunchFailedException.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.api.exception; + +public class AgentLaunchFailedException extends RuntimeException { + public AgentLaunchFailedException(String message, Throwable cause) { + super("Agent 启动失败: " + message, cause); + } + + public AgentLaunchFailedException(String message) { + super("Agent 启动失败: " + message); + } +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/AgentRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/AgentRegisterFactory.java index 20f50211..c53c762a 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/AgentRegisterFactory.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/AgentRegisterFactory.java @@ -1,8 +1,6 @@ package work.slhaf.partner.api.factory; -import cn.hutool.core.bean.BeanUtil; import org.reflections.util.ClasspathHelper; -import work.slhaf.partner.api.entity.AgentContext; import work.slhaf.partner.api.factory.capability.CapabilityCheckFactory; import work.slhaf.partner.api.factory.capability.CapabilityInjectFactory; import work.slhaf.partner.api.factory.capability.CapabilityRegisterFactory; @@ -14,6 +12,7 @@ import work.slhaf.partner.api.factory.module.ModuleCheckFactory; import work.slhaf.partner.api.factory.module.ModulePreHookExecuteFactory; import work.slhaf.partner.api.factory.module.ModuleProxyFactory; import work.slhaf.partner.api.factory.module.ModuleRegisterFactory; +import work.slhaf.partner.api.factory.module.pojo.MetaModule; import java.io.File; import java.net.URL; @@ -27,7 +26,7 @@ public class AgentRegisterFactory { private AgentRegisterFactory() { } - public static AgentContext launch(String packageName) { + public static List launch(String packageName) { urls.addAll(packageNameToURL(packageName)); AgentRegisterContext registerContext = new AgentRegisterContext(urls); //流程 @@ -46,11 +45,10 @@ public class AgentRegisterFactory { //. 执行模块PreHook逻辑 new ModulePreHookExecuteFactory().execute(registerContext); - AgentContext agentContext = new AgentContext(); - BeanUtil.copyProperties(registerContext, agentContext); - return agentContext; + return registerContext.getModuleFactoryContext().getModuleList(); } + /** * 添加可扫描包 * @param packageName 指定的包名 diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/context/ModuleFactoryContext.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/context/ModuleFactoryContext.java index 7496e766..12730d3b 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/context/ModuleFactoryContext.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/context/ModuleFactoryContext.java @@ -14,4 +14,5 @@ public class ModuleFactoryContext { private List moduleList = new ArrayList<>(); private HashMap,Set> preHookMethods = new HashMap<>(); private HashMap,Set> postHookMethods = new HashMap<>(); + private HashMap,Set> initHookMethods = new HashMap<>(); } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleCheckFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleCheckFactory.java index 338a193a..3fe5eecc 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleCheckFactory.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleCheckFactory.java @@ -1,12 +1,14 @@ package work.slhaf.partner.api.factory.module; +import cn.hutool.core.util.ClassUtil; import org.reflections.Reflections; import work.slhaf.partner.api.factory.AgentBaseFactory; import work.slhaf.partner.api.factory.config.ModelConfigManager; import work.slhaf.partner.api.factory.context.AgentRegisterContext; -import work.slhaf.partner.api.factory.module.annotation.After; +import work.slhaf.partner.api.factory.module.annotation.AfterExecute; import work.slhaf.partner.api.factory.module.annotation.AgentModule; -import work.slhaf.partner.api.factory.module.annotation.Before; +import work.slhaf.partner.api.factory.module.annotation.BeforeExecute; +import work.slhaf.partner.api.factory.module.annotation.Init; import work.slhaf.partner.api.factory.module.exception.ModuleCheckException; import work.slhaf.partner.api.flow.abstracts.ActivateModel; import work.slhaf.partner.api.flow.abstracts.AgentInteractionModule; @@ -68,14 +70,35 @@ public class ModuleCheckFactory extends AgentBaseFactory { } private void hookLocationCheck() { - //检查@After注解 + //检查@AfterExecute注解 postHookLocationCheck(); - //检查@Before注解 + //检查@BeforeExecute注解 preHookLocationCheck(); + //检查@Init注解 + initHookLocationCheck(); + //检查@AgentModule注解是否只位于普通类上 + agentModuleLocationCheck(); + } + + private void agentModuleLocationCheck() { + Set> types = reflections.getTypesAnnotatedWith(AgentModule.class); + for (Class type : types) { + if (!ClassUtil.isNormalClass(type)) { + throw new ModuleCheckException("AgentModule 注解仅能位于普通类上! 异常类信息: " + type.getSimpleName()); + } + } + } + + private void initHookLocationCheck() { + Set methods = reflections.getMethodsAnnotatedWith(Init.class); + Set> types = methods.stream() + .map(Method::getDeclaringClass) + .collect(Collectors.toSet()); + checkLocation(types); } private void preHookLocationCheck() { - Set methods = reflections.getMethodsAnnotatedWith(Before.class); + Set methods = reflections.getMethodsAnnotatedWith(BeforeExecute.class); Set> types = methods.stream() .map(Method::getDeclaringClass) .collect(Collectors.toSet()); @@ -84,7 +107,7 @@ public class ModuleCheckFactory extends AgentBaseFactory { private void postHookLocationCheck() { - Set methods = reflections.getMethodsAnnotatedWith(After.class); + Set methods = reflections.getMethodsAnnotatedWith(AfterExecute.class); Set> types = methods.stream() .map(Method::getDeclaringClass) .collect(Collectors.toSet()); diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleProxyFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleProxyFactory.java index 62053cdd..5ecbb590 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleProxyFactory.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleProxyFactory.java @@ -1,9 +1,6 @@ package work.slhaf.partner.api.factory.module; -import net.bytebuddy.ByteBuddy; -import net.bytebuddy.implementation.MethodDelegation; import net.bytebuddy.implementation.bind.annotation.*; -import net.bytebuddy.matcher.ElementMatchers; import work.slhaf.partner.api.factory.AgentBaseFactory; import work.slhaf.partner.api.factory.context.AgentRegisterContext; import work.slhaf.partner.api.factory.context.ModuleFactoryContext; @@ -11,59 +8,81 @@ import work.slhaf.partner.api.factory.module.exception.ModuleInstanceGenerateFai import work.slhaf.partner.api.factory.module.exception.ModuleProxyGenerateFailedException; import work.slhaf.partner.api.factory.module.pojo.MetaMethod; import work.slhaf.partner.api.factory.module.pojo.MetaModule; -import work.slhaf.partner.api.flow.abstracts.AgentInteractionModule; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.Comparator; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.concurrent.Callable; /** - * 通过扫描注解@Before,获取到各个模块的后hook逻辑并通过动态代理添加到执行逻辑之后 + * 通过扫描注解@BeforeExecute,获取到各个模块的后hook逻辑并通过动态代理添加到执行逻辑之后 */ public class ModuleProxyFactory extends AgentBaseFactory { private List moduleList; private HashMap, Set> postHookMethods; + private HashMap, Set> preHookMethods; @Override protected void setVariables(AgentRegisterContext context) { ModuleFactoryContext factoryContext = context.getModuleFactoryContext(); moduleList = factoryContext.getModuleList(); postHookMethods = factoryContext.getPostHookMethods(); + preHookMethods = factoryContext.getPreHookMethods(); } @Override protected void run() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { - //TODO 生成实例、并通过动态代理添加PostHook逻辑 + //TODO 填充具体逻辑 generateInstances(); - setPostHookProxy(); + setHookProxy(); } - private void setPostHookProxy() { + private void setHookProxy() { for (MetaModule module : moduleList) { Class clazz = module.getClazz(); try { - Class proxyClass = new ByteBuddy() - .subclass(clazz) - .method(ElementMatchers.isOverriddenFrom(AgentInteractionModule.class)) - .intercept(MethodDelegation.to(new ModuleProxyInterceptor(postHookMethods.get(clazz).stream().sorted(Comparator.comparing(MetaMethod::getOrder)).toList()))) - .make() - .load(ModuleProxyFactory.class.getClassLoader()) - .getLoaded(); - - AgentInteractionModule interactionModule = (AgentInteractionModule) proxyClass.getConstructor().newInstance(); - //TODO 检测代理写法是否正确 - //TODO 添加ModuleManager,负责统一管理Module的加载、卸载 + MethodsListRecord record = getHookMethodsList(clazz); + //生成实例, + generateProxiedInstances(record); } catch (Exception e) { throw new ModuleProxyGenerateFailedException("创建代理对象失败: " + clazz.getSimpleName(), e); } } } + private void generateProxiedInstances(MethodsListRecord record) { + + } + + private MethodsListRecord getHookMethodsList(Class clazz) { + List post = new ArrayList<>(); + List pre = new ArrayList<>(); + //获取该类本身的hook逻辑 + getHookMethodsList(post, pre, clazz); + //获取它所继承、实现的抽象类或接口, 以AgentInteractionModule、ActiveModel为终点 + List> classes = getExtendedClasses(clazz); + //获取这些类中的hook逻辑 + getHookMethodsList(post, pre, classes); + return new MethodsListRecord(post, pre); + } + + private void getHookMethodsList(List post, List pre, List> classes) { + + } + + private List> getExtendedClasses(Class clazz) { + + return null; + } + + private void getHookMethodsList(List post, List pre, Class clazz) { + + } + private void generateInstances() { for (MetaModule metaModule : moduleList) { try { @@ -78,19 +97,27 @@ public class ModuleProxyFactory extends AgentBaseFactory { private static class ModuleProxyInterceptor { - private List postHookMethods; + private final List postHookMethods; + private final List preHookMethods; - private ModuleProxyInterceptor(List postHookMethods) { + private ModuleProxyInterceptor(List postHookMethods, List preHookMethods) { this.postHookMethods = postHookMethods; + this.preHookMethods = preHookMethods; } @RuntimeType public Object intercept(@Origin Method method, @AllArguments Object[] allArguments, @SuperCall Callable zuper, @This Object proxy) throws Exception { + for (MetaMethod metaMethod : preHookMethods) { + metaMethod.getMethod().invoke(proxy); + } Object res = zuper.call(); for (MetaMethod metaMethod : postHookMethods) { - metaMethod.getMethod().invoke(proxy, allArguments); + metaMethod.getMethod().invoke(proxy); } return res; } } + + record MethodsListRecord(List post, List pre) { + } } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleRegisterFactory.java index 8358b180..ad80d456 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleRegisterFactory.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/ModuleRegisterFactory.java @@ -4,9 +4,10 @@ import org.reflections.Reflections; import work.slhaf.partner.api.factory.AgentBaseFactory; import work.slhaf.partner.api.factory.context.AgentRegisterContext; import work.slhaf.partner.api.factory.context.ModuleFactoryContext; -import work.slhaf.partner.api.factory.module.annotation.After; +import work.slhaf.partner.api.factory.module.annotation.AfterExecute; import work.slhaf.partner.api.factory.module.annotation.AgentModule; -import work.slhaf.partner.api.factory.module.annotation.Before; +import work.slhaf.partner.api.factory.module.annotation.BeforeExecute; +import work.slhaf.partner.api.factory.module.annotation.Init; import work.slhaf.partner.api.factory.module.pojo.MetaMethod; import work.slhaf.partner.api.factory.module.pojo.MetaModule; @@ -22,6 +23,7 @@ public class ModuleRegisterFactory extends AgentBaseFactory { private List moduleList; private HashMap, Set> postHookMethods; private HashMap, Set> preHookMethods; + private HashMap, Set> initHookMethods; @Override protected void setVariables(AgentRegisterContext context) { @@ -30,6 +32,7 @@ public class ModuleRegisterFactory extends AgentBaseFactory { moduleList = factoryContext.getModuleList(); postHookMethods = factoryContext.getPostHookMethods(); preHookMethods = factoryContext.getPreHookMethods(); + initHookMethods = factoryContext.getInitHookMethods(); } @Override @@ -41,25 +44,37 @@ public class ModuleRegisterFactory extends AgentBaseFactory { private void registerHookSet() { setPostHookMethods(); setPreHookMethods(); + setInitMethods(); } - private void setPreHookMethods() { - Set methods = reflections.getMethodsAnnotatedWith(After.class); + private void setInitMethods() { + Set methods = reflections.getMethodsAnnotatedWith(Init.class); for (Method method : methods) { MetaMethod metaMethod = new MetaMethod(); metaMethod.setMethod(method); - metaMethod.setOrder(method.getAnnotation(After.class).order()); + metaMethod.setOrder(method.getAnnotation(Init.class).order()); + + addMetaMethod(method, metaMethod, initHookMethods); + } + } + + private void setPreHookMethods() { + Set methods = reflections.getMethodsAnnotatedWith(AfterExecute.class); + for (Method method : methods) { + MetaMethod metaMethod = new MetaMethod(); + metaMethod.setMethod(method); + metaMethod.setOrder(method.getAnnotation(AfterExecute.class).order()); addMetaMethod(method, metaMethod, postHookMethods); } } private void setPostHookMethods() { - Set methods = reflections.getMethodsAnnotatedWith(Before.class); + Set methods = reflections.getMethodsAnnotatedWith(BeforeExecute.class); for (Method method : methods) { MetaMethod metaMethod = new MetaMethod(); metaMethod.setMethod(method); - metaMethod.setOrder(method.getAnnotation(Before.class).order()); + metaMethod.setOrder(method.getAnnotation(BeforeExecute.class).order()); addMetaMethod(method, metaMethod, preHookMethods); } @@ -69,7 +84,7 @@ public class ModuleRegisterFactory extends AgentBaseFactory { Class clazz = method.getDeclaringClass(); if (preHookMethods.containsKey(clazz)) { preHookMethods.get(clazz).add(metaMethod); - }else { + } else { HashSet metaMethods = new HashSet<>(); metaMethods.add(metaMethod); preHookMethods.put(clazz, metaMethods); diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/After.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/AfterExecute.java similarity index 94% rename from Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/After.java rename to Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/AfterExecute.java index 0a0195b3..2ee78d7e 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/After.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/AfterExecute.java @@ -15,6 +15,6 @@ import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface After { +public @interface AfterExecute { int order() default 0; } \ No newline at end of file diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Before.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/BeforeExecute.java similarity index 94% rename from Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Before.java rename to Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/BeforeExecute.java index c10079a9..54102223 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Before.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/BeforeExecute.java @@ -13,6 +13,6 @@ import java.lang.annotation.Target; */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface Before { +public @interface BeforeExecute { int order() default 0; } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Init.java b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Init.java new file mode 100644 index 00000000..8ecee244 --- /dev/null +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/factory/module/annotation/Init.java @@ -0,0 +1,12 @@ +package work.slhaf.partner.api.factory.module.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Init { + int order() default 0; +} diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/AgentInteraction.java b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/AgentInteraction.java index 016f023e..8e190be1 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/AgentInteraction.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/AgentInteraction.java @@ -1,6 +1,9 @@ package work.slhaf.partner.api.flow; -import work.slhaf.partner.api.entity.AgentContext; +import work.slhaf.partner.api.factory.module.pojo.MetaModule; +import work.slhaf.partner.api.flow.entity.InteractionFlowContext; + +import java.util.List; /** * Agent执行流程 @@ -9,7 +12,7 @@ public class AgentInteraction { private AgentInteraction(){} - public static void launch(AgentContext context){ + public static void launch(List moduleList, InteractionFlowContext interactionContext){ //流程执行启动,需考虑模块热插拔,可结合http调整模块启用情况,并序列化至本地或数据库中 } } diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/abstracts/ActivateModel.java b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/abstracts/ActivateModel.java index abf04980..dfd805ee 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/abstracts/ActivateModel.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/abstracts/ActivateModel.java @@ -7,14 +7,14 @@ import work.slhaf.partner.api.common.chat.pojo.ChatResponse; import work.slhaf.partner.api.common.chat.pojo.Message; import work.slhaf.partner.api.factory.config.ModelConfigManager; import work.slhaf.partner.api.factory.config.pojo.ModelConfig; -import work.slhaf.partner.api.factory.module.annotation.Before; +import work.slhaf.partner.api.factory.module.annotation.BeforeExecute; import java.util.ArrayList; import java.util.List; public interface ActivateModel { - @Before + @BeforeExecute default void modelSettings() { Model model = new Model(); ModelConfig modelConfig = ModelConfigManager.INSTANCE.loadModelConfig(modelKey()); diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/entity/InteractionFlowContext.java b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/entity/InteractionFlowContext.java index 950c1890..5e10cba4 100644 --- a/Partner-Api/src/main/java/work/slhaf/partner/api/flow/entity/InteractionFlowContext.java +++ b/Partner-Api/src/main/java/work/slhaf/partner/api/flow/entity/InteractionFlowContext.java @@ -6,5 +6,6 @@ import lombok.Data; * 流程上下文 */ @Data -public class InteractionFlowContext { +public abstract class InteractionFlowContext { + } diff --git a/Partner-Api/src/test/java/TestApplication.java b/Partner-Api/src/test/java/TestApplication.java new file mode 100644 index 00000000..efd75139 --- /dev/null +++ b/Partner-Api/src/test/java/TestApplication.java @@ -0,0 +1,7 @@ +import work.slhaf.partner.api.Agent; + +public class TestApplication { + public static void main(String[] args) { + Agent.newAgent(TestApplication.class,null).run(); + } +} diff --git a/Partner-Api/src/test/java/module/ModuleProxyTest.java b/Partner-Api/src/test/java/module/ModuleProxyTest.java new file mode 100644 index 00000000..2dc3a0fd --- /dev/null +++ b/Partner-Api/src/test/java/module/ModuleProxyTest.java @@ -0,0 +1,24 @@ +package module; + +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.implementation.MethodDelegation; +import net.bytebuddy.matcher.ElementMatchers; +import org.junit.jupiter.api.Test; +import work.slhaf.partner.api.flow.abstracts.AgentInteractionModule; + +import java.lang.reflect.InvocationTargetException; + +public class ModuleProxyTest { + @Test + public void test() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + Class clazz = new ByteBuddy().subclass(MyAgentInteractionModule.class) + .method(ElementMatchers.isOverriddenFrom(AgentInteractionModule.class)) + .intercept(MethodDelegation.to( + new MyModuleProxyInterceptor() + )) + .make() + .load(ModuleProxyTest.class.getClassLoader()) + .getLoaded(); + clazz.getConstructor().newInstance().execute(null); + } +} diff --git a/Partner-Api/src/test/java/module/MyAgentInteractionModule.java b/Partner-Api/src/test/java/module/MyAgentInteractionModule.java new file mode 100644 index 00000000..f911fce5 --- /dev/null +++ b/Partner-Api/src/test/java/module/MyAgentInteractionModule.java @@ -0,0 +1,11 @@ +package module; + +import work.slhaf.partner.api.flow.abstracts.AgentInteractionModule; +import work.slhaf.partner.api.flow.entity.InteractionFlowContext; + +public class MyAgentInteractionModule extends AgentInteractionModule { + @Override + public void execute(InteractionFlowContext context) { + System.out.println("MyAgentInteractionModule"); + } +} diff --git a/Partner-Api/src/test/java/module/MyModuleProxyInterceptor.java b/Partner-Api/src/test/java/module/MyModuleProxyInterceptor.java new file mode 100644 index 00000000..72405548 --- /dev/null +++ b/Partner-Api/src/test/java/module/MyModuleProxyInterceptor.java @@ -0,0 +1,18 @@ +package module; + +import net.bytebuddy.implementation.bind.annotation.*; + +import java.lang.reflect.Method; +import java.util.concurrent.Callable; + +public class MyModuleProxyInterceptor { + public MyModuleProxyInterceptor() {} + + @RuntimeType + public Object intercept(@Origin Method method, @AllArguments Object[] allArguments, @SuperCall Callable zuper, @This Object proxy) throws Exception { + System.out.println("22222"); + Object res = zuper.call(); + System.out.println("11111"); + return res; + } +}