/*
* Copyright 2013 Robert von Burg <eitch@eitchnet.ch>
*
* 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.
*/
package li.strolch.runtime.configuration;
import java.io.File;
import java.text.MessageFormat;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import li.strolch.utils.helper.StringHelper;
public abstract class AbstractionConfiguration {
private static final Logger logger = LoggerFactory.getLogger(AbstractionConfiguration.class);
private final String name;
private final Map<String, String> configurationValues;
public AbstractionConfiguration(String name, Map<String, String> configurationValues) {
this.name = name;
this.configurationValues = configurationValues;
}
public String getName() {
return this.name;
}
public boolean hasProperty(String key) {
return this.configurationValues.containsKey(key);
}
public Set<String> getPropertyKeys() {
return new HashSet<>(this.configurationValues.keySet());
}
public String[] getStringArray(String key, String defValue) {
String value = getValue(key, defValue);
String[] values = value.split(","); //$NON-NLS-1$
for (int i = 0; i < values.length; i++) {
values[i] = values[i].trim();
}
return values;
}
public String getString(String key, String defValue) {
return getValue(key, defValue);
}
public boolean getBoolean(String key, Boolean defValue) {
String value = this.configurationValues.get(key);
if (StringHelper.isNotEmpty(value)) {
if (value.equalsIgnoreCase("true")) //$NON-NLS-1$
return true;
else if (value.equalsIgnoreCase("false")) //$NON-NLS-1$
return false;
String msg = "Component {0} has non-boolean configuration value for {1} = {2}!"; //$NON-NLS-1$
msg = MessageFormat.format(msg, this.name, key, value);
throw new StrolchConfigurationException(msg);
}
assertDefValueExist(key, defValue);
logDefValueUse(key, defValue);
return defValue;
}
public int getInt(String key, int defValue) {
String value = this.configurationValues.get(key);
if (StringHelper.isNotEmpty(value)) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
String msg = "Component {0} has non-integer configuration value for {1} = {2}!"; //$NON-NLS-1$
msg = MessageFormat.format(msg, this.name, key, value);
throw new StrolchConfigurationException(msg);
}
}
assertDefValueExist(key, defValue);
logDefValueUse(key, defValue);
return defValue;
}
public long getLong(String key, long defValue) {
String value = this.configurationValues.get(key);
if (StringHelper.isNotEmpty(value)) {
try {
return Long.parseLong(value);
} catch (NumberFormatException e) {
String msg = "Component {0} has non-long configuration value for {1} = {2}!"; //$NON-NLS-1$
msg = MessageFormat.format(msg, this.name, key, value);
throw new StrolchConfigurationException(msg);
}
}
assertDefValueExist(key, defValue);
logDefValueUse(key, defValue);
return defValue;
}
public File getConfigFile(String key, String defValue, RuntimeConfiguration configuration) {
String value = getValue(key, defValue);
File configFile = new File(configuration.getConfigPath(), value);
if (!configFile.isFile() || !configFile.canRead()) {
String msg = "Component {0} requires configuration file for configuration property ''{1}'' which does not exist with value: {2}"; //$NON-NLS-1$
msg = MessageFormat.format(msg, this.name, key, value);
throw new StrolchConfigurationException(msg);
}
return configFile;
}
public File getDataDir(String key, String defValue, RuntimeConfiguration configuration, boolean checkExists) {
String value = getValue(key, defValue);
File dataDir = new File(configuration.getDataPath(), value);
if (checkExists && !dataDir.isDirectory() || !dataDir.canRead()) {
String msg = "Component {0} requires data directory for configuration property ''{1}'' which does not exist with value: {2}"; //$NON-NLS-1$
msg = MessageFormat.format(msg, this.name, key, value);
throw new StrolchConfigurationException(msg);
}
return dataDir;
}
public File getDataFile(String key, String defValue, RuntimeConfiguration configuration, boolean checkExists) {
String value = getValue(key, defValue);
File dataFile = new File(configuration.getDataPath(), value);
if (checkExists && !dataFile.isFile() || !dataFile.canRead()) {
String msg = "Component {0} requires data file for configuration property ''{1}'' which does not exist with value: {2}"; //$NON-NLS-1$
msg = MessageFormat.format(msg, this.name, key, value);
throw new StrolchConfigurationException(msg);
}
return dataFile;
}
private String getValue(String key, String defValue) {
String value = this.configurationValues.get(key);
if (StringHelper.isEmpty(value)) {
assertDefValueExist(key, defValue);
logDefValueUse(key, defValue);
value = defValue;
}
return value;
}
private void logDefValueUse(String key, Object defValue) {
String msg = "{0}: Using default for key {1}={2}"; //$NON-NLS-1$
msg = MessageFormat.format(msg, this.name, key, defValue);
logger.info(msg);
}
private void assertDefValueExist(String key, Object defValue) {
if (defValue == null) {
String msg = "Component {0} is missing the configuration value with key ''{1}''!"; //$NON-NLS-1$
msg = MessageFormat.format(msg, this.name, key);
throw new StrolchConfigurationException(msg);
}
}
}