rdonkin 2004/10/31 02:15:22
Modified: betwixt/src/java/org/apache/commons/betwixt
XMLIntrospector.java
betwixt/src/java/org/apache/commons/betwixt/io
BeanRuleSet.java
betwixt/src/java/org/apache/commons/betwixt/strategy
PropertySuppressionStrategy.java
betwixt/src/test/org/apache/commons/betwixt
TestCollectives.java
betwixt/xdocs tasks.xml
Log:
Improved support for collections subclasses by adding ability for extra properties
to be recognized.
Revision Changes Path
1.39 +37 -13
jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/XMLIntrospector.java
Index: XMLIntrospector.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/XMLIntrospector.java,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- XMLIntrospector.java 6 Oct 2004 21:38:05 -0000 1.38
+++ XMLIntrospector.java 31 Oct 2004 10:15:21 -0000 1.39
@@ -623,25 +623,35 @@
getLog().trace("Bean is primitive");
elementDescriptor.setTextExpression( StringExpression.getInstance() );
- } else if ( bean.isLoopType() ) {
- getLog().trace("Bean is loop");
- ElementDescriptor loopDescriptor = new ElementDescriptor();
- loopDescriptor.setContextExpression(
- new IteratorExpression( EmptyExpression.getInstance() )
- );
- if ( bean.isMapType() ) {
- loopDescriptor.setQualifiedName( "entry" );
- }
- elementDescriptor.setElementDescriptors( new ElementDescriptor[] {
loopDescriptor } );
-
} else {
+
getLog().trace("Bean is standard type");
+
+ boolean isLoopType = bean.isLoopType();
+
List elements = new ArrayList();
List attributes = new ArrayList();
List contents = new ArrayList();
- addProperties( bean.getProperties(), elements, attributes, contents );
-
+ // add bean properties for all collection which are not basic
+ if ( !( isLoopType && isBasicCollection( bean.getClass() ) ) )
+ {
+ addProperties( bean.getProperties(), elements, attributes, contents
);
+ }
+
+ // add iterator for collections
+ if ( isLoopType ) {
+ getLog().trace("Bean is loop");
+ ElementDescriptor loopDescriptor = new ElementDescriptor();
+ loopDescriptor.setContextExpression(
+ new IteratorExpression( EmptyExpression.getInstance() )
+ );
+ if ( bean.isMapType() ) {
+ loopDescriptor.setQualifiedName( "entry" );
+ }
+ elements.add( loopDescriptor );
+ }
+
int size = elements.size();
if ( size > 0 ) {
ElementDescriptor[] descriptors = new ElementDescriptor[size];
@@ -673,6 +683,20 @@
getLog().trace("Populated descriptor:");
getLog().trace(elementDescriptor);
}
+ }
+
+ /**
+ * <p>Is the given type a basic collection?
+ * </p><p>
+ * This is used to determine whether a collective type
+ * should be introspected as a bean (in addition to a collection).
+ * </p>
+ * @param type <code>Class</code>, not null
+ * @return
+ */
+ private boolean isBasicCollection( Class type )
+ {
+ return type.getName().startsWith( "java.util" );
}
/**
1.22 +2 -2
jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/BeanRuleSet.java
Index: BeanRuleSet.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/BeanRuleSet.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- BeanRuleSet.java 4 Oct 2004 22:27:12 -0000 1.21
+++ BeanRuleSet.java 31 Oct 2004 10:15:21 -0000 1.22
@@ -297,7 +297,7 @@
public void body(String namespace, String name, String text)
throws Exception {
- log.trace("[BRS] Body with text " + text);
+ if (log.isTraceEnabled()) log.trace("[BRS] Body with text " + text);
if (digester.getCount() > 0) {
MappingAction action = context.currentMappingAction();
action.body(text, context);
1.3 +9 -1
jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/strategy/PropertySuppressionStrategy.java
Index: PropertySuppressionStrategy.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/strategy/PropertySuppressionStrategy.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- PropertySuppressionStrategy.java 6 Oct 2004 21:38:05 -0000 1.2
+++ PropertySuppressionStrategy.java 31 Oct 2004 10:15:21 -0000 1.3
@@ -15,6 +15,8 @@
*/
package org.apache.commons.betwixt.strategy;
+import java.util.Collection;
+
/**
* Pluggable strategy specifying whether property's should be surpressed.
* Implementations can be used to give rules about which properties
@@ -25,7 +27,8 @@
/**
* Default implementation supresses the class property
- * found on every object.
+ * found on every object. Also, the <code>isEmpty</code>
+ * property is supressed for implementations of <code>Collection</code>.
*/
public static final PropertySuppressionStrategy DEFAULT = new
PropertySuppressionStrategy() {
public boolean suppressProperty(Class clazz, Class propertyType, String
propertyName) {
@@ -34,6 +37,11 @@
if ( Class.class.equals( propertyType) && "class".equals( propertyName
) ) {
result = true;
}
+ // ignore isEmpty for collection subclasses
+ if ( "empty".equals( propertyName ) &&
Collection.class.isAssignableFrom( clazz )) {
+ result = true;
+ }
+
return result;
}
};
1.3 +49 -1
jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/TestCollectives.java
Index: TestCollectives.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/TestCollectives.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestCollectives.java 13 Jun 2004 21:32:46 -0000 1.2
+++ TestCollectives.java 31 Oct 2004 10:15:22 -0000 1.3
@@ -21,6 +21,7 @@
import java.io.StringWriter;
import java.util.Iterator;
+import org.apache.commons.betwixt.expression.IteratorExpression;
import org.apache.commons.betwixt.io.BeanReader;
import org.apache.commons.betwixt.io.BeanWriter;
import org.apache.commons.betwixt.strategy.CapitalizeNameMapper;
@@ -98,5 +99,52 @@
}
+ public void testIntrospectListExtension() throws Exception
+ {
+ XMLIntrospector xmlIntrospector = new XMLIntrospector();
+ XMLBeanInfo beanInfo = xmlIntrospector.introspect(ArrayListExtender.class);
+
+ ElementDescriptor elementDescriptor = beanInfo.getElementDescriptor();
+ ElementDescriptor[] childDescriptors =
elementDescriptor.getElementDescriptors();
+ assertEquals(2, childDescriptors.length);
+ assertEquals("another", childDescriptors[0].getPropertyName());
+ assertTrue(childDescriptors[1].getContextExpression() instanceof
IteratorExpression);
+ }
+ public void testWriteListExtension() throws Exception
+ {
+ ArrayListExtender bean = new ArrayListExtender("Whatever");
+ bean.add(new Long(11));
+ bean.add(new Long(12));
+ bean.add(new Long(13));
+
+ StringWriter out = new StringWriter();
+ out.write("<?xml version='1.0'?>");
+
+ BeanWriter writer = new BeanWriter(out);
+ writer.getBindingConfiguration().setMapIDs( false );
+ writer.write(bean);
+
+ String expected = "<?xml
version='1.0'?><ArrayListExtender><another>Whatever</another>" +
+
"<Long>11</Long><Long>12</Long><Long>13</Long></ArrayListExtender>";
+
+ xmlAssertIsomorphicContent(parseString( expected ), parseString( out ));
+ }
+
+
+ public void testReadListExtension() throws Exception
+ {
+ String xml = "<?xml
version='1.0'?><ArrayListExtender><another>Whatever</another>" +
+ "<Long>11</Long><Long>12</Long><Long>13</Long></ArrayListExtender>";
+
+ StringReader in = new StringReader( xml );
+
+ BeanReader reader = new BeanReader();
+ reader.getBindingConfiguration().setMapIDs( false );
+
+ reader.registerBeanClass( ArrayListExtender.class );
+ ArrayListExtender bean = (ArrayListExtender) reader.parse( in );
+
+ assertEquals("Whatever", bean.getAnother());
+ }
}
1.39 +7 -0 jakarta-commons/betwixt/xdocs/tasks.xml
Index: tasks.xml
===================================================================
RCS file: /home/cvs/jakarta-commons/betwixt/xdocs/tasks.xml,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- tasks.xml 4 Oct 2004 22:27:13 -0000 1.38
+++ tasks.xml 31 Oct 2004 10:15:22 -0000 1.39
@@ -199,6 +199,8 @@
<li>All exceptions are now complex</li>
<li><strong>PropertySuppressionStrategy</strong> added which allows
course grained control of those properties which should be ignored by
Betwixt.</li>
+ <li>Improved support for <strong>java.util collections API
implementations</strong>.
+ Betwixt now recognizes additional properties on custom collection
implementations.</li>
</ul>
</subsection>
<subsection name='0.6'>
@@ -455,6 +457,11 @@
<li>
All exceptions are now complex types. This is now more consistent but the default
binding for exceptions in java.lang package have been changed from simple to
complex.
+ </li>
+ <li>
+Properties on collection implementations are now recognized (rather than ignored)
+by Betwixt. Please use an appropriate <code>ClassNormalizer</code> for
implementations
+that need to hide their extra properties.
</li>
</ul>
</subsection>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]