diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/SynapseLanguageService.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/SynapseLanguageService.java index a3da20da7..f7b6946fb 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/SynapseLanguageService.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/SynapseLanguageService.java @@ -337,6 +337,13 @@ public CompletableFuture availableResources(ResourceParam para return CompletableFuture.supplyAsync(() -> response); } + @Override + public CompletableFuture> getAllResources() { + + Map allResources = resourceFinder.getAllResources(projectUri); + return CompletableFuture.supplyAsync(() -> allResources); + } + @Override public CompletableFuture> availableConnectors(ConnectorParam param) { diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/ISynapseLanguageService.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/ISynapseLanguageService.java index 1dd6d94d3..12833babd 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/ISynapseLanguageService.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/ISynapseLanguageService.java @@ -119,6 +119,9 @@ public interface ISynapseLanguageService { @JsonRequest CompletableFuture availableResources(ResourceParam param); + @JsonRequest + CompletableFuture> getAllResources(); + @JsonRequest CompletableFuture> availableConnectors(ConnectorParam param); diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/synapse/resourceFinder/AbstractResourceFinder.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/synapse/resourceFinder/AbstractResourceFinder.java index f77390800..48e1507ba 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/synapse/resourceFinder/AbstractResourceFinder.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/synapse/resourceFinder/AbstractResourceFinder.java @@ -407,6 +407,11 @@ public Map getDependentResourcesMap() { return dependentResourcesMap; } + public Map getAllResources(String projectPath) { + + return new HashMap<>(); + } + private String getFullyQualifiedName(OverviewPageDetailsResponse pomDetailsResponse, Resource resource) { // For DataServices and proxy services, the name remains unchanged as by default MI server won't expose versioned services diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/synapse/resourceFinder/NewProjectResourceFinder.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/synapse/resourceFinder/NewProjectResourceFinder.java index 07c74dfc2..17d57f18f 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/synapse/resourceFinder/NewProjectResourceFinder.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/customservice/synapse/resourceFinder/NewProjectResourceFinder.java @@ -140,6 +140,25 @@ private void filterResourcesForUnitTestRegistry(List resourcesInRegist } } + /** + * Returns all resources in the project, including artifacts, local entries, and registry + * resources from both the main project and resolved dependent projects. + * + * @param projectPath the root directory of the project + * @return a map where the key is the resource type and the value is the corresponding ResourceResponse + */ + @Override + public Map getAllResources(String projectPath) { + + Map allResources = findAllResources(projectPath); + Map dependentResources = getDependentResourcesMap(); + for (Map.Entry entry : dependentResources.entrySet()) { + allResources.computeIfAbsent(entry.getKey(), k -> new ResourceResponse()); + mergeResourceResponses(allResources.get(entry.getKey()), entry.getValue()); + } + return allResources; + } + @Override protected String getArtifactFolder(String type) { diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/synapse/resource/finder/ResourceFinderTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/synapse/resource/finder/ResourceFinderTest.java index 52e0d7233..5e3268bc7 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/synapse/resource/finder/ResourceFinderTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/synapse/resource/finder/ResourceFinderTest.java @@ -15,7 +15,10 @@ package org.eclipse.lemminx.synapse.resource.finder; import org.eclipse.lemminx.customservice.synapse.resourceFinder.AbstractResourceFinder; +import org.eclipse.lemminx.customservice.synapse.resourceFinder.NewProjectResourceFinder; import org.eclipse.lemminx.customservice.synapse.resourceFinder.ResourceFinderFactory; +import org.eclipse.lemminx.customservice.synapse.resourceFinder.pojo.ArtifactResource; +import org.eclipse.lemminx.customservice.synapse.resourceFinder.pojo.RegistryResource; import org.eclipse.lemminx.customservice.synapse.resourceFinder.pojo.RequestedResource; import org.eclipse.lemminx.customservice.synapse.resourceFinder.pojo.Resource; import org.eclipse.lemminx.customservice.synapse.resourceFinder.pojo.ResourceResponse; @@ -448,6 +451,51 @@ public void testRequestMultipleRegistryResource() { assertEqualResourceNames(expectedResourceNames, multipleResources.getRegistryResources()); } + @Test + public void testGetAllResources() { + + TestNewProjectResourceFinder finder = new TestNewProjectResourceFinder(); + + // Simulate a dependent project that contributes a sequence artifact and a sequence registry resource + ArtifactResource depSequence = new ArtifactResource(); + depSequence.setName("depSequence1"); + ResourceResponse depSequenceResponse = new ResourceResponse(); + depSequenceResponse.setResources(new ArrayList<>(List.of(depSequence))); + + RegistryResource depSequenceRegistry = new RegistryResource(); + depSequenceRegistry.setName("depSequenceRegistry1"); + depSequenceResponse.setRegistryResources(new ArrayList<>(List.of(depSequenceRegistry))); + finder.addDependentResources("sequence", depSequenceResponse); + + // Simulate a dependent project that contributes an api artifact + ArtifactResource depApi = new ArtifactResource(); + depApi.setName("depApi1"); + ResourceResponse depApiResponse = new ResourceResponse(); + depApiResponse.setResources(new ArrayList<>(List.of(depApi))); + finder.addDependentResources("api", depApiResponse); + + Map allResources = finder.getAllResources(projectPath); + + // api: 1 from main project + 1 from dependent project + ResourceResponse apiResources = allResources.get("api"); + assertEquals(2, apiResources.getResources().size()); + assertEqualResourceNames(new String[]{"testApi", "depApi1"}, apiResources.getResources()); + + // sequence: 1 artifact from main + 1 from dep; 2 registry from main + 1 from dep + ResourceResponse sequenceResources = allResources.get("sequence"); + assertEquals(2, sequenceResources.getResources().size()); + assertEquals(3, sequenceResources.getRegistryResources().size()); + assertEqualResourceNames(new String[]{"testSequence1", "depSequence1"}, sequenceResources.getResources()); + assertEqualResourceNames(new String[]{"testSequence1", "testSequence2", "depSequenceRegistry1"}, + sequenceResources.getRegistryResources()); + + // endpoint: main project resources unaffected by dependent resources + ResourceResponse endpointResources = allResources.get("endpoint"); + assertEquals(2, endpointResources.getResources().size()); + assertEquals(4, endpointResources.getRegistryResources().size()); + assertEqualResourceNames(new String[]{"testEndpoint1", "testEndpoint2"}, endpointResources.getResources()); + } + private void assertEqualResourceNames(String[] expectedResourceNames, List resources) { List actualResourceNames = @@ -464,4 +512,11 @@ public static boolean areListsEqual(List list1, List list2) { Collections.sort(list2); return list1.equals(list2); } + + private static class TestNewProjectResourceFinder extends NewProjectResourceFinder { + + void addDependentResources(String type, ResourceResponse response) { + dependentResourcesMap.put(type, response); + } + } }