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);