From cdebf4dc6dfeb83463cf92f808b83846803537e9 Mon Sep 17 00:00:00 2001 From: Chris Gual Date: Mon, 7 Jul 2025 23:39:59 -0700 Subject: [PATCH 1/3] [req] Allow models and apis list properties to span multi-lines and include white space (#19628) --- .../codegen/DefaultGenerator.java | 37 +++----- .../codegen/DefaultGeneratorTest.java | 94 ++++++++++++++++--- 2 files changed, 97 insertions(+), 34 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index b2e5424c8da9..7457f9b6d031 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -626,6 +626,17 @@ private String calculateModelKey(String type, String ref) { } } + private Set getPropertyAsSet(String propertyName) { + String propertyRaw = GlobalSettings.getProperty(propertyName); + if (propertyRaw == null || propertyRaw.isEmpty()) { + return Collections.emptySet(); + } + + return Arrays.stream(propertyRaw.split(",")) + .map(String::trim) + .collect(Collectors.toSet()); + } + private Set modelKeys() { final Map schemas = ModelUtils.getSchemas(this.openAPI); if (schemas == null) { @@ -633,12 +644,7 @@ private Set modelKeys() { return Collections.emptySet(); } - String modelNames = GlobalSettings.getProperty("models"); - Set modelsToGenerate = null; - if (modelNames != null && !modelNames.isEmpty()) { - modelsToGenerate = new HashSet<>(Arrays.asList(modelNames.split(","))); - } - + Set modelsToGenerate = getPropertyAsSet(CodegenConstants.MODELS); Set modelKeys = schemas.keySet(); if (modelsToGenerate != null && !modelsToGenerate.isEmpty()) { Set updatedKeys = new HashSet<>(); @@ -661,11 +667,7 @@ void generateApis(List files, List allOperations, List> paths = processPaths(this.openAPI.getPaths()); - Set apisToGenerate = null; - String apiNames = GlobalSettings.getProperty(CodegenConstants.APIS); - if (apiNames != null && !apiNames.isEmpty()) { - apisToGenerate = new HashSet<>(Arrays.asList(apiNames.split(","))); - } + Set apisToGenerate = getPropertyAsSet(CodegenConstants.APIS); if (apisToGenerate != null && !apisToGenerate.isEmpty()) { Map> updatedPaths = new TreeMap<>(); for (String m : paths.keySet()) { @@ -827,11 +829,7 @@ void generateWebhooks(List files, List allWebhooks, List> webhooks = processWebhooks(this.openAPI.getWebhooks()); - Set webhooksToGenerate = null; - String webhookNames = GlobalSettings.getProperty(CodegenConstants.WEBHOOKS); - if (webhookNames != null && !webhookNames.isEmpty()) { - webhooksToGenerate = new HashSet<>(Arrays.asList(webhookNames.split(","))); - } + Set webhooksToGenerate = getPropertyAsSet(CodegenConstants.WEBHOOKS); if (webhooksToGenerate != null && !webhooksToGenerate.isEmpty()) { Map> Webhooks = new TreeMap<>(); for (String m : webhooks.keySet()) { @@ -1064,12 +1062,7 @@ private void generateSupportingFiles(List files, Map bundl return; } - Set supportingFilesToGenerate = null; - String supportingFiles = GlobalSettings.getProperty(CodegenConstants.SUPPORTING_FILES); - if (supportingFiles != null && !supportingFiles.isEmpty()) { - supportingFilesToGenerate = new HashSet<>(Arrays.asList(supportingFiles.split(","))); - } - + Set supportingFilesToGenerate = getPropertyAsSet(CodegenConstants.SUPPORTING_FILES); for (SupportingFile support : config.supportingFiles()) { try { String outputFolder = config.outputFolder(); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java index 273ea24217b7..1abe87fcef8b 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java @@ -809,11 +809,11 @@ private ClientOptInput createOptInputIssue(String issueNumber, Path target) { public void testGenerateRecursiveDependentModelsBackwardCompatibilityIssue18444() throws IOException { Path target = Files.createTempDirectory("test"); File output = target.toFile(); - String oldModelsProp = GlobalSettings.getProperty("models"); + String oldModelsProp = GlobalSettings.getProperty(CodegenConstants.MODELS); try { DefaultGenerator generator = generatorGenerateRecursiveDependentModelsBackwardCompatibility("false"); - GlobalSettings.setProperty("models", "RQ1,RS1"); + GlobalSettings.setProperty(CodegenConstants.MODELS, "RQ1,RS1"); ClientOptInput clientOptInput = createOptInputIssue18444(target); List files = generator.opts(clientOptInput).generate(); Assert.assertEquals(files.size(), 17); @@ -853,9 +853,9 @@ public void testGenerateRecursiveDependentModelsBackwardCompatibilityIssue18444( } finally { output.deleteOnExit(); if (oldModelsProp != null) { - GlobalSettings.setProperty("models", oldModelsProp); + GlobalSettings.setProperty(CodegenConstants.MODELS, oldModelsProp); } else { - GlobalSettings.clearProperty("models"); + GlobalSettings.clearProperty(CodegenConstants.MODELS); } } } @@ -864,11 +864,11 @@ public void testGenerateRecursiveDependentModelsBackwardCompatibilityIssue18444( public void testGenerateRecursiveDependentModelsIssue18444() throws IOException { Path target = Files.createTempDirectory("test"); File output = target.toFile(); - String oldModelsProp = GlobalSettings.getProperty("models"); + String oldModelsProp = GlobalSettings.getProperty(CodegenConstants.MODELS); try { DefaultGenerator generator = generatorGenerateRecursiveDependentModelsBackwardCompatibility("true"); - GlobalSettings.setProperty("models", "RQ1,RS1"); + GlobalSettings.setProperty(CodegenConstants.MODELS, "RQ1,RS1"); ClientOptInput clientOptInput = createOptInputIssue18444(target); List files = generator.opts(clientOptInput).generate(); Assert.assertEquals(files.size(), 21); @@ -908,9 +908,9 @@ public void testGenerateRecursiveDependentModelsIssue18444() throws IOException } finally { output.deleteOnExit(); if (oldModelsProp != null) { - GlobalSettings.setProperty("models", oldModelsProp); + GlobalSettings.setProperty(CodegenConstants.MODELS, oldModelsProp); } else { - GlobalSettings.clearProperty("models"); + GlobalSettings.clearProperty(CodegenConstants.MODELS); } } } @@ -919,11 +919,11 @@ public void testGenerateRecursiveDependentModelsIssue18444() throws IOException public void testGenerateRecursiveDependentModelsIssue19220() throws IOException { Path target = Files.createTempDirectory("test"); File output = target.toFile(); - String oldModelsProp = GlobalSettings.getProperty("models"); + String oldModelsProp = GlobalSettings.getProperty(CodegenConstants.MODELS); try { DefaultGenerator generator = generatorGenerateRecursiveDependentModelsBackwardCompatibility("true"); - GlobalSettings.setProperty("models", "RQ1,RS1"); + GlobalSettings.setProperty(CodegenConstants.MODELS, "RQ1,RS1"); ClientOptInput clientOptInput = createOptInputIssue19220(target); List files = generator.opts(clientOptInput).generate(); Assert.assertEquals(files.size(), 21); @@ -963,11 +963,81 @@ public void testGenerateRecursiveDependentModelsIssue19220() throws IOException } finally { output.deleteOnExit(); if (oldModelsProp != null) { - GlobalSettings.setProperty("models", oldModelsProp); + GlobalSettings.setProperty(CodegenConstants.MODELS, oldModelsProp); } else { - GlobalSettings.clearProperty("models"); + GlobalSettings.clearProperty(CodegenConstants.MODELS); } } } + @Test + public void testGenerateMultiLinePropertiesIssue19628() throws IOException { + Path target = Files.createTempDirectory("test"); + File output = target.toFile(); + String multiLineSeparator = ",\n "; + try { + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("java") + .setInputSpec("src/test/resources/3_1/java/petstore.yaml") + .setOutputDir(target.toAbsolutePath().toString()); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + DefaultGenerator generator = new DefaultGenerator(true); + + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.API_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.API_TESTS, "false"); + + List filesToGenerate = Arrays.asList( + "pom.xml", + ".travis.yml", + ".gitignore", + "git_push.sh" + ); + GlobalSettings.setProperty(CodegenConstants.SUPPORTING_FILES, String.join(multiLineSeparator, filesToGenerate)); + + List apisToGenerate = Arrays.asList( + "Pet", + "User" + ); + GlobalSettings.setProperty(CodegenConstants.APIS, String.join(multiLineSeparator, apisToGenerate)); + + List modelsToGenerate = Arrays.asList( + "Category", + "Pet", + "Tag", + "User" + ); + GlobalSettings.setProperty(CodegenConstants.MODELS, String.join(multiLineSeparator, modelsToGenerate)); + + List files = generator.opts(clientOptInput).generate(); + + Assert.assertEquals(files.size(), 5 + modelsToGenerate.size() + apisToGenerate.size()); + + TestUtils.ensureContainsFile(files, output, "pom.xml"); + TestUtils.ensureContainsFile(files, output, ".travis.yml"); + TestUtils.ensureContainsFile(files, output, ".gitignore"); + TestUtils.ensureContainsFile(files, output, "git_push.sh"); + TestUtils.ensureContainsFile(files, output, ".openapi-generator/VERSION"); + + for(String apiFile : apisToGenerate) { + String filename = "src/main/java/org/openapitools/client/api/" + apiFile + "Api.java"; + TestUtils.ensureContainsFile(files, output, filename); + } + + for(String apiFile : modelsToGenerate) { + String filename = "src/main/java/org/openapitools/client/model/" + apiFile + ".java"; + TestUtils.ensureContainsFile(files, output, filename); + } + } finally { + GlobalSettings.reset(); + output.deleteOnExit(); + } + + } } From 8e679768b93e536580c9a44b6d0dd09543557161 Mon Sep 17 00:00:00 2001 From: Chris Gual Date: Tue, 8 Jul 2025 22:59:05 -0700 Subject: [PATCH 2/3] Add comment for DefaultGenerator.getPropertyAsSet --- .../main/java/org/openapitools/codegen/DefaultGenerator.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 7457f9b6d031..8750031094c9 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -626,6 +626,11 @@ private String calculateModelKey(String type, String ref) { } } + /** + * this method splits the specified property by commas, trims any results for spaces and + * newlines, and returns them as a Set of Strings. the method will return an empty + * set if the specified property has not been set or is an empty string. + */ private Set getPropertyAsSet(String propertyName) { String propertyRaw = GlobalSettings.getProperty(propertyName); if (propertyRaw == null || propertyRaw.isEmpty()) { From 49e32fc03c254ad338314d8015151c4565ccdf2c Mon Sep 17 00:00:00 2001 From: Chris Gual Date: Tue, 8 Jul 2025 23:06:35 -0700 Subject: [PATCH 3/3] Fix some variable names in DefaultGeneratorTest.testGenerateMultiLinePropertiesIssue19628 --- .../codegen/DefaultGeneratorTest.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java index 1abe87fcef8b..42672541cffb 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java @@ -993,13 +993,13 @@ public void testGenerateMultiLinePropertiesIssue19628() throws IOException { generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); generator.setGeneratorPropertyDefault(CodegenConstants.API_TESTS, "false"); - List filesToGenerate = Arrays.asList( + List supportingFilesToGenerate = Arrays.asList( "pom.xml", ".travis.yml", ".gitignore", "git_push.sh" ); - GlobalSettings.setProperty(CodegenConstants.SUPPORTING_FILES, String.join(multiLineSeparator, filesToGenerate)); + GlobalSettings.setProperty(CodegenConstants.SUPPORTING_FILES, String.join(multiLineSeparator, supportingFilesToGenerate)); List apisToGenerate = Arrays.asList( "Pet", @@ -1017,21 +1017,24 @@ public void testGenerateMultiLinePropertiesIssue19628() throws IOException { List files = generator.opts(clientOptInput).generate(); - Assert.assertEquals(files.size(), 5 + modelsToGenerate.size() + apisToGenerate.size()); + Assert.assertEquals( + files.size(), + // version file + files specified by properties + 1 + supportingFilesToGenerate.size() + modelsToGenerate.size() + apisToGenerate.size() + ); - TestUtils.ensureContainsFile(files, output, "pom.xml"); - TestUtils.ensureContainsFile(files, output, ".travis.yml"); - TestUtils.ensureContainsFile(files, output, ".gitignore"); - TestUtils.ensureContainsFile(files, output, "git_push.sh"); TestUtils.ensureContainsFile(files, output, ".openapi-generator/VERSION"); + for(String supportingFile : supportingFilesToGenerate) { + TestUtils.ensureContainsFile(files, output, supportingFile); + } for(String apiFile : apisToGenerate) { String filename = "src/main/java/org/openapitools/client/api/" + apiFile + "Api.java"; TestUtils.ensureContainsFile(files, output, filename); } - for(String apiFile : modelsToGenerate) { - String filename = "src/main/java/org/openapitools/client/model/" + apiFile + ".java"; + for(String modelFile : modelsToGenerate) { + String filename = "src/main/java/org/openapitools/client/model/" + modelFile + ".java"; TestUtils.ensureContainsFile(files, output, filename); } } finally {