From 84099eefdc7fe4f5a9b7726e376fc01189ae355d Mon Sep 17 00:00:00 2001 From: Falko Modler Date: Sun, 19 Apr 2020 02:40:09 +0200 Subject: [PATCH] =?UTF-8?q?[maven]=20mark=20Mojo=20threadSafe=3Dtrue=20+?= =?UTF-8?q?=20fix=20concurrency=20issue=20in=20Co=E2=80=A6=20(#5898)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codegen/plugin/CodeGenMojo.java | 2 +- .../codegen/config/CodegenConfigurator.java | 115 +++++++++--------- 2 files changed, 61 insertions(+), 56 deletions(-) diff --git a/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java b/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java index aa386a2995f..0d33707e32d 100644 --- a/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java +++ b/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java @@ -70,7 +70,7 @@ import com.google.common.io.Files; * Goal which generates client/server code from a OpenAPI json/yaml definition. */ @SuppressWarnings({"unused", "MismatchedQueryAndUpdateOfCollection"}) -@Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES) +@Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES, threadSafe = true) public class CodeGenMojo extends AbstractMojo { private static final Logger LOGGER = LoggerFactory.getLogger(CodeGenMojo.class); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java index a60f824278b..840790ed4c8 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java @@ -79,69 +79,74 @@ public class CodegenConfigurator { public static CodegenConfigurator fromFile(String configFile, Module... modules) { if (isNotEmpty(configFile)) { - ObjectMapper mapper; + DynamicSettings settings = readDynamicSettings(configFile, modules); - if (FilenameUtils.isExtension(configFile, new String[]{"yml", "yaml"})) { - mapper = Yaml.mapper(); - } else { - mapper = Json.mapper(); + CodegenConfigurator configurator = new CodegenConfigurator(); + + GeneratorSettings generatorSettings = settings.getGeneratorSettings(); + WorkflowSettings workflowSettings = settings.getWorkflowSettings(); + + // We copy "cached" properties into configurator so it is appropriately configured with all settings in external files. + // FIXME: target is to eventually move away from CodegenConfigurator properties except gen/workflow settings. + configurator.generatorName = generatorSettings.getGeneratorName(); + configurator.inputSpec = workflowSettings.getInputSpec(); + configurator.templatingEngineName = workflowSettings.getTemplatingEngineName(); + if (workflowSettings.getSystemProperties() != null) { + configurator.systemProperties.putAll(workflowSettings.getSystemProperties()); + } + if(generatorSettings.getInstantiationTypes() != null) { + configurator.instantiationTypes.putAll(generatorSettings.getInstantiationTypes()); + } + if(generatorSettings.getTypeMappings() != null) { + configurator.typeMappings.putAll(generatorSettings.getTypeMappings()); + } + if(generatorSettings.getAdditionalProperties() != null) { + configurator.additionalProperties.putAll(generatorSettings.getAdditionalProperties()); + } + if(generatorSettings.getImportMappings() != null) { + configurator.importMappings.putAll(generatorSettings.getImportMappings()); + } + if(generatorSettings.getLanguageSpecificPrimitives() != null) { + configurator.languageSpecificPrimitives.addAll(generatorSettings.getLanguageSpecificPrimitives()); + } + if(generatorSettings.getReservedWordMappings() != null) { + configurator.reservedWordMappings.putAll(generatorSettings.getReservedWordMappings()); + } + if(generatorSettings.getServerVariables() != null) { + configurator.serverVariables.putAll(generatorSettings.getServerVariables()); } - if (modules != null && modules.length > 0) { - mapper.registerModules(modules); - } + configurator.generatorSettingsBuilder = GeneratorSettings.newBuilder(generatorSettings); + configurator.workflowSettingsBuilder = WorkflowSettings.newBuilder(workflowSettings); - mapper.registerModule(new GuavaModule()); - - try { - DynamicSettings settings = mapper.readValue(new File(configFile), DynamicSettings.class); - CodegenConfigurator configurator = new CodegenConfigurator(); - - GeneratorSettings generatorSettings = settings.getGeneratorSettings(); - WorkflowSettings workflowSettings = settings.getWorkflowSettings(); - - // We copy "cached" properties into configurator so it is appropriately configured with all settings in external files. - // FIXME: target is to eventually move away from CodegenConfigurator properties except gen/workflow settings. - configurator.generatorName = generatorSettings.getGeneratorName(); - configurator.inputSpec = workflowSettings.getInputSpec(); - configurator.templatingEngineName = workflowSettings.getTemplatingEngineName(); - if (workflowSettings.getSystemProperties() != null) { - configurator.systemProperties.putAll(workflowSettings.getSystemProperties()); - } - if(generatorSettings.getInstantiationTypes() != null) { - configurator.instantiationTypes.putAll(generatorSettings.getInstantiationTypes()); - } - if(generatorSettings.getTypeMappings() != null) { - configurator.typeMappings.putAll(generatorSettings.getTypeMappings()); - } - if(generatorSettings.getAdditionalProperties() != null) { - configurator.additionalProperties.putAll(generatorSettings.getAdditionalProperties()); - } - if(generatorSettings.getImportMappings() != null) { - configurator.importMappings.putAll(generatorSettings.getImportMappings()); - } - if(generatorSettings.getLanguageSpecificPrimitives() != null) { - configurator.languageSpecificPrimitives.addAll(generatorSettings.getLanguageSpecificPrimitives()); - } - if(generatorSettings.getReservedWordMappings() != null) { - configurator.reservedWordMappings.putAll(generatorSettings.getReservedWordMappings()); - } - if(generatorSettings.getServerVariables() != null) { - configurator.serverVariables.putAll(generatorSettings.getServerVariables()); - } - - configurator.generatorSettingsBuilder = GeneratorSettings.newBuilder(generatorSettings); - configurator.workflowSettingsBuilder = WorkflowSettings.newBuilder(workflowSettings); - - return configurator; - } catch (IOException ex) { - LOGGER.error(ex.getMessage()); - throw new RuntimeException("Unable to deserialize config file: " + configFile); - } + return configurator; } return null; } + private static DynamicSettings readDynamicSettings(String configFile, Module... modules) { + ObjectMapper mapper; + + if (FilenameUtils.isExtension(configFile.toLowerCase(Locale.ROOT), new String[]{"yml", "yaml"})) { + mapper = Yaml.mapper().copy(); + } else { + mapper = Json.mapper().copy(); + } + + if (modules != null && modules.length > 0) { + mapper.registerModules(modules); + } + + mapper.registerModule(new GuavaModule()); + + try { + return mapper.readValue(new File(configFile), DynamicSettings.class); + } catch (IOException ex) { + LOGGER.error(ex.getMessage()); + throw new RuntimeException("Unable to deserialize config file: " + configFile); + } + } + public CodegenConfigurator addServerVariable(String key, String value) { this.serverVariables.put(key, value); generatorSettingsBuilder.withServerVariable(key, value);