public Iterator<FeatureDescriptor> getFeatureDescriptors(
                                          ELContext context,
                                          Object base) {
        if (base == null){
            return null;
        }

        BeanInfo info = null;
        try {
            info = Introspector.getBeanInfo(base.getClass());
        } catch (Exception ex) {
        }
        if (info == null) {
            return null;
        }
        ArrayList<FeatureDescriptor> list = new ArrayList<FeatureDescriptor>(
                info.getPropertyDescriptors().length);
        for (PropertyDescriptor pd: info.getPropertyDescriptors()) {
            pd.setValue("type", pd.getPropertyType());
            pd.setValue("resolvableAtDesignTime", Boolean.TRUE);
            list.add(pd);
        }
        return list.iterator();
    }
public Iterator < FeatureDescriptor > getFeatureDescriptors ( ELContext context , Object base ) { if ( base == null ) { return null ; } BeanInfo info = null ; try { info = Introspector . getBeanInfo ( base . getClass ( ) ) ; } catch ( Exception ex ) { } if ( info == null ) { return null ; } ArrayList < FeatureDescriptor > list = new ArrayList < FeatureDescriptor > ( info . getPropertyDescriptors ( ) . length ) ; for ( PropertyDescriptor pd : info . getPropertyDescriptors ( ) ) { pd . setValue ( "type" , pd . getPropertyType ( ) ) ; pd . setValue ( "resolvableAtDesignTime" , Boolean . TRUE ) ; list . add ( pd ) ; } return list . iterator ( ) ; }
If the base object is not <code>null</code>, returns an
<code>Iterator</code> containing the set of JavaBeans properties
available on the given object. Otherwise, returns <code>null</code>.

<p>The <code>Iterator</code> returned must contain zero or more
instances of {@link java.beans.FeatureDescriptor}. Each info object
contains information about a property in the bean, as obtained by
calling the <code>BeanInfo.getPropertyDescriptors</code> method.
The <code>FeatureDescriptor</code> is initialized using the same
fields as are present in the <code>PropertyDescriptor</code>,
with the additional required named attributes "<code>type</code>" and
"<code>resolvableAtDesignTime</code>" set as follows:
<dl>
<li>{@link ELResolver#TYPE} - The runtime type of the property, from
<code>PropertyDescriptor.getPropertyType()</code>.</li>
<li>{@link ELResolver#RESOLVABLE_AT_DESIGN_TIME} - <code>true</code>.</li>
</dl>
</p>

@param context The context of this evaluation.
@param base The bean to analyze.
@return An <code>Iterator</code> containing zero or more
<code>FeatureDescriptor</code> objects, each representing a property
on this bean, or <code>null</code> if the <code>base</code>
object is <code>null</code>.