diff --git a/modules/openapi-generator-online/src/main/java/org/openapitools/codegen/online/model/GeneratorInput.java b/modules/openapi-generator-online/src/main/java/org/openapitools/codegen/online/model/GeneratorInput.java index 0844839e9e5c..be8f8c55f370 100644 --- a/modules/openapi-generator-online/src/main/java/org/openapitools/codegen/online/model/GeneratorInput.java +++ b/modules/openapi-generator-online/src/main/java/org/openapitools/codegen/online/model/GeneratorInput.java @@ -23,6 +23,7 @@ import lombok.Getter; import lombok.Setter; +import java.util.List; import java.util.Map; @Setter @@ -31,6 +32,8 @@ public class GeneratorInput { @Getter private Map options; private String openAPIUrl; @Getter private AuthorizationValue authorizationValue; + //FILTER=operationId:updatePet + @Getter private List openapiNormalizer; @ApiModelProperty(example = "https://raw.githubusercontent.com/OpenAPITools/openapi-generator/master/modules/openapi-generator/src/test/resources/2_0/petstore.yaml") public String getOpenAPIUrl() { diff --git a/modules/openapi-generator-online/src/main/java/org/openapitools/codegen/online/service/Generator.java b/modules/openapi-generator-online/src/main/java/org/openapitools/codegen/online/service/Generator.java index be5326278cb2..aa3993fbd85f 100644 --- a/modules/openapi-generator-online/src/main/java/org/openapitools/codegen/online/service/Generator.java +++ b/modules/openapi-generator-online/src/main/java/org/openapitools/codegen/online/service/Generator.java @@ -118,6 +118,7 @@ private static String generate(String language, GeneratorInput opts, Type type) throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "The OpenAPI specification supplied was not valid"); } + // do not use opts.getOptions().get("outputFolder") as the input can contain ../../ // to access other folders in the server String destPath = language + "-" + type.getTypeName(); @@ -140,6 +141,16 @@ private static String generate(String language, GeneratorInput opts, Type type) codegenConfig.additionalProperties().put("openAPI", openapi); } + if(opts.getOpenapiNormalizer() != null && !opts.getOpenapiNormalizer().isEmpty()){ + for(String rule: opts.getOpenapiNormalizer()){ + String[] ruleOperands = rule.split("="); + if(ruleOperands.length != 2) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "In rule: " + rule + "the operands were not provided in the form of ="); + } + codegenConfig.openapiNormalizer().put(ruleOperands[0],ruleOperands[1]); + } + } + codegenConfig.setOutputDir(outputFolder); clientOptInput.config(codegenConfig); diff --git a/modules/openapi-generator-online/src/test/java/org/openapitools/codegen/online/api/GenApiControllerTest.java b/modules/openapi-generator-online/src/test/java/org/openapitools/codegen/online/api/GenApiControllerTest.java index c29405b7cfa8..7855d3405a49 100644 --- a/modules/openapi-generator-online/src/test/java/org/openapitools/codegen/online/api/GenApiControllerTest.java +++ b/modules/openapi-generator-online/src/test/java/org/openapitools/codegen/online/api/GenApiControllerTest.java @@ -10,6 +10,7 @@ import org.springframework.http.MediaType; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.util.Assert; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; @@ -133,4 +134,32 @@ public void generateClientWithInvalidOpenAPIUrl() throws Exception { .content("{\"openAPIUrl\": \"" + invalidOpenAPIUrl + "\"}")) .andExpect(status().isBadRequest()); } + + @Test + public void generateWithOpenAPINormalizer() throws Exception { + String withOpenAPINormalizer = "{\"openAPIUrl\":\"https://raw.githubusercontent.com/OpenAPITools/openapi-generator/master/modules/openapi-generator/src/test/resources/2_0/petstore.yaml\",\"openapiNormalizer\":[\"FILTER=operationId:updatePet\"],\"options\":{},\"spec\":{}}"; + String withoutOpenAPINormalizer = "{\"openAPIUrl\":\"https://raw.githubusercontent.com/OpenAPITools/openapi-generator/master/modules/openapi-generator/src/test/resources/2_0/petstore.yaml\",\"options\":{},\"spec\":{}}"; + + String responseOfNormalized = mockMvc.perform(post("http://test.com:1234/api/gen/clients/java") + .contentType(MediaType.APPLICATION_JSON) + .content(withOpenAPINormalizer)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + String codeOfNormalized = new ObjectMapper().readValue(responseOfNormalized, ResponseCode.class).getCode(); + Long lengthOfNormalized = Long.parseLong(mockMvc.perform(get("http://test.com:1234/api/gen/download/" + codeOfNormalized)) + .andExpect(content().contentType("application/zip")) + .andExpect(status().isOk()).andReturn().getResponse().getHeader("Content-Length")); + + String responseOfNotNormalized = mockMvc.perform(post("http://test.com:1234/api/gen/clients/java") + .contentType(MediaType.APPLICATION_JSON) + .content(withoutOpenAPINormalizer)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + + String codeOfNotNormalized = new ObjectMapper().readValue(responseOfNotNormalized, ResponseCode.class).getCode(); + Long lengthOfNotNormalized = Long.parseLong(mockMvc.perform(get("http://test.com:1234/api/gen/download/" + codeOfNotNormalized)) + .andExpect(content().contentType("application/zip")) + .andExpect(status().isOk()).andReturn().getResponse().getHeader("Content-Length")); + + Assert.isTrue(lengthOfNormalized <= lengthOfNotNormalized,"Using the normalizer should result in a smaller or equal file size"); + + } }