package br.com.citframework.util; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.commons.lang.StringUtils; /** * Helper que representa um arquivo {@code .properties} * * @author Bruno C�sar Ribeiro e Silva - <a href="mailto:bruno@brunocesar.com">bruno@brunocesar.com</a> */ public final class PropertyFile { private Properties properties; private final String fileName; private static final String UNDEFINED_KEY = "???"; private static final ConcurrentMap<String, PropertyFile> PROPERTIES = new ConcurrentHashMap<>(); /** * Constr�i um arquivo de propriedades, de acordo com o nome do arquivo * * @param fileName * nome do arquivo, sem extens�o * @return {@link PropertyFile} */ public static PropertyFile getPropertyFile(final String fileName) { PropertyFile pFile = PROPERTIES.get(fileName); if (pFile == null) { pFile = new PropertyFile(fileName); PROPERTIES.put(fileName, pFile); } return pFile; } /** * Constr�i uma configura��o, de acordo com o nome do arquivo * * @param fileName * nome do arquivo, sem extens�o */ private PropertyFile(final String fileName) { this.fileName = fileName; this.loadConfiguration(); } /** * Recupera o arquivo de propriedades da inst�ncia de {@link PropertyFile} * * @return {@link Properties} */ public Properties getProperties() { return properties; } /** * Recupera de um {@code .properties} o valor da propriedade correspondente � chave informada * * @param key * a chave do valor recuperado * @return o valor correspondente � chave ou <code>key</code> se a chave n�o for encontrada. */ public String getProperty(final String key) { return this.getProperty(key, null); } /** * Recupera de um {@code .properties} o valor da propriedade correspondente � chave informada * * @param key * a chave do valor recuperado * @param defaultValue * valor padr�o caso n�o exista a chave no arquivo de propriedades * @return o valor correspondente � chave ou <code>defaultValue</code> se a chave n�o for encontrada. */ public String getProperty(final String key, final String defaultValue) { String property = properties.getProperty(key); if (StringUtils.isBlank(property) && StringUtils.isBlank(defaultValue)) { property = UNDEFINED_KEY + key + UNDEFINED_KEY; } else if (StringUtils.isBlank(property) && StringUtils.isNotBlank(defaultValue)) { property = defaultValue; } return property; } /** * Recupera o nome do arquivo de configura��o, j� com a extens�o {@code .properties} * * @return {@link String} nome do arquivo de configura��o */ private String getConfigurationFileName() { return "/" + fileName + ".properties"; } /** * Carrega do classpath o arquivo de configura��o */ private void loadConfiguration() { properties = new Properties(); try (final InputStream is = PropertyFile.class.getResourceAsStream(this.getConfigurationFileName())) { if (is == null) { throw new IOException("Arquivo de configura��o " + this.getConfigurationFileName() + " n�o p�de ser encontrado."); } properties.load(is); } catch (final IOException ex) { throw new RuntimeException(ex.getMessage(), ex); } } }