package org.rembx.jeeshop.configuration;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* Configuration Producer
* <p/>
* Produces a value for a given @NamedConfiguration annotated property.
* This value is retrieved from a property file named with the lower case class name where this property is declared
* <p/>
* User: remi
*/
public class ConfigurationProducer {
private final static Logger logger = LoggerFactory.getLogger(ConfigurationProducer.class);
private final static String CONFIGURATION_FILE_SUFFIX = ".properties";
/**
* Stores every property files associated to classes using NamedConfiguration annotation
*/
private static final Map<String, Properties> configurations = new HashMap<>();
@Produces
@NamedConfiguration
String retrieveNamedConfiguration(InjectionPoint injectionPoint) {
String configurationFilePath;
NamedConfiguration namedConfiguration = injectionPoint.getAnnotated().getAnnotation(NamedConfiguration.class);
if (namedConfiguration.value() == null || StringUtils.isEmpty(namedConfiguration.value())) {
return null;
}
if (namedConfiguration.configurationFile() == null || StringUtils.isEmpty(namedConfiguration.configurationFile())) {
configurationFilePath = "/" + injectionPoint.getMember().getDeclaringClass().getSimpleName().toLowerCase()
+ CONFIGURATION_FILE_SUFFIX;
} else {
configurationFilePath = namedConfiguration.configurationFile();
}
Properties properties = loadConfigurationFile(configurationFilePath);
return properties.getProperty(namedConfiguration.value());
}
private Properties loadConfigurationFile(String configurationFilePath) {
if (configurations.get(configurationFilePath) != null) {
return configurations.get(configurationFilePath);
}
logger.debug("Loading property file : {}", configurationFilePath);
Properties properties = new Properties();
try (InputStream configurationFile = getClass().getResourceAsStream(configurationFilePath)) {
if (configurationFile == null)
throw new IllegalStateException("File :" + configurationFilePath + " not found");
properties.load(configurationFile);
configurations.put(configurationFilePath,properties);
} catch (IOException e) {
throw new RuntimeException("Failed to load configuration file: " + configurationFilePath, e);
}
logger.debug("Property file load successful");
return properties;
}
}