From 3fdd800133ad5f07aadc90f9731cca28e96896d9 Mon Sep 17 00:00:00 2001 From: sebdet Date: Fri, 4 Jun 2021 17:49:31 +0200 Subject: Create a common ConfigurationManager class Create a common ConfigurationManager class as some classes have the same logic Issue-ID: SDC-3616 Signed-off-by: sebdet Change-Id: I44aeb3a4baf45753c3c43f7b4d202253ae4186eb --- .../sdc/common/CommonConfigurationManager.java | 135 +++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/CommonConfigurationManager.java (limited to 'openecomp-be/lib/openecomp-common-lib') diff --git a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/CommonConfigurationManager.java b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/CommonConfigurationManager.java new file mode 100644 index 0000000000..46747fb881 --- /dev/null +++ b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/CommonConfigurationManager.java @@ -0,0 +1,135 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2017, 2021 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.openecomp.sdc.common; + +import org.onap.sdc.tosca.services.YamlUtil; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.BiConsumer; + +/** + * This is a common class that can access the config file given in input to the JVM with the parameter + * -Dconfiguration.yaml=file.yaml. + */ +public class CommonConfigurationManager { + public static final String JVM_PARAM_CONFIGURATION_FILE = "configuration.yaml"; + private static final Logger LOGGER = LoggerFactory.getLogger(CommonConfigurationManager.class); + private static CommonConfigurationManager singletonInstance; + private Map> configuration; + private String configFilename; + private String yamlSection; + + protected CommonConfigurationManager() { + initConfiguration(); + } + + protected CommonConfigurationManager(String yamlSection) { + this(); + this.yamlSection = yamlSection; + } + + public static synchronized CommonConfigurationManager getInstance() { + if (singletonInstance == null) { + singletonInstance = new CommonConfigurationManager(); + } + return singletonInstance; + } + + private void initConfiguration() { + YamlUtil yamlUtil = new YamlUtil(); + readConfigurationFromStream(yamlUtil, (filename, stream) -> { + this.configFilename = filename; + if (stream == null) { + LOGGER.warn("Configuration not found: " + filename + ". Using defaults"); + return; + } + Map> configurationMap = yamlUtil.yamlToMap(stream); + if (configurationMap == null) { + LOGGER.warn("Configuration cannot be parsed: " + filename + ". Using defaults"); + return; + } else { + this.configuration = configurationMap; + } + }); + } + + private void readConfigurationFromStream(YamlUtil yamlUtil, BiConsumer reader) { + String configurationYamlFile = System.getProperty(JVM_PARAM_CONFIGURATION_FILE); + try { + if (configurationYamlFile == null) { + try (InputStream inputStream = yamlUtil.loadYamlFileIs("/" + JVM_PARAM_CONFIGURATION_FILE)) { + reader.accept(JVM_PARAM_CONFIGURATION_FILE, inputStream); + } + } else { + try (InputStream inputStream = new FileInputStream(configurationYamlFile)) { + reader.accept(configurationYamlFile, inputStream); + } + } + } catch (IOException e) { + LOGGER.error("Failed to read configuration " + configurationYamlFile, e); + throw new RuntimeException("Failed to read configuration " + configurationYamlFile, e); + } + } + + /** + * This method can be used to access any yaml section configuration. + * + * @param yamlSection The yaml section that must be accessed + * @param name The configuration name inside that yaml section + * @param defaultValue A default value + * @param The type of value to be returned + * @return The value found or the default value if not found + */ + public T getConfigValue(String yamlSection, String name, T defaultValue) { + Map section = this.configuration.get(yamlSection); + if (section == null) { + LOGGER.error("Section " + yamlSection + " is missing in configuration file '" + configFilename + + "'. Using defaults"); + return defaultValue; + } + Object value = section.get(name); + try { + return value == null ? defaultValue : (T) value; + } catch (ClassCastException e) { + LOGGER.warn( + String.format("Failed to read configuration property '%s' as requested type. Using default '%s'", + name, defaultValue), e); + return defaultValue; + } + } + + /** + * This method can be used to access a specific configuration parameter in the configuration in the + * yamlSection predefined in the constructor. + * + * @param name The name of the config + * @param defaultValue A default value + * @param The type of value to be returned + * @return The value found or the default value if not found + */ + public T getConfigValue(String name, T defaultValue) { + return this.getConfigValue(yamlSection, name, defaultValue); + } +} -- cgit 1.2.3-korg