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

Print this page

        

*** 727,752 **** pd = null; ipd = null; if (igpd != null && ispd != null) { // Complete indexed properties set // Merge any classic property descriptors ! if (gpd != null) { ! PropertyDescriptor tpd = mergePropertyDescriptor(igpd, gpd); ! if (tpd instanceof IndexedPropertyDescriptor) { ! igpd = (IndexedPropertyDescriptor)tpd; ! } ! } ! if (spd != null) { ! PropertyDescriptor tpd = mergePropertyDescriptor(ispd, spd); ! if (tpd instanceof IndexedPropertyDescriptor) { ! ispd = (IndexedPropertyDescriptor)tpd; ! } } if (igpd == ispd) { ! pd = igpd; } else { ! pd = mergePropertyDescriptor(igpd, ispd); } } else if (gpd != null && spd != null) { if (igpd != null) { gpd = mergePropertyWithIndexedProperty(gpd, igpd); } --- 727,768 ---- pd = null; ipd = null; if (igpd != null && ispd != null) { // Complete indexed properties set // Merge any classic property descriptors ! if ((gpd == spd) || (gpd == null)) { ! pd = spd; ! } else if (spd == null) { ! 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); } if (igpd == ispd) { ! ipd = igpd; } else { ! ipd = mergePropertyDescriptor(igpd, ispd); ! } ! if (pd == null) { ! pd = ipd; ! } else { ! Class<?> propType = pd.getPropertyType(); ! Class<?> ipropType = ipd.getIndexedPropertyType(); ! if (propType.isArray() && propType.getComponentType() == ipropType) { ! pd = pd.getClass0().isAssignableFrom(ipd.getClass0()) ! ? new IndexedPropertyDescriptor(pd, ipd) ! : new IndexedPropertyDescriptor(ipd, pd); ! } else if (pd.getClass0().isAssignableFrom(ipd.getClass0())) { ! pd = pd.getClass0().isAssignableFrom(ipd.getClass0()) ! ? new PropertyDescriptor(pd, ipd) ! : new PropertyDescriptor(ipd, pd); ! } else { ! pd = ipd; ! } } } else if (gpd != null && spd != null) { if (igpd != null) { gpd = mergePropertyWithIndexedProperty(gpd, igpd); }
*** 846,855 **** --- 862,877 ---- if (pd.getClass0().isAssignableFrom(ipd.getClass0())) { result = new IndexedPropertyDescriptor(pd, ipd); } else { result = new IndexedPropertyDescriptor(ipd, pd); } + } else if ((ipd.getReadMethod() == null) && (ipd.getWriteMethod() == null)) { + if (pd.getClass0().isAssignableFrom(ipd.getClass0())) { + result = new PropertyDescriptor(pd, ipd); + } else { + result = new PropertyDescriptor(ipd, pd); + } } else { // Cannot merge the pd because of type mismatch // Return the most specific pd if (pd.getClass0().isAssignableFrom(ipd.getClass0())) { result = ipd;
*** 897,907 **** return new PropertyDescriptor(pd2, pd1); } } // Handle regular ipd merge ! private PropertyDescriptor mergePropertyDescriptor(IndexedPropertyDescriptor ipd1, IndexedPropertyDescriptor ipd2) { if (ipd1.getClass0().isAssignableFrom(ipd2.getClass0())) { return new IndexedPropertyDescriptor(ipd1, ipd2); } else { return new IndexedPropertyDescriptor(ipd2, ipd1); --- 919,929 ---- return new PropertyDescriptor(pd2, pd1); } } // Handle regular ipd merge ! private IndexedPropertyDescriptor mergePropertyDescriptor(IndexedPropertyDescriptor ipd1, IndexedPropertyDescriptor ipd2) { if (ipd1.getClass0().isAssignableFrom(ipd2.getClass0())) { return new IndexedPropertyDescriptor(ipd1, ipd2); } else { return new IndexedPropertyDescriptor(ipd2, ipd1);