jstrachan 01/08/22 12:44:56
Modified: betwixt/src/java/org/apache/commons/betwixt
XMLIntrospector.java
betwixt/src/java/org/apache/commons/betwixt/io
BeanWriter.java
betwixt/src/test/org/apache/commons/betwixt
CustomerBean.java TestBeanWriter.java
Added: betwixt/src/java/org/apache/commons/betwixt/expression
IteratorExpression.java
Removed: betwixt/src/java/org/apache/commons/betwixt/expression
Loop.java
Log:
Almost got iterators working when navigating bean models
Revision Changes Path
1.3 +33 -5
jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLIntrospector.java
Index: XMLIntrospector.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLIntrospector.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- XMLIntrospector.java 2001/08/22 18:30:48 1.2
+++ XMLIntrospector.java 2001/08/22 19:44:55 1.3
@@ -5,7 +5,7 @@
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*
- * $Id: XMLIntrospector.java,v 1.2 2001/08/22 18:30:48 jstrachan Exp $
+ * $Id: XMLIntrospector.java,v 1.3 2001/08/22 19:44:55 jstrachan Exp $
*/
package org.apache.commons.betwixt;
@@ -19,15 +19,21 @@
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Date;
+import java.util.Enumeration;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import org.apache.commons.betwixt.expression.Expression;
+import org.apache.commons.betwixt.expression.IteratorExpression;
import org.apache.commons.betwixt.expression.MethodExpression;
/** <p><code>XMLIntrospector</code> an introspector of beans to create a
XMLBeanInfo instance.</p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a>
- * @version $Revision: 1.2 $
+ * @version $Revision: 1.3 $
*/
public class XMLIntrospector {
@@ -102,7 +108,15 @@
if ( readMethod == null ) {
return;
}
- if ( isPrimitiveType( type ) ) {
+ Expression loop = createLoopExpression( propertyDescriptor, type );
+ if ( loop != null ) {
+ ElementDescriptor elementDescriptor = new ElementDescriptor();
+ elementDescriptor.setContextExpression( loop );
+
+ nodeDescriptor = elementDescriptor;
+ elements.add( nodeDescriptor );
+ }
+ else if ( isPrimitiveType( type ) ) {
nodeDescriptor = new AttributeDescriptor();
nodeDescriptor.setTextExpression( new MethodExpression( readMethod ) );
attributes.add( nodeDescriptor );
@@ -116,8 +130,7 @@
elementDescriptor.setAttributeDescriptors(
childDescriptor.getAttributeDescriptors() );
elementDescriptor.setContextExpression( new MethodExpression(
readMethod ) );
- nodeDescriptor = elementDescriptor;
-
+ nodeDescriptor = elementDescriptor;
elements.add( nodeDescriptor );
}
nodeDescriptor.setLocalName( propertyDescriptor.getName() );
@@ -134,6 +147,21 @@
return answer;
}
+ /** Creates a new Expression for loop based properties such as Arrays,
+ * Collections, Enumerations, Arrays etc.
+ */
+ protected Expression createLoopExpression( PropertyDescriptor
propertyDescriptor, Class type ) {
+ if ( type.isArray()
+ || type.isAssignableFrom( Map.class )
+ || type.isAssignableFrom( Collection.class )
+ || type.isAssignableFrom( Enumeration.class )
+ || type.isAssignableFrom( Iterator.class )
+ ) {
+ return new IteratorExpression( new MethodExpression(
propertyDescriptor.getReadMethod() ) );
+ }
+ return null;
+ }
+
/** Returns true for primitive types */
protected boolean isPrimitiveType(Class type) {
return type.getName().startsWith( "java.lang." ) || type.isAssignableFrom(
Date.class );
1.1
jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/expression/IteratorExpression.java
Index: IteratorExpression.java
===================================================================
package org.apache.commons.betwixt.expression;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.collections.ArrayIterator;
import org.apache.commons.collections.EnumerationIterator;
import org.apache.commons.collections.SingletonIterator;
/** <p><code>IteratorExpression</code> returns an iterator over the current
context.</p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a>
* @version $Revision: 1.1 $
*/
public class IteratorExpression implements Expression {
private Expression expression;
public IteratorExpression(Expression expression) {
this.expression = expression;
}
/** Returns an interator over the current context */
public Object evaluate(Context context) {
Object value = expression.evaluate( context );
//System.out.println( "IeratorExpression evaluating: " + value );
if ( value instanceof Iterator ) {
return (Iterator) value;
}
else if ( value instanceof Collection ) {
Collection collection = (Collection) value;
return collection.iterator();
}
else if ( value instanceof Map ) {
Map map = (Map) value;
return map.entrySet().iterator();
}
else if ( value instanceof Enumeration ) {
return new EnumerationIterator( (Enumeration) value );
}
else if ( value != null ) {
Class type = value.getClass();
if ( type.isArray() ) {
/*
Object[] array = (Object[]) value;
return new ArrayIterator( array );
*/
}
}
return Collections.EMPTY_LIST.iterator();
}
}
1.3 +16 -5
jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/BeanWriter.java
Index: BeanWriter.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/BeanWriter.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- BeanWriter.java 2001/08/22 18:30:48 1.2
+++ BeanWriter.java 2001/08/22 19:44:55 1.3
@@ -5,7 +5,7 @@
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*
- * $Id: BeanWriter.java,v 1.2 2001/08/22 18:30:48 jstrachan Exp $
+ * $Id: BeanWriter.java,v 1.3 2001/08/22 19:44:55 jstrachan Exp $
*/
package org.apache.commons.betwixt.io;
@@ -15,6 +15,7 @@
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
+import java.util.Iterator;
import org.apache.commons.betwixt.AttributeDescriptor;
import org.apache.commons.betwixt.ElementDescriptor;
@@ -26,7 +27,7 @@
/** <p><code>BeanWriter</code> outputs a bean as XML.</p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a>
- * @version $Revision: 1.2 $
+ * @version $Revision: 1.3 $
*/
public class BeanWriter {
@@ -66,6 +67,7 @@
write( elementDescriptor, context );
}
}
+
if ( autoFlush ) {
writer.flush();
}
@@ -101,7 +103,7 @@
//-------------------------------------------------------------------------
/** Writes the given element */
- protected void write( ElementDescriptor elementDescriptor, Context context )
throws IOException {
+ protected void write( ElementDescriptor elementDescriptor, Context context )
throws IOException, IntrospectionException {
String qualifiedName = elementDescriptor.getQualifiedName();
writeIndent();
writer.write( "<" );
@@ -122,7 +124,7 @@
*
* @return true if some content was written
*/
- protected boolean writeContent( ElementDescriptor elementDescriptor, Context
context ) throws IOException {
+ protected boolean writeContent( ElementDescriptor elementDescriptor, Context
context ) throws IOException, IntrospectionException {
boolean answer = false;
ElementDescriptor[] childDescriptors =
elementDescriptor.getElementDescriptors();
if ( childDescriptors != null && childDescriptors.length > 0 ) {
@@ -137,8 +139,17 @@
if ( childBean == null ) {
// XXXX: should we handle nulls better
continue;
+ }
+ if ( childBean instanceof Iterator ) {
+ for ( Iterator iter = (Iterator) childBean; iter.hasNext();
) {
+ write( iter.next() );
+ }
+ continue;
+ }
+ else {
+ childContext = context.newContext( childBean );
}
- childContext = context.newContext( childBean );
+
}
writePrintln();
write( childDescriptor, childContext );
1.3 +4 -2
jakarta-commons-sandbox/betwixt/src/test/org/apache/commons/betwixt/CustomerBean.java
Index: CustomerBean.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/betwixt/src/test/org/apache/commons/betwixt/CustomerBean.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- CustomerBean.java 2001/08/22 18:30:48 1.2
+++ CustomerBean.java 2001/08/22 19:44:56 1.3
@@ -5,7 +5,7 @@
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*
- * $Id: CustomerBean.java,v 1.2 2001/08/22 18:30:48 jstrachan Exp $
+ * $Id: CustomerBean.java,v 1.3 2001/08/22 19:44:56 jstrachan Exp $
*/
package org.apache.commons.betwixt;
@@ -19,7 +19,7 @@
/** <p><code>CustomerBean</code> is a sample bean for use by the test cases.</p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a>
- * @version $Revision: 1.2 $
+ * @version $Revision: 1.3 $
*/
public class CustomerBean implements Serializable {
@@ -48,6 +48,7 @@
return address;
}
+/*
public Map getProjectMap() {
return projectMap;
}
@@ -65,6 +66,7 @@
}
return new IteratorEnumeration( projectMap.values().iterator() );
}
+*/
public void setID(String id) {
this.id = id;
1.3 +5 -2
jakarta-commons-sandbox/betwixt/src/test/org/apache/commons/betwixt/TestBeanWriter.java
Index: TestBeanWriter.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/betwixt/src/test/org/apache/commons/betwixt/TestBeanWriter.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestBeanWriter.java 2001/08/22 18:30:48 1.2
+++ TestBeanWriter.java 2001/08/22 19:44:56 1.3
@@ -5,7 +5,7 @@
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*
- * $Id: TestBeanWriter.java,v 1.2 2001/08/22 18:30:48 jstrachan Exp $
+ * $Id: TestBeanWriter.java,v 1.3 2001/08/22 19:44:56 jstrachan Exp $
*/
package org.apache.commons.betwixt;
@@ -19,7 +19,7 @@
/** Test harness for the BeanWriter
*
* @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a>
- * @version $Revision: 1.2 $
+ * @version $Revision: 1.3 $
*/
public class TestBeanWriter extends AbstractTestCase {
@@ -37,11 +37,14 @@
Object bean = createBean();
+/*
writer.write( bean );
String text = buffer.toString();
System.out.println( "Found: " + text );
+*/
+
System.out.println( "Now trying pretty print" );
writer = new BeanWriter();