package org.ovirt.engine.core.uutils.cli.parser;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang.ClassUtils;
class StringValueConverter {
public static Object getObjectValueByString(Class<?> clazz, String value) {
Object v = null;
if (clazz.isPrimitive()) {
clazz = ClassUtils.primitiveToWrapper(clazz);
}
if (clazz.equals(Collection.class)) {
List<Object> r = new ArrayList<>();
for (String c : value.trim().split(" *, *")) {
if (!c.isEmpty()) {
r.add(getObjectValueByString(String.class, c));
}
}
v = r;
}
if (v == null) {
if (clazz.isArray() && Object.class.isAssignableFrom(clazz.getComponentType())) {
List<Object> r = new ArrayList<>();
for (String c : value.trim().split(" *, *")) {
if (!c.isEmpty()) {
r.add(getObjectValueByString(clazz.getComponentType(), c));
}
}
v = r.toArray((Object[]) Array.newInstance(clazz.getComponentType(), 0));
}
}
if (v == null) {
try {
Field f = clazz.getField(value);
if (Modifier.isStatic(f.getModifiers())) {
v = f.get(null);
}
} catch(ReflectiveOperationException ignore) {}
}
if (v == null) {
try {
Method convert = clazz.getMethod("valueOf", String.class);
if (Modifier.isStatic(convert.getModifiers())) {
v = convert.invoke(null, value);
}
} catch(ReflectiveOperationException ignore) {}
}
if (v == null) {
try {
Method convert = clazz.getMethod("valueOf", Object.class);
if (Modifier.isStatic(convert.getModifiers())) {
v = convert.invoke(null, value);
}
} catch(ReflectiveOperationException ignore) {}
}
if (v == null) {
try {
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
v = constructor.newInstance(value);
} catch(ReflectiveOperationException ignore) {}
}
if (v == null) {
throw new IllegalArgumentException(String.format("Failed to convert '%s' to %s", value, clazz.getName()));
}
return v;
}
}