com.gisgraphy.helper.BeanHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.gisgraphy.helper.BeanHelper.java

Source

/*******************************************************************************
 * Gisgraphy Project 
 *  
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License as published by the Free Software Foundation; either
 *    version 2.1 of the License, or (at your option) any later version.
 *  
 *    This library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *    Lesser General Public License for more details.
 *  
 *    You should have received a copy of the GNU Lesser General Public
 *    License along with this library; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
 *  
 *   Copyright 2008  Gisgraphy project 
 * 
 *   David Masclet <davidmasclet@gisgraphy.com>
 ******************************************************************************/
package com.gisgraphy.helper;

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;

public class BeanHelper {

    private static final long serialVersionUID = 2497822953120680812L;

    private static Logger logger = Logger.getLogger(BeanHelper.class);

    private boolean compareProperty(final Object object1, final Object object2, final String propertyName)
            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        final Object object1PropValue = PropertyUtils.getProperty(object1, propertyName);
        final Object object2PropValue = PropertyUtils.getProperty(object2, propertyName);
        if (object1PropValue == null) {
            return object2PropValue == null;
        }
        return object1PropValue.equals(object2PropValue);
    }

    public boolean equals(final Object other, final Object current) {
        if (!current.getClass().isAssignableFrom(other.getClass())) {
            return false;
        }
        final String thisName = current.getClass().getSimpleName();
        final String objectName = other.getClass().getSimpleName();
        String propertyName;
        Exception exception;
        try {
            for (final PropertyDescriptor thisPropertyDescriptor : Introspector
                    .getBeanInfo(current.getClass(), Object.class).getPropertyDescriptors()) {
                exception = null;
                propertyName = thisPropertyDescriptor.getName();
                logger.debug("propertyName=" + propertyName);
                try {
                    if (!compareProperty(current, other, propertyName)) {
                        return false;
                    }
                } catch (final IllegalAccessException e) {
                    exception = e;
                } catch (final InvocationTargetException e) {
                    exception = e;
                } catch (final NoSuchMethodException e) {
                    exception = e;
                }
                if (exception != null) {
                    logger.debug("impossible to compare property " + propertyName + " for beans " + thisName
                            + " and " + objectName, exception);
                    continue;
                }
            }
        } catch (final IntrospectionException e) {
            logger.debug("impossible to get properties for bean " + thisName, e);
        }
        return true;
    }

    public static String toString(Object current) {
        if (current == null) {
            return "null";
        }
        final StringBuffer buffer = new StringBuffer();
        final String beanName = current.getClass().getSimpleName();
        buffer.append(beanName);
        buffer.append(" { ");
        String propertyName;
        Object propertyValue = null;
        boolean first = true;
        Exception exception;
        try {
            for (final PropertyDescriptor propertyDescriptor : Introspector
                    .getBeanInfo(current.getClass(), Object.class).getPropertyDescriptors()) {
                exception = null;
                propertyName = propertyDescriptor.getName();
                logger.debug("propertyName=" + propertyName);
                try {
                    propertyValue = PropertyUtils.getProperty(current, propertyName);
                } catch (final IllegalAccessException e) {
                    exception = e;
                } catch (final InvocationTargetException e) {
                    exception = e;
                } catch (final NoSuchMethodException e) {
                    exception = e;
                }
                if (exception != null) {
                    logger.debug("impossible to get value of property " + propertyName + " of bean " + beanName,
                            exception);
                    continue;
                }
                if (first) {
                    first = false;
                } else {
                    buffer.append(", ");
                }
                buffer.append(propertyName);
                buffer.append(':');
                buffer.append(propertyValue);
            }
        } catch (final IntrospectionException e) {
            logger.error("impossible to get properties of bean " + beanName, e);
        }
        buffer.append(" }");
        return buffer.toString();
    }

    public static Object cloneBean(final Object bean) throws IllegalAccessException, InstantiationException,
            InvocationTargetException, NoSuchMethodException {
        return org.apache.commons.beanutils.BeanUtils.cloneBean(bean);
    }

    public static PropertyDescriptor[] getBeanProperties(final Object bean) throws IntrospectionException {
        return Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors();
    }

    public static Class getBeanPropertyClass(final Object bean, final String propertyName)
            throws IntrospectionException {
        final PropertyDescriptor[] propDescriptors = BeanHelper.getBeanProperties(bean);
        for (final PropertyDescriptor propDescriptor : propDescriptors) {
            if (propertyName.equals(propDescriptor.getName())) {
                return propDescriptor.getPropertyType();
            }
        }
        return null;
    }

}