diff --git a/app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/service/impl/AgentInfoGenerateServiceImpl.java b/app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/service/impl/AgentInfoGenerateServiceImpl.java index 445372e11e..1aae2c617c 100644 --- a/app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/service/impl/AgentInfoGenerateServiceImpl.java +++ b/app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/service/impl/AgentInfoGenerateServiceImpl.java @@ -25,6 +25,7 @@ import modelengine.fit.jober.aipp.service.AippModelService; import modelengine.fit.jober.aipp.util.UUIDUtil; import modelengine.fitframework.annotation.Component; +import modelengine.fitframework.annotation.Value; import modelengine.fitframework.log.Logger; import modelengine.fitframework.util.IoUtils; import modelengine.fitframework.util.MapBuilder; @@ -40,6 +41,8 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 表示 {@link AgentInfoGenerateService} 的默认实现。 @@ -65,13 +68,17 @@ public class AgentInfoGenerateServiceImpl implements AgentInfoGenerateService { private final String agentNameFormat = "^[\\u4E00-\\u9FA5A-Za-z0-9][\\u4E00-\\u9FA5A-Za-z0-9-_]*$"; + private final String systemCreator; + public AgentInfoGenerateServiceImpl(AippModelService aippModelService, AippModelCenter aippModelCenter, - PluginToolService toolService, LocaleService localeService, AppBuilderAppRepository appRepository) { + PluginToolService toolService, LocaleService localeService, AppBuilderAppRepository appRepository, + @Value("${app-engine.plugin.system-creator}") String systemCreator) { this.aippModelService = aippModelService; this.aippModelCenter = aippModelCenter; this.toolService = toolService; this.localeService = localeService; this.appRepository = appRepository; + this.systemCreator = systemCreator; } @Override @@ -110,7 +117,9 @@ public List selectTools(String desc, String creator, OperationContext co private ArrayList getToolsResult(String desc, String creator, OperationContext context) { StringBuilder toolsCandidate = new StringBuilder(); - ListResult tools = this.getTools(creator); + ListResult creatorTools = this.getTools(creator); + ListResult systemTools = this.getTools(this.systemCreator); + ListResult tools = this.merge(creatorTools, systemTools); int count = tools.getCount(); List toolData = tools.getData(); for (int i = 0; i < count; i++) { @@ -136,6 +145,20 @@ private ArrayList getToolsResult(String desc, String creator, OperationC return toolsResult; } + private ListResult merge(ListResult tool1, ListResult tools2) { + if (tool1 == null || tool1.getCount() == 0) { + return tools2; + } else if (tools2 == null || tools2.getCount() == 0) { + return tool1; + } + ListResult tools = ListResult.create(new ArrayList<>(), 0); + tools.setCount(tool1.getCount() + tools2.getCount()); + List mergedData = Stream.concat(tool1.getData().stream(), tools2.getData().stream()) + .collect(Collectors.toList()); + tools.setData(mergedData); + return tools; + } + private ListResult getTools(String creator) { PluginToolQuery pluginQuery = new PluginToolQuery.Builder().toolName(null).includeTags(new HashSet() {{ add("FIT"); diff --git a/app-builder/plugins/aipp-plugin/src/main/resources/application.yml b/app-builder/plugins/aipp-plugin/src/main/resources/application.yml index 6afadf7b39..ec97107868 100644 --- a/app-builder/plugins/aipp-plugin/src/main/resources/application.yml +++ b/app-builder/plugins/aipp-plugin/src/main/resources/application.yml @@ -60,6 +60,8 @@ app-engine: max-length: 20000 user-context: max-length: 500 + plugin: + system-creator: 'system' elsa: endpoint: elsaKey: diff --git a/app-builder/plugins/aipp-plugin/src/test/java/modelengine/fit/jober/aipp/service/AgentInfoGenerateServiceImplTest.java b/app-builder/plugins/aipp-plugin/src/test/java/modelengine/fit/jober/aipp/service/AgentInfoGenerateServiceImplTest.java index 18e59a0792..f92f5bbd2b 100644 --- a/app-builder/plugins/aipp-plugin/src/test/java/modelengine/fit/jober/aipp/service/AgentInfoGenerateServiceImplTest.java +++ b/app-builder/plugins/aipp-plugin/src/test/java/modelengine/fit/jober/aipp/service/AgentInfoGenerateServiceImplTest.java @@ -25,6 +25,7 @@ import modelengine.jade.store.service.PluginToolService; import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -68,7 +69,7 @@ void beforeAll() { this.aippModelCenter, this.toolService, this.localeService, - this.appRepository); + this.appRepository, "system"); } @Test @@ -135,6 +136,81 @@ void shouldOkWhenSelectTools() { "UNIQUENAME3"); } + @Test + void testMerge_tool1IsNull_returnsTools2() { + ListResult tools2 = new ListResult<>(List.of(new PluginToolData()), 1); + ListResult result = this.invokeMerge(null, tools2); + Assertions.assertSame(tools2, result); + } + + /** + * 测试当 tool1 的 count 为 0 时是否正确返回 tools2 + */ + @Test + void testMerge_tool1IsEmpty_returnsTools2() { + ListResult tool1 = new ListResult<>(new ArrayList<>(), 0); + ListResult tools2 = new ListResult<>(List.of(new PluginToolData()), 1); + ListResult result = this.invokeMerge(tool1, tools2); + Assertions.assertSame(tools2, result); + } + + /** + * 测试当 tools2 为 null 时是否正确返回 tool1 + */ + @Test + void testMerge_tools2IsNull_returnsTool1() { + ListResult tool1 = new ListResult<>(List.of(new PluginToolData()), 1); + ListResult result = invokeMerge(tool1, null); + Assertions.assertSame(tool1, result); + } + + /** + * 测试当 tools2 的 count 为 0 时是否正确返回 tool1 + */ + @Test + void testMerge_tools2IsEmpty_returnsTool1() { + ListResult tool1 = new ListResult<>(List.of(new PluginToolData()), 1); + ListResult tools2 = new ListResult<>(new ArrayList<>(), 0); + ListResult result = invokeMerge(tool1, tools2); + Assertions.assertSame(tool1, result); + } + + /** + * 测试正常情况下两个列表能否成功合并 + */ + @Test + void testMerge_bothValid_mergeCorrectly() { + PluginToolData data1 = new PluginToolData(); + PluginToolData data2 = new PluginToolData(); + ListResult tool1 = new ListResult<>(List.of(data1), 1); + ListResult tools2 = new ListResult<>(List.of(data2), 1); + + ListResult result = invokeMerge(tool1, tools2); + + Assertions.assertNotNull(result); + Assertions.assertEquals(2, result.getCount()); + Assertions.assertTrue(result.getData().contains(data1)); + Assertions.assertTrue(result.getData().contains(data2)); + } + + /** + * 利用反射机制调用私有方法 merge + * + * @param tool1 第一个 ListResult 参数 + * @param tools2 第二个 ListResult 参数 + * @return 合并后的 ListResult 结果 + */ + private ListResult invokeMerge(ListResult tool1, ListResult tools2) { + try { + var method = AgentInfoGenerateServiceImpl.class.getDeclaredMethod("merge", + ListResult.class, ListResult.class); + method.setAccessible(true); + return (ListResult) method.invoke(this.agentInfoGenerateService, tool1, tools2); + } catch (Exception e) { + throw new RuntimeException("Failed to invoke private method 'merge'", e); + } + } + @NotNull private ModelListDto getModelListDto() { List modelAccessInfos = new ArrayList<>();