package org.testng.internal; import org.testng.log4testng.Logger; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * Utility class for setting JavaBeans-style properties on instances. * * @author Cosmin Marginean, Apr 12, 2007 */ public class PropertyUtils { private static final Logger LOGGER = Logger.getLogger(PropertyUtils.class); public static void setProperty(Object instance, String name, String value) { if (instance == null) { LOGGER.warn("Cannot set property " + name + " with value " + value + ". The target instance is null"); return; } Class propClass = getPropertyType(instance.getClass(), name); if (propClass == null) { LOGGER.warn("Cannot set property " + name + " with value " + value + ". Property class could not be found"); return; } Object realValue = Parameters.convertType(propClass, value, name); //TODO: Here the property desc is serched again setPropertyRealValue(instance, name, realValue); } public static Class getPropertyType(Class instanceClass, String propertyName) { if (instanceClass == null) { LOGGER.warn("Cannot retrieve property class for " + propertyName + ". Target instance class is null"); } PropertyDescriptor propDesc = getPropertyDescriptor(instanceClass, propertyName); return propDesc.getPropertyType(); } private static PropertyDescriptor getPropertyDescriptor(Class targetClass, String propertyName) { PropertyDescriptor result = null; if (targetClass == null) { LOGGER.warn("Cannot retrieve property " + propertyName + ". Class is null"); } else { try { BeanInfo beanInfo = Introspector.getBeanInfo(targetClass); PropertyDescriptor[] propDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor propDesc : propDescriptors) { if (propDesc.getName().equals(propertyName)) { result = propDesc; break; } } } catch (IntrospectionException ie) { LOGGER.warn("Cannot retrieve property " + propertyName + ". Cause is: " + ie); } } return result; } public static void setPropertyRealValue(Object instance, String name, Object value) { if (instance == null) { LOGGER.warn("Cannot set property " + name + " with value " + value + ". Targe instance is null"); return; } PropertyDescriptor propDesc = getPropertyDescriptor(instance.getClass(), name); if (propDesc == null) { LOGGER.warn("Cannot set property " + name + " with value " + value + ". Property does not exist"); return; } Method method = propDesc.getWriteMethod(); try { method.invoke(instance, new Object[]{value}); } catch (IllegalAccessException iae) { LOGGER.warn("Cannot set property " + name + " with value " + value + ". Cause " + iae); } catch (InvocationTargetException ite) { LOGGER.warn("Cannot set property " + name + " with value " + value + ". Cause " + ite); } } }