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