jdk/src/share/classes/java/beans/Introspector.java

Print this page

        

*** 745,757 **** --- 745,767 ---- pd = igpd; } else { pd = mergePropertyDescriptor(igpd, ispd); } } else if (gpd != null && spd != null) { + if (igpd != null) { + gpd = mergePropertyWithIndexedProperty(gpd, igpd); + } + if (ispd != null) { + spd = mergePropertyWithIndexedProperty(spd, ispd); + } // Complete simple properties set if (gpd == spd) { pd = gpd; + } else if (spd instanceof IndexedPropertyDescriptor) { + pd = mergePropertyWithIndexedProperty(gpd, (IndexedPropertyDescriptor) spd); + } else if (gpd instanceof IndexedPropertyDescriptor) { + pd = mergePropertyWithIndexedProperty(spd, (IndexedPropertyDescriptor) gpd); } else { pd = mergePropertyDescriptor(gpd, spd); } } else if (ispd != null) { // indexed setter
*** 807,816 **** --- 817,836 ---- private static boolean isAssignable(Class<?> current, Class<?> candidate) { return current == null ? candidate == null : current.isAssignableFrom(candidate); } + private PropertyDescriptor mergePropertyWithIndexedProperty(PropertyDescriptor pd, IndexedPropertyDescriptor ipd) { + Class<?> type = pd.getPropertyType(); + if (type.isArray() && (type.getComponentType() == ipd.getIndexedPropertyType())) { + return pd.getClass0().isAssignableFrom(ipd.getClass0()) + ? new IndexedPropertyDescriptor(pd, ipd) + : new IndexedPropertyDescriptor(ipd, pd); + } + return pd; + } + /** * Adds the property descriptor to the indexedproperty descriptor only if the * types are the same. * * The most specific property descriptor will take precedence.