package org.ovirt.engine.core.config.entity;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.commons.configuration.SubnodeConfiguration;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.ovirt.engine.core.config.EngineConfig;
import org.ovirt.engine.core.config.entity.helper.StringValueHelper;
import org.ovirt.engine.core.config.entity.helper.ValueHelper;
public class ConfigKeyFactory {
private HierarchicalConfiguration keysConfig;
private Map<String, String> alternateKeysMap;
private static ConfigKeyFactory instance;
static {
instance = new ConfigKeyFactory();
}
private ConfigKeyFactory() {
}
public static void init(HierarchicalConfiguration keysConfig, Map<String, String> alternateKeysMap) {
instance.keysConfig = keysConfig;
instance.alternateKeysMap = alternateKeysMap;
}
public static ConfigKeyFactory getInstance() {
return instance;
}
public ConfigKey generateByPropertiesKey(String key) {
SubnodeConfiguration configurationAt = null;
try {
if (Character.isLetter(key.charAt(0))) {
configurationAt = keysConfig.configurationAt(key);
}
} catch (IllegalArgumentException e) {
// Can't find a key. maybe its an alternate key.
}
if (configurationAt == null || configurationAt.isEmpty()) {
key = alternateKeysMap.get(key);
configurationAt = keysConfig.configurationAt(key);
}
String type = configurationAt.getString("type");
if (StringUtils.isBlank(type)) {
type = "String";
}
String[] validValues = configurationAt.getStringArray("validValues");
String description = configurationAt.getString("description");
String alternateKey = keysConfig.getString("/" + key + "/" + "alternateKey");
ConfigKey configKey = new ConfigKey(type, description, alternateKey, key, "", validValues, "", getHelperByType(type));
return configKey;
}
public ConfigKey generateBlankConfigKey(String keyName,String keyType) {
return new ConfigKey(keyType, "", "", keyName, "", null, "", getHelperByType(keyType));
}
private ValueHelper getHelperByType(String type) {
ValueHelper valueHelper;
try {
if (type == null) {
type = "String";
}
Class<?> cls = Class.forName("org.ovirt.engine.core.config.entity.helper." + type + "ValueHelper");
valueHelper = (ValueHelper) cls.newInstance();
} catch (Exception e) {
// failed finding a helper for this type. Setting default string type
Logger.getLogger(EngineConfig.class).debug("Unable to find " + type + " type. Using default string type.");
valueHelper = new StringValueHelper();
}
return valueHelper;
}
public ConfigKey copyOf(ConfigKey key, String value, String version) {
return new ConfigKey(
key.getType(),
key.getDescription(),
key.getAlternateKeys(),
key.getKey(),
value,
key.getValidValues().toArray(new String[0]),
version,
key.getValueHelper());
}
/**
* Create a ConfigKey from a ResultSet object. <b>Note</b>: Some fields are not represented by the DB, such as
* decription and type.<br>
*
* @TODO Consider refactoring the entity to be composed out of a real value-object which will represent the db
* entity and a view-object which will represent the user interaction (view) layer.
* @TODO move "option_name" and other column indexes to Enum values.
*
*
* @param resultSet
* @return
* @throws SQLException
*/
public ConfigKey fromResultSet(ResultSet resultSet) throws SQLException {
ConfigKey configKey = generateByPropertiesKey(resultSet.getString("option_name"));
configKey.unsafeSetValue(resultSet.getString("option_value"));
configKey.setVersion(resultSet.getString("version"));
return configKey;
}
}