diff --git a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/config/WorkflowSettings.java b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/config/WorkflowSettings.java index bf13cacf7b2..174109f37b9 100644 --- a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/config/WorkflowSettings.java +++ b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/config/WorkflowSettings.java @@ -103,7 +103,9 @@ public class WorkflowSettings { builder.strictSpecBehavior = copy.isStrictSpecBehavior(); builder.templatingEngineName = copy.getTemplatingEngineName(); builder.ignoreFileOverride = copy.getIgnoreFileOverride(); - builder.systemProperties = ImmutableMap.copyOf(copy.getSystemProperties()); + + // this, and any other collections, must be mutable in the builder. + builder.systemProperties = new HashMap<>(copy.getSystemProperties()); // force builder "with" methods to invoke side effects builder.withTemplateDir(copy.getTemplateDir()); @@ -272,6 +274,8 @@ public class WorkflowSettings { private String templateDir; private String templatingEngineName = DEFAULT_TEMPLATING_ENGINE_NAME; private String ignoreFileOverride; + + // NOTE: All collections must be mutable in the builder, and copied to a new immutable collection in .build() private Map systemProperties = new HashMap<>();; private Builder() { diff --git a/modules/openapi-generator-core/src/test/java/org/openapitools/codegen/config/WorkflowSettingsTest.java b/modules/openapi-generator-core/src/test/java/org/openapitools/codegen/config/WorkflowSettingsTest.java index b958c9decf4..c375e98df2c 100644 --- a/modules/openapi-generator-core/src/test/java/org/openapitools/codegen/config/WorkflowSettingsTest.java +++ b/modules/openapi-generator-core/src/test/java/org/openapitools/codegen/config/WorkflowSettingsTest.java @@ -19,6 +19,7 @@ package org.openapitools.codegen.config; import org.testng.annotations.Test; import java.nio.file.Paths; +import java.util.Map; import static org.testng.Assert.*; @@ -48,6 +49,25 @@ public class WorkflowSettingsTest { assertTrue(settings.isStrictSpecBehavior()); } + @Test + public void newBuilderFromCopyShouldMutateSystemProperties(){ + WorkflowSettings original = WorkflowSettings.newBuilder() + .withOutputDir("output") + .withVerbose(true) + .withSkipOverwrite(false) + .withSystemProperty("first", "1st") + .build(); + + WorkflowSettings modified = WorkflowSettings.newBuilder(original) + .withSystemProperty("second", "2nd") + .build(); + + Map properties = modified.getSystemProperties(); + assertEquals(properties.size(), 2, "System Properties map should allow mutation when invoked via copy constructor"); + assertEquals(properties.getOrDefault("first", ""), "1st"); + assertEquals(properties.getOrDefault("second", ""), "2nd"); + } + private void assertOnChangesToDefaults(WorkflowSettings defaults) { WorkflowSettings settings = WorkflowSettings.newBuilder() .withOutputDir("output") diff --git a/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md b/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md index 702381eed21..7d4ba57448f 100644 --- a/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md +++ b/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md @@ -11,6 +11,7 @@ gradle openApiGenerate gradle openApiMeta gradle openApiValidate gradle buildGoSdk +gradle buildDotnetSdk gradle generateGoWithInvalidSpec ``` diff --git a/modules/openapi-generator-gradle-plugin/samples/local-spec/build.gradle b/modules/openapi-generator-gradle-plugin/samples/local-spec/build.gradle index 68913ab6c2c..99e3d0f674c 100644 --- a/modules/openapi-generator-gradle-plugin/samples/local-spec/build.gradle +++ b/modules/openapi-generator-gradle-plugin/samples/local-spec/build.gradle @@ -65,6 +65,20 @@ task buildGoSdk(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTas ] } +task buildDotnetSdk(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){ + generatorName = "csharp-netcore" + inputSpec = "$rootDir/petstore-v3.0.yaml".toString() + additionalProperties = [ + packageGuid: "{321C8C3F-0156-40C1-AE42-D59761FB9B6C}", + useCompareNetObjects: "true" + ] + outputDir = "$buildDir/csharp-netcore".toString() + systemProperties = [ + models: "", + apis : "", + ] +} + task generateGoWithInvalidSpec(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){ validateSpec = true generatorName = "go"