package org.ovirt.engine.core.config.entity;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.core.config.EngineConfigCLIParser;
import org.ovirt.engine.core.config.entity.helper.CompositePasswordValueHelper;
import org.ovirt.engine.core.config.entity.helper.PasswordValueHelper;
import org.ovirt.engine.core.config.entity.helper.ValidationResult;
import org.ovirt.engine.core.config.entity.helper.ValueHelper;
import org.slf4j.LoggerFactory;
public class ConfigKey {
private String type;
private String description;
private String alternateKey;
private String keyName;
private String value;
private final boolean deprecated;
private boolean reloadable;
private List<String> validValues;
private static final List<String> EMPTY_LIST = new ArrayList<>(0);
private String version;
private ValueHelper valueHelper;
protected ConfigKey(String type,
String description,
String alternateKey,
String key,
String value,
String[] validValues,
String version,
ValueHelper helper,
boolean reloadable,
boolean deprecated) {
super();
this.type = type;
this.description = description;
this.alternateKey = alternateKey;
this.keyName = key;
this.value = value;
this.deprecated = deprecated;
setVersion(version);
this.validValues = validValues != null ? Arrays.asList(validValues) : EMPTY_LIST;
this.valueHelper = helper;
this.reloadable = reloadable;
}
public void setVersion(String version) {
this.version = version == null || version.isEmpty() ? "general" : version;
}
public String getType() {
return type;
}
public String getDescription() {
return description;
}
public String getAlternateKeys() {
return alternateKey;
}
public String getKey() {
return keyName;
}
public String getValue() {
return value;
}
public String getDisplayValue() throws Exception {
return valueHelper.getValue(value);
}
public void setType(String type) {
this.type = type;
}
public void setDescription(String description) {
this.description = description;
}
public void setAlternateKey(String alternateKey) {
this.alternateKey = alternateKey;
}
public void setKey(String key) {
this.keyName = key;
}
/**
* Sets the value of this Config key to the given value. Is meant to be used before updating the DB, therefore is
* safe, and throws an Exception in case of validation failure.
*
* @param value
* The value to set
*/
public void safeSetValue(String value) throws InvalidParameterException, Exception {
ValidationResult validationResult = valueHelper.validate(this, value);
if (!validationResult.isOk()) {
StringBuilder invalidParamMsg = new StringBuilder();
invalidParamMsg.append("Cannot set value ")
.append(value)
.append(" to key ")
.append(keyName)
.append(". ")
.append(StringUtils.isNotEmpty(validationResult.getDetails()) ? validationResult.getDetails() : "");
throw new InvalidParameterException(invalidParamMsg.toString());
}
this.value = valueHelper.setValue(value);
}
public void setParser(EngineConfigCLIParser parser) {
valueHelper.setParser(parser);
}
/**
* Sets the value of this ConfigKey to the given value without validation. Is meant for internal use only.
*/
public void unsafeSetValue(String value) {
this.value = value;
}
@Override
public String toString() {
String value = "Error fetching value";
try{
value = getDisplayValue();
}
catch (Exception e) {
LoggerFactory.getLogger(ConfigKey.class).debug("Error fetching value", e);
}
return new StringBuilder ("ConfigKey [type=").append(type).append(", description=").append(description)
.append(", alternateKey=").append(alternateKey).append(", key=").append(keyName).append(", value=").append(value)
.append(", validValues=").append(validValues).append(", version=").append(version + "]").toString();
}
public List<String> getValidValues() {
return this.validValues;
}
public String getVersion() {
return version;
}
public ValueHelper getValueHelper() {
return valueHelper;
}
public boolean isReloadable() {
return reloadable;
}
public boolean isPasswordKey() {
return CompositePasswordValueHelper.class.isAssignableFrom(valueHelper.getClass()) ||
PasswordValueHelper.class.isAssignableFrom(valueHelper.getClass());
}
public boolean isDeprecated() {
return deprecated;
}
}