/*
* Copyright 2008-2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jdal.util;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.BeansException;
import org.springframework.beans.InvalidPropertyException;
import org.springframework.beans.PropertyAccessException;
import org.springframework.beans.PropertyValue;
/**
* Some static funtions added to spring BeanUtils
*
* @author Jose Luis Martin
* @author Ignacio Vargas
* @since 1.0
*/
public abstract class BeanUtils extends org.springframework.beans.BeanUtils {
/** log */
private static Log log = LogFactory.getLog(BeanUtils.class);
/**
* Excluded properties
*/
private static final String[] EXCLUDED_PROPERTIES = {"class"};
/**
* Get PropertyValues from Object
* @param obj Object to get PropertyValues
* @return the property values
*/
public static PropertyValue[] getPropertyValues(Object obj) {
PropertyDescriptor[] pds = getPropertyDescriptors(obj.getClass());
ArrayList<PropertyValue> pvs = new ArrayList<PropertyValue>();
List<String> excludedProperties = Arrays.asList(EXCLUDED_PROPERTIES);
for (int i = 0; i < pds.length; i++) {
Object value = null;
String name = pds[i].getName();
if (!excludedProperties.contains(name)) {
try {
value = pds[i].getReadMethod().invoke(obj, (Object[]) null);
} catch (IllegalAccessException e) {
log.error("Error reading property name: " + name, e);
} catch (IllegalArgumentException e) {
log.error("Error reading property name: " + name, e);
} catch (InvocationTargetException e) {
log.error("Error reading property name: " + name, e);
}
pvs.add(new PropertyValue (name, value));
}
}
return (PropertyValue[]) pvs.toArray(new PropertyValue[pvs.size()]);
}
/**
* Copy a property, avoid Execeptions
* @param source source bean
* @param dest destination bean
* @param propertyName the propertyName
*
*/
public static void copyProperty(Object source,
Object dest, String propertyName) {
BeanWrapper wrapper = new BeanWrapperImpl(source);
PropertyValue pv = new PropertyValue(propertyName,
wrapper.getPropertyValue(propertyName));
wrapper.setPropertyValue(pv);
}
/**
* Set property, without trowing exceptions on errors
* @param bean bean name
* @param name name
* @param value value
*/
public static void setProperty(Object bean, String name, Object value) {
try {
BeanWrapper wrapper = new BeanWrapperImpl(bean);
wrapper.setPropertyValue(new PropertyValue(name, value));
} catch (InvalidPropertyException ipe) {
log.debug("Bean has no property: " + name);
} catch (PropertyAccessException pae) {
log.debug("Access Error on property: " + name);
}
}
/**
* Get property value null if none
* @param bean beam
* @param name name
* @return the property value
*/
public static Object getProperty(Object bean, String name) {
try {
BeanWrapper wrapper = new BeanWrapperImpl(bean);
return wrapper.getPropertyValue(name);
} catch (BeansException be) {
log.error(be);
return null;
}
}
}