/* * Copyright 2001-2013 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") */ package com.uwyn.rife.tools; import com.uwyn.rife.config.RifeConfig; import com.uwyn.rife.datastructures.EnumClass; import com.uwyn.rife.tools.exceptions.BeanUtilsException; 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; import java.text.DateFormat; import java.text.Format; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public abstract class BeanUtils { public static final Accessors GETTERS = new Accessors("GETTERS"); public static final Accessors SETTERS = new Accessors("SETTERS"); public static final Accessors GETTERS_SETTERS = new Accessors("GETTERS_SETTERS"); public static DateFormat getConcisePreciseDateFormat() { SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmssSSSZ", Localization.getLocale()); sf.setTimeZone(RifeConfig.Tools.getDefaultTimeZone()); return sf; } public static BeanInfo getBeanInfo(Class beanClass) throws BeanUtilsException { try { return Introspector.getBeanInfo(beanClass); } catch (IntrospectionException e) { throw new BeanUtilsException("Couldn't introspect the bean.", beanClass, e); } } private static String validateProperty(Accessors accessor, PropertyDescriptor property, Collection<String> includedProperties, Collection<String> excludedProperties, String prefix) { String name; // only take properties into account that have both read and write accessors if ((GETTERS == accessor && property.getReadMethod() != null) || (SETTERS == accessor && property.getWriteMethod() != null) || (GETTERS_SETTERS == accessor && property.getReadMethod() != null && property.getWriteMethod() != null)) { name = property.getName(); // don't take the class and the metaClass property into account if (name.equals("class") || name.equals("metaClass")) { return null; } // apply the prefix if it was provided if (prefix != null) { name = prefix + name; } // check if the property isn't explicitly included or if it should be excluded before adding it if ((null == includedProperties || includedProperties.contains(name)) && (null == excludedProperties || !excludedProperties.contains(name))) { return name; } } return null; } public static Set<String> getPropertyNames(Class beanClass, String[] includedProperties, String[] excludedProperties, String prefix) throws BeanUtilsException { return getPropertyNames(GETTERS_SETTERS, beanClass, includedProperties, excludedProperties, prefix); } public static Set<String> getPropertyNames(Accessors accessors, Class beanClass, String[] includedProperties, String[] excludedProperties, String prefix) throws BeanUtilsException { if (null == beanClass) { return Collections.emptySet(); } final LinkedHashSet<String> property_names = new LinkedHashSet<>(); processProperties(accessors, beanClass, includedProperties, excludedProperties, prefix, new BeanPropertyProcessor() { public boolean gotProperty(String name, PropertyDescriptor descriptor) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { property_names.add(name); return true; } }); return property_names; } public static void processProperties(Class beanClass, String[] includedProperties, String[] excludedProperties, String prefix, BeanPropertyProcessor processor) throws BeanUtilsException { processProperties(GETTERS_SETTERS, beanClass, includedProperties, excludedProperties, prefix, processor); } public static void processProperties(Accessors accessors, Class beanClass, String[] includedProperties, String[] excludedProperties, String prefix, BeanPropertyProcessor processor) throws BeanUtilsException { if (null == beanClass) { return; } if (null == processor) { return; } // obtain the BeanInfo class BeanInfo bean_info = getBeanInfo(beanClass); // process the properties of the bean PropertyDescriptor[] bean_properties = bean_info.getPropertyDescriptors(); if (bean_properties.length > 0) { String property_name; Collection<String> included_properties = null; Collection<String> excluded_properties = null; if (null != includedProperties && includedProperties.length > 0) { included_properties = new ArrayList<>(Arrays.asList(includedProperties)); } if (null != excludedProperties && excludedProperties.length > 0) { excluded_properties = new ArrayList<>(Arrays.asList(excludedProperties)); } // iterate over the properties of the bean for (PropertyDescriptor bean_property : bean_properties) { property_name = validateProperty(accessors, bean_property, included_properties, excluded_properties, prefix); // process the property if it was valid if (property_name != null) { try { if (!processor.gotProperty(property_name, bean_property)) { break; } } catch (IllegalAccessException e) { throw new BeanUtilsException("No permission to invoke a method of the property '" + property_name + "' of the bean.", beanClass, e); } catch (IllegalArgumentException e) { throw new BeanUtilsException("Invalid arguments while invoking a method of the property '" + property_name + "' on the bean.", beanClass, e); } catch (InvocationTargetException e) { throw new BeanUtilsException("A method of the property '" + property_name + "' of the bean has thrown an exception.", beanClass, e.getTargetException()); } } } } } public static void processPropertyValues(final Object bean, String[] includedProperties, String[] excludedProperties, String prefix, final BeanPropertyValueProcessor processor) throws BeanUtilsException { processPropertyValues(GETTERS_SETTERS, bean, includedProperties, excludedProperties, prefix, processor); } public static void processPropertyValues(Accessors accessors, final Object bean, String[] includedProperties, String[] excludedProperties, String prefix, final BeanPropertyValueProcessor processor) throws BeanUtilsException { if (null == bean) { return; } if (bean instanceof Class) { throw new IllegalArgumentException("bean should be a bean instance, not a bean class."); } processProperties(accessors, bean.getClass(), includedProperties, excludedProperties, prefix, new BeanPropertyProcessor() { public boolean gotProperty(String name, PropertyDescriptor descriptor) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { // obtain the value of the property Method property_read_method = descriptor.getReadMethod(); if (property_read_method != null) { // handle the property value processor.gotProperty(name, descriptor, property_read_method.invoke(bean, (Object[])null)); } return true; } }); } public static int countProperties(Class beanClass, String[] includedProperties, String[] excludedProperties, String prefix) throws BeanUtilsException { return countProperties(GETTERS_SETTERS, beanClass, includedProperties, excludedProperties, prefix); } public static int countProperties(Accessors accessors, Class beanClass, String[] includedProperties, String[] excludedProperties, String prefix) throws BeanUtilsException { if (null == beanClass) { return 0; } final int[] result = new int[]{0}; processProperties(accessors, beanClass, includedProperties, excludedProperties, prefix, new BeanPropertyProcessor() { public boolean gotProperty(String name, PropertyDescriptor descriptor) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { result[0]++; return true; } }); return result[0]; } public static Object getPropertyValue(Object bean, String name) throws BeanUtilsException { if (null == bean) { throw new IllegalArgumentException("bean can't be null."); } if (bean instanceof Class) { throw new IllegalArgumentException("bean should be a bean instance, not a bean class."); } if (null == name) { throw new IllegalArgumentException("name can't be null."); } if (0 == name.length()) { throw new IllegalArgumentException("name can't be empty."); } // obtain the BeanInfo class Class bean_class = bean.getClass(); BeanInfo bean_info = getBeanInfo(bean_class); // process the properties of the bean PropertyDescriptor[] bean_properties = bean_info.getPropertyDescriptors(); if (bean_properties.length > 0) { String property_name; Method property_read_method; // iterate over the properties of the bean for (PropertyDescriptor bean_property : bean_properties) { property_name = bean_property.getName(); // process the property if it was valid if (property_name.equals(name)) { // obtain the value of the property property_read_method = bean_property.getReadMethod(); if (null == property_read_method) { throw new BeanUtilsException("The bean '" + bean_class + "' doesn't contain a getter for property '" + name + "'", bean_class); } try { return property_read_method.invoke(bean, (Object[])null); } catch (IllegalAccessException e) { throw new BeanUtilsException("No permission to invoke the '" + property_read_method.getName() + "' method on the bean.", bean_class, e); } catch (IllegalArgumentException e) { throw new BeanUtilsException("Invalid arguments while invoking the '" + property_read_method.getName() + "' method on the bean.", bean_class, e); } catch (InvocationTargetException e) { throw new BeanUtilsException("The '" + property_read_method.getName() + "' method of the bean has thrown an exception.", bean_class, e.getTargetException()); } } } } throw new BeanUtilsException("The bean '" + bean_class + "' doesn't contain property '" + name + "'", bean_class); } public static void setPropertyValue(Object bean, String name, Object value) throws BeanUtilsException { if (null == bean) { throw new IllegalArgumentException("bean can't be null."); } if (bean instanceof Class) { throw new IllegalArgumentException("bean should be a bean instance, not a bean class."); } if (null == name) { throw new IllegalArgumentException("name can't be null."); } if (0 == name.length()) { throw new IllegalArgumentException("name can't be empty."); } // obtain the BeanInfo class Class bean_class = bean.getClass(); BeanInfo bean_info = getBeanInfo(bean_class); // process the properties of the bean PropertyDescriptor[] bean_properties = bean_info.getPropertyDescriptors(); if (bean_properties.length > 0) { String property_name; Method property_write_method; // iterate over the properties of the bean for (PropertyDescriptor bean_property : bean_properties) { property_name = bean_property.getName(); // process the property if it was valid if (property_name.equals(name)) { // obtain the value of the property property_write_method = bean_property.getWriteMethod(); try { property_write_method.invoke(bean, value); return; } catch (IllegalAccessException e) { throw new BeanUtilsException("No permission to invoke the '" + property_write_method.getName() + "' method on the bean.", bean_class, e); } catch (IllegalArgumentException e) { throw new BeanUtilsException("Invalid arguments while invoking the '" + property_write_method.getName() + "' method on the bean.", bean_class, e); } catch (InvocationTargetException e) { throw new BeanUtilsException("The '" + property_write_method.getName() + "' method of the bean has thrown an exception.", bean_class, e.getTargetException()); } } } } throw new BeanUtilsException("The bean '" + bean_class + "' doesn't contain property '" + name + "'", bean_class); } public static Class getPropertyType(Class beanClass, String name) throws BeanUtilsException { if (null == beanClass) { throw new IllegalArgumentException("beanClass can't be null."); } if (null == name) { throw new IllegalArgumentException("name can't be null."); } if (0 == name.length()) { throw new IllegalArgumentException("name can't be empty."); } // obtain the BeanInfo class BeanInfo bean_info = getBeanInfo(beanClass); // process the properties of the bean PropertyDescriptor[] bean_properties = bean_info.getPropertyDescriptors(); if (bean_properties.length > 0) { String property_name; Method property_read_method; // iterate over the properties of the bean for (PropertyDescriptor bean_property : bean_properties) { property_name = bean_property.getName(); // process the property if it was valid if (property_name.equals(name)) { // obtain the value of the property property_read_method = bean_property.getReadMethod(); return property_read_method.getReturnType(); } } } throw new BeanUtilsException("The bean '" + beanClass + "' doesn't contain property '" + name + "'", beanClass); } public static Map<String, Object> getPropertyValues(Object bean, String[] includedProperties, String[] excludedProperties, String prefix) throws BeanUtilsException { return getPropertyValues(GETTERS_SETTERS, bean, includedProperties, excludedProperties, prefix); } public static Map<String, Object> getPropertyValues(Accessors accessors, Object bean, String[] includedProperties, String[] excludedProperties, String prefix) throws BeanUtilsException { final LinkedHashMap<String, Object> property_values = new LinkedHashMap<>(); processPropertyValues(accessors, bean, includedProperties, excludedProperties, prefix, new BeanPropertyValueProcessor() { public void gotProperty(String name, PropertyDescriptor descriptor, Object value) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { // store the property value property_values.put(name, value); } }); return property_values; } // TODO // public static String formatPropertyValue(Object propertyValue, ConstrainedProperty constrainedProperty) // { // if (propertyValue instanceof String) // { // return (String)propertyValue; // } // // Format format = null; // if (constrainedProperty != null && // constrainedProperty.isFormatted()) // { // format = constrainedProperty.getFormat(); // } // else if (propertyValue instanceof Date) // { // format = getConcisePreciseDateFormat(); // } // // if (format != null) // { // return format.format(propertyValue); // } // // return String.valueOf(propertyValue); // } public static Map<String, Class> getPropertyTypes(Class beanClass, String[] includedProperties, String[] excludedProperties, String prefix) throws BeanUtilsException { return getPropertyTypes(GETTERS_SETTERS, beanClass, includedProperties, excludedProperties, prefix); } public static Map<String, Class> getPropertyTypes(Accessors accessors, Class beanClass, String[] includedProperties, String[] excludedProperties, String prefix) throws BeanUtilsException { if (null == beanClass) { return Collections.emptyMap(); } final LinkedHashMap<String, Class> property_types = new LinkedHashMap<>(); processProperties(accessors, beanClass, includedProperties, excludedProperties, prefix, new BeanPropertyProcessor() { public boolean gotProperty(String name, PropertyDescriptor descriptor) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class property_class; // obtain and store the property type Method property_read_method = descriptor.getReadMethod(); if (property_read_method != null) { property_class = property_read_method.getReturnType(); } else { Method property_write_method = descriptor.getWriteMethod(); property_class = property_write_method.getParameterTypes()[0]; } property_types.put(name, property_class); return true; } }); return property_types; } // TODO // /** // * Retrieves a map of all the properties of a bean and their descriptors. // * <p>The property names will be uppercased and an exception will be thrown // * if two properties are equals case-insensitively. // * // * @param beanClass the class of the bean // * @exception com.uwyn.rife.tools.exceptions.BeanUtilsException when an error // * occurred while obtaining the bean properties // * @return the map of the bean properties // * @see #setUppercasedBeanProperty(String, String[], String, Map, Object, Object) // * @see #setUppercasedBeanProperty(String, UploadedFile, String, Map, Object) // * @since 1.4 // */ // public static HashMap<String, PropertyDescriptor> getUppercasedBeanProperties(Class beanClass) // throws BeanUtilsException // { // if (null == beanClass) throw new IllegalArgumentException("beanClass can't be null."); // // HashMap<String, PropertyDescriptor> bean_properties = new HashMap<String, PropertyDescriptor>(); // BeanInfo bean_info = null; // PropertyDescriptor[] bean_properties_array = null; // // try // { // bean_info = Introspector.getBeanInfo(beanClass); // } // catch (IntrospectionException e) // { // throw new BeanUtilsException("Couldn't introspect the bean with class '"+beanClass.getName()+"'.", beanClass, e); // } // bean_properties_array = bean_info.getPropertyDescriptors(); // String bean_property_name = null; // for (PropertyDescriptor bean_property : bean_properties_array) // { // bean_property_name = bean_property.getName().toUpperCase(); // if (bean_properties.containsKey(bean_property_name)) // { // throw new BeanUtilsException("Duplicate case insensitive bean property '"+bean_property_name+"' in bean '"+beanClass.getName()+"'.", beanClass); // } // bean_properties.put(bean_property_name, bean_property); // } // // return bean_properties; // } /** * Parses the textual representation of the date using a custom format, or by * relying on the standard date formats. * * @param date the textual representation of the date * @param format the custom format that should be used for parsing the string * representation of the date; or {@code null} if the default formats should * be used * @return the parsed date * @throws ParseException if an error occurred when the date was parsed * @since 1.6 */ public Object parseDate(String date, Format format) throws ParseException { if (null == date) { return null; } Object result; if (null == format) { try { result = BeanUtils.getConcisePreciseDateFormat().parseObject(date); } catch (ParseException e) { try { result = RifeConfig.Tools.getDefaultInputDateFormat().parseObject(date); } catch (ParseException e2) { throw e; } } } else { result = format.parseObject(date); } return result; } // TODO // /** // * Set the value of a bean property from an array of strings. // * // * @param propertyName the name of the property // * @param propertyValues the values that will be set, can be <code>null</code> // * @param propertyNamePrefix the prefix that the propertyName parameter // * should have, can be <code>null</code> // * @param beanProperties the map of the uppercased bean property names and // * their descriptors // * @param beanInstance the bean instance whose property should be updated // * @param emptyBean this bean instance will be used to set the value of the // * property in case the propertyValues parameter is empty or null, can be // * <code>null</code> // * @exception com.uwyn.rife.tools.exceptions.BeanUtilsException when an error // * occurred while setting the bean property // * @see #getUppercasedBeanProperties(Class) // * @see #setUppercasedBeanProperty(String, UploadedFile, String, Map, Object) // * @since 1.4 // */ // public static void setUppercasedBeanProperty(String propertyName, String[] propertyValues, String propertyNamePrefix, Map<String, PropertyDescriptor> beanProperties, Object beanInstance, Object emptyBean) // throws BeanUtilsException // { // if (null == propertyName) throw new IllegalArgumentException("propertyName can't be null."); // if (null == beanProperties) throw new IllegalArgumentException("beanProperties can't be null."); // if (null == beanInstance) throw new IllegalArgumentException("beanInstance can't be null."); // // Class bean_class = beanInstance.getClass(); // // String name_upper = null; // PropertyDescriptor property = null; // Method write_method = null; // Class property_type = null; // // if (propertyNamePrefix != null) // { // if (!propertyName.startsWith(propertyNamePrefix)) // { // return; // } // // propertyName = propertyName.substring(propertyNamePrefix.length()); // } // name_upper = propertyName.toUpperCase(); // // if (beanProperties.containsKey(name_upper)) // { // if (null == emptyBean && // (null == propertyValues || // 0 == propertyValues.length)) // { // return; // } // // property = beanProperties.get(name_upper); // // write_method = property.getWriteMethod(); // if (null == write_method) // { // return; // } // // property_type = property.getPropertyType(); // if (null == property_type) // { // return; // } // // Validated validated = null; // if (beanInstance instanceof Validated) // { // validated = (Validated)beanInstance; // } // // Constrained constrained = ConstrainedUtils.makeConstrainedInstance(beanInstance); // ConstrainedProperty constrained_property = null; // if (constrained != null) // { // constrained_property = constrained.getConstrainedProperty(property.getName()); // } // // try // { // // handle the assignment of empty values to properties // // in case an empty template bean has been provided // if (emptyBean != null && // (null == propertyValues || // 0 == propertyValues.length || // null == propertyValues[0] || // 0 == propertyValues[0].length())) // { // Method read_method = property.getReadMethod(); // Object empty_value = read_method.invoke(emptyBean, (Object[])null); // write_method.invoke(beanInstance, new Object[] {empty_value}); // } // // assign the value normally // else // { // // process an array property // if (property_type.isArray()) // { // Class component_type = property_type.getComponentType(); // if (component_type == String.class) // { // write_method.invoke(beanInstance, new Object[] {propertyValues}); // } // else if (component_type == int.class) // { // int parameter_values_typed[] = new int[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toInt(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toInt(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == Integer.class) // { // Integer parameter_values_typed[] = new Integer[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toInt(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toInt(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == char.class) // { // char parameter_values_typed[] = new char[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // parameter_values_typed[i] = propertyValues[i].charAt(0); // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == Character.class) // { // Character parameter_values_typed[] = new Character[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // parameter_values_typed[i] = new Character(propertyValues[i].charAt(0)); // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == boolean.class) // { // boolean parameter_values_typed[] = new boolean[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // parameter_values_typed[i] = StringUtils.convertToBoolean(propertyValues[i]); // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == Boolean.class) // { // Boolean parameter_values_typed[] = new Boolean[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // parameter_values_typed[i] = Boolean.valueOf(StringUtils.convertToBoolean(propertyValues[i])); // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == byte.class) // { // byte parameter_values_typed[] = new byte[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toByte(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toByte(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == Byte.class) // { // Byte parameter_values_typed[] = new Byte[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toByte(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toByte(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == double.class) // { // double parameter_values_typed[] = new double[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toDouble(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toDouble(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == Double.class) // { // Double parameter_values_typed[] = new Double[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toDouble(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toDouble(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == float.class) // { // float parameter_values_typed[] = new float[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toFloat(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toFloat(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == Float.class) // { // Float parameter_values_typed[] = new Float[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toFloat(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toFloat(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == long.class) // { // long parameter_values_typed[] = new long[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toLong(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toLong(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == Long.class) // { // Long parameter_values_typed[] = new Long[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toLong(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toLong(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == short.class) // { // short parameter_values_typed[] = new short[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toShort(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toShort(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == Short.class) // { // Short parameter_values_typed[] = new Short[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = Convert.toShort(constrained_property.getFormat().parseObject(propertyValues[i])); // } // else // { // parameter_values_typed[i] = Convert.toShort(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == BigDecimal.class) // { // BigDecimal parameter_values_typed[] = new BigDecimal[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_values_typed[i] = new BigDecimal(String.valueOf(constrained_property.getFormat().parseObject(propertyValues[i]))); // } // else // { // parameter_values_typed[i] = new BigDecimal(propertyValues[i]); // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == StringBuffer.class) // { // StringBuffer parameter_values_typed[] = new StringBuffer[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // parameter_values_typed[i] = new StringBuffer(propertyValues[i]); // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (component_type == StringBuilder.class) // { // StringBuilder parameter_values_typed[] = new StringBuilder[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // parameter_values_typed[i] = new StringBuilder(propertyValues[i]); // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (Date.class.isAssignableFrom(component_type)) // { // Format custom_format = null; // if (constrained_property != null && // constrained_property.isFormatted()) // { // custom_format = constrained_property.getFormat(); // } // // try // { // Date parameter_values_typed[] = new Date[propertyValues.length]; // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // Format used_format = null; // // Object parameter_value_typed = null; // if (null == custom_format) // { // try // { // used_format = BeanUtils.getConcisePreciseDateFormat(); // parameter_value_typed = used_format.parseObject(propertyValues[i]); // } // catch (ParseException e) // { // try // { // used_format = RifeConfig.Tools.getDefaultInputDateFormat(); // parameter_value_typed = used_format.parseObject(propertyValues[i]); // } // catch (ParseException e2) // { // throw e; // } // } // } // else // { // used_format = custom_format; // parameter_value_typed = used_format.parseObject(propertyValues[i]); // } // // if (propertyValues[i].equals(used_format.format(parameter_value_typed))) // { // parameter_values_typed[i] = (Date)parameter_value_typed; // } // else // { // if (validated != null) // { // validated.addValidationError(new ValidationError.INVALID(propertyName).erroneousValue(propertyValues[i])); // } // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // catch (ParseException e) // { // if (validated != null) // { // validated.addValidationError(new ValidationError.INVALID(propertyName).erroneousValue(propertyValues[0])); // } // } // } // else if (component_type.isEnum()) // { // Object parameter_values_typed = Array.newInstance(component_type, propertyValues.length); // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // try // { // Array.set(parameter_values_typed, i, Enum.valueOf(component_type, propertyValues[i])); // } // catch (IllegalArgumentException e) // { // // don't throw an exception for this since any invalid copy/paste of an URL // // will give a general exception, just set the value to null and it will // // no be set to the property // if (validated != null) // { // validated.addValidationError(new ValidationError.INVALID(propertyName).erroneousValue(propertyValues[i])); // } // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // else if (Serializable.class.isAssignableFrom(component_type)) // { // Object parameter_values_typed = Array.newInstance(component_type, propertyValues.length); // for (int i = 0; i < propertyValues.length; i++) // { // if (propertyValues[i] != null && propertyValues[i].length() > 0) // { // try // { // Array.set(parameter_values_typed, i, SerializationUtils.deserializeFromString(propertyValues[i])); // } // catch (SerializationUtilsErrorException e) // { // if (validated != null) // { // validated.addValidationError(new ValidationError.INVALID(propertyName).erroneousValue(propertyValues[i])); // } // } // } // } // write_method.invoke(beanInstance, new Object[] {parameter_values_typed}); // } // } // // process an object or a primitive type // else if (propertyValues[0] != null && propertyValues[0].length() > 0) // { // Object parameter_value_typed = null; // if (property_type == String.class) // { // parameter_value_typed = propertyValues[0]; // } // else if (property_type == int.class || // property_type == Integer.class) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_value_typed = Convert.toInt(constrained_property.getFormat().parseObject(propertyValues[0])); // } // else // { // parameter_value_typed = Convert.toInt(propertyValues[0]); // } // } // else if (property_type == char.class || // property_type == Character.class) // { // parameter_value_typed = new Character(propertyValues[0].charAt(0)); // } // else if (property_type == boolean.class || // property_type == Boolean.class) // { // parameter_value_typed = Convert.toBoolean(StringUtils.convertToBoolean(propertyValues[0])); // } // else if (property_type == byte.class || // property_type == Byte.class) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_value_typed = Convert.toByte(constrained_property.getFormat().parseObject(propertyValues[0])); // } // else // { // parameter_value_typed = Convert.toByte(propertyValues[0]); // } // } // else if (property_type == double.class || // property_type == Double.class) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_value_typed = Convert.toDouble(constrained_property.getFormat().parseObject(propertyValues[0])); // } // else // { // parameter_value_typed = Convert.toDouble(propertyValues[0]); // } // } // else if (property_type == float.class || // property_type == Float.class) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_value_typed = Convert.toFloat(constrained_property.getFormat().parseObject(propertyValues[0])); // } // else // { // parameter_value_typed = Convert.toFloat(propertyValues[0]); // } // } // else if (property_type == long.class || // property_type == Long.class) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_value_typed = Convert.toLong(constrained_property.getFormat().parseObject(propertyValues[0])); // } // else // { // parameter_value_typed = Convert.toLong(propertyValues[0]); // } // } // else if (property_type == short.class || // property_type == Short.class) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // parameter_value_typed = Convert.toShort(constrained_property.getFormat().parseObject(propertyValues[0])); // } // else // { // parameter_value_typed = Convert.toShort(propertyValues[0]); // } // } // else if (property_type == BigDecimal.class) // { // if (constrained_property != null && constrained_property.isFormatted()) // { // Number n = (Number)constrained_property.getFormat().parseObject(propertyValues[0]); // parameter_value_typed = new BigDecimal(String.valueOf(n)); // } // else // { // parameter_value_typed = new BigDecimal(propertyValues[0]); // } // } // else if (property_type == StringBuffer.class) // { // parameter_value_typed = new StringBuffer(propertyValues[0]); // } // else if (property_type == StringBuilder.class) // { // parameter_value_typed = new StringBuilder(propertyValues[0]); // } // else if (Date.class.isAssignableFrom(property_type)) // { // Format custom_format = null; // if (constrained_property != null && // constrained_property.isFormatted()) // { // custom_format = constrained_property.getFormat(); // } // // try // { // Format used_format = null; // // if (null == custom_format) // { // try // { // used_format = BeanUtils.getConcisePreciseDateFormat(); // parameter_value_typed = used_format.parseObject(propertyValues[0]); // } // catch (ParseException e) // { // try // { // used_format = RifeConfig.Tools.getDefaultInputDateFormat(); // parameter_value_typed = used_format.parseObject(propertyValues[0]); // } // catch (ParseException e2) // { // throw e; // } // } // } // else // { // used_format = custom_format; // parameter_value_typed = used_format.parseObject(propertyValues[0]); // } // // if (!propertyValues[0].equals(used_format.format(parameter_value_typed))) // { // parameter_value_typed = null; // // if (validated != null) // { // validated.addValidationError(new ValidationError.INVALID(propertyName).erroneousValue(propertyValues[0])); // } // } // } // catch (ParseException e) // { // if (validated != null) // { // validated.addValidationError(new ValidationError.INVALID(propertyName).erroneousValue(propertyValues[0])); // } // } // } // else if (property_type.isEnum()) // { // try // { // parameter_value_typed = Enum.valueOf(property_type, propertyValues[0]); // } // catch (IllegalArgumentException e) // { // parameter_value_typed = null; // // if (validated != null) // { // validated.addValidationError(new ValidationError.INVALID(propertyName).erroneousValue(propertyValues[0])); // } // } // } // else if (Serializable.class.isAssignableFrom(property_type)) // { // try // { // parameter_value_typed = SerializationUtils.deserializeFromString(propertyValues[0]); // } // catch (SerializationUtilsErrorException e) // { // // don't throw an exception for this since any invalid copy/paste of an URL // // will give a general exception, just set the value to null and it will // // no be set to the property // parameter_value_typed = null; // // if (validated != null) // { // validated.addValidationError(new ValidationError.INVALID(propertyName).erroneousValue(propertyValues[0])); // } // } // } // // if (parameter_value_typed != null) // { // write_method.invoke(beanInstance, new Object[] {parameter_value_typed}); // } // } // } // } // catch (ParseException e) // { // if (validated != null) // { // validated.addValidationError(new ValidationError.NOTNUMERIC(propertyName).erroneousValue(propertyValues[0])); // } // else // { // throw new BeanUtilsException("The '"+propertyName+"' property of the bean with class '"+bean_class.getName()+"' couldn't be populated due to a parsing error.", bean_class, e); // } // } // catch (ConversionException e) // { // if (validated != null) // { // validated.addValidationError(new ValidationError.NOTNUMERIC(propertyName).erroneousValue(propertyValues[0])); // } // else // { // throw new BeanUtilsException("The '"+propertyName+"' property of the bean with class '"+bean_class.getName()+"' couldn't be populated due to conversion error.", bean_class, e); // } // } // catch (IllegalAccessException e) // { // throw new BeanUtilsException("No permission to invoke the '"+write_method.getName()+"' method on the bean with class '"+bean_class.getName()+"'.", bean_class, e); // } // catch (IllegalArgumentException e) // { // throw new BeanUtilsException("Invalid arguments while invoking the '"+write_method.getName()+"' method on the bean with class '"+bean_class.getName()+"'.", bean_class, e); // } // catch (InvocationTargetException e) // { // throw new BeanUtilsException("The '"+write_method.getName()+"' method of the bean with class '"+bean_class.getName()+"' has thrown an exception.", bean_class, e); // } // } // } // // /** // * Set the value of a bean property from an uploaded file. // * // * @param propertyName the name of the property // * @param propertyFile the file that will be set, can be <code>null</code> // * @param propertyNamePrefix the prefix that the propertyName parameter // * should have, can be <code>null</code> // * @param beanProperties the map of the uppercased bean property names and // * their descriptors // * @param beanInstance the bean instance whose property should be updated // * @exception com.uwyn.rife.tools.exceptions.BeanUtilsException when an error // * occurred while setting the bean property // * @see #getUppercasedBeanProperties(Class) // * @see #setUppercasedBeanProperty(String, String[], String, Map, Object, Object) // * @since 1.4 // */ // public static void setUppercasedBeanProperty(String propertyName, UploadedFile propertyFile, String propertyNamePrefix, Map<String, PropertyDescriptor> beanProperties, Object beanInstance) // throws BeanUtilsException // { // if (null == propertyName) throw new IllegalArgumentException("propertyName can't be null."); // if (null == beanProperties) throw new IllegalArgumentException("beanProperties can't be null."); // if (null == beanInstance) throw new IllegalArgumentException("beanInstance can't be null."); // // Class bean_class = beanInstance.getClass(); // // String name_upper = null; // PropertyDescriptor property = null; // Method write_method = null; // Class property_type = null; // // if (propertyNamePrefix != null) // { // if (!propertyName.startsWith(propertyNamePrefix)) // { // return; // } // // propertyName = propertyName.substring(propertyNamePrefix.length()); // } // name_upper = propertyName.toUpperCase(); // // if (beanProperties.containsKey(name_upper)) // { // if (null == propertyFile) // { // return; // } // // property = beanProperties.get(name_upper); // // write_method = property.getWriteMethod(); // if (null == write_method) // { // return; // } // // property_type = property.getPropertyType(); // if (null == property_type) // { // return; // } // // Validated validated = null; // if (beanInstance instanceof Validated) // { // validated = (Validated)beanInstance; // } // // Constrained constrained = ConstrainedUtils.makeConstrainedInstance(beanInstance); // // try // { // if (propertyFile.wasSizeExceeded()) // { // if (validated != null) // { // validated.addValidationError(new ValidationError.WRONGLENGTH(propertyName)); // } // } // else // { // Object parameter_value_typed = null; // if (property_type == InputStream.class) // { // parameter_value_typed = new FileInputStream(propertyFile.getFile()); // } // else if (property_type == String.class) // { // parameter_value_typed = FileUtils.readString(propertyFile.getFile()); // } // else if (property_type == byte[].class) // { // parameter_value_typed = FileUtils.readBytes(propertyFile.getFile()); // } // // if (parameter_value_typed != null) // { // if (constrained != null) // { // // fill in the property name automatically if none has been provided // // in the constraints // ConstrainedProperty constrained_property = constrained.getConstrainedProperty(propertyName); // if (constrained_property != null && // propertyFile.getName() != null) // { // if (null == constrained_property.getName()) // { // // if the filename exceeds the maximum length, reduce it intelligently // String file_name = propertyFile.getName(); // if (file_name.length() > 100) // { // int reduction_index; // int min_reduction_index = file_name.length() - 100; // int slash_index = file_name.lastIndexOf('/'); // if (slash_index > min_reduction_index) // { // reduction_index = slash_index+1; // } // else // { // int backslash_index = file_name.lastIndexOf('\\'); // if (backslash_index > min_reduction_index) // { // reduction_index = backslash_index+1; // } // else // { // reduction_index = min_reduction_index; // } // } // file_name = file_name.substring(reduction_index); // } // // constrained_property.setName(file_name); // } // } // } // // write_method.invoke(beanInstance, new Object[] {parameter_value_typed}); // } // } // } // catch (FileUtilsErrorException e) // { // throw new BeanUtilsException("The '"+propertyName+"' property of the bean with class '"+bean_class.getName()+"' couldn't be populated due to an unexpected problem during file reading.", bean_class, e); // } // catch (FileNotFoundException e) // { // throw new BeanUtilsException("The '"+propertyName+"' property of the bean with class '"+bean_class.getName()+"' couldn't be populated due to an unexpected problem during file reading.", bean_class, e); // } // catch (IllegalAccessException e) // { // throw new BeanUtilsException("No permission to invoke the '"+write_method.getName()+"' method on the bean with class '"+bean_class.getName()+"'.", bean_class, e); // } // catch (IllegalArgumentException e) // { // throw new BeanUtilsException("Invalid arguments while invoking the '"+write_method.getName()+"' method on the bean with class '"+bean_class.getName()+"'.", bean_class, e); // } // catch (InvocationTargetException e) // { // throw new BeanUtilsException("The '"+write_method.getName()+"' method of the bean with class '"+bean_class.getName()+"' has thrown an exception.", bean_class, e); // } // } // } static class Accessors extends EnumClass<String> { Accessors(String identifier) { super(identifier); } public static Accessors getMethod(String name) { return getMember(Accessors.class, name); } } }