You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-dev@xml.apache.org by ke...@apache.org on 2003/07/14 15:58:18 UTC

cvs commit: xml-xindice/java/src/org/apache/xindice/tools/command StringSerializer.java

kevinross    2003/07/14 06:58:18

  Modified:    java/src/org/apache/xindice/core/filer FSFiler.java
               java/src/org/apache/xindice/client/xmldb/resources
                        XMLResourceImpl.java
               java/src/org/apache/xindice/xml/sax SAXEventGenerator.java
               .        build.xml .classpath
               java/tests/src/org/apache/xindice/integration/client/basic
                        DocumentTest.java
               java/src/org/apache/xindice/tools/command
                        StringSerializer.java
  Added:       java/tests/src/org/apache/xindice/integration/client/basic/testdocs
                        namespaces.xml namespace-changingprefixes.xml
                        namespace-simpleprefixes.xml
               java/lib xmlunit-1.0.jar xmlunit-1.0.LICENSE
  Log:
  PR: 21535
  Submitted By: Kevin O'Neill (kevin@rocketred.com.au)
  Reviewed By: Kevin Ross
  
  While working my way toward integrating xindice into the BELTS runtime
  environment I came across this little problem. The namespace attributes were
  being emitted twice.
  
  Source Document
  <test xmlns="http://example.com/test-1">
  
  Content emitted by getContentAsSAX
  <test xmlns="http://example.com/test-1" xmlns="http://example.com/test-1">
  
  After some digging (and a few new test cases) I found that the
  hasSaxNamespacesPrefixes of the SAXEventGenerator and XMLResourceImpl have
  incorrect default values (according to
  http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description)
  
  
  This patch corrects this and adds the additional test cases I used to track the
  problem down. It does add an addition jar dependency for the test cases though.
  XMLUnit. XMLUnit provides better testing of document structure than just string
  comparisons.
  
  Revision  Changes    Path
  1.1                  xml-xindice/java/tests/src/org/apache/xindice/integration/client/basic/testdocs/namespaces.xml
  
  Index: namespaces.xml
  ===================================================================
  <?xml version="1.0"?>
  <test xmlns="http://example.com/test-1">
  	<test xmlns="http://example.com/test-2">Some text</test>
  	<text> Some text in another namespace with space at the start and end &#10; and a carrage return
  	</text>
  </test>
  
  
  1.1                  xml-xindice/java/tests/src/org/apache/xindice/integration/client/basic/testdocs/namespace-changingprefixes.xml
  
  Index: namespace-changingprefixes.xml
  ===================================================================
  <?xml version="1.0"?>
  <test:test xmlns:test="http://example.com/test-1">
  	<test:test xmlns:test="http://example.com/test-2">
  		<test:test xmlns:test="http://example.com/test-1">confused yet?</test:test>
  	</test:test>
  	<test:text> Some text in another namespace with space at the start and end 
  		and a carrage return
  	</test:text>
  </test:test>
  
  
  1.1                  xml-xindice/java/tests/src/org/apache/xindice/integration/client/basic/testdocs/namespace-simpleprefixes.xml
  
  Index: namespace-simpleprefixes.xml
  ===================================================================
  <?xml version="1.0"?>
  <test:test xmlns:test="http://example.com/test-1">
  	<test2:test xmlns:test2="http://example.com/test-2">Some text</test2:test>
  	<test:text> Some text in another namespace with space at the start and end 
  		and a carrage return
  	</test:text>
  </test:test>
  
  
  1.1                  xml-xindice/java/lib/xmlunit-1.0.jar
  
  	<<Binary file>>
  
  
  1.1                  xml-xindice/java/lib/xmlunit-1.0.LICENSE
  
  Index: xmlunit-1.0.LICENSE
  ===================================================================
  /*
  ******************************************************************
  Copyright (c) 2001, Jeff Martin, Tim Bacon
  All rights reserved.
  
  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
  are met:
  
      * Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.
      * Redistributions in binary form must reproduce the above
        copyright notice, this list of conditions and the following
        disclaimer in the documentation and/or other materials provided
        with the distribution.
      * Neither the name of the xmlunit.sourceforge.net nor the names
        of its contributors may be used to endorse or promote products
        derived from this software without specific prior written
        permission.
  
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
  
  ******************************************************************
  */
  
  
  
  
  1.7       +2 -2      xml-xindice/java/src/org/apache/xindice/core/filer/FSFiler.java
  
  Index: FSFiler.java
  ===================================================================
  RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/core/filer/FSFiler.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FSFiler.java	31 Oct 2002 06:59:57 -0000	1.6
  +++ FSFiler.java	14 Jul 2003 13:58:17 -0000	1.7
  @@ -185,7 +185,7 @@
         try {
            locks.acquireSharedLock(file);
   
  -         HashMap meta = new HashMap(1);
  +         HashMap meta = new HashMap(2);
            meta.put(Record.MODIFIED, new Long(file.lastModified()));
   
            byte[] valueData = cache.getFile(file);
  
  
  
  1.13      +16 -7     xml-xindice/java/src/org/apache/xindice/client/xmldb/resources/XMLResourceImpl.java
  
  Index: XMLResourceImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/client/xmldb/resources/XMLResourceImpl.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- XMLResourceImpl.java	19 Nov 2002 05:36:55 -0000	1.12
  +++ XMLResourceImpl.java	14 Jul 2003 13:58:17 -0000	1.13
  @@ -109,18 +109,28 @@
   
       /**
        * This is a SAX feature that controls how namespaces are reported in SAX.
  -     * By default this feature is <em>on</em>.
  +     * By default this feature is <em>off</em>.
        *
        * @see <a href="http://sax.sourceforge.net/?selected=namespaces">sax.sourceforge.net/?selected=namespaces</a>
        */
       public static final String SAX_NAMESPACE_PREFIXES_FEATURE
           = SAXEventGenerator.SAX_NAMESPACE_PREFIXES_FEATURE;
   
  -    /* Is the SAX namespaces feature turned on for this generator? */
  +	/*
  +	 * State of the SAX_NAMESPACES_FEATURE. True indicates namespace URIs and unprefixed local 
  +	 * names for element and attribute names will be available.
  +	 * 
  +	 * For SAX2 the default is true.
  +	 */
       private boolean hasSaxNamespaces = true;
   
  -    /* Is the SAX namespaces-prefixes feature turned on for this generator? */
  -    private boolean hasSaxNamespacesPrefixes = true;
  +	/*
  +	 * State of the SAX_NAMESPACE_PREFIXES_FEATURE. True indicates XML 1.0 names (with prefixes) 
  +	 * and attributes (including xmlns* attributes) will be available.
  +	 * 
  +	 * For SAX2 the default is off.
  +	 */
  +    private boolean hasSaxNamespacesPrefixes = false;
   
      private SymbolTable symbols = null;
      private byte[] bytes = null;
  @@ -388,8 +398,7 @@
               SAXEventGenerator events = new SAXEventGenerator(symbols, bytes);
   
               events.setFeature(SAX_NAMESPACES_FEATURE, hasSaxNamespaces);
  -            events.setFeature(SAX_NAMESPACE_PREFIXES_FEATURE,
  -                    hasSaxNamespacesPrefixes);
  +            events.setFeature(SAX_NAMESPACE_PREFIXES_FEATURE, hasSaxNamespacesPrefixes);
               events.setContentHandler(handler);
   
               if (handler instanceof ErrorHandler) {
  
  
  
  1.19      +17 -7     xml-xindice/java/src/org/apache/xindice/xml/sax/SAXEventGenerator.java
  
  Index: SAXEventGenerator.java
  ===================================================================
  RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/xml/sax/SAXEventGenerator.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- SAXEventGenerator.java	25 Dec 2002 14:22:45 -0000	1.18
  +++ SAXEventGenerator.java	14 Jul 2003 13:58:17 -0000	1.19
  @@ -96,7 +96,7 @@
   
       /**
        * This is a SAX feature that controls how namespaces are reported in SAX.
  -     * By default this feature is <em>on</em>.
  +     * In accordance with the SAX2 specification by default this feature is <em>on</em>.
        *
        * @see <a href="http://sax.sourceforge.net/?selected=namespaces">sax.sourceforge.net/?selected=namespaces</a>
        */
  @@ -105,18 +105,28 @@
   
       /**
        * This is a SAX feature that controls how namespaces are reported in SAX.
  -     * By default this feature is <em>on</em>.
  +     * In accordance with the SAX2 specification by default this feature is <em>off</em>.
        *
        * @see <a href="http://sax.sourceforge.net/?selected=namespaces">sax.sourceforge.net/?selected=namespaces</a>
        */
       public static final String SAX_NAMESPACE_PREFIXES_FEATURE
           = "http://xml.org/sax/features/namespace-prefixes";
   
  -    /* Is the SAX namespaces feature turned on for this generator? */
  +	/*
  +	 * State of the SAX_NAMESPACES_FEATURE. True indicates namespace URIs and unprefixed local 
  +	 * names for element and attribute names will be available.
  +	 * 
  +	 * For SAX2 the default is true.
  +	 */
       private boolean hasSaxNamespaces = true;
   
  -    /* Is the SAX namespaces-prefixes feature turned on for this generator? */
  -    private boolean hasSaxNamespacesPrefixes = true;
  +	/*
  +	 * State of the SAX_NAMESPACE_PREFIXES_FEATURE. True indicates XML 1.0 names (with prefixes) 
  +	 * and attributes (including xmlns* attributes) will be available.
  +	 * 
  +	 * For SAX2 the default is off.
  +	 */
  +    private boolean hasSaxNamespacesPrefixes = false;
   
   
      private SymbolTable symbols = null;
  @@ -271,7 +281,7 @@
            return qname;
      }
   
  -   private final boolean isNSAttr(String qName) {
  +   private final boolean isNSAttr(final String qName) {
   
         return (("xmlns".equals(qName)) || qName.startsWith("xmlns:"));
      }
  
  
  
  1.48      +27 -1     xml-xindice/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/xml-xindice/build.xml,v
  retrieving revision 1.47
  retrieving revision 1.48
  diff -u -r1.47 -r1.48
  --- build.xml	14 Jul 2003 13:40:28 -0000	1.47
  +++ build.xml	14 Jul 2003 13:58:18 -0000	1.48
  @@ -80,6 +80,8 @@
   		<include name="junit-addons-1.2.jar"/>
   		<include name="junitperf-1.8.jar"/>
   		<include name="servlet-2.3.jar"/>
  +		<include name="xmlunit-1.0.jar"/>
  +		<include name="clover-1.2.jar"/>
   	</fileset>
   	<!-- classpath to use within project -->
   	<path id="project.class.path">
  @@ -159,6 +161,9 @@
   				<path refid="project.class.path"/>
   			</classpath>
   		</javac>
  +		<copy todir="${test.build.dir}">
  +			<fileset dir="${test.src.dir}" excludes="*.java"/>
  +		</copy>
   	</target>
   	<target name="test-all" depends="test-unit, test-embed-binary, test-integration-embed, test-integration-xmlrpc, test-integration-managed"/>
   	<target name="test-unit" depends="test-build, test-validate">
  @@ -384,4 +389,25 @@
   		<delete dir="${api.dir}"/>
   	</target>
   	<target name="gump-target" depends="release"/>
  +	
  +	<!-- clover -->
  +	<!--
  +	<taskdef resource="clovertasks"/>
  +	
  +	<target name="with.clover">
  +		<clover-setup initString="${build.dir}/coverage.db"/>
  +   </target>
  +   
  +	<target name="clover.report.html" depends="with.clover">
  +		<clover-report>
  +			<current outfile="clover_html">
  +				<format type="html"/> 
  +			</current>	 
  +		</clover-report>
  +	</target>
  +	
  +	<target name="clover.view" depends="with.clover">
  +		<clover-view/>
  +	</target>
  +   -->
   </project>
  
  
  
  1.6       +5 -4      xml-xindice/.classpath
  
  Index: .classpath
  ===================================================================
  RCS file: /home/cvs/xml-xindice/.classpath,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- .classpath	5 Jun 2003 04:01:45 -0000	1.5
  +++ .classpath	14 Jul 2003 13:58:18 -0000	1.6
  @@ -1,9 +1,9 @@
   <?xml version="1.0" encoding="UTF-8"?>
   <classpath>
       <classpathentry kind="src" path="java/src"/>
  -    <classpathentry kind="src" path="java/tests/src"/>
  -    <classpathentry kind="src" path="java/examples/Addressbook/src/java"/>
  -    <classpathentry kind="src" path="java/examples/guide/src"/>
  +    <classpathentry kind="src" output="build/classes-tests" path="java/tests/src"/>
  +    <classpathentry kind="src" output="build/classes-address" path="java/examples/Addressbook/src/java"/>
  +    <classpathentry kind="src" output="build/classes-guide" path="java/examples/guide/src"/>
       <classpathentry exported="true" kind="var" path="JRE_LIB" sourcepath="JRE_SRC"/>
       <classpathentry exported="true" kind="lib" path="java/lib/ant-1.5.1.jar"/>
       <classpathentry exported="true" kind="lib" path="java/lib/commons-logging-1.0.1.jar"/>
  @@ -19,5 +19,6 @@
       <classpathentry exported="true" kind="lib" path="java/lib/xml-apis-1.1.jar"/>
       <classpathentry exported="true" kind="lib" path="java/lib/junit-addons-1.2.jar"/>
       <classpathentry exported="true" kind="lib" path="java/lib/servlet-2.3.jar"/>
  -    <classpathentry kind="output" path="classes"/>
  +    <classpathentry kind="lib" path="java/lib/xmlunit-1.0.jar"/>
  +    <classpathentry kind="output" path="build/classes"/>
   </classpath>
  
  
  
  1.5       +183 -8    xml-xindice/java/tests/src/org/apache/xindice/integration/client/basic/DocumentTest.java
  
  Index: DocumentTest.java
  ===================================================================
  RCS file: /home/cvs/xml-xindice/java/tests/src/org/apache/xindice/integration/client/basic/DocumentTest.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DocumentTest.java	10 Jul 2003 14:43:51 -0000	1.4
  +++ DocumentTest.java	14 Jul 2003 13:58:18 -0000	1.5
  @@ -59,10 +59,22 @@
   
   package org.apache.xindice.integration.client.basic;
   
  +import java.io.FileNotFoundException;
  +import java.io.IOException;
  +import java.io.InputStream;
   import java.io.StringWriter;
  +import java.io.Writer;
  +
  +import javax.xml.parsers.ParserConfigurationException;
  +import javax.xml.parsers.SAXParserFactory;
   
   import org.apache.xindice.integration.client.AbstractXmlDbClientTest;
  -import org.apache.xml.serialize.XMLSerializer;
  +import org.apache.xindice.tools.command.StringSerializer;
  +import org.custommonkey.xmlunit.XMLAssert;
  +import org.xml.sax.ContentHandler;
  +import org.xml.sax.InputSource;
  +import org.xml.sax.SAXException;
  +import org.xml.sax.XMLReader;
   import org.xmldb.api.base.XMLDBException;
   
   /**
  @@ -118,7 +130,7 @@
   
         String doc = this.client.getDocument(TEST_COLLECTION_PATH, "doc1");
         assertNotNull(doc);
  -      assertEquals(testDocument, doc);
  +		assertXMLEqual(testDocument, doc);
   
         this.client.removeDocument(TEST_COLLECTION_PATH, "doc1");
      }
  @@ -127,15 +139,14 @@
   		String testDocument = "<?xml version=\"1.0\"?>\n<data><test>test data</test></data>";
   		this.client.insertDocument(TEST_COLLECTION_PATH, "doc1", testDocument);
   
  -		StringWriter out = new StringWriter();
  -		XMLSerializer serializer = new XMLSerializer();
  -		serializer.setOutputCharStream(out); 
  +		final StringWriter out = new StringWriter();
  +		final ContentHandler serializer = createSerializer(out);
   
   		this.client.getDocumentAsSax(TEST_COLLECTION_PATH, "doc1", serializer);
   		String doc = out.toString();
   		
   		assertNotNull(doc);
  -		assertEquals(testDocument, doc);
  +		assertXMLEqual(testDocument, doc);
   
   		this.client.removeDocument(TEST_COLLECTION_PATH, "doc1");
   	}	
  @@ -200,5 +211,169 @@
         this.client.removeDocument(TEST_COLLECTION_PATH, "doc2");
         assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
      }
  +   
  +   public void testDocumentWithNameSpaces() throws Exception
  +   {
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +		
  +		final String testDocument = fetchTestDocument("namespaces.xml");
  +		this.client.insertDocument(TEST_COLLECTION_PATH, "namespaces.xml", testDocument);
  +
  +		String doc = this.client.getDocument(TEST_COLLECTION_PATH, "namespaces.xml");
  +		assertNotNull(doc);
  +		assertXMLEqual(testDocument, doc);
  +
  +		this.client.removeDocument(TEST_COLLECTION_PATH, "namespaces.xml");
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +   }
  +   
  +   public void testDocumentWithNameSpacesSAX() throws Exception
  +   {
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +		
  +		final String testDocument = fetchTestDocument("namespaces.xml");
  +		this.client.insertDocument(TEST_COLLECTION_PATH, "namespaces.xml", testDocument);
  +
  +		final StringWriter out = new StringWriter();
  +		final ContentHandler serializer = createSerializer(out);
  +
  +		this.client.getDocumentAsSax(TEST_COLLECTION_PATH, "namespaces.xml", serializer);
  +		String doc = out.toString();
  +
  +		assertNotNull(doc);
  +		assertXMLEqual(testDocument, doc);
   
  +		this.client.removeDocument(TEST_COLLECTION_PATH, "namespaces.xml");
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +   }
  +
  +	public void testDocumentWithSimpleNameSpacePrefixes() throws Exception
  +	{
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +
  +		final String testDocument = fetchTestDocument("namespace-simpleprefixes.xml");
  +		this.client.insertDocument(TEST_COLLECTION_PATH, "namespaces.xml", testDocument);
  +
  +		String doc = this.client.getDocument(TEST_COLLECTION_PATH, "namespaces.xml");
  +		assertNotNull(doc);
  +		assertXMLEqual(testDocument, doc);
  +
  +		this.client.removeDocument(TEST_COLLECTION_PATH, "namespaces.xml");
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +	}
  +	
  +	public void testDocumentWithSimpleNameSpacePrefixesSAX() throws Exception
  +	{
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +
  +		final String testDocument = fetchTestDocument("namespace-simpleprefixes.xml");
  +		this.client.insertDocument(TEST_COLLECTION_PATH, "namespaces.xml", testDocument);
  +
  +		final StringWriter out = new StringWriter();
  +		final ContentHandler serializer = createSerializer(out);
  +
  +		this.client.getDocumentAsSax(TEST_COLLECTION_PATH, "namespaces.xml", serializer);
  +		String doc = out.toString();
  +
  +		assertNotNull(doc);
  +		assertXMLEqual(testDocument, doc);
  +
  +		this.client.removeDocument(TEST_COLLECTION_PATH, "namespaces.xml");
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +	}
  +
  +	public void testDocumentWithChangingNameSpacePrefixes() throws Exception
  +	{
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +
  +		final String testDocument = fetchTestDocument("namespace-changingprefixes.xml");
  +		this.client.insertDocument(TEST_COLLECTION_PATH, "namespaces.xml", testDocument);
  +
  +		String doc = this.client.getDocument(TEST_COLLECTION_PATH, "namespaces.xml");
  +		assertNotNull(doc);
  +		assertXMLEqual(testDocument, doc);
  +
  +		this.client.removeDocument(TEST_COLLECTION_PATH, "namespaces.xml");
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +	}	
  +   
  +	public void testDocumentWithChangingNameSpacePrefixesSAX() throws Exception
  +	{
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +
  +		final String testDocument = fetchTestDocument("namespace-changingprefixes.xml");
  +		this.client.insertDocument(TEST_COLLECTION_PATH, "namespaces.xml", testDocument);
  +		
  +		final StringWriter out = new StringWriter();
  +		final ContentHandler serializer = createSerializer(out);
  +
  +		this.client.getDocumentAsSax(TEST_COLLECTION_PATH, "namespaces.xml", serializer);
  +		String doc = out.toString();
  +
  +		assertNotNull(doc);
  +		assertXMLEqual(testDocument, doc);
  +
  +		this.client.removeDocument(TEST_COLLECTION_PATH, "namespaces.xml");
  +		assertEquals(0, this.client.countDocument(TEST_COLLECTION_PATH));
  +	}	
  +
  +	private String fetchTestDocument(String name) throws IOException, SAXException, ParserConfigurationException
  +	{
  +		final StringWriter out = new StringWriter();
  +		final ContentHandler serializer = createSerializer(out);
  +		
  +		parseTestDocument(name, serializer);
  +		
  +		return out.toString(); 
  +	}
  +
  +	private void parseTestDocument(String name, ContentHandler handler) throws IOException, SAXException, ParserConfigurationException
  +	{
  +		InputStream in = getClass().getResourceAsStream("testdocs/" + name);
  +
  +		if (null == in)
  +		{
  +			throw new FileNotFoundException("The resource " + name + " could not be found");
  +		}
  +
  +		final SAXParserFactory factory = SAXParserFactory.newInstance();
  +		factory.setNamespaceAware(true);
  +
  +		final XMLReader saxReader = factory.newSAXParser().getXMLReader();
  +				
  +		saxReader.setContentHandler(handler);		
  +		saxReader.parse(new InputSource(in));
  +	}
  +	
  +	private ContentHandler createSerializer(final Writer out)
  +	{
  +		final ContentHandler serializer = new StringSerializer()
  +		{
  +			public void endDocument() throws SAXException
  +			{
  +				super.endDocument();
  +				
  +				try
  +				{
  +					out.write(this.toString());
  +					out.flush();
  +				}
  +				catch (IOException e)
  +				{
  +					throw new RuntimeException("Unexpected IO exception", e);
  +				}
  +			}
  +		};
  +
  +		return serializer;
  +	}
  +
  +	protected void assertXMLEqual(String control, String result) throws Exception
  +	{
  +		try {
  +			XMLAssert.assertXMLEqual(control, result);
  +		} catch (SAXException e) {
  +			fail(e.getLocalizedMessage());
  +		}
  +	}
   }
  
  
  
  1.6       +10 -1     xml-xindice/java/src/org/apache/xindice/tools/command/StringSerializer.java
  
  Index: StringSerializer.java
  ===================================================================
  RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/tools/command/StringSerializer.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- StringSerializer.java	21 Nov 2002 07:44:36 -0000	1.5
  +++ StringSerializer.java	14 Jul 2003 13:58:18 -0000	1.6
  @@ -93,6 +93,15 @@
       /* the document so far */
       private StringBuffer outputXml;
       
  +	/**
  +	 * Creates new <code>StringSerializer</code>. The output encoding is not specified therefor
  +	 * will be treated as "UTF-8".
  +	 */
  +    public StringSerializer()
  +    {
  +    	this(null);
  +    }
  +    
       /**
        * Creates new <code>StringSerializer</code>.
        *
  @@ -107,7 +116,7 @@
       public StringSerializer(String outputEncoding) {
   
           this.outputEncoding = outputEncoding;
  -        outputXml = new StringBuffer();
  +        outputXml = new StringBuffer(1024); // allocate a 1k block to start with
           namespaceMap = new HashMap();
           namespaceDecls = new StringBuffer();
           inCDATA = false;