jstrachan 02/05/28 07:17:23 Modified: betwixt/src/java/org/apache/commons/betwixt/digester XMLIntrospectorHelper.java betwixt/src/java/org/apache/commons/betwixt XMLIntrospector.java betwixt/src/test/org/apache/commons/betwixt TestMavenProject.java Log: Patched code so that betwixt can now parse Maven project files, provided the XMLIntrospector is configured with the Maven/Turbine configuration. It'd be nice to provide this configuration in some static helper method to do this automatically; just need to think of a good name. e.g. createTurbineStyleIntrospector() ? The only thing missing right now is to be able to plugin a type name to element name plugin strategy, so that we can default all type-based elements in Maven/Turbine to lower case. Right now the output of the Maven project appears as <Project> similarly its <Developer> and <Dependency> etc. Revision Changes Path 1.6 +36 -5 jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/digester/XMLIntrospectorHelper.java Index: XMLIntrospectorHelper.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/digester/XMLIntrospectorHelper.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- XMLIntrospectorHelper.java 28 May 2002 13:38:26 -0000 1.5 +++ XMLIntrospectorHelper.java 28 May 2002 14:17:22 -0000 1.6 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/digester/XMLIntrospectorHelper.java,v 1.5 2002/05/28 13:38:26 jstrachan Exp $ - * $Revision: 1.5 $ - * $Date: 2002/05/28 13:38:26 $ + * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/digester/XMLIntrospectorHelper.java,v 1.6 2002/05/28 14:17:22 jstrachan Exp $ + * $Revision: 1.6 $ + * $Date: 2002/05/28 14:17:22 $ * * ==================================================================== * @@ -57,7 +57,7 @@ * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * - * $Id: XMLIntrospectorHelper.java,v 1.5 2002/05/28 13:38:26 jstrachan Exp $ + * $Id: XMLIntrospectorHelper.java,v 1.6 2002/05/28 14:17:22 jstrachan Exp $ */ package org.apache.commons.betwixt.digester; @@ -99,7 +99,7 @@ * common code shared between the digestor and introspector.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a> - * @version $Revision: 1.5 $ + * @version $Revision: 1.6 $ */ public class XMLIntrospectorHelper { @@ -344,6 +344,19 @@ descriptor.setUpdater( new MethodUpdater( method ) ); descriptor.setSingularPropertyType( types[0] ); } + + if ( introspector.isWrapCollectionsInElement() ) { + // lets wrap the descriptor in a dummy element + ElementDescriptor parent = new ElementDescriptor(); + parent.setQualifiedName( descriptor.getPropertyName() ); + ElementDescriptor[] children = new ElementDescriptor[] { + descriptor + }; + parent.setElementDescriptors( children ); + descriptor.setQualifiedName( propertyName ); + // now lets try swap in the new element descriptor above the current one + swapDescriptor( rootDescriptor, descriptor, parent ); + } } else { if ( log.isDebugEnabled() ) { @@ -411,5 +424,23 @@ } } return null; + } + + /** + * Traverse the tree of element descriptors and find the oldValue and swap it with the newValue. + * This would be much easier to do if ElementDescriptor supported a parent relationship. + */ + protected static void swapDescriptor( ElementDescriptor rootDescriptor, ElementDescriptor oldValue, ElementDescriptor newValue ) { + ElementDescriptor[] children = rootDescriptor.getElementDescriptors(); + if ( children != null ) { + for ( int i = 0, size = children.length; i < size; i++ ) { + ElementDescriptor child = children[i]; + if ( child == oldValue ) { + children[i] = newValue; + break; + } + swapDescriptor( child, oldValue, newValue ); + } + } } } 1.24 +23 -8 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.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- XMLIntrospector.java 28 May 2002 13:38:26 -0000 1.23 +++ XMLIntrospector.java 28 May 2002 14:17:22 -0000 1.24 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLIntrospector.java,v 1.23 2002/05/28 13:38:26 jstrachan Exp $ - * $Revision: 1.23 $ - * $Date: 2002/05/28 13:38:26 $ + * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLIntrospector.java,v 1.24 2002/05/28 14:17:22 jstrachan Exp $ + * $Revision: 1.24 $ + * $Date: 2002/05/28 14:17:22 $ * * ==================================================================== * @@ -57,7 +57,7 @@ * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * - * $Id: XMLIntrospector.java,v 1.23 2002/05/28 13:38:26 jstrachan Exp $ + * $Id: XMLIntrospector.java,v 1.24 2002/05/28 14:17:22 jstrachan Exp $ */ package org.apache.commons.betwixt; @@ -102,7 +102,7 @@ * Later requests for the same class will return the cached value.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a> - * @version $Revision: 1.23 $ + * @version $Revision: 1.24 $ */ public class XMLIntrospector { @@ -112,15 +112,20 @@ /** should attributes or elements be used for primitive types */ private boolean attributesForPrimitives = false; - /** Maps classes to <code>XMLBeanInfo</code>'s */ - protected HashMap cacheXMLBeanInfos = new HashMap(); + /** should we wrap collections in an extra element? */ + private boolean wrapCollectionsInElement = false; /** Is <code>XMLBeanInfo</code> caching enabled? */ boolean cachingEnabled = true; + /** Maps classes to <code>XMLBeanInfo</code>'s */ + protected HashMap cacheXMLBeanInfos = new HashMap(); + /** Digester used to parse the XML descriptor files */ private XMLBeanInfoDigester digester; - + + // pluggable strategies + /** The strategy used to detect matching singular and plural properties */ private PluralStemmer pluralStemmer; @@ -289,6 +294,16 @@ /** Set whether attributes (or elements) should be used for primitive types. */ public void setAttributesForPrimitives(boolean attributesForPrimitives) { this.attributesForPrimitives = attributesForPrimitives; + } + + /** @return whether we should we wrap collections in an extra element? */ + public boolean isWrapCollectionsInElement() { + return wrapCollectionsInElement; + } + + /** Sets whether we should we wrap collections in an extra element? */ + public void setWrapCollectionsInElement(boolean wrapCollectionsInElement) { + this.wrapCollectionsInElement = wrapCollectionsInElement; } /** 1.3 +49 -51 jakarta-commons-sandbox/betwixt/src/test/org/apache/commons/betwixt/TestMavenProject.java Index: TestMavenProject.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/betwixt/src/test/org/apache/commons/betwixt/TestMavenProject.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- TestMavenProject.java 28 May 2002 13:38:26 -0000 1.2 +++ TestMavenProject.java 28 May 2002 14:17:23 -0000 1.3 @@ -112,18 +112,62 @@ * Tests we can parse a project.xml */ public void testParse() throws Exception { - // create a BeanReader + BeanReader reader = createBeanReader(); + + Project project = (Project) reader.parse( new FileInputStream( "project.xml" ) ); + + testProject( project ); + } + + + /** + * Tests we can round trip from the XML -> bean -> XML -> bean. + * Ideally this method should test both Project objects are identical + */ + public void testRoundTrip() throws Exception { + BeanReader reader = createBeanReader(); + + Project project = (Project) reader.parse( new FileInputStream( "project.xml" ) ); + + // now lets output it to a buffer + StringWriter buffer = new StringWriter(); + write( project, buffer ); + + + // create a new BeanReader + reader = createBeanReader(); + + // now lets try parse the output sing the BeanReader + String text = buffer.toString(); + + System.out.println( text ); + + Project newProject = (Project) reader.parse( new StringReader(text ) ); + + // managed to parse it again! + testProject( newProject ); + + // #### should now test the old and new Project instances for equality. + } + + + // Implementation methods + //------------------------------------------------------------------------- + + protected BeanReader createBeanReader() throws Exception { BeanReader reader = new BeanReader(); // set elements for attributes to true reader.getXMLIntrospector().setAttributesForPrimitives(false); + // wrap collections in an XML element + reader.getXMLIntrospector().setWrapCollectionsInElement(true); // #### remove the need to name the element, via a lower-case-naming strategy reader.registerBeanClass( "project", Project.class ); - - // now lets try parse the output sing the BeanReader - Project project = (Project) reader.parse( new FileInputStream( "project.xml" ) ); - + return reader; + } + + protected void testProject(Project project) throws Exception { assertTrue( "Returned null project instance", project != null ); assertEquals( "commons-betwixt", project.getName() ); assertEquals( "commons-betwixt", project.getId() ); @@ -146,52 +190,6 @@ } -/* - public void testRoundTrip() throws Exception { - // create a BeanReader - BeanReader reader = new BeanReader(); - reader.registerBeanClass( Project.class ); - - // now lets try parse the output sing the BeanReader - String text = buffer.toString(); - Project project = (Project) reader.parse( new FileReader( "project.xml" ) ); - - - // lets parse the example using the RSSDigester - RSSDigester digester = new RSSDigester(); - - InputStream in = new FileInputStream( "src/test/org/apache/commons/betwixt/rss-example.xml" ); - Object bean = digester.parse( in ); - in.close(); - - // now lets output it to a buffer - StringWriter buffer = new StringWriter(); - write( bean, buffer ); - - - // create a BeanReader - BeanReader reader = new BeanReader(); - reader.registerBeanClass( Project.class ); - - // now lets try parse the output sing the BeanReader - String text = buffer.toString(); - Project project = (Project) reader.parse( new StringReader(text ) ); - - // managed to parse it again! - - // now lets write it to another buffer - buffer = new StringWriter(); - write( bean, buffer ); - - String text2 = buffer.toString(); - - // if the two strings are equal then we've done a full round trip - // with the XML staying the same. Though the original source XML - // could well be different - assertEquals( "Round trip value should remain unchanged", text, text2 ); - } -*/ - protected void write(Object bean, Writer out) throws Exception { BeanWriter writer = new BeanWriter(out); writer.getXMLIntrospector().setAttributesForPrimitives(false);
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>