| /******************************************************************************** |
| * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation |
| * |
| * See the NOTICE file(s) distributed with this work for additional |
| * information regarding copyright ownership. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| ********************************************************************************/ |
| |
| package org.eclipse.mdm.property; |
| |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Properties; |
| |
| import javax.annotation.PostConstruct; |
| import javax.enterprise.context.ApplicationScoped; |
| import javax.enterprise.inject.Produces; |
| import javax.enterprise.inject.spi.InjectionPoint; |
| |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| /** |
| * Producer for injectable properties. |
| * |
| * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH |
| * |
| */ |
| @ApplicationScoped |
| public class GlobalPropertyService { |
| |
| private static final Logger LOG = LoggerFactory.getLogger(GlobalPropertyService.class); |
| |
| public static final String PROPERTY_CONFIG_PATH = "org.eclipse.mdm.configPath"; |
| private static final String COMPONENT_CONFIG_FOLDER = "org.eclipse.mdm.property"; |
| private static final String GLOBAL_PROPERTIES_FILENAME = "global.properties"; |
| |
| private Properties globalProperties = new Properties(); |
| |
| /** |
| * Reads the properties from the configuration file. |
| */ |
| @PostConstruct |
| public void readProperties() { |
| |
| try (InputStream in = getPropertyConfiguration()) { |
| this.globalProperties.load(in); |
| } catch (IOException e) { |
| LOG.error(e.getMessage(), e); |
| throw new GlobalPropertyException(e.getMessage(), e); |
| } |
| } |
| |
| /** |
| * Producer method for global properties. |
| * |
| * @param ip The injection point. |
| * @return The global property value. |
| * @throws GlobalPropertyException Thrown if the property is not set. |
| */ |
| @Produces |
| @GlobalProperty |
| public String getGlobalPropertyValue(InjectionPoint ip) throws GlobalPropertyException { |
| GlobalProperty property = ip.getAnnotated().getAnnotation(GlobalProperty.class); |
| String propertyName = property.value(); |
| if (!globalProperties.containsKey(propertyName)) { |
| LOG.warn("global property with name '{}' not found!", propertyName); |
| return ""; |
| } |
| return globalProperties.getProperty(propertyName); |
| } |
| |
| /** |
| * Producer method for a global property map. |
| * |
| * @param ip The injection point. |
| * @return A map with the global properties |
| */ |
| @Produces |
| @GlobalProperty |
| public Map<String, String> getGlobalPropertyMap(InjectionPoint ip) { |
| Map<String, String> map = new HashMap<>(); |
| for (String key : globalProperties.stringPropertyNames()) { |
| map.put(key, globalProperties.getProperty(key)); |
| } |
| return map; |
| } |
| |
| private static InputStream getPropertyConfiguration() throws FileNotFoundException { |
| String configRoot = System.getProperty(PROPERTY_CONFIG_PATH, "."); |
| LOG.info("found system property {} with value {}", PROPERTY_CONFIG_PATH, configRoot); |
| |
| File componentConfigFolder = new File(configRoot, COMPONENT_CONFIG_FOLDER); |
| if (!componentConfigFolder.exists() || !componentConfigFolder.isDirectory()) { |
| throw new GlobalPropertyException("property configuration folder at '" |
| + componentConfigFolder.getAbsolutePath() + "' does not exist! No properties available!"); |
| } |
| File globalConfigFile = new File(componentConfigFolder, GLOBAL_PROPERTIES_FILENAME); |
| if (!globalConfigFile.exists()) { |
| throw new GlobalPropertyException("property configuration file for global properties at '" |
| + globalConfigFile.getAbsolutePath() + "' does not exist! no global properties available"); |
| } |
| |
| LOG.info("loading global properties from file: {}", globalConfigFile); |
| return new FileInputStream(globalConfigFile); |
| } |
| } |