it.geosolutions.geoserver.jms.impl.utils.BeanUtils.java Source code

Java tutorial

Introduction

Here is the source code for it.geosolutions.geoserver.jms.impl.utils.BeanUtils.java

Source

/* Copyright (c) 2011 GeoSolutions - http://www.geo-solutions.it/.  All rights reserved.
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package it.geosolutions.geoserver.jms.impl.utils;

import it.geosolutions.geoserver.jms.impl.handlers.catalog.CatalogUtils;

import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;

/**
 * This class implements a set of function inspired by the Apache BeanUtils
 * defining wrappers which are designed to work with the GeoServer catalog and configuration 
 * 
 * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it
 *
 */
public abstract class BeanUtils {

    /**
     * This is a 'smart' (perform checks for some special cases) update function which should be used to copy of the properties for objects
     * of the catalog and configuration.
     * 
     * @param <T> the type of the bean to update
     * @param info the bean instance to update
     * @param properties the list of string of properties to update
     * @param values the list of new values to update
     * 
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     * @throws NoSuchMethodException
     */
    public static <T> void smartUpdate(final T info, final List<String> properties, final List<Object> values)
            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        final Iterator<String> itPropertyName = properties.iterator();
        final Iterator<Object> itValue = values.iterator();
        while (itPropertyName.hasNext() && itValue.hasNext()) {
            String propertyName = itPropertyName.next();
            final Object value = itValue.next();

            PropertyDescriptor pd = PropertyUtils.getPropertyDescriptor(info, propertyName);
            // return null if there is no such descriptor
            if (pd == null) {
                // this is a special case used by the NamespaceInfoImpl setURI
                // the propertyName coming from the ModificationProxy is set to 'uRI'
                // lets set it to uri
                propertyName = propertyName.toUpperCase();
                pd = PropertyUtils.getPropertyDescriptor(info, propertyName);
                if (pd == null) {
                    return;
                }
            }
            if (pd.getWriteMethod() != null) {
                PropertyUtils.setProperty(info, propertyName, value);
            } else {
                // T interface do not declare setter method for this property
                // lets use getter methods to get the property reference
                final Object property = PropertyUtils.getProperty(info, propertyName);

                // check type of property to apply new value
                if (Collection.class.isAssignableFrom(pd.getPropertyType())) {
                    final Collection<?> liveCollection = (Collection<?>) property;
                    liveCollection.clear();
                    liveCollection.addAll((Collection) value);
                } else if (Map.class.isAssignableFrom(pd.getPropertyType())) {
                    final Map<?, ?> liveMap = (Map<?, ?>) property;
                    liveMap.clear();
                    liveMap.putAll((Map) value);
                } else {
                    if (CatalogUtils.LOGGER.isLoggable(java.util.logging.Level.SEVERE))
                        CatalogUtils.LOGGER.severe("Skipping unwritable property " + propertyName
                                + " with property type " + pd.getPropertyType());
                }
            }
        }
    }

}