blob: 72baf9ea967842821a5310650878637514d7fcbb [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. 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.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache
* XMLBeans", nor may "Apache" appear in their name, without prior
* written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
* ITS 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.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2000-2003 BEA Systems
* Inc., <http://www.bea.com/>. For more information on the Apache Software
* Foundation, please see <http://www.apache.org/>.
*/
package streamtest;
import java.io.File;
import java.io.Reader;
import java.io.FileReader;
import java.io.BufferedReader;
import java.util.Date;
import org.xmlpull.mxp1.MXParser;
import org.xmlpull.mxp1.MXParserCachingStrings;
import weblogic.xml.stream.XMLInputStream;
import weblogic.xml.stream.XMLInputStreamFactory;
import weblogic.xml.stream.XMLEvent;
import xmlext.xml.XppAdaptor;
import org.xmlpull.stream.XppXmlStreamImpl;
import org.xmlpull.stream.XmlStreamFactory;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlObject;
/**
* Tests the conformance of the XMLInputStream produced by XppXmlStreamImpl.
* @author Cezar Andrei
*/
public class XmlStreamConformance
{
final static int TIMES = 30;
public static void main(String[] args)
throws Exception
{
if( args.length>0 )
{
File f = new File(args[0]);
if( f.isDirectory() )
compareDir(f);
else
//compareFile(f);
printFile(f);
}
else
{
printUsage();
}
}
static void printUsage()
{
System.out.println("\tThis app tests the conformance of the two " +
"XMLInputStream \n\tproduced by Babel parser and " +
"Xpp3 parser.");
System.out.println("\n\n\tUSAGE: java ... test.XmlStreamConformance " +
"dir|file");
System.out.println("\n\t\tdir\t\tMakes the test for all the files in " +
"the dir.");
System.out.println("\t\tfile\t\tMakes the test only for that file.");
}
static void compareFile(File file)
throws Exception
{
System.out.println(file.getPath() + " size: " + file.length());
if(!file.isFile())
//throw new Exception("compareFile: file not a File");
return;
Reader r1 = new BufferedReader( new FileReader(file));
Reader r2 = new BufferedReader( new FileReader(file));
XMLInputStream xpp = XmlStreamFactory.
createXmlInputStream(new XppXmlStreamImpl(r2));
XMLInputStream babel = XMLInputStreamFactory.newInstance().
newInputStream(r1);
while( xpp.hasNext() || babel.hasNext() )
{
XMLEvent xppevent = xpp.peek();
XMLEvent babelevent = babel.peek();
if( !(""+xppevent).equals((""+babelevent)) )
printError(xppevent, babelevent);
else
{
//System.out.println(" `" + xppevent + "'\n `" + babelevent +
// "'"); System.out.flush();
}
xppevent = xpp.next();
babelevent = babel.next();
}
//System.out.println(" xpp overlimit: " + xpp.next() );
//System.out.println(" babel overlimit: " + babel.next() );
r1.close();
r2.close();
//comparePerf(file);
}
static void printFile(File file)
throws Exception
{
System.out.println(file.getPath() + " size: " + file.length());
if(!file.isFile())
//throw new Exception("compareFile: file not a File");
return;
Reader r2 = new BufferedReader( new FileReader(file));
XMLInputStream xpp = XmlStreamFactory.
createXmlInputStream(new XppXmlStreamImpl(r2));
XMLInputStream morphedStream;
try
{
System.out.println("Starting xquery");
XmlObject xmlObj = XmlObject.Factory.parse(xpp);
XmlCursor crs = xmlObj.newCursor();
XmlCursor resCrs = crs.execQuery("$this");
// not yet implemented
//morphedStream = resCrs.newXMLInputStream();
Reader reader = resCrs.newReader();
reader = resCrs.newReader();
morphedStream = XMLInputStreamFactory.newInstance().
newInputStream(reader);
System.out.print("...");
}
catch( Exception e )
{
e.printStackTrace();
morphedStream = null;
}
xpp = morphedStream;
while( xpp.hasNext() )
{
XMLEvent xppevent = xpp.peek();
System.out.println(" `" + xppevent + "'"); System.out.flush();
xppevent = xpp.next();
}
r2.close();
}
static void printError(XMLEvent xppevent, XMLEvent babelevent)
{
String sxpp = ""+xppevent;
String sbab = ""+babelevent;
System.out.println("ERROR-----");
if( !sxpp.trim().equals(sbab.trim()) )
{
System.out.println("xpp :`" + sxpp + "'");
System.out.print("babel :`" + sbab + "'");
}
else
{
System.out.print("xpp :");
for(int i=0; i<sxpp.length(); i++)
{
byte b = (byte)sxpp.charAt(i);
System.out.print(" #" + b);
}
System.out.print("\nbabel :");
for(int i=0; i<sbab.length(); i++)
{
byte b = (byte)sbab.charAt(i);
System.out.print(" #" + b);
}
}
System.out.println("\n----------");
}
static void compareDir(File dir)
throws Exception
{
if(!dir.isDirectory())
throw new Exception("compareDir: dir not a Directory");
File[] files = dir.listFiles();
for( int i=0; i<files.length; i++)
compareFile(files[i]);
}
static void comparePerf(File file)
throws Exception
{
long start;
double xstime = 0;
double xrtime = 0;
double babeltime = 0;
//babel
for( int i=0; i<TIMES; i++ )
{
Reader r = new BufferedReader( new FileReader(file));
start = new Date().getTime();
XMLInputStream babel = XMLInputStreamFactory.newInstance().
newInputStream(r);
while( babel.hasNext() )
{
XMLEvent babelevent = babel.peek();
babelevent = babel.next();
}
babeltime += new Date().getTime() - start;
r.close();
//System.out.print(".");
}
//xpp with direct acces to the xpp parser
for( int i=0; i<TIMES; i++ )
{
Reader r = new BufferedReader( new FileReader(file));
start = new Date().getTime();
MXParser xpp = (MXParser) new MXParserCachingStrings();
xpp.setFeature( MXParser.FEATURE_PROCESS_NAMESPACES, true);
xpp.setInput( r );
int eventType = xpp.getEventType();
while ( eventType != xpp.END_DOCUMENT )
{
eventType = xpp.nextToken();
}
xrtime += new Date().getTime() - start;
r.close();
//System.out.print("'");
}
//xpp with XppXmlStreamImpl
for( int i=0; i<TIMES; i++ )
{
Reader r = new BufferedReader( new FileReader(file));
//XMLInputStream xpp = new XppAdaptor().getStream(r2);
start = new Date().getTime();
XMLInputStream xpp = (XMLInputStream) new XppXmlStreamImpl(r);
while( xpp.hasNext() )
{
XMLEvent xppevent = xpp.peek();
xppevent = xpp.next();
}
xstime += new Date().getTime() - start;
r.close();
//System.out.print("`");
}
System.out.println("PERF: babel/xppIS = " + dec(babeltime/xstime) +
" \tbabel/xppRaw = " + dec(babeltime/xrtime) );
}
static String dec( double f)
{
return "" + ((double)Math.round(f*100))/100;
}
}