You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ay...@apache.org on 2006/11/16 19:57:02 UTC
svn commit: r475867 - in
/incubator/harmony/enhanced/classlib/trunk/modules/beans/src:
main/java/java/beans/ test/java/org/apache/harmony/beans/tests/java/beans/
Author: ayza
Date: Thu Nov 16 10:57:01 2006
New Revision: 475867
URL: http://svn.apache.org/viewvc?view=rev&rev=475867
Log:
processing of inherited properties corrected; testIntrospection_5 was enabled
Modified:
incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/BeanInfoWrapper.java
incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/IndexedPropertyDescriptor.java
incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Introspector.java
incubator/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java
Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/BeanInfoWrapper.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/BeanInfoWrapper.java?view=diff&rev=475867&r1=475866&r2=475867
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/BeanInfoWrapper.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/BeanInfoWrapper.java Thu Nov 16 10:57:01 2006
@@ -27,8 +27,10 @@
class BeanInfoWrapper implements BeanInfo {
+ // external BeanInfo class if it was specified
private BeanInfo info;
+ // information gathered by means of reflection API
private BeanInfoImpl impl;
private BeanInfoWrapper parentBeanInfoWrapper;
@@ -42,6 +44,7 @@
PropertyDescriptor[] result = null;
PropertyDescriptor[] infoResult = null;
+ // if external BeanInfo class was specified
if (info != null) {
BeanInfo[] infos = info.getAdditionalBeanInfo();
@@ -59,6 +62,8 @@
}
}
+ // if no external BeanInfo class was specified or we fail to
+ // to obtain the result on the previous step by some reason
if (info == null || infoResult == null) {
PropertyDescriptor[] implResult = impl.getPropertyDescriptors();
@@ -66,19 +71,8 @@
if (parentBeanInfoWrapper != null) {
PropertyDescriptor[] parentResult = parentBeanInfoWrapper
.getPropertyDescriptors();
- Map<String, FeatureDescriptor> hm = concatArraysUniqueByName(
- implResult, parentResult);
-
- Collection<FeatureDescriptor> values = hm.values();
- Iterator<FeatureDescriptor> iterator;
- int idx = 0;
-
- result = new PropertyDescriptor[values.size()];
- iterator = values.iterator();
- while (iterator.hasNext()) {
- result[idx++] = (PropertyDescriptor) iterator.next();
- }
+ result = concatArraysToOneArray(implResult, parentResult);
Arrays.sort(result, new Comparator<PropertyDescriptor>() {
public int compare(PropertyDescriptor pd1,
PropertyDescriptor pd2) {
@@ -185,13 +179,12 @@
implResult, parentResult);
Collection<FeatureDescriptor> values = hm.values();
- Iterator<FeatureDescriptor> iterator;
int idx = 0;
result = new EventSetDescriptor[values.size()];
- iterator = values.iterator();
- while (iterator.hasNext()) {
- result[idx++] = (EventSetDescriptor) iterator.next();
+
+ for (FeatureDescriptor fd : values) {
+ result[idx++] = (EventSetDescriptor) fd;
}
Arrays.sort(result, new Comparator<EventSetDescriptor>() {
@@ -277,7 +270,7 @@
return result;
}
- void merge(BeanInfoWrapper parentBeanInfoWrapper) {
+ void setParentToMerge(BeanInfoWrapper parentBeanInfoWrapper) {
this.parentBeanInfoWrapper = parentBeanInfoWrapper;
}
@@ -305,20 +298,101 @@
private static PropertyDescriptor[] concatArraysToOneArray(
PropertyDescriptor[] childs, PropertyDescriptor[] parents) {
if (childs != null || parents != null) {
- Map<String, FeatureDescriptor> hm = concatArraysUniqueByName(
- childs, parents);
- PropertyDescriptor[] result = new PropertyDescriptor[hm.size()];
-
- Iterator<String> iterator = hm.keySet().iterator();
- int idx = 0;
+ Map<String, PropertyDescriptor> resultHM =
+ new HashMap<String, PropertyDescriptor>();
- while (iterator.hasNext()) {
- String name = iterator.next();
+ if (childs != null) {
+ for (PropertyDescriptor element : childs) {
+ resultHM.put(element.getName(), element);
+ }
+ }
- result[idx++] = (PropertyDescriptor) hm.get(name);
+ if (parents != null) {
+ for (PropertyDescriptor parentPD : parents) {
+ PropertyDescriptor childPD =
+ resultHM.get(parentPD.getName());
+
+ if (childPD == null) {
+ resultHM.put(parentPD.getName(), parentPD);
+ } else {
+ boolean childIsIndexed =
+ childPD instanceof IndexedPropertyDescriptor;
+ boolean parentIsIndexed =
+ parentPD instanceof IndexedPropertyDescriptor;
+ boolean shouldBeMerged;
+ Class<?> childPropType = childPD.getPropertyType();
+ Class<?> childIdxPropType = childIsIndexed ?
+ ((IndexedPropertyDescriptor) childPD)
+ .getIndexedPropertyType() : null;
+ Class<?> parentPropType = parentPD.getPropertyType();
+ Class<?> parentIdxPropType = parentIsIndexed ?
+ ((IndexedPropertyDescriptor) parentPD)
+ .getIndexedPropertyType() : null;
+
+ // additional consistency checks
+ // for child
+ assert (!childIsIndexed ? childPropType != null : true);
+ assert (childIsIndexed ?
+ childIdxPropType != null : true);
+ assert (childIsIndexed ? childPropType == null ||
+ childPropType.isArray() : true);
+ assert (childIsIndexed && childPropType != null ?
+ childPropType.getComponentType() ==
+ childIdxPropType : true);
+ // for parent
+ assert (!parentIsIndexed ?
+ parentPropType != null : true);
+ assert (parentIsIndexed ?
+ parentIdxPropType != null : true);
+ assert (parentIsIndexed ? parentPropType == null ||
+ parentPropType.isArray() : true);
+ assert (parentIsIndexed && parentPropType != null ?
+ parentPropType.getComponentType() ==
+ parentIdxPropType : true);
+
+ // let's check types
+ shouldBeMerged = childPropType != null &&
+ childPropType == parentPropType;
+ if (childIsIndexed) {
+ shouldBeMerged |=
+ childPropType == null
+ && parentPropType != null
+ && parentPropType.isArray()
+ && childIdxPropType ==
+ parentPropType.getComponentType();
+ }
+ if (parentIsIndexed) {
+ shouldBeMerged |=
+ parentPropType == null
+ && childPropType != null
+ && childPropType.isArray()
+ && parentIdxPropType ==
+ childPropType.getComponentType();
+
+ }
+ if (childIsIndexed && parentIsIndexed) {
+ shouldBeMerged |=
+ childIdxPropType == parentIdxPropType;
+ }
+
+ // merge if descriptors are compatible
+ if (shouldBeMerged) {
+ try {
+ resultHM.put(parentPD.getName(),
+ mergePDs(childPD, parentPD));
+ } catch (IntrospectionException e) {
+ // should be logged
+ //e.printStackTrace();
+ }
+ }
+ // we should not do anything if parent is not
+ // compatible with the child
+ }
+ }
}
- return result;
+ return resultHM.values().toArray(
+ new PropertyDescriptor[resultHM.size()]);
}
return null;
@@ -380,5 +454,87 @@
}
return null;
+ }
+
+ /**
+ * Merges two property descriptors.
+ * @param childPD child property descriptor
+ * @param parentPD parent property descriptor
+ * @return merged descriptor
+ * XXX
+ */
+ private static PropertyDescriptor mergePDs(PropertyDescriptor childPD,
+ PropertyDescriptor parentPD) throws IntrospectionException {
+
+ assert childPD != null;
+ assert childPD instanceof IndexedPropertyDescriptor ?
+ (childPD.getPropertyType() != null ||
+ ((IndexedPropertyDescriptor) childPD)
+ .getIndexedPropertyType() != null)
+ : childPD.getPropertyType() != null;
+ assert parentPD != null;
+ assert parentPD instanceof IndexedPropertyDescriptor ?
+ (parentPD.getPropertyType() != null ||
+ ((IndexedPropertyDescriptor) parentPD)
+ .getIndexedPropertyType() != null)
+ : parentPD.getPropertyType() != null;
+
+ PropertyDescriptor result;
+
+ if (childPD instanceof IndexedPropertyDescriptor) {
+ result = new IndexedPropertyDescriptor(childPD.getName(),
+ childPD.getReadMethod(), childPD.getWriteMethod(),
+ ((IndexedPropertyDescriptor) childPD).getIndexedReadMethod(),
+ ((IndexedPropertyDescriptor) childPD).getIndexedWriteMethod());
+ } else if (parentPD instanceof IndexedPropertyDescriptor) {
+ result = new IndexedPropertyDescriptor(childPD.getName(),
+ childPD.getReadMethod(), childPD.getWriteMethod(),
+ ((IndexedPropertyDescriptor) parentPD).getIndexedReadMethod(),
+ ((IndexedPropertyDescriptor) parentPD).getIndexedWriteMethod());
+ } else {
+ result = new PropertyDescriptor(childPD.getName(),
+ childPD.getReadMethod(), childPD.getWriteMethod());
+ }
+ copy(result, childPD);
+
+ if (result.getReadMethod() == null &&
+ parentPD.getReadMethod() != null) {
+ result.setReadMethod(parentPD.getReadMethod());
+ }
+ if (result.getWriteMethod() == null &&
+ parentPD.getWriteMethod() != null) {
+ result.setWriteMethod(parentPD.getWriteMethod());
+ }
+
+ if (result instanceof IndexedPropertyDescriptor) {
+ IndexedPropertyDescriptor result2 =
+ (IndexedPropertyDescriptor) result;
+ IndexedPropertyDescriptor parentPD2 =
+ (IndexedPropertyDescriptor) parentPD;
+
+ if (result2.getIndexedReadMethod() == null &&
+ parentPD2.getIndexedReadMethod() != null) {
+ result2.setIndexedReadMethod(parentPD2.getIndexedReadMethod());
+ }
+ if (result2.getIndexedWriteMethod() == null &&
+ parentPD2.getIndexedWriteMethod() != null) {
+ result2.setIndexedWriteMethod(parentPD2.getIndexedWriteMethod());
+ }
+ }
+
+ return result;
+ }
+
+ private static void copy(PropertyDescriptor target,
+ PropertyDescriptor source) throws IntrospectionException {
+ target.setBound(source.isBound());
+ target.setConstrained(source.isConstrained());
+ target.setDisplayName(source.getDisplayName());
+ target.setExpert(source.isExpert());
+ target.setHidden(source.isHidden());
+ target.setPreferred(source.isPreferred());
+ target.setPropertyEditorClass(source.getPropertyEditorClass());
+ target.setShortDescription(source.getShortDescription());
+ // XXX Attributes?
}
}
Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/IndexedPropertyDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/IndexedPropertyDescriptor.java?view=diff&rev=475867&r1=475866&r2=475867
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/IndexedPropertyDescriptor.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/IndexedPropertyDescriptor.java Thu Nov 16 10:57:01 2006
@@ -43,7 +43,7 @@
super(propertyName, getter, setter);
setIndexedReadMethod(indexedGetter);
- setIndexedWriteMethod(indexedGetter);
+ setIndexedWriteMethod(indexedSetter);
}
public IndexedPropertyDescriptor(String propertyName, Class<?> beanClass)
Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Introspector.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Introspector.java?view=diff&rev=475867&r1=475866&r2=475867
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Introspector.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Introspector.java Thu Nov 16 10:57:01 2006
@@ -163,7 +163,7 @@
BeanInfoWrapper parentBeanInfo = getBeanInfo(parent, stopClass,
ignoreSuperClassBeanInfo, ignoreSuperClassBeanInfo);
- wrapper.merge(parentBeanInfo);
+ wrapper.setParentToMerge(parentBeanInfo);
}
// ...
Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java?view=diff&rev=475867&r1=475866&r2=475867
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java Thu Nov 16 10:57:01 2006
@@ -824,6 +824,7 @@
BeanInfo info = Introspector.getBeanInfo(beanClass);
PropertyDescriptor[] pds;
+
assertEquals(0, info.getEventSetDescriptors().length);
assertEquals(13, info.getMethodDescriptors().length);
@@ -831,6 +832,9 @@
assertEquals(2, pds.length);
for (PropertyDescriptor element : pds) {
+ System.out.println("QQQ " + element.getName() + " " +
+ (element instanceof IndexedPropertyDescriptor));
+
if (element.getName().equals("class")) {
assertNull(element.getWriteMethod());
assertNotNull(element.getReadMethod());
@@ -884,10 +888,12 @@
public void testIntrospection_7() throws IntrospectionException {
Class<FakeFox501> beanClass = FakeFox501.class;
BeanInfo info = Introspector.getBeanInfo(beanClass);
+ PropertyDescriptor[] propertyDesc;
+
assertEquals(0, info.getEventSetDescriptors().length);
assertEquals(12, info.getMethodDescriptors().length);
- PropertyDescriptor[] propertyDesc = info.getPropertyDescriptors();
+ propertyDesc = info.getPropertyDescriptors();
assertEquals(2, propertyDesc.length);
for (PropertyDescriptor element : propertyDesc) {
@@ -895,7 +901,9 @@
assertNull(element.getWriteMethod());
assertNotNull(element.getReadMethod());
} else {
- IndexedPropertyDescriptor indexedDesc = (IndexedPropertyDescriptor) element;
+ IndexedPropertyDescriptor indexedDesc =
+ (IndexedPropertyDescriptor) element;
+
assertEquals("fox501", element.getName());
assertEquals(String[].class.getName(), element
.getPropertyType().getName());
@@ -1414,7 +1422,7 @@
// TestSuite suite = new TestSuite();
TestSuite suite = new TestSuite(IntrospectorTest.class);
-// suite.addTest(new IntrospectorTest("testGetPropertyDescriptors_H1838"));
+// suite.addTest(new IntrospectorTest("testIntrospection_7"));
return suite;
}