Mega Code Archive

 
Categories / Java / Language Basics
 

Obtains all property descriptors from a bean (interface or implementation)

//package com.witframework.util; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /**  * Obtains all property descriptors from a bean (interface or implementation).  * <p>  * The java.beans.Introspector does not process the interfaces hierarchy chain, this one does.  * <p>  * @author Alejandro Abdelnur  *  */ public class BeanIntrospector {     private static final Map _introspected = new HashMap();     public static synchronized PropertyDescriptor[] getPropertyDescriptors(Class klass) throws IntrospectionException {         PropertyDescriptor[] descriptors = (PropertyDescriptor[]) _introspected.get(klass);         if (descriptors==null) {             descriptors = getPDs(klass);             _introspected.put(klass,descriptors);         }         return descriptors;     }     private static PropertyDescriptor[] getPDs(Class klass) throws IntrospectionException {         Method[] methods = klass.getMethods();         Map getters = getPDs(methods,false);         Map setters = getPDs(methods,true);         List pds     = merge(getters,setters);         PropertyDescriptor[] array = new PropertyDescriptor[pds.size()];         pds.toArray(array);         return array;     }     private static final String SETTER = "set";     private static final String GETTER = "get";     private static final String BOOLEAN_GETTER = "is";     private static Map getPDs(Method[] methods,boolean setters) throws IntrospectionException {         Map pds = new HashMap();         for (int i=0;i<methods.length;i++) {             String pName = null;             PropertyDescriptor pDescriptor = null;             if ((methods[i].getModifiers()&Modifier.PUBLIC)!=0) {                 if (setters) {                     if (methods[i].getName().startsWith(SETTER) &&                         methods[i].getReturnType()==void.class && methods[i].getParameterTypes().length==1) {                         pName = Introspector.decapitalize(methods[i].getName().substring(3));                         pDescriptor = new PropertyDescriptor(pName,null,methods[i]);                     }                 }                 else {                     if (methods[i].getName().startsWith(GETTER) &&                         methods[i].getReturnType()!=void.class && methods[i].getParameterTypes().length==0) {                         pName = Introspector.decapitalize(methods[i].getName().substring(3));                         pDescriptor = new PropertyDescriptor(pName,methods[i],null);                     }                     else                     if (methods[i].getName().startsWith(BOOLEAN_GETTER) &&                         methods[i].getReturnType()==boolean.class && methods[i].getParameterTypes().length==0) {                         pName = Introspector.decapitalize(methods[i].getName().substring(2));                         pDescriptor = new PropertyDescriptor(pName,methods[i],null);                     }                 }             }             if (pName!=null) {                 pds.put(pName,pDescriptor);             }         }         return pds;     }     private static List merge(Map getters,Map setters) throws IntrospectionException {         List props = new ArrayList();         Set processedProps = new HashSet();         Iterator gs = getters.keySet().iterator();         while (gs.hasNext()) {             String name = (String) gs.next();             PropertyDescriptor getter = (PropertyDescriptor) getters.get(name);             PropertyDescriptor setter = (PropertyDescriptor) setters.get(name);             if (setter!=null) {                 processedProps.add(name);                 PropertyDescriptor prop = new PropertyDescriptor(name,getter.getReadMethod(),setter.getWriteMethod());                 props.add(prop);             }             else {                 props.add(getter);             }         }         Set writeOnlyProps = new HashSet(setters.keySet());         writeOnlyProps.removeAll(processedProps);         Iterator ss = writeOnlyProps.iterator();         while (ss.hasNext()) {             String name = (String) ss.next();             PropertyDescriptor setter = (PropertyDescriptor) setters.get(name);             props.add(setter);         }         return props;     } }