package org.ovirt.engine.core.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.config.DataType;
import org.ovirt.engine.core.common.config.DefaultValueAttribute;
import org.ovirt.engine.core.common.config.IConfigUtilsInterface;
import org.ovirt.engine.core.common.config.OptionBehaviourAttribute;
import org.ovirt.engine.core.common.config.TypeConverterAttribute;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.compat.RefObject;
import org.ovirt.engine.core.compat.TimeSpan;
import org.ovirt.engine.core.compat.Version;
import org.ovirt.engine.core.utils.serialization.json.JsonObjectDeserializer;
/**
* Config Utils Base Class
*/
public abstract class ConfigUtilsBase implements IConfigUtilsInterface {
@Override
public final boolean getBoolValue(String name, String defaultValue) {
return ((Boolean) GetValue(DataType.Bool, name, defaultValue)).booleanValue();
}
@Override
public final int getIntValue(String name, String defaultValue) {
return ((Integer) GetValue(DataType.Int, name, defaultValue)).intValue();
}
@Override
public final Date getDateTimeValue(String name, String defaultValue) {
Date dt = new java.util.Date(0);
String dateString = GetValue(DataType.String, name, defaultValue).toString();
try {
dt = (new SimpleDateFormat("k:m:s")).parse(dateString);
} catch (Exception e) {
// eat it, the value is null
}
return dt;
}
@Override
public final TimeSpan getTimeSpanValue(String name, String defaultValue) {
return (TimeSpan) GetValue(DataType.TimeSpan, name, defaultValue);
}
@Override
public final Version getVersionValue(String name, String defaultValue) {
return (Version) GetValue(DataType.Version, name, defaultValue);
}
@Override
public final String getPathValue(String name, String defaultValue) {
return (String) GetValue(DataType.String, name, defaultValue);
}
@Override
public final void SetStringValue(String name, String value) {
SetValue(name, value, Config.DefaultConfigurationVersion);
}
@Override
public final boolean ValidateParse(DataType type, String valueInApp, String defaultValue,
RefObject<Object> returnValue) {
boolean castSucceded = true;
switch (type) {
case Bool: {
if (valueInApp != null) {
returnValue.argvalue = Boolean.parseBoolean(valueInApp);
} else {
castSucceded = false;
returnValue.argvalue = Boolean.parseBoolean(defaultValue);
}
break;
}
case Int: {
try {
returnValue.argvalue = new Integer(valueInApp);
} catch (NumberFormatException e) {
castSucceded = false;
returnValue.argvalue = new Integer(defaultValue);
}
break;
}
case String: {
if (valueInApp != null) {
returnValue.argvalue = valueInApp;
} else {
castSucceded = false;
returnValue.argvalue = defaultValue;
}
break;
}
case DateTime: {
SimpleDateFormat fmt = new SimpleDateFormat("k:m:s");
java.util.Date val;
try {
val = fmt.parse(valueInApp);
} catch (Exception e) {
castSucceded = false;
try {
val = fmt.parse(defaultValue);
} catch (Exception e2) {
val = null;
}
}
returnValue.argvalue = val;
break;
}
case TimeSpan: {
TimeSpan val;
try {
val = TimeSpan.Parse(valueInApp);
} catch (Exception e) {
castSucceded = false;
try {
val = TimeSpan.Parse(defaultValue);
} catch (Exception e2) {
val = null;
}
}
returnValue.argvalue = val;
break;
}
case Version: {
Version val;
try {
val = new Version(valueInApp);
} catch (Exception e) {
castSucceded = false;
try {
val = new Version(defaultValue);
} catch (Exception e2) {
val = null;
}
}
returnValue.argvalue = val;
break;
}
}
return castSucceded;
}
protected abstract void SetValue(String name, String value, String version);
protected abstract Object GetValue(DataType type, String name, String defaultValue);
@Override
public abstract <T> T GetValue(ConfigValues configValue, String version);
/**
* parse the enum value by its attributes and return the type, default value, and option behaviour (if any) return
* false if cannot find value in enum or cannot get type
*
* @param name
* @param fieldType
* @param defaultValue
* @param optionBehaviour
* @return
*/
@SuppressWarnings("rawtypes")
protected static boolean ParseEnumValue(String name, RefObject<java.lang.Class> fieldType,
RefObject<String> defaultValue, RefObject<OptionBehaviourAttribute> optionBehaviour) {
final String TEMP = "Temp";
boolean succeeded = true;
optionBehaviour.argvalue = null;
defaultValue.argvalue = null;
fieldType.argvalue = null;
java.lang.Class t = ConfigValues.class;
// get field from enum for its attributes
java.lang.reflect.Field fi = null;
try {
fi = t.getField(name);
} catch (Exception ex) {
// eat this exception. it is not fatal and will be handled like
// fi==null;
}
if (fi == null) {
// Ignore temporary values inserted to vdc_options by upgrades as
// flags.
if (!name.startsWith(TEMP)) {
log.warnFormat("Could not find enum value for option: {0}", name);
}
succeeded = false;
}
else {
// get type
if (fi.isAnnotationPresent(TypeConverterAttribute.class)) {
fieldType.argvalue = fi.getAnnotation(TypeConverterAttribute.class).value();
// get default value
if (fi.isAnnotationPresent(DefaultValueAttribute.class)) {
defaultValue.argvalue = fi.getAnnotation(DefaultValueAttribute.class).value();
}
// get the attribute for default behaviour
if (fi.isAnnotationPresent(OptionBehaviourAttribute.class)) {
optionBehaviour.argvalue = fi.getAnnotation(OptionBehaviourAttribute.class);
}
} else {
// if could not get type then cannot continue
succeeded = false;
}
}
return succeeded;
}
private static LogCompat log = LogFactoryCompat.getLog(ConfigUtilsBase.class);
@SuppressWarnings("unchecked")
@Override
public Map<String, String> getMapValue(final String name, final String defaultValue) {
final String jsonString = (String) GetValue(DataType.String, name, defaultValue);
if(jsonString != null) {
return new JsonObjectDeserializer().deserialize(jsonString, HashMap.class);
} else {
return null;
}
}
}