oms3.dsl.BeanBuilder Maven / Gradle / Ivy
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package oms3.dsl;
/*
* BeanBuilder.java
*
* Created on March 17, 2007, 10:27 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
import java.beans.BeanInfo;
import java.beans.IndexedPropertyDescriptor;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author jclarke
*/
class BeanBuilder {
HashMap propertyMap;
Class beanClass;
BeanBuilder(Class beanClass) throws IntrospectionException {
this.beanClass = beanClass;
loadBean();
}
protected void loadBean() throws IntrospectionException {
propertyMap = new HashMap();
BeanInfo info = Introspector.getBeanInfo(beanClass);
PropertyDescriptor[] properties = info.getPropertyDescriptors();
for (int i = 0; i < properties.length; i++) {
propertyMap.put(properties[i].getName(), properties[i]);
}
}
public boolean isIndexedProperty(String property) {
return propertyMap.get(property) instanceof IndexedPropertyDescriptor;
}
public boolean hasProperty(String property) {
return propertyMap.containsKey(property);
}
public void setProperties(Object instance, Map map) throws IllegalAccessException, InvocationTargetException {
if (map == null) {
return;
}
for (Object object : map.keySet()) {
String property = (String) object;
Object v = map.get(property);
if (isIndexedProperty(property)) {
Map m = (Map) v;
for (Object object1 : m.keySet()) {
Number n = (Number) object1;
Object propVal = m.get(n);
// System.out.println("Setting Indexed Property: " + property + ": " + n + " = " + propVal);
setProperty(instance, property, n, propVal);
}
} else {
setProperty(instance, property, v);
}
}
}
public void setProperty(Object instance, String property, Number index, Object value)
throws IllegalAccessException, InvocationTargetException {
setProperty(instance, property, index.intValue(), value);
}
public void setProperty(Object instance, String property, int index, Object value)
throws IllegalAccessException, InvocationTargetException {
IndexedPropertyDescriptor desc = (IndexedPropertyDescriptor) propertyMap.get(property);
if (desc == null) {
throw new IllegalArgumentException("Invalid property '" + property + "'");
}
Method meth = desc.getIndexedWriteMethod();
Class propertyType = desc.getIndexedPropertyType();
Object arg = getPropertyTypeValue(propertyType, value);
// System.out.println("Invoking: " + meth.getName() + " Index = " + index + " arg = " + arg);
meth.invoke(instance, new Object[]{new Integer(index), arg});
}
public void setProperty(Object instance, String property, Object value) throws IllegalAccessException, InvocationTargetException {
PropertyDescriptor desc = propertyMap.get(property);
if (desc == null) {
throw new IllegalArgumentException("Invalid property '" + property + "'");
}
Method meth = desc.getWriteMethod();
Class propertyType = desc.getPropertyType();
if (propertyType == null) {
// System.out.println("Cannot determine type for property: " + property);
meth.invoke(instance, value);
return;
}
Object arg = getPropertyTypeValue(propertyType, value);
meth.invoke(instance, new Object[]{arg});
}
/**
* converts ths incoming value to an object for the property type.
*/
private Object getPropertyTypeValue(Class propertyType, Object value) {
if (propertyType.equals(String.class)) {
return value.toString();
} else if (propertyType.equals(Boolean.class) || propertyType.equals(Boolean.TYPE)) {
Boolean arg = null;
if (value instanceof Boolean) {
arg = (Boolean) value;
} else {
arg = Boolean.parseBoolean(value.toString());
}
return arg;
} else if (propertyType.equals(Short.class) || propertyType.equals(Short.TYPE)) {
Short arg = null;
if (value instanceof Short) {
arg = (Short) value;
} else {
arg = Short.parseShort(value.toString());
}
return arg;
} else if (propertyType.equals(Integer.class) || propertyType.equals(Integer.TYPE)) {
Integer arg = null;
if (value instanceof Integer) {
arg = (Integer) value;
} else {
arg = Integer.parseInt(value.toString());
}
return arg;
} else if (propertyType.equals(Long.class) || propertyType.equals(Long.TYPE)) {
Long arg = null;
if (value instanceof Long) {
arg = (Long) value;
} else {
arg = Long.parseLong(value.toString());
}
return arg;
} else if (propertyType.equals(Float.class) || propertyType.equals(Float.TYPE)) {
Float arg = null;
if (value instanceof Float) {
arg = (Float) value;
} else {
arg = Float.parseFloat(value.toString());
}
return arg;
} else if (propertyType.equals(Double.class) || propertyType.equals(Double.TYPE)) {
Double arg = null;
if (value instanceof Double) {
arg = (Double) value;
} else {
arg = Double.parseDouble(value.toString());
}
return arg;
} else { // Object
return value;
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy