package org.ovirt.engine.core.compat.backendcompat;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.ovirt.engine.core.compat.CompatException;
// This will wrap java beans introspection
public class TypeCompat {
private static final String CLASS = "class";
private static Log log = LogFactory.getLog(TypeCompat.class);
public static List<PropertyInfo> GetProperties(Class<?> type) {
List<PropertyInfo> returnValue = new ArrayList<PropertyInfo>();
try {
PropertyDescriptor[] pds = Introspector.getBeanInfo(type).getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
// Class is a bogud property, remove it
if (!CLASS.equals(pd.getName())) {
returnValue.add(new PropertyInfo(pd));
}
}
} catch (Exception e) {
throw new CompatException(e);
}
return returnValue;
}
public static PropertyCompat GetProperty(Class<?> type, String idField) {
try {
PropertyDescriptor[] pds = Introspector.getBeanInfo(type).getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
if (pd.getName().equalsIgnoreCase(idField)) {
return new PropertyCompat(pd);
}
}
} catch (Exception e) {
throw new CompatException(e);
}
return null;
}
/**
* The following method will get values for properties of provided object and will keep them in map
* @param obj - this is an object which values will be taken
* @param properties - a set of properties names
* @param values - a map which will contains all values of properties
*/
public static void getPropertyValues(Object obj, Set<String> properties, Map<String, String> values) {
try {
PropertyDescriptor[] pds = Introspector.getBeanInfo(obj.getClass()).getPropertyDescriptors();
int hitCount = 0;
for (PropertyDescriptor pd : pds) {
String propertyName = pd.getName().toLowerCase();
if (properties.contains(propertyName)) {
Object value = null;
hitCount++;
try {
value = pd.getReadMethod().invoke(obj);
String stringValue = value != null ? value.toString() : null;
values.put(propertyName, stringValue);
} catch (Exception e) {
log.warn("Unable to get value of property: " + pd.getDisplayName() + " for class "
+ obj.getClass().getName());
}
if (hitCount == properties.size()) {
break;
}
}
}
} catch (Exception e) {
throw new CompatException(e);
}
}
}