diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 893e79de..e47da802 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -3,12 +3,12 @@
-
-
+
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 42ae0cec..98b28166 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,8 +1,9 @@
-
+
+
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
new file mode 100644
index 00000000..f67d6aee
--- /dev/null
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/Agent.java
@@ -0,0 +1,7 @@
+package work.slhaf.partner.api;
+
+public class Agent {
+ public static void run(Class> clazz) {
+
+ }
+}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/AgentRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/AgentRegisterFactory.java
new file mode 100644
index 00000000..b07afa9d
--- /dev/null
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/AgentRegisterFactory.java
@@ -0,0 +1,16 @@
+package work.slhaf.partner.api;
+
+import work.slhaf.partner.api.common.entity.AgentRegisterContext;
+
+public class AgentRegisterFactory {
+
+ private AgentRegisterContext context = new AgentRegisterContext();
+
+ private AgentRegisterFactory(){}
+
+ public static void launch(){
+ //TODO 通过调用module与capability的注册逻辑,完成完整的注册过程,需要考虑hook机制
+ AgentRegisterFactory factory = new AgentRegisterFactory();
+ }
+
+}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/capability/BaseCoordinateManager.java b/Partner-Api/src/main/java/work/slhaf/partner/api/capability/BaseCoordinateManager.java
deleted file mode 100644
index 5878c704..00000000
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/capability/BaseCoordinateManager.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package work.slhaf.partner.api.capability;
-
-
-public class BaseCoordinateManager {
-}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/capability/CapabilityRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/capability/CapabilityRegisterFactory.java
index 22fc6217..a8f9cf56 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/capability/CapabilityRegisterFactory.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/capability/CapabilityRegisterFactory.java
@@ -6,8 +6,7 @@ import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import work.slhaf.partner.api.capability.annotation.*;
import work.slhaf.partner.api.capability.exception.*;
-import work.slhaf.partner.api.capability.module.CapabilityHolder;
-import work.slhaf.partner.api.capability.util.CapabilityUtil;
+import work.slhaf.partner.api.common.util.AgentUtil;
import java.lang.reflect.*;
import java.net.URL;
@@ -15,13 +14,11 @@ import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
-import static work.slhaf.partner.api.capability.util.CapabilityUtil.methodSignature;
+import static work.slhaf.partner.api.common.util.AgentUtil.methodSignature;
public final class CapabilityRegisterFactory {
- public static volatile CapabilityRegisterFactory capabilityRegisterFactory;
-
private Reflections reflections;
private final HashMap> methodsRouterTable = new HashMap<>();
private final HashMap> coordinatedMethodsRouterTable = new HashMap<>();
@@ -33,26 +30,20 @@ public final class CapabilityRegisterFactory {
private CapabilityRegisterFactory() {
}
- public static CapabilityRegisterFactory getInstance() {
- if (capabilityRegisterFactory == null) {
- synchronized (CapabilityRegisterFactory.class) {
- if (capabilityRegisterFactory == null) {
- capabilityRegisterFactory = new CapabilityRegisterFactory();
- }
- }
- }
- return capabilityRegisterFactory;
- }
-
-
+ //TODO 需决定是否分离检查与路由表生成、注入逻辑,如果分离,可进一步添加hook点,但目前似乎并非必要
public void registerCapabilities(String scannerPath) {
setBasicVariable(scannerPath);
//检查可注册能力是否正常
statusCheck();
+ //扫描现有Capability, value为键,返回函数路由表, 函数路由表内部通过反射调用对应core的方法
+ generateRouterTable();
+ //通过动态代理注入能力
+ injectCapability();
+ }
+
+ private void generateRouterTable() {
generateMethodsRouterTable();
generateCoordinatedMethodsRouterTable();
- //扫描现有Capability, value为键,返回函数路由表, 函数路由表内部通过反射调用对应core的方法
- injectCapability();
}
private void generateCoordinatedMethodsRouterTable() {
@@ -82,9 +73,9 @@ public final class CapabilityRegisterFactory {
private HashMap getCognationManagerInstances() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException {
HashMap map = new HashMap<>();
- for (Class extends BaseCoordinateManager> c : reflections.getSubTypesOf(BaseCoordinateManager.class)) {
- Constructor extends BaseCoordinateManager> constructor = c.getDeclaredConstructor();
- BaseCoordinateManager instance = constructor.newInstance();
+ for (Class> c : reflections.getTypesAnnotatedWith(CoordinateManager.class)) {
+ Constructor> constructor = c.getDeclaredConstructor();
+ Object instance = constructor.newInstance();
Arrays.stream(c.getMethods())
.filter(method -> method.isAnnotationPresent(Coordinated.class))
@@ -186,8 +177,8 @@ public final class CapabilityRegisterFactory {
private void checkInjectCapability() {
reflections.getFieldsAnnotatedWith(InjectCapability.class).forEach(field -> {
- if (!CapabilityHolder.class.isAssignableFrom(field.getDeclaringClass())) {
- throw new UnMatchedCapabilityException("InjectCapability 注解只能用于CapabilityHolder的子类");
+ if (!field.getDeclaringClass().isAssignableFrom(CapabilityHolder.class)) {
+ throw new UnMatchedCapabilityException("InjectCapability 注解只能用于 CapabilityHolder 注解所在类");
}
});
}
@@ -223,7 +214,7 @@ public final class CapabilityRegisterFactory {
})
.collect(Collectors.toSet());
if (!methodsToCoordinated.isEmpty()) {
- Set> subTypesOfAbsCM = reflections.getSubTypesOf(BaseCoordinateManager.class);
+ Set> subTypesOfAbsCM = reflections.getTypesAnnotatedWith(CoordinateManager.class);
Set methodsCoordinated = getMethodsCoordinated(subTypesOfAbsCM);
if (!methodsCoordinated.equals(methodsToCoordinated)) {
// 找出缺少的协调方法
@@ -245,9 +236,9 @@ public final class CapabilityRegisterFactory {
}
}
- private Set getMethodsCoordinated(Set> subTypesOfAbsCM) {
+ private Set getMethodsCoordinated(Set> classes) {
Set methodsCoordinated = new HashSet<>();
- for (Class extends BaseCoordinateManager> cm : subTypesOfAbsCM) {
+ for (Class> cm : classes) {
Method[] methods = cm.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(Coordinated.class)) {
@@ -280,11 +271,11 @@ public final class CapabilityRegisterFactory {
private LackRecord checkMethodsMatched(List methodsWithAnnotation, List capabilityMethods) {
Set collectedMethodsWithAnnotation = methodsWithAnnotation.stream()
.filter(method -> !method.isAnnotationPresent(ToCoordinated.class))
- .map(CapabilityUtil::methodSignature)
+ .map(AgentUtil::methodSignature)
.collect(Collectors.toSet());
Set collectedCapabilityMethods = capabilityMethods.stream()
.filter(method -> !method.isAnnotationPresent(ToCoordinated.class))
- .map(CapabilityUtil::methodSignature)
+ .map(AgentUtil::methodSignature)
.collect(Collectors.toSet());
return checkMethodsMatched(collectedMethodsWithAnnotation, collectedCapabilityMethods);
}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/capability/annotation/CapabilityHolder.java b/Partner-Api/src/main/java/work/slhaf/partner/api/capability/annotation/CapabilityHolder.java
new file mode 100644
index 00000000..f08210de
--- /dev/null
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/capability/annotation/CapabilityHolder.java
@@ -0,0 +1,9 @@
+package work.slhaf.partner.api.capability.annotation;
+
+import java.lang.annotation.*;
+
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface CapabilityHolder {
+}
diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/CapabilityMethod.java b/Partner-Api/src/main/java/work/slhaf/partner/api/capability/annotation/CoordinateManager.java
similarity index 63%
rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/CapabilityMethod.java
rename to Partner-Api/src/main/java/work/slhaf/partner/api/capability/annotation/CoordinateManager.java
index 2365986f..de50b271 100644
--- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/CapabilityMethod.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/capability/annotation/CoordinateManager.java
@@ -1,11 +1,11 @@
-package work.slhaf.demo.capability.annotation;
+package work.slhaf.partner.api.capability.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface CapabilityMethod {
+public @interface CoordinateManager {
}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/capability/module/CapabilityHolder.java b/Partner-Api/src/main/java/work/slhaf/partner/api/capability/module/CapabilityHolder.java
deleted file mode 100644
index 3068cb8c..00000000
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/capability/module/CapabilityHolder.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package work.slhaf.partner.api.capability.module;
-
-import work.slhaf.partner.api.capability.CapabilityRegisterFactory;
-
-public abstract class CapabilityHolder {
- protected CapabilityHolder() {
- CapabilityRegisterFactory.getInstance().registerModule(this);
- }
-}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/capability/util/CapabilityUtil.java b/Partner-Api/src/main/java/work/slhaf/partner/api/capability/util/CapabilityUtil.java
deleted file mode 100644
index f1f85727..00000000
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/capability/util/CapabilityUtil.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package work.slhaf.partner.api.capability.util;
-
-import java.lang.reflect.Method;
-
-public final class CapabilityUtil {
- public static String methodSignature(Method method) {
- StringBuilder sb = new StringBuilder();
- sb.append("(");
- sb.append(method.getReturnType().getName()).append(" ");
- sb.append(method.getName()).append("(");
- Class>[] paramTypes = method.getParameterTypes();
- for (int i = 0; i < paramTypes.length; i++) {
- sb.append(paramTypes[i].getName());
- if (i < paramTypes.length - 1) sb.append(",");
- }
- sb.append(")").append(")");
- return sb.toString();
- }
-}
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/common/entity/AgentRegisterContext.java b/Partner-Api/src/main/java/work/slhaf/partner/api/common/entity/AgentRegisterContext.java
new file mode 100644
index 00000000..b5569b1d
--- /dev/null
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/common/entity/AgentRegisterContext.java
@@ -0,0 +1,10 @@
+package work.slhaf.partner.api.common.entity;
+
+import lombok.Data;
+import org.reflections.Reflections;
+
+@Data
+public class AgentRegisterContext {
+ //TODO 抽取出必要的注册工厂共用的上下文
+ private Reflections reflections;
+}
diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/util/CapabilityUtil.java b/Partner-Api/src/main/java/work/slhaf/partner/api/common/util/AgentUtil.java
similarity index 88%
rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/util/CapabilityUtil.java
rename to Partner-Api/src/main/java/work/slhaf/partner/api/common/util/AgentUtil.java
index dc13868a..b703831f 100644
--- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/util/CapabilityUtil.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/common/util/AgentUtil.java
@@ -1,8 +1,8 @@
-package work.slhaf.demo.capability.util;
+package work.slhaf.partner.api.common.util;
import java.lang.reflect.Method;
-public final class CapabilityUtil {
+public final class AgentUtil {
public static String methodSignature(Method method) {
StringBuilder sb = new StringBuilder();
sb.append("(");
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/module/ModuleRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/module/ModuleRegisterFactory.java
new file mode 100644
index 00000000..54f8d1b5
--- /dev/null
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/module/ModuleRegisterFactory.java
@@ -0,0 +1,4 @@
+package work.slhaf.partner.api.module;
+
+public class ModuleRegisterFactory {
+}
diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/Main.java b/Partner-Capability-Demo/src/main/java/work/slhaf/Main.java
deleted file mode 100644
index 293e4faf..00000000
--- a/Partner-Capability-Demo/src/main/java/work/slhaf/Main.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package work.slhaf;
-
-import work.slhaf.demo.TestModule;
-import work.slhaf.demo.capability.CapabilityRegisterFactory;
-
-public class Main {
- public static void main(String[] args) throws ClassNotFoundException {
- TestModule testModule = new TestModule();
- CapabilityRegisterFactory.getInstance().registerCapabilities(Main.class.getPackage().getName());
- testModule.execute();
- }
-}
\ No newline at end of file
diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/BaseCognationManager.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/BaseCognationManager.java
deleted file mode 100644
index 0a1e3db0..00000000
--- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/BaseCognationManager.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package work.slhaf.demo.capability;
-
-public class BaseCognationManager {
-}
diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/CapabilityRegisterFactory.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/CapabilityRegisterFactory.java
deleted file mode 100644
index c8926510..00000000
--- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/CapabilityRegisterFactory.java
+++ /dev/null
@@ -1,373 +0,0 @@
-package work.slhaf.demo.capability;
-
-import org.reflections.Reflections;
-import org.reflections.scanners.Scanners;
-import org.reflections.util.ClasspathHelper;
-import org.reflections.util.ConfigurationBuilder;
-import work.slhaf.demo.capability.annotation.*;
-import work.slhaf.demo.capability.exception.*;
-import work.slhaf.demo.capability.module.CapabilityHolder;
-import work.slhaf.demo.capability.util.CapabilityUtil;
-
-import java.lang.reflect.*;
-import java.net.URL;
-import java.util.*;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static work.slhaf.demo.capability.util.CapabilityUtil.methodSignature;
-
-public final class CapabilityRegisterFactory {
-
- public static volatile CapabilityRegisterFactory capabilityRegisterFactory;
-
- private Reflections reflections;
- private final HashMap> methodsRouterTable = new HashMap<>();
- private final HashMap> coordinatedMethodsRouterTable = new HashMap<>();
- private final HashMap, Object> capabilityCoreInstances = new HashMap<>();
- private final HashMap, Object> capabilityHolderInstances = new HashMap<>();
- private Set> cores;
- private Set> capabilities;
-
- private CapabilityRegisterFactory() {
- }
-
- public static CapabilityRegisterFactory getInstance() {
- if (capabilityRegisterFactory == null) {
- synchronized (CapabilityRegisterFactory.class) {
- if (capabilityRegisterFactory == null) {
- capabilityRegisterFactory = new CapabilityRegisterFactory();
- }
- }
- }
- return capabilityRegisterFactory;
- }
-
-
- public void registerCapabilities(String scannerPath) {
- setBasicVariable(scannerPath);
- //检查可注册能力是否正常
- statusCheck();
- generateMethodsRouterTable();
- generateCoordinatedMethodsRouterTable();
- //扫描现有Capability, value为键,返回函数路由表, 函数路由表内部通过反射调用对应core的方法
- injectCapability();
- }
-
- private void generateCoordinatedMethodsRouterTable() {
- Set methodsAnnotatedWith = reflections.getMethodsAnnotatedWith(Coordinated.class);
- if (methodsAnnotatedWith.isEmpty()) {
- return;
- }
- try {
- //获取所有CM实例
- HashMap cognationManagerInstances = getCognationManagerInstances();
- methodsAnnotatedWith.forEach(method -> {
- String key = method.getAnnotation(Coordinated.class).capability() + "." + methodSignature(method);
- Function