Example usage for org.apache.commons.beanutils PropertyUtils MAPPED_DELIM2

List of usage examples for org.apache.commons.beanutils PropertyUtils MAPPED_DELIM2

Introduction

In this page you can find the example usage for org.apache.commons.beanutils PropertyUtils MAPPED_DELIM2.

Prototype

char MAPPED_DELIM2

To view the source code for org.apache.commons.beanutils PropertyUtils MAPPED_DELIM2.

Click Source Link

Document

The delimiter that follows the key of a mapped property.

Usage

From source file:nl.strohalm.cyclos.utils.binding.CustomBeanUtilsBean.java

@Override
public void setProperty(final Object bean, String name, final Object value)
        throws IllegalAccessException, InvocationTargetException {

    // Resolve any nested expression to get the actual target bean
    Object target = bean;/*from ww  w. j  av  a 2  s  .  co  m*/
    final int delim = findLastNestedIndex(name);
    if (delim >= 0) {
        try {
            target = getPropertyUtils().getProperty(bean, name.substring(0, delim));
        } catch (final NoSuchMethodException e) {
            return; // Skip this property setter
        }
        name = name.substring(delim + 1);
    }

    // Declare local variables we will require
    String propName = null; // Simple name of target property
    Class<?> type = null; // Java type of target property
    int index = -1; // Indexed subscript value (if any)
    String key = null; // Mapped key value (if any)

    // Calculate the property name, index, and key values
    propName = name;
    final int i = propName.indexOf(PropertyUtils.INDEXED_DELIM);
    if (i >= 0) {
        final int k = propName.indexOf(PropertyUtils.INDEXED_DELIM2);
        try {
            index = Integer.parseInt(propName.substring(i + 1, k));
        } catch (final NumberFormatException e) {
            // Ignore
        }
        propName = propName.substring(0, i);
    }
    final int j = propName.indexOf(PropertyUtils.MAPPED_DELIM);
    if (j >= 0) {
        final int k = propName.indexOf(PropertyUtils.MAPPED_DELIM2);
        try {
            key = propName.substring(j + 1, k);
        } catch (final IndexOutOfBoundsException e) {
            // Ignore
        }
        propName = propName.substring(0, j);
    }

    // Calculate the property type
    if (target instanceof DynaBean) {
        final DynaClass dynaClass = ((DynaBean) target).getDynaClass();
        final DynaProperty dynaProperty = dynaClass.getDynaProperty(propName);
        if (dynaProperty == null) {
            return; // Skip this property setter
        }
        type = dynaProperty.getType();
        if (type.isArray() || Collection.class.isAssignableFrom(type)) {
            type = Object[].class;
        }
    } else {
        PropertyDescriptor descriptor = null;
        try {
            descriptor = getPropertyUtils().getPropertyDescriptor(target, name);
            if (descriptor == null) {
                return; // Skip this property setter
            }
        } catch (final NoSuchMethodException e) {
            return; // Skip this property setter
        }
        if (descriptor instanceof MappedPropertyDescriptor) {
            if (((MappedPropertyDescriptor) descriptor).getMappedWriteMethod() == null) {
                return; // Read-only, skip this property setter
            }
            type = ((MappedPropertyDescriptor) descriptor).getMappedPropertyType();

            /**
             * Overriden behaviour ------------------- When a type is Object on a mapped property, retrieve the value to check if it's an array
             */
            if (Object.class.equals(type)) {
                try {
                    final Object retrieved = getPropertyUtils().getMappedProperty(target, propName, key);
                    if (retrieved != null) {
                        final Class<?> retrievedType = retrieved.getClass();
                        if (retrievedType.isArray() || Collection.class.isAssignableFrom(retrievedType)) {
                            type = Object[].class;
                        }
                    }
                } catch (final NoSuchMethodException e) {
                    throw new PropertyException(target, propName + "(" + key + ")");
                }
            }
        } else if (descriptor instanceof IndexedPropertyDescriptor) {
            if (((IndexedPropertyDescriptor) descriptor).getIndexedWriteMethod() == null) {
                return; // Read-only, skip this property setter
            }
            type = ((IndexedPropertyDescriptor) descriptor).getIndexedPropertyType();
        } else {
            if (descriptor.getWriteMethod() == null) {
                return; // Read-only, skip this property setter
            }
            type = descriptor.getPropertyType();
        }
    }

    /**
     * Overriden behaviour ------------------- When a type is Map on a mapped property, retrieve the value to check if it's an array
     */
    if (Map.class.isAssignableFrom(type) && StringUtils.isNotEmpty(key)) {
        try {
            final Map<?, ?> map = (Map<?, ?>) getPropertyUtils().getProperty(target, propName);
            final Object retrieved = map.get(key);
            if (retrieved != null) {
                final Class<?> retrievedType = retrieved.getClass();
                if (retrievedType.isArray() || Collection.class.isAssignableFrom(retrievedType)) {
                    type = Object[].class;
                }
            }
        } catch (final NoSuchMethodException e) {
            throw new PropertyException(target, propName + "(" + key + ")");
        }
    }

    // Convert the specified value to the required type
    Object newValue = null;
    if (type.isArray() && (index < 0)) { // Scalar value into array
        if (value == null) {
            final String values[] = new String[1];
            values[0] = (String) value;
            newValue = getConvertUtils().convert(values, type);
        } else if (value instanceof String) {
            final String values[] = new String[1];
            values[0] = (String) value;
            newValue = getConvertUtils().convert(values, type);
        } else if (value instanceof String[]) {
            newValue = getConvertUtils().convert((String[]) value, type);
        } else {
            newValue = value;
        }
    } else if (type.isArray()) { // Indexed value into array
        if (value instanceof String) {
            newValue = getConvertUtils().convert((String) value, type.getComponentType());
        } else if (value instanceof String[]) {
            newValue = getConvertUtils().convert(((String[]) value)[0], type.getComponentType());
        } else {
            newValue = value;
        }
    } else { // Value into scalar
        if ((value instanceof String) || (value == null)) {
            newValue = getConvertUtils().convert((String) value, type);
        } else if (value instanceof String[]) {
            newValue = getConvertUtils().convert(((String[]) value)[0], type);
        } else if (getConvertUtils().lookup(value.getClass()) != null) {
            newValue = getConvertUtils().convert(value.toString(), type);
        } else {
            newValue = value;
        }
    }

    // Invoke the setter method
    try {
        if (index >= 0) {
            getPropertyUtils().setIndexedProperty(target, propName, index, newValue);
        } else if (key != null) {
            getPropertyUtils().setMappedProperty(target, propName, key, newValue);
        } else {
            getPropertyUtils().setProperty(target, propName, newValue);
        }
    } catch (final NoSuchMethodException e) {
        throw new InvocationTargetException(e, "Cannot set " + propName);
    }

}

From source file:nl.strohalm.cyclos.utils.binding.CustomBeanUtilsBean.java

private int findLastNestedIndex(final String expression) {
    // walk back from the end to the start
    // and find the first index that
    int bracketCount = 0;
    for (int i = expression.length() - 1; i >= 0; i--) {
        final char at = expression.charAt(i);
        switch (at) {
        case PropertyUtils.NESTED_DELIM:
            if (bracketCount < 1) {
                return i;
            }//w w w.  j  av  a  2 s  . c om
            break;

        case PropertyUtils.MAPPED_DELIM:
        case PropertyUtils.INDEXED_DELIM:
            // not bothered which
            --bracketCount;
            break;

        case PropertyUtils.MAPPED_DELIM2:
        case PropertyUtils.INDEXED_DELIM2:
            // not bothered which
            ++bracketCount;
            break;
        }
    }
    // can't find any
    return -1;
}

From source file:org.displaytag.util.LookupUtil.java

/**
 * <p>/*from w  w  w .jav  a  2 s .  co m*/
 * Returns the value of a property in the given bean.
 * </p>
 * <p>
 * This method is a modificated version from commons-beanutils PropertyUtils.getProperty(). It allows intermediate
 * nulls in expression without throwing exception (es. it doesn't throw an exception for the property
 * <code>object.date.time</code> if <code>date</code> is null)
 * </p>
 * @param bean javabean
 * @param name name of the property to read from the javabean
 * @return Object
 * @throws ObjectLookupException for errors while retrieving a property in the bean
 */
public static Object getBeanProperty(Object bean, String name) throws ObjectLookupException {

    if (log.isDebugEnabled()) {
        log.debug("getProperty [" + name + "] on bean " + bean);
    }

    if (bean == null) {
        throw new IllegalArgumentException("No bean specified");
    }
    if (name == null) {
        throw new IllegalArgumentException("No name specified");
    }

    Object evalBean = bean;
    String evalName = name;

    try {

        int indexOfINDEXEDDELIM;
        int indexOfMAPPEDDELIM;
        int indexOfMAPPEDDELIM2;
        int indexOfNESTEDDELIM;
        while (true) {

            indexOfNESTEDDELIM = evalName.indexOf(PropertyUtils.NESTED_DELIM);
            indexOfMAPPEDDELIM = evalName.indexOf(PropertyUtils.MAPPED_DELIM);
            indexOfMAPPEDDELIM2 = evalName.indexOf(PropertyUtils.MAPPED_DELIM2);
            if (indexOfMAPPEDDELIM2 >= 0 && indexOfMAPPEDDELIM >= 0
                    && (indexOfNESTEDDELIM < 0 || indexOfNESTEDDELIM > indexOfMAPPEDDELIM)) {
                indexOfNESTEDDELIM = evalName.indexOf(PropertyUtils.NESTED_DELIM, indexOfMAPPEDDELIM2);
            } else {
                indexOfNESTEDDELIM = evalName.indexOf(PropertyUtils.NESTED_DELIM);
            }
            if (indexOfNESTEDDELIM < 0) {
                break;
            }
            String next = evalName.substring(0, indexOfNESTEDDELIM);
            indexOfINDEXEDDELIM = next.indexOf(PropertyUtils.INDEXED_DELIM);
            indexOfMAPPEDDELIM = next.indexOf(PropertyUtils.MAPPED_DELIM);
            if (evalBean instanceof Map) {
                evalBean = ((Map) evalBean).get(next);
            } else if (indexOfMAPPEDDELIM >= 0) {

                evalBean = PropertyUtils.getMappedProperty(evalBean, next);

            } else if (indexOfINDEXEDDELIM >= 0) {
                evalBean = PropertyUtils.getIndexedProperty(evalBean, next);
            } else {
                evalBean = PropertyUtils.getSimpleProperty(evalBean, next);
            }

            if (evalBean == null) {
                log.debug("Null property value for '" + evalName.substring(0, indexOfNESTEDDELIM) + "'");
                return null;
            }
            evalName = evalName.substring(indexOfNESTEDDELIM + 1);

        }

        indexOfINDEXEDDELIM = evalName.indexOf(PropertyUtils.INDEXED_DELIM);
        indexOfMAPPEDDELIM = evalName.indexOf(PropertyUtils.MAPPED_DELIM);

        if (evalBean instanceof Map) {
            evalBean = ((Map) evalBean).get(evalName);
        } else if (indexOfMAPPEDDELIM >= 0) {
            evalBean = PropertyUtils.getMappedProperty(evalBean, evalName);
        } else if (indexOfINDEXEDDELIM >= 0) {
            evalBean = PropertyUtils.getIndexedProperty(evalBean, evalName);
        } else {
            evalBean = PropertyUtils.getSimpleProperty(evalBean, evalName);
        }
    } catch (IllegalAccessException e) {
        throw new ObjectLookupException(LookupUtil.class, evalBean, evalName, e);
    }

    catch (InvocationTargetException e) {
        throw new ObjectLookupException(LookupUtil.class, evalBean, evalName, e);
    } catch (NoSuchMethodException e) {
        throw new ObjectLookupException(LookupUtil.class, evalBean, evalName, e);
    }

    return evalBean;

}

From source file:org.gameye.psp.image.utils.TBeanUtilsBean.java

public void copyProperty(Object bean, String name, Object value)
        throws IllegalAccessException, InvocationTargetException {

    // Trace logging (if enabled)
    if (log.isTraceEnabled()) {
        StringBuffer sb = new StringBuffer("  copyProperty(");
        sb.append(bean);//from   w ww .ja  va 2  s  .  c o m
        sb.append(", ");
        sb.append(name);
        sb.append(", ");
        if (value == null) {
            sb.append("<NULL>");
        } else if (value instanceof String) {
            sb.append((String) value);
        } else if (value instanceof String[]) {
            String values[] = (String[]) value;
            sb.append('[');
            for (int i = 0; i < values.length; i++) {
                if (i > 0) {
                    sb.append(',');
                }
                sb.append(values[i]);
            }
            sb.append(']');
        } else {
            sb.append(value.toString());
        }
        sb.append(')');
        log.trace(sb.toString());
    }

    // Resolve any nested expression to get the actual target bean
    Object target = bean;
    int delim = name.lastIndexOf(PropertyUtils.NESTED_DELIM);
    if (delim >= 0) {
        try {
            target = getPropertyUtils().getProperty(bean, name.substring(0, delim));
        } catch (NoSuchMethodException e) {
            return; // Skip this property setter
        }
        name = name.substring(delim + 1);
        if (log.isTraceEnabled()) {
            log.trace("    Target bean = " + target);
            log.trace("    Target name = " + name);
        }
    }

    // Declare local variables we will require
    String propName = null; // Simple name of target property
    Class type = null; // Java type of target property
    int index = -1; // Indexed subscript value (if any)
    String key = null; // Mapped key value (if any)

    // Calculate the target property name, index, and key values
    propName = name;
    int i = propName.indexOf(PropertyUtils.INDEXED_DELIM);
    if (i >= 0) {
        int k = propName.indexOf(PropertyUtils.INDEXED_DELIM2);
        try {
            index = Integer.parseInt(propName.substring(i + 1, k));
        } catch (NumberFormatException e) {
            ;
        }
        propName = propName.substring(0, i);
    }
    int j = propName.indexOf(PropertyUtils.MAPPED_DELIM);
    if (j >= 0) {
        int k = propName.indexOf(PropertyUtils.MAPPED_DELIM2);
        try {
            key = propName.substring(j + 1, k);
        } catch (IndexOutOfBoundsException e) {
            ;
        }
        propName = propName.substring(0, j);
    }

    // Calculate the target property type
    if (target instanceof DynaBean) {
        DynaClass dynaClass = ((DynaBean) target).getDynaClass();
        DynaProperty dynaProperty = dynaClass.getDynaProperty(propName);
        if (dynaProperty == null) {
            return; // Skip this property setter
        }
        type = dynaProperty.getType();
    } else {
        PropertyDescriptor descriptor = null;
        try {
            descriptor = getPropertyUtils().getPropertyDescriptor(target, name);
            if (descriptor == null) {
                return; // Skip this property setter
            }
        } catch (NoSuchMethodException e) {
            return; // Skip this property setter
        }
        type = descriptor.getPropertyType();
        if (type == null) {
            // Most likely an indexed setter on a POJB only
            if (log.isTraceEnabled()) {
                log.trace("    target type for property '" + propName + "' is null, so skipping ths setter");
            }
            return;
        }
    }
    if (log.isTraceEnabled()) {
        log.trace("    target propName=" + propName + ", type=" + type + ", index=" + index + ", key=" + key);
    }

    // Convert the specified value to the required type and store it
    if (index >= 0) { // Destination must be indexed
        Converter converter = getConvertUtils().lookup(type.getComponentType());
        if (converter != null) {
            log.trace("        USING CONVERTER " + converter);
            value = converter.convert(type, value);
        }
        try {
            getPropertyUtils().setIndexedProperty(target, propName, index, value);
        } catch (NoSuchMethodException e) {
            throw new InvocationTargetException(e, "Cannot set " + propName);
        }
    } else if (key != null) { // Destination must be mapped
        // Maps do not know what the preferred data type is,
        // so perform no conversions at all
        // FIXME - should we create or support a TypedMap?
        try {
            getPropertyUtils().setMappedProperty(target, propName, key, value);
        } catch (NoSuchMethodException e) {
            throw new InvocationTargetException(e, "Cannot set " + propName);
        }
    } else { // Destination must be simple
        Converter converter = getConvertUtils().lookup(type);
        if (converter != null) {
            log.trace("        USING CONVERTER " + converter);
            value = converter.convert(type, value);
        }
        try {
            getPropertyUtils().setSimpleProperty(target, propName, value);
        } catch (NoSuchMethodException e) {
            throw new InvocationTargetException(e, "Cannot set " + propName);
        }
    }

}

From source file:org.gameye.psp.image.utils.TBeanUtilsBean.java

/**
 * <p>Set the specified property value, performing type conversions as
 * required to conform to the type of the destination property.</p>
 *
 * <p>If the property is read only then the method returns 
 * without throwing an exception.</p>
 *
 * <p>If <code>null</code> is passed into a property expecting a primitive value,
 * then this will be converted as if it were a <code>null</code> string.</p>
 *
 * <p><strong>WARNING</strong> - The logic of this method is customized
 * to meet the needs of <code>populate()</code>, and is probably not what
 * you want for general property copying with type conversion.  For that
 * purpose, check out the <code>copyProperty()</code> method instead.</p>
 *
 * <p><strong>WARNING</strong> - PLEASE do not modify the behavior of this
 * method without consulting with the Struts developer community.  There
 * are some subtleties to its functionality that are not documented in the
 * Javadoc description above, yet are vital to the way that Struts utilizes
 * this method.</p>/*from w  w w  .  j a v a  2s  .c  o  m*/
 *
 * @param bean Bean on which setting is to be performed
 * @param name Property name (can be nested/indexed/mapped/combo)
 * @param value Value to be set
 *
 * @exception IllegalAccessException if the caller does not have
 *  access to the property accessor method
 * @exception InvocationTargetException if the property accessor method
 *  throws an exception
 */
public void setProperty(Object bean, String name, Object value)
        throws IllegalAccessException, InvocationTargetException {

    // Trace logging (if enabled)
    if (log.isTraceEnabled()) {
        StringBuffer sb = new StringBuffer("  setProperty(");
        sb.append(bean);
        sb.append(", ");
        sb.append(name);
        sb.append(", ");
        if (value == null) {
            sb.append("<NULL>");
        } else if (value instanceof String) {
            sb.append((String) value);
        } else if (value instanceof String[]) {
            String values[] = (String[]) value;
            sb.append('[');
            for (int i = 0; i < values.length; i++) {
                if (i > 0) {
                    sb.append(',');
                }
                sb.append(values[i]);
            }
            sb.append(']');
        } else {
            sb.append(value.toString());
        }
        sb.append(')');
        log.trace(sb.toString());
    }

    // Resolve any nested expression to get the actual target bean
    Object target = bean;
    int delim = findLastNestedIndex(name);
    if (delim >= 0) {
        try {
            target = getPropertyUtils().getProperty(bean, name.substring(0, delim));
        } catch (NoSuchMethodException e) {
            return; // Skip this property setter
        }
        name = name.substring(delim + 1);
        if (log.isTraceEnabled()) {
            log.trace("    Target bean = " + target);
            log.trace("    Target name = " + name);
        }
    }

    // Declare local variables we will require
    String propName = null; // Simple name of target property
    Class type = null; // Java type of target property
    int index = -1; // Indexed subscript value (if any)
    String key = null; // Mapped key value (if any)

    // Calculate the property name, index, and key values
    propName = name;
    int i = propName.indexOf(PropertyUtils.INDEXED_DELIM);
    if (i >= 0) {
        int k = propName.indexOf(PropertyUtils.INDEXED_DELIM2);
        try {
            index = Integer.parseInt(propName.substring(i + 1, k));
        } catch (NumberFormatException e) {
            ;
        }
        propName = propName.substring(0, i);
    }
    int j = propName.indexOf(PropertyUtils.MAPPED_DELIM);
    if (j >= 0) {
        int k = propName.indexOf(PropertyUtils.MAPPED_DELIM2);
        try {
            key = propName.substring(j + 1, k);
        } catch (IndexOutOfBoundsException e) {
            ;
        }
        propName = propName.substring(0, j);
    }

    // Calculate the property type
    if (target instanceof DynaBean) {
        DynaClass dynaClass = ((DynaBean) target).getDynaClass();
        DynaProperty dynaProperty = dynaClass.getDynaProperty(propName);
        if (dynaProperty == null) {
            return; // Skip this property setter
        }
        type = dynaProperty.getType();
    } else {
        PropertyDescriptor descriptor = null;
        try {
            descriptor = getPropertyUtils().getPropertyDescriptor(target, name);
            if (descriptor == null) {
                return; // Skip this property setter
            }
        } catch (NoSuchMethodException e) {
            return; // Skip this property setter
        }
        if (descriptor instanceof MappedPropertyDescriptor) {
            if (((MappedPropertyDescriptor) descriptor).getMappedWriteMethod() == null) {
                if (log.isDebugEnabled()) {
                    log.debug("Skipping read-only property");
                }
                return; // Read-only, skip this property setter
            }
            type = ((MappedPropertyDescriptor) descriptor).getMappedPropertyType();
        } else if (descriptor instanceof IndexedPropertyDescriptor) {
            if (((IndexedPropertyDescriptor) descriptor).getIndexedWriteMethod() == null) {
                if (log.isDebugEnabled()) {
                    log.debug("Skipping read-only property");
                }
                return; // Read-only, skip this property setter
            }
            type = ((IndexedPropertyDescriptor) descriptor).getIndexedPropertyType();
        } else {
            if (descriptor.getWriteMethod() == null) {
                if (log.isDebugEnabled()) {
                    log.debug("Skipping read-only property");
                }
                return; // Read-only, skip this property setter
            }
            type = descriptor.getPropertyType();
        }
    }

    // Convert the specified value to the required type
    Object newValue = null;
    if (type.isArray() && (index < 0)) { // Scalar value into array
        if (value == null) {
            String values[] = new String[1];
            values[0] = (String) value;
            newValue = getConvertUtils().convert((String[]) values, type);
        } else if (value instanceof String) {
            String values[] = new String[1];
            values[0] = (String) value;
            newValue = getConvertUtils().convert((String[]) values, type);
        } else if (value instanceof String[]) {
            newValue = getConvertUtils().convert((String[]) value, type);
        } else {
            newValue = value;
        }
    } else if (type.isArray()) { // Indexed value into array
        if (value instanceof String) {
            newValue = getConvertUtils().convert((String) value, type.getComponentType());
        } else if (value instanceof String[]) {
            newValue = getConvertUtils().convert(((String[]) value)[0], type.getComponentType());
        } else {
            newValue = value;
        }
    } else { // Value into scalar
        if ((value instanceof String) || (value == null)) {
            newValue = getConvertUtils().convert((String) value, type);
        } else if (value instanceof String[]) {
            newValue = getConvertUtils().convert(((String[]) value)[0], type);
        } else if (getConvertUtils().lookup(value.getClass()) != null) {
            newValue = getConvertUtils().convert(value.toString(), type);
        } else {
            newValue = value;
        }
    }

    // Invoke the setter method
    try {
        if (index >= 0) {
            getPropertyUtils().setIndexedProperty(target, propName, index, newValue);
        } else if (key != null) {
            getPropertyUtils().setMappedProperty(target, propName, key, newValue);
        } else {
            getPropertyUtils().setProperty(target, propName, newValue);
        }
    } catch (NoSuchMethodException e) {
        throw new InvocationTargetException(e, "Cannot set " + propName);
    }

}

From source file:org.gameye.psp.image.utils.TBeanUtilsBean.java

private int findLastNestedIndex(String expression) {
    // walk back from the end to the start 
    // and find the first index that 
    int bracketCount = 0;
    for (int i = expression.length() - 1; i >= 0; i--) {
        char at = expression.charAt(i);
        switch (at) {
        case PropertyUtils.NESTED_DELIM:
            if (bracketCount < 1) {
                return i;
            }//w  ww .ja  v  a 2s.c o  m
            break;

        case PropertyUtils.MAPPED_DELIM:
        case PropertyUtils.INDEXED_DELIM:
            // not bothered which
            --bracketCount;
            break;

        case PropertyUtils.MAPPED_DELIM2:
        case PropertyUtils.INDEXED_DELIM2:
            // not bothered which
            ++bracketCount;
            break;
        }
    }
    // can't find any
    return -1;
}

From source file:org.kuali.rice.kns.web.struts.form.pojo.PojoPropertyUtilsBean.java

private int findNextNestedIndex(String expression) {
    // walk back from the end to the start
    // and find the first index that
    int bracketCount = 0;
    for (int i = 0, size = expression.length(); i < size; i++) {
        char at = expression.charAt(i);
        switch (at) {
        case PropertyUtils.NESTED_DELIM:
            if (bracketCount < 1) {
                return i;
            }/*from   w ww.ja  v a2 s . c o  m*/
            break;

        case PropertyUtils.MAPPED_DELIM:
        case PropertyUtils.INDEXED_DELIM:
            // not bothered which
            ++bracketCount;
            break;

        case PropertyUtils.MAPPED_DELIM2:
        case PropertyUtils.INDEXED_DELIM2:
            // not bothered which
            --bracketCount;
            break;
        }
    }
    // can't find any
    return -1;
}

From source file:utils.beanUtils.JIMBeanUtilsBean.java

/**
 * /*from  www  .j a  v  a2  s.c o m*/
 * ------
 * MODIFIED METHOD, THIS JAVADOC IS NOT COMPLETE
 * ------
 * 
 * <p>Copy the specified property value to the specified destination bean,
 * performing any type conversion that is required.  If the specified
 * bean does not have a property of the specified name, or the property
 * is read only on the destination bean, return without
 * doing anything.  If you have custom destination property types, register
 * {@link Converter}s for them by calling the <code>register()</code>
 * method of {@link ConvertUtils}.</p>
 *
 * <p><strong>IMPLEMENTATION RESTRICTIONS</strong>:</p>
 * <ul>
 * <li>Does not support destination properties that are indexed,
 *     but only an indexed setter (as opposed to an array setter)
 *     is available.</li>
 * <li>Does not support destination properties that are mapped,
 *     but only a keyed setter (as opposed to a Map setter)
 *     is available.</li>
 * <li>The desired property type of a mapped setter cannot be
 *     determined (since Maps support any data type), so no conversion
 *     will be performed.</li>
 * </ul>
 *
 * @param bean Bean on which setting is to be performed
 * @param name Property name (can be nested/indexed/mapped/combo)
 * @param value Value to be set
 *
 * @exception IllegalAccessException if the caller does not have
 *  access to the property accessor method
 * @exception InvocationTargetException if the property accessor method
 *  throws an exception
 */
protected void copyProperty(Object bean, String name, Object value)
        throws IllegalAccessException, InvocationTargetException {

    // Trace logging (if enabled)
    if (log.isTraceEnabled()) {
        StringBuffer sb = new StringBuffer("  copyProperty(");
        sb.append(bean);
        sb.append(", ");
        sb.append(name);
        sb.append(", ");
        if (value == null) {
            sb.append("<NULL>");
        } else if (value instanceof String) {
            sb.append((String) value);
        } else if (value instanceof String[]) {
            String values[] = (String[]) value;
            sb.append('[');
            for (int i = 0; i < values.length; i++) {
                if (i > 0) {
                    sb.append(',');
                }
                sb.append(values[i]);
            }
            sb.append(']');
        } else {
            sb.append(value.toString());
        }
        sb.append(')');
        log.trace(sb.toString());
    }

    //TODO: form here to next 'TODO' the code has not been revised

    // Resolve any nested expression to get the actual target bean
    Object target = bean;
    int delim = name.lastIndexOf(PropertyUtils.NESTED_DELIM);
    if (delim >= 0) {
        try {
            target = getPropertyUtils().getProperty(bean, name.substring(0, delim));
        } catch (NoSuchMethodException e) {
            return; // Skip this property setter
        }
        name = name.substring(delim + 1);
        if (log.isTraceEnabled()) {
            log.trace("    Target bean = " + target);
            log.trace("    Target name = " + name);
        }
    }

    // Declare local variables we will require
    String propName = null; // Simple name of target property
    Class type = null; // Java type of target property
    int index = -1; // Indexed subscript value (if any)
    String key = null; // Mapped key value (if any)

    // Calculate the target property name, index, and key values
    propName = name;
    int i = propName.indexOf(PropertyUtils.INDEXED_DELIM);
    if (i >= 0) {
        int k = propName.indexOf(PropertyUtils.INDEXED_DELIM2);
        try {
            index = Integer.parseInt(propName.substring(i + 1, k));
        } catch (NumberFormatException e) {
            ;
        }
        propName = propName.substring(0, i);
    }
    int j = propName.indexOf(PropertyUtils.MAPPED_DELIM);
    if (j >= 0) {
        int k = propName.indexOf(PropertyUtils.MAPPED_DELIM2);
        try {
            key = propName.substring(j + 1, k);
        } catch (IndexOutOfBoundsException e) {
            ;
        }
        propName = propName.substring(0, j);
    }

    //TODO: until here (from last 'TODO') the code has not been revised

    // Calculate the target property type
    if (target instanceof DynaBean) {
        throw new IllegalArgumentException("this method can not work with DynaBean");
    } else {
        PropertyDescriptor descriptor = null;
        try {
            descriptor = getPropertyUtils().getPropertyDescriptor(target, name);
            if (descriptor == null) {
                return; // Skip this property setter
            }
        } catch (NoSuchMethodException e) {
            return; // Skip this property setter
        }
        type = descriptor.getPropertyType();
        if (type == null) {
            // Most likely an indexed setter on a POJB only
            if (log.isTraceEnabled()) {
                log.trace("    target type for property '" + propName + "' is null, so skipping ths setter");
            }
            return;
        }
    }
    if (log.isTraceEnabled()) {
        log.trace("    target propName=" + propName + ", type=" + type + ", index=" + index + ", key=" + key);
    }

    //TODO: form here to next 'TODO' the code has not been revised
    // Convert the specified value to the required type and store it
    if (index >= 0) { // Destination must be indexed
        Converter converter = getConvertUtils().lookup(type.getComponentType());
        if (converter != null) {
            log.trace("        USING CONVERTER " + converter);
            value = converter.convert(type, value);
        }
        try {
            getPropertyUtils().setIndexedProperty(target, propName, index, value);
        } catch (NoSuchMethodException e) {
            throw new InvocationTargetException(e, "Cannot set " + propName);
        }
    } else if (key != null) { // Destination must be mapped
        // Maps do not know what the preferred data type is,
        // so perform no conversions at all
        // FIXME - should we create or support a TypedMap?
        try {
            getPropertyUtils().setMappedProperty(target, propName, key, value);
        } catch (NoSuchMethodException e) {
            throw new InvocationTargetException(e, "Cannot set " + propName);
        }
        // TODO: until here (from last 'TODO') the code has not been revised
    } else {

        if (isFromPojoCopy() && !Persistent.class.isInstance(value) && !NonPersistent.class.isInstance(value)) {
            try {
                Object oldValue = getPropertyUtils().getProperty(target, propName);
                if (!(oldValue == null
                        || (String.class.isInstance(oldValue) && ((String) oldValue).equalsIgnoreCase("")))) {
                    //                   log.error("****** (1) comprobar si hay que quitar estas lneas de cdigo, ver diagnet *****");
                    return;
                }
            } catch (NoSuchMethodException e2) {

            }
        }
        // Destination must be simple
        Converter converter = getConvertUtils().lookup(type);
        if (converter != null) {
            log.trace("        USING CONVERTER " + converter);
            if (propName.equals("year")) {
                //chapuza para que los aos no salgan formateados
                value = value.toString();
            } else {
                value = converter.convert(type, value);
            }
        }
        try {

            getPropertyUtils().setSimpleProperty(target, propName, value);
        } catch (Exception e) {
            try {
                //it is not a simple property, so it should be recursivelly copied
                Object originalValue = getPropertyUtils().getProperty(target, propName);
                if (originalValue == null) {
                    //if it is null it should be created
                    Class clazz = getPropertyUtils().getPropertyType(target, propName);
                    originalValue = clazz.newInstance();
                    getPropertyUtils().setProperty(target, propName, originalValue);
                }

                if (target instanceof bussineslogic.objects.Personal) {
                    if (name.equals("country") && (originalValue instanceof bussineslogic.objects.Country)
                            && (value instanceof presentation.formbeans.objects.Country_IDForm)) {
                        bussineslogic.objects.Country newCountry = new bussineslogic.objects.Country();
                        newCountry.setCode(
                                ((presentation.formbeans.objects.Country_IDForm) value).getCountrycode());
                        ((bussineslogic.objects.Personal) target).setCountry(newCountry);
                    } else if (name.equals("birth_country")
                            && (originalValue instanceof bussineslogic.objects.Country)
                            && (value instanceof presentation.formbeans.objects.Country_IDForm)) {
                        bussineslogic.objects.Country newCountry = new bussineslogic.objects.Country();
                        newCountry.setCode(
                                ((presentation.formbeans.objects.Country_IDForm) value).getCountrycode());
                        ((bussineslogic.objects.Personal) target).setBirth_country(newCountry);
                    } else if (name.equals("end_of_contract_country")
                            && (originalValue instanceof bussineslogic.objects.Country)
                            && (value instanceof presentation.formbeans.objects.Country_IDForm)) {
                        bussineslogic.objects.Country newCountry = new bussineslogic.objects.Country();
                        newCountry.setCode(
                                ((presentation.formbeans.objects.Country_IDForm) value).getCountrycode());
                        ((bussineslogic.objects.Personal) target).setEnd_of_contract_country(newCountry);
                    } else if (name.equals("nationality")
                            && (originalValue instanceof bussineslogic.objects.Nationality)
                            && (value instanceof presentation.formbeans.objects.Nationality_IDForm)) {
                        bussineslogic.objects.Nationality newNationality = new bussineslogic.objects.Nationality();
                        newNationality.setCode(((presentation.formbeans.objects.Nationality_IDForm) value)
                                .getNationalitycode());
                        ((bussineslogic.objects.Personal) target).setNationality(newNationality);
                    } else if (name.equals("nationality_2")
                            && (originalValue instanceof bussineslogic.objects.Nationality)
                            && (value instanceof presentation.formbeans.objects.Nationality_IDForm)) {
                        bussineslogic.objects.Nationality newNationality = new bussineslogic.objects.Nationality();
                        newNationality.setCode(((presentation.formbeans.objects.Nationality_IDForm) value)
                                .getNationalitycode());
                        ((bussineslogic.objects.Personal) target).setNationality_2(newNationality);
                    } else {
                        copyProperties(originalValue, value);
                    }
                } else if (target instanceof bussineslogic.objects.Alumni_personal) {
                    if (name.equals("nationality")
                            && (originalValue instanceof bussineslogic.objects.Nationality)
                            && (value instanceof presentation.formbeans.objects.Nationality_IDForm)) {
                        bussineslogic.objects.Nationality newNationality = new bussineslogic.objects.Nationality();
                        newNationality.setCode(((presentation.formbeans.objects.Nationality_IDForm) value)
                                .getNationalitycode());
                        ((bussineslogic.objects.Alumni_personal) target).setNationality(newNationality);
                    } else if (name.equals("nationality_2")
                            && (originalValue instanceof bussineslogic.objects.Nationality)
                            && (value instanceof presentation.formbeans.objects.Nationality_IDForm)) {
                        bussineslogic.objects.Nationality newNationality = new bussineslogic.objects.Nationality();
                        newNationality.setCode(((presentation.formbeans.objects.Nationality_IDForm) value)
                                .getNationalitycode());
                        ((bussineslogic.objects.Alumni_personal) target).setNationality_2(newNationality);
                    } else {
                        copyProperties(originalValue, value);
                    }
                } else if (target instanceof bussineslogic.objects.Professional) {
                    if (name.equals("payroll_institution")
                            && (originalValue instanceof bussineslogic.objects.Payroll_institution)
                            && (value instanceof presentation.formbeans.objects.Payroll_institution_IDForm)) {
                        bussineslogic.objects.Payroll_institution newInstitution = new bussineslogic.objects.Payroll_institution();
                        newInstitution
                                .setCode(((presentation.formbeans.objects.Payroll_institution_IDForm) value)
                                        .getPayroll_institutioncode());
                        ((bussineslogic.objects.Professional) target).setPayroll_institution(newInstitution);
                    } else if (name.equals("payroll_institution_2")
                            && (originalValue instanceof bussineslogic.objects.Payroll_institution)
                            && (value instanceof presentation.formbeans.objects.Payroll_institution_IDForm)) {
                        bussineslogic.objects.Payroll_institution newInstitution = new bussineslogic.objects.Payroll_institution();
                        newInstitution
                                .setCode(((presentation.formbeans.objects.Payroll_institution_IDForm) value)
                                        .getPayroll_institutioncode());
                        ((bussineslogic.objects.Professional) target).setPayroll_institution_2(newInstitution);
                    } else if (name.equals("professional_unit")
                            && (originalValue instanceof bussineslogic.objects.Unit)
                            && (value instanceof presentation.formbeans.objects.Unit_IDForm)) {
                        bussineslogic.objects.Unit newUnit = new bussineslogic.objects.Unit();
                        newUnit.setCode(((presentation.formbeans.objects.Unit_IDForm) value).getUnitcode());
                        ((bussineslogic.objects.Professional) target).setProfessional_unit(newUnit);
                    } else if (name.equals("professional_unit_3")
                            && (originalValue instanceof bussineslogic.objects.Unit)
                            && (value instanceof presentation.formbeans.objects.Unit_IDForm)) {
                        bussineslogic.objects.Unit newUnit = new bussineslogic.objects.Unit();
                        newUnit.setCode(((presentation.formbeans.objects.Unit_IDForm) value).getUnitcode());
                        ((bussineslogic.objects.Professional) target).setProfessional_unit_3(newUnit);
                    } else if (name.equals("professional_unit_4")
                            && (originalValue instanceof bussineslogic.objects.Unit)
                            && (value instanceof presentation.formbeans.objects.Unit_IDForm)) {
                        bussineslogic.objects.Unit newUnit = new bussineslogic.objects.Unit();
                        newUnit.setCode(((presentation.formbeans.objects.Unit_IDForm) value).getUnitcode());
                        ((bussineslogic.objects.Professional) target).setProfessional_unit_4(newUnit);
                    } else if (name.equals("research_group")
                            && (originalValue instanceof bussineslogic.objects.Research_group)
                            && (value instanceof presentation.formbeans.objects.Research_group_IDForm)) {
                        bussineslogic.objects.Research_group newResearchGroup = new bussineslogic.objects.Research_group();
                        newResearchGroup.setCode(((presentation.formbeans.objects.Research_group_IDForm) value)
                                .getResearch_groupcode());
                        ((bussineslogic.objects.Professional) target).setResearch_group(newResearchGroup);
                    } else if (name.equals("research_group_2")
                            && (originalValue instanceof bussineslogic.objects.Research_group)
                            && (value instanceof presentation.formbeans.objects.Research_group_IDForm)) {
                        bussineslogic.objects.Research_group newResearchGroup = new bussineslogic.objects.Research_group();
                        newResearchGroup.setCode(((presentation.formbeans.objects.Research_group_IDForm) value)
                                .getResearch_groupcode());
                        ((bussineslogic.objects.Professional) target).setResearch_group_2(newResearchGroup);
                    } else if (name.equals("research_group_3")
                            && (originalValue instanceof bussineslogic.objects.Research_group)
                            && (value instanceof presentation.formbeans.objects.Research_group_IDForm)) {
                        bussineslogic.objects.Research_group newResearchGroup = new bussineslogic.objects.Research_group();
                        newResearchGroup.setCode(((presentation.formbeans.objects.Research_group_IDForm) value)
                                .getResearch_groupcode());
                        ((bussineslogic.objects.Professional) target).setResearch_group_3(newResearchGroup);
                    } else if (name.equals("research_group_4")
                            && (originalValue instanceof bussineslogic.objects.Research_group)
                            && (value instanceof presentation.formbeans.objects.Research_group_IDForm)) {
                        bussineslogic.objects.Research_group newResearchGroup = new bussineslogic.objects.Research_group();
                        newResearchGroup.setCode(((presentation.formbeans.objects.Research_group_IDForm) value)
                                .getResearch_groupcode());
                        ((bussineslogic.objects.Professional) target).setResearch_group_4(newResearchGroup);
                    } else {
                        copyProperties(originalValue, value);
                    }
                } else {
                    copyProperties(originalValue, value);
                }
            } catch (Exception e1) {
                throw new InvocationTargetException(e, "Cannot get " + propName + " of " + target);
            }
        }
    }

}

From source file:utils.beanUtils.JIMBeanUtilsBean.java

/**
 * <p>Set the specified property value, performing type conversions as
 * required to conform to the type of the destination property.</p>
 *
 * <p>If the property is read only then the method returns 
 * without throwing an exception.</p>
 *
 * <p>If <code>null</code> is passed into a property expecting a primitive value,
 * then this will be converted as if it were a <code>null</code> string.</p>
 *
 * <p><strong>WARNING</strong> - The logic of this method is customized
 * to meet the needs of <code>populate()</code>, and is probably not what
 * you want for general property copying with type conversion.  For that
 * purpose, check out the <code>copyProperty()</code> method instead.</p>
 *
 * <p><strong>WARNING</strong> - PLEASE do not modify the behavior of this
 * method without consulting with the Struts developer community.  There
 * are some subtleties to its functionality that are not documented in the
 * Javadoc description above, yet are vital to the way that Struts utilizes
 * this method.</p>//from w  w w  . j  av  a  2  s  . com
 *
 * @param bean Bean on which setting is to be performed
 * @param name Property name (can be nested/indexed/mapped/combo)
 * @param value Value to be set
 *
 * @exception IllegalAccessException if the caller does not have
 *  access to the property accessor method
 * @exception InvocationTargetException if the property accessor method
 *  throws an exception
 */
protected void setProperty(Object bean, String name, Object value)
        throws IllegalAccessException, InvocationTargetException {

    // Trace logging (if enabled)
    if (log.isTraceEnabled()) {
        StringBuffer sb = new StringBuffer("  setProperty(");
        sb.append(bean);
        sb.append(", ");
        sb.append(name);
        sb.append(", ");
        if (value == null) {
            sb.append("<NULL>");
        } else if (value instanceof String) {
            sb.append((String) value);
        } else if (value instanceof String[]) {
            String values[] = (String[]) value;
            sb.append('[');
            for (int i = 0; i < values.length; i++) {
                if (i > 0) {
                    sb.append(',');
                }
                sb.append(values[i]);
            }
            sb.append(']');
        } else {
            sb.append(value.toString());
        }
        sb.append(')');
        log.trace(sb.toString());
    }

    // Resolve any nested expression to get the actual target bean
    Object target = bean;
    int delim = findLastNestedIndex(name);
    if (delim >= 0) {
        try {
            target = getPropertyUtils().getProperty(bean, name.substring(0, delim));
        } catch (NoSuchMethodException e) {
            return; // Skip this property setter
        }
        name = name.substring(delim + 1);
        if (log.isTraceEnabled()) {
            log.trace("    Target bean = " + target);
            log.trace("    Target name = " + name);
        }
    }

    // Declare local variables we will require
    String propName = null; // Simple name of target property
    Class type = null; // Java type of target property
    int index = -1; // Indexed subscript value (if any)
    String key = null; // Mapped key value (if any)

    // Calculate the property name, index, and key values
    propName = name;
    int i = propName.indexOf(PropertyUtils.INDEXED_DELIM);
    if (i >= 0) {
        int k = propName.indexOf(PropertyUtils.INDEXED_DELIM2);
        try {
            index = Integer.parseInt(propName.substring(i + 1, k));
        } catch (NumberFormatException e) {
            ;
        }
        propName = propName.substring(0, i);
    }
    int j = propName.indexOf(PropertyUtils.MAPPED_DELIM);
    if (j >= 0) {
        int k = propName.indexOf(PropertyUtils.MAPPED_DELIM2);
        try {
            key = propName.substring(j + 1, k);
        } catch (IndexOutOfBoundsException e) {
            ;
        }
        propName = propName.substring(0, j);
    }

    // Calculate the property type
    if (target instanceof DynaBean) {
        DynaClass dynaClass = ((DynaBean) target).getDynaClass();
        DynaProperty dynaProperty = dynaClass.getDynaProperty(propName);
        if (dynaProperty == null) {
            return; // Skip this property setter
        }
        type = dynaProperty.getType();
    } else {
        PropertyDescriptor descriptor = null;
        try {
            descriptor = getPropertyUtils().getPropertyDescriptor(target, name);
            if (descriptor == null) {
                return; // Skip this property setter
            }
        } catch (NoSuchMethodException e) {
            return; // Skip this property setter
        }
        if (descriptor instanceof MappedPropertyDescriptor) {
            if (((MappedPropertyDescriptor) descriptor).getMappedWriteMethod() == null) {
                if (log.isDebugEnabled()) {
                    log.debug("Skipping read-only property");
                }
                return; // Read-only, skip this property setter
            }
            type = ((MappedPropertyDescriptor) descriptor).getMappedPropertyType();
        } else if (descriptor instanceof IndexedPropertyDescriptor) {
            if (((IndexedPropertyDescriptor) descriptor).getIndexedWriteMethod() == null) {
                if (log.isDebugEnabled()) {
                    log.debug("Skipping read-only property");
                }
                return; // Read-only, skip this property setter
            }
            type = ((IndexedPropertyDescriptor) descriptor).getIndexedPropertyType();
        } else {
            if (descriptor.getWriteMethod() == null) {
                if (log.isDebugEnabled()) {
                    log.debug("Skipping read-only property");
                }
                return; // Read-only, skip this property setter
            }
            type = descriptor.getPropertyType();
        }
    }

    // Convert the specified value to the required type
    Object newValue = null;
    if (type.isArray() && (index < 0)) { // Scalar value into array
        if (value == null) {
            String values[] = new String[1];
            values[0] = (String) value;
            newValue = getConvertUtils().convert((String[]) values, type);
        } else if (value instanceof String) {
            String values[] = new String[1];
            values[0] = (String) value;
            newValue = getConvertUtils().convert((String[]) values, type);
        } else if (value instanceof String[]) {
            newValue = getConvertUtils().convert((String[]) value, type);
        } else {
            newValue = value;
        }
    } else if (type.isArray()) { // Indexed value into array
        if (value instanceof String) {
            newValue = getConvertUtils().convert((String) value, type.getComponentType());
        } else if (value instanceof String[]) {
            newValue = getConvertUtils().convert(((String[]) value)[0], type.getComponentType());
        } else {
            newValue = value;
        }
    } else { // Value into scalar
        if ((value instanceof String) || (value == null)) {
            newValue = getConvertUtils().convert((String) value, type);
        } else if (value instanceof String[]) {
            newValue = getConvertUtils().convert(((String[]) value)[0], type);
        } else if (getConvertUtils().lookup(value.getClass()) != null) {
            newValue = getConvertUtils().convert(value.toString(), type);
        } else {
            newValue = value;
        }
    }

    // Invoke the setter method
    try {
        if (index >= 0) {
            getPropertyUtils().setIndexedProperty(target, propName, index, newValue);
        } else if (key != null) {
            getPropertyUtils().setMappedProperty(target, propName, key, newValue);
        } else {
            getPropertyUtils().setProperty(target, propName, newValue);
        }
    } catch (NoSuchMethodException e) {
        throw new InvocationTargetException(e, "Cannot set " + propName);
    }

}