package org.springframework.flex.core.io;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList;
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.ConfigurablePropertyAccessor;
import org.springframework.beans.PropertyAccessor;
import org.springframework.beans.PropertyAccessorFactory;
import org.springframework.core.convert.ConversionService;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.ReflectionUtils.FieldCallback;
/**
* Static helper util methods for Spring-based property access and introspection.
*
* @author Jeremy Grelle
*/
class PropertyProxyUtils {
private static final Log log = LogFactory.getLog(PropertyProxyUtils.class);
private PropertyProxyUtils(){}
public static boolean hasAmfCreator(Class<?> beanType) {
for (Constructor<?> constructor : beanType.getConstructors()) {
if (constructor.getAnnotation(AmfCreator.class) != null) {
return true;
}
}
return false;
}
public static PropertyAccessor getPropertyAccessor(ConversionService conversionService, boolean useDirectFieldAccess, Object instance) {
ConfigurablePropertyAccessor accessor = null;
if (useDirectFieldAccess) {
accessor = PropertyAccessorFactory.forDirectFieldAccess(instance);
} else {
accessor = PropertyAccessorFactory.forBeanPropertyAccess(instance);
}
accessor.setConversionService(conversionService);
return accessor;
}
public static List<String> getFieldNames(Object instance) {
final List<String> names = new ArrayList<String>();
ReflectionUtils.doWithFields(instance.getClass(), new FieldCallback() {
public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
names.add(field.getName());
}
});
if (log.isDebugEnabled()) {
log.debug("Property names for "+instance+" : "+names);
}
return names;
}
public static List<String> getBeanPropertyNames(BeanWrapper beanWrapper) {
List<String> names = new ArrayList<String>();
for (PropertyDescriptor pd : beanWrapper.getPropertyDescriptors()) {
if (!pd.getName().equals("class")) {
names.add(pd.getName());
}
}
if (log.isDebugEnabled()) {
log.debug("Property names for "+beanWrapper.getWrappedInstance()+" : "+names);
}
return names;
}
public static List<String> findPropertyNames(ConversionService conversionService, boolean useDirectFieldAccess, Object instance) {
if (useDirectFieldAccess) {
return getFieldNames(instance);
} else {
return getBeanPropertyNames((BeanWrapper)getPropertyAccessor(conversionService, useDirectFieldAccess, instance));
}
}
}