diff --git a/commons/pom.xml b/commons/pom.xml
index 75cf2819..141d4256 100644
--- a/commons/pom.xml
+++ b/commons/pom.xml
@@ -4,7 +4,7 @@
io.polyapi
parent-pom
- 0.15.5-SNAPSHOT
+ 0.15.6-SNAPSHOT
../parent-pom
diff --git a/library/pom.xml b/library/pom.xml
index f02dd9a3..17a60586 100644
--- a/library/pom.xml
+++ b/library/pom.xml
@@ -4,7 +4,7 @@
io.polyapi
parent-pom
- 0.15.5-SNAPSHOT
+ 0.15.6-SNAPSHOT
../parent-pom
library
diff --git a/parent-pom/pom.xml b/parent-pom/pom.xml
index b2ae77e0..b7e6bc64 100644
--- a/parent-pom/pom.xml
+++ b/parent-pom/pom.xml
@@ -3,7 +3,7 @@
4.0.0
io.polyapi
parent-pom
- 0.15.5-SNAPSHOT
+ 0.15.6-SNAPSHOT
pom
PolyAPI Java parent POM
https://polyapi.io
diff --git a/polyapi-maven-plugin/pom.xml b/polyapi-maven-plugin/pom.xml
index 56871939..449bc724 100644
--- a/polyapi-maven-plugin/pom.xml
+++ b/polyapi-maven-plugin/pom.xml
@@ -4,7 +4,7 @@
io.polyapi
parent-pom
- 0.15.5-SNAPSHOT
+ 0.15.6-SNAPSHOT
../parent-pom
polyapi-maven-plugin
diff --git a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/mojo/GenerateSourcesMojo.java b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/mojo/GenerateSourcesMojo.java
index 00e17a62..338ed83d 100644
--- a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/mojo/GenerateSourcesMojo.java
+++ b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/mojo/GenerateSourcesMojo.java
@@ -22,17 +22,25 @@ public class GenerateSourcesMojo extends PolyApiMojo {
@Parameter(property = "overwrite", defaultValue = "false")
private Boolean overwrite;
- @Parameter(property = "context")
- private String context;
+ @Parameter(property = "contexts")
+ private String contexts;
+
+ @Parameter(property = "functionIds")
+ private String functionIds;
+
private PolyGenerationService polyGenerationService;
@Override
public void execute(String host, Integer port) {
log.info("Initiating generation of Poly sources.");
this.polyGenerationService = new PolyGenerationServiceImpl(getHttpClient(), getJsonParser(), host, port, getTokenProvider().getToken());
- List contextFilters = Arrays.stream(Optional.ofNullable(context).map(contextCsv -> contextCsv.split(",")).orElse(new String[]{""})).toList();
+ List contextFilters = Arrays.stream(Optional.ofNullable(contexts).map(contextCsv -> contextCsv.split(",")).orElse(new String[]{""})).toList();
log.debug("Context filters: \"{}\"", join("\", \"", contextFilters));
- this.polyGenerationService.generate(contextFilters, overwrite);
+
+ List functionIdFilters = Arrays.stream(Optional.ofNullable(functionIds).map(functionIdsCsv -> functionIdsCsv.split(",")).orElse(new String[]{""})).toList();
+ log.debug("Function ID filters: \"{}\"", join("\", \"", functionIdFilters));
+
+ this.polyGenerationService.generate(contextFilters, functionIdFilters, overwrite);
log.info("Poly generation complete.");
}
}
diff --git a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/PolyFunctionServiceImpl.java b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/PolyFunctionServiceImpl.java
index f5962d9a..a06a4a69 100644
--- a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/PolyFunctionServiceImpl.java
+++ b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/PolyFunctionServiceImpl.java
@@ -8,6 +8,7 @@
import io.polyapi.plugin.model.specification.Specification;
import lombok.extern.slf4j.Slf4j;
+import java.util.Collections;
import java.util.List;
import static java.lang.String.format;
@@ -32,7 +33,7 @@ public PolyFunction deploy(String type, PolyFunction polyFunction) {
@Override
public void delete(String context, String name) {
log.info("Deleting function '{}' on context '{}'.", name, context);
- List specifications = specificationService.list(List.of())
+ List specifications = specificationService.list(List.of(context), Collections.emptyList())
.stream()
.filter(spec -> spec.getName().equalsIgnoreCase(name) && spec.getContext().equalsIgnoreCase(context))
.toList();
@@ -54,7 +55,7 @@ public void delete(String context, String name) {
@Override
public void delete(String id) {
- specificationService.list(List.of()).stream()
+ specificationService.list(Collections.emptyList(), List.of(id)).stream()
.filter(specification -> specification.getId().equals(id))
.forEach(this::delete);
}
diff --git a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/SpecificationService.java b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/SpecificationService.java
index 33150d76..684bbe87 100644
--- a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/SpecificationService.java
+++ b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/SpecificationService.java
@@ -12,8 +12,9 @@ public interface SpecificationService {
/**
* Retrieve all the JSON specifications in Poly.
*
- * @param context The contexts that should be used to filter the specifications.
+ * @param contexts The contexts that should be used to filter the specifications.
+ * @param functionIdFilters A list of function/specification IDs to filter by. Can be empty.
* @return String A JSON containing the specifications.
*/
- List list(List context);
+ List list(List contexts, List functionIdFilters);
}
diff --git a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/SpecificationServiceImpl.java b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/SpecificationServiceImpl.java
index 0f84b359..aea35803 100644
--- a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/SpecificationServiceImpl.java
+++ b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/SpecificationServiceImpl.java
@@ -12,6 +12,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.StringJoiner;
import java.util.function.Predicate;
import static com.fasterxml.jackson.databind.type.TypeFactory.defaultInstance;
@@ -27,36 +28,32 @@ public SpecificationServiceImpl(HttpClient client, JsonParser jsonParser, String
}
@Override
- public List list(List contextFilters) {
+ public List list(List contextFilters, List functionIdFilters) {
log.info("Retrieving JSON specifications from PolyAPI for this user.");
- List specifications = get("specs", defaultInstance().constructCollectionType(List.class, Specification.class));
- log.debug("{} specifications retrieved without filter.", specifications.size());
- if (log.isDebugEnabled()) {
+
+ // Build the query parameter string for server-side filtering
+ StringJoiner queryParams = new StringJoiner("&");
+ if (contextFilters != null && !contextFilters.isEmpty()) {
+ queryParams.add("contexts=" + String.join(",", contextFilters));
+ }
+ if (functionIdFilters != null && !functionIdFilters.isEmpty()) {
+ queryParams.add("ids=" + String.join(",", functionIdFilters));
+ }
+
+ String path = "specs";
+ if (queryParams.length() > 0) {
+ path += "?" + queryParams.toString();
+ log.info("Applying server-side filters: {}", queryParams.toString());
+ }
+
+ // Make the API call with the constructed path
+ List specifications = get(path, defaultInstance().constructCollectionType(List.class, Specification.class));
+
+ if (log.isTraceEnabled()) {
log.trace("Retrieved specifications with the following IDs: [{}]", specifications.stream().map(Specification::getId).collect(joining(", ")));
}
- log.debug("Validating for duplicate context/name pairs and filtering specification contexts.");
- Map filteredMap = new HashMap<>();
- specifications.stream()
- .filter(not(IgnoredSpecification.class::isInstance))
- .filter(specification -> {
- String context = specification.getContext().trim().toLowerCase();
- return contextFilters.isEmpty() || contextFilters.stream()
- .map(String::trim)
- .map(String::toLowerCase)
- .anyMatch(contextFilter -> contextFilter.equalsIgnoreCase(context) || contextFilter.isEmpty() || context.startsWith(format("%s.", contextFilter)));
- })
- .filter(not(specification -> specification instanceof ClientFunctionSpecification clientFunctionSpecification && !clientFunctionSpecification.getLanguage().equalsIgnoreCase("java")))
- .forEach(specification -> {
- String key = format("%s.%s", specification.getContext(), specification.getName()).toLowerCase();
- if (filteredMap.containsKey(key)) {
- log.warn("Skipping {} specification '{}' in context '{}' as it clashes with {} specification with the same name and context.", specification.getType(), specification.getName(), specification.getContext(), filteredMap.get(key).getType());
- } else {
- log.debug("Specification key '{}' not repeated (yet).", key);
- filteredMap.put(key, specification);
- }
- });
- List result = filteredMap.values().stream().toList();
- log.info("{} specifications retrieved.", result.size());
- return result;
+
+ log.info("{} specifications retrieved after server-side filtering.", specifications.size());
+ return specifications;
}
}
diff --git a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/generation/PolyGenerationService.java b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/generation/PolyGenerationService.java
index e3f188ec..17692aa9 100644
--- a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/generation/PolyGenerationService.java
+++ b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/generation/PolyGenerationService.java
@@ -4,5 +4,5 @@
public interface PolyGenerationService {
- void generate(List contextFilters, boolean overwrite);
+ void generate(List contextFilters, List functionIdFilters, boolean overwrite);
}
diff --git a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/generation/PolyGenerationServiceImpl.java b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/generation/PolyGenerationServiceImpl.java
index 09d02d14..60bf5484 100644
--- a/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/generation/PolyGenerationServiceImpl.java
+++ b/polyapi-maven-plugin/src/main/java/io/polyapi/plugin/service/generation/PolyGenerationServiceImpl.java
@@ -50,8 +50,12 @@ public PolyGenerationServiceImpl(HttpClient httpClient, JsonParser jsonParser, S
}
@Override
- public void generate(List contextFilters, boolean overwrite) {
- var specifications = specificationService.list(contextFilters);
+ public void generate(List contextFilters, List functionIdFilters, boolean overwrite) {
+ // The call to list now passes both filters for server-side processing.
+ log.info("Applying context filters on the API call: {}", contextFilters);
+ log.info("Applying function ID filters on the API call: {}", functionIdFilters);
+ var specifications = specificationService.list(contextFilters, functionIdFilters);
+
var contextModel = new HashMap();
contextModel.put("clientId", UUID.randomUUID().toString());
contextModel.put("host", host);
diff --git a/pom.xml b/pom.xml
index 4a5ee6c7..60c23271 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
io.polyapi
polyapi-java
- 0.15.5-SNAPSHOT
+ 0.15.6-SNAPSHOT
pom
parent-pom