com.mb.framework.util.property.PropertyUtilExt.java Source code

Java tutorial

Introduction

Here is the source code for com.mb.framework.util.property.PropertyUtilExt.java

Source

/**
 * Copyright (C) 2013 Company. All Rights Reserved. 
 * 
 * This software is the proprietary information of Company . 
 * Use is subjected to license terms. 
 *
 * @since Jul 17, 2013 11:47:15 PM
 * @author SPA
    
 *
 */
/**
 * 
 */
package com.mb.framework.util.property;

import java.beans.PropertyDescriptor;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.sql.Blob;
import java.text.SimpleDateFormat;

import org.apache.commons.beanutils.PropertyUtils;

import com.mb.framework.util.DateTimeConstants;

/**
 * @author SPA
 * 
 */
public class PropertyUtilExt {
    private static final int READ_BUFFER_LENGTH = 2048; // 2Kb

    private static final SimpleDateFormat TIMESTAMP_FORMATTER = new SimpleDateFormat(
            DateTimeConstants.DATE_PATTERN_LONG_YEAR);

    private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat(
            DateTimeConstants.DATE_PATTERN_LONG_YEAR);

    private static final SimpleDateFormat TIME_FORMATTER = new SimpleDateFormat("HHH:mm:ss");

    /**
     * Copy property values from the origin bean to the destination bean for all
     * cases where the property names are the same. For each property, a
     * conversion is attempted as necessary. All combinations of standard
     * JavaBeans and DynaBeans as origin and destination are supported.
     * Properties that exist in the origin bean, but do not exist in the
     * destination bean (or are read-only in the destination bean) are silently
     * ignored.
     * <p>
     * In addition to the method with the same name in the
     * <code>org.apache.commons.beanutils.PropertyUtils</code> class this method
     * can also copy properties of the following types:
     * <ul>
     * <li>java.lang.Integer</li>
     * <li>java.lang.Double</li>
     * <li>java.lang.Long</li>
     * <li>java.lang.Short</li>
     * <li>java.lang.Float</li>
     * <li>java.lang.String</li>
     * <li>java.lang.Boolean</li>
     * <li>java.sql.Date</li>
     * <li>java.sql.Time</li>
     * <li>java.sql.Timestamp</li>
     * <li>java.math.BigDecimal</li>
     * <li>a container-managed relations field.</li>
     * </ul>
     * 
     * @param dest
     *            Destination bean whose properties are modified
     * @param orig
     *            Origin bean whose properties are retrieved
     * @throws IllegalAccessException
     *             if the caller does not have access to the property accessor
     *             method
     * @throws InvocationTargetException
     *             if the property accessor method throws an exception
     * @throws NoSuchMethodException
     *             if an accessor method for this propety cannot be found
     * @throws ClassNotFoundException
     *             if an incorrect relations class mapping exists.
     * @throws InstantiationException
     *             if an object of the mapped relations class can not be
     *             constructed.
     */
    public static void copyProperties(Object dest, Object orig)
            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException, Exception {
        PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(orig);

        for (int i = 0; i < origDescriptors.length; i++) {
            String name = origDescriptors[i].getName();

            if (PropertyUtils.getPropertyDescriptor(dest, name) != null) {
                Object origValue = PropertyUtils.getSimpleProperty(orig, name);
                String origParamType = origDescriptors[i].getPropertyType().getName();
                try {
                    // edited
                    // if (origValue == null)throw new NullPointerException();

                    PropertyUtils.setSimpleProperty(dest, name, origValue);
                } catch (Exception e) {
                    try {
                        String destParamType = PropertyUtils.getPropertyType(dest, name).getName();

                        if (origValue instanceof String) {
                            if (destParamType.equals("java.lang.Integer")) {
                                Integer intValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    intValue = new Integer(sValue);
                                }
                                PropertyUtils.setSimpleProperty(dest, name, intValue);
                            } else if (destParamType.equals("java.lang.Byte")) {
                                Byte byteValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    byteValue = new Byte(sValue);
                                }
                                PropertyUtils.setSimpleProperty(dest, name, byteValue);
                            } else if (destParamType.equals("java.lang.Double")) {
                                Double doubleValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    doubleValue = new Double(sValue);
                                }
                                PropertyUtils.setSimpleProperty(dest, name, doubleValue);
                            } else if (destParamType.equals("java.lang.Long")) {
                                Long longValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    longValue = new Long(sValue);
                                }
                                PropertyUtils.setSimpleProperty(dest, name, longValue);
                            } else if (destParamType.equals("java.lang.Short")) {
                                Short shortValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    shortValue = new Short(sValue);
                                }
                                PropertyUtils.setSimpleProperty(dest, name, shortValue);
                            } else if (destParamType.equals("java.lang.Float")) {
                                Float floatValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    floatValue = new Float(sValue);
                                }
                                PropertyUtils.setSimpleProperty(dest, name, floatValue);
                            } else if (destParamType.equals("java.sql.Date")) {
                                java.sql.Date dateValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    dateValue = new java.sql.Date(DATE_FORMATTER.parse(sValue).getTime());
                                }
                                PropertyUtils.setSimpleProperty(dest, name, dateValue);
                            } else if (destParamType.equals("java.sql.Time")) {
                                java.sql.Time dateValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    dateValue = new java.sql.Time(TIME_FORMATTER.parse(sValue).getTime());
                                }
                                PropertyUtils.setSimpleProperty(dest, name, dateValue);
                            } else if (destParamType.equals("java.sql.Timestamp")) {
                                java.sql.Timestamp dateValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    dateValue = new java.sql.Timestamp(TIMESTAMP_FORMATTER.parse(sValue).getTime());
                                }
                                PropertyUtils.setSimpleProperty(dest, name, dateValue);
                            } else if (destParamType.equals("java.lang.Boolean")) {
                                Boolean bValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    bValue = Boolean.valueOf(sValue);
                                }
                                PropertyUtils.setSimpleProperty(dest, name, bValue);
                            } else if (destParamType.equals("java.math.BigDecimal")) {
                                BigDecimal bdValue = null;
                                String sValue = ((String) origValue).trim();

                                if (sValue.length() > 0) {
                                    bdValue = new BigDecimal(sValue);
                                }
                                PropertyUtils.setSimpleProperty(dest, name, bdValue);
                            }
                        } else if ((origValue != null) && (destParamType.equals("java.lang.String"))) {
                            // we're transferring a business-layer value object
                            // into a String-based Struts form bean..
                            if ("java.sql.Date".equals(origParamType)) {
                                PropertyUtils.setSimpleProperty(dest, name, DATE_FORMATTER.format(origValue));
                            } else if ("java.sql.Timestamp".equals(origParamType)) {
                                PropertyUtils.setSimpleProperty(dest, name, TIMESTAMP_FORMATTER.format(origValue));
                            } else if ("java.sql.Blob".equals(origParamType)) {
                                // convert a Blob to a String..
                                Blob blob = (Blob) origValue;
                                BufferedInputStream bin = null;
                                try {
                                    int bytesRead;
                                    StringBuffer result = new StringBuffer();
                                    byte[] buffer = new byte[READ_BUFFER_LENGTH];
                                    bin = new BufferedInputStream(blob.getBinaryStream());
                                    do {
                                        bytesRead = bin.read(buffer);
                                        if (bytesRead != -1) {
                                            result.append(new String(buffer, 0, bytesRead));
                                        }
                                    } while (bytesRead == READ_BUFFER_LENGTH);

                                    PropertyUtils.setSimpleProperty(dest, name, result.toString());

                                } finally {
                                    if (bin != null)
                                        try {
                                            bin.close();
                                        } catch (IOException ignored) {
                                        }
                                }

                            } else {
                                PropertyUtils.setSimpleProperty(dest, name, origValue.toString());
                            }
                        }
                    } catch (Exception e2) {
                        throw e2;
                    }
                }
            }
        }
    }

    public static boolean equalsSimpleProperties(Object mainObject, Object otherObject)
            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(mainObject);
        for (int i = 0; i < origDescriptors.length; i++) {
            String name = origDescriptors[i].getName();

            if (PropertyUtils.getPropertyDescriptor(otherObject, name) != null) {
                Object origValue = PropertyUtils.getSimpleProperty(mainObject, name);
                Object otherValue = PropertyUtils.getSimpleProperty(otherObject, name);

                if (origValue != null && otherValue == null) {
                    return false;
                }

                if (origValue == null && otherValue != null) {
                    return false;
                }

                if (origValue != null && otherValue != null) {
                    /*
                     * to walk around timestamp and date equals behavior Date d
                     * = new Date(); Timestamp t = new Timestamp(d.getTime());
                     * d.equals(t) > == true; t.equals(d) > == false;
                     */
                    if (origValue instanceof java.sql.Timestamp
                            && (otherValue instanceof java.sql.Date || otherValue instanceof java.util.Date)) {
                        if (!otherValue.equals(origValue)) {
                            return false;
                        }
                    } else {
                        if (!origValue.equals(otherValue)) {
                            return false;
                        }
                    }
                }
            }
        }
        return true;
    }

    /**
     * Resets the bean's <code>String</code> type properties to empty quotes.
     * 
     * @param orig
     *            Origin bean whose properties are retrieved.
     */
    public static void resetProperties(Object orig) {
        resetProperties(orig, "");
    }

    /**
     * Resets the bean's <code>String</code> type properties to a specified
     * value.
     * 
     * @param orig
     *            Origin bean whose properties are retrieved.
     * @param value
     *            the value to set the bean properties to.
     */
    public static void resetProperties(Object orig, String value) {
        PropertyDescriptor origDescriptors[] = null;

        try {
            origDescriptors = PropertyUtils.getPropertyDescriptors(orig);
        } catch (Exception e) {
            return;
        }

        if (origDescriptors != null) {
            for (int i = 0; i < origDescriptors.length; i++) {
                try {
                    String name = origDescriptors[i].getName();
                    Object orgValue = PropertyUtils.getSimpleProperty(orig, name);
                    if ((orgValue != null) && (orgValue instanceof String)) {
                        PropertyUtils.setSimpleProperty(orig, name, value);
                    }
                } catch (Exception e) {
                    // skip it
                }
            }
        }
    }
}