001/*
002// $Id: //open/util/resgen/src/org/eigenbase/xom/ParserTester.java#3 $
003// Package org.eigenbase.xom is an XML Object Mapper.
004// Copyright (C) 2005-2005 The Eigenbase Project
005// Copyright (C) 2005-2005 Disruptive Tech
006// Copyright (C) 2005-2005 LucidEra, Inc.
007// Portions Copyright (C) 2000-2005 Kana Software, Inc. and others.
008//
009// This library is free software; you can redistribute it and/or modify it
010// under the terms of the GNU Lesser General Public License as published by the
011// Free Software Foundation; either version 2 of the License, or (at your
012// option) any later version approved by The Eigenbase Project.
013//
014// This library is distributed in the hope that it will be useful, 
015// but WITHOUT ANY WARRANTY; without even the implied warranty of
016// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
017// GNU Lesser General Public License for more details.
018// 
019// You should have received a copy of the GNU Lesser General Public License
020// along with this library; if not, write to the Free Software
021// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
022//
023// KLO, 22 July, 2001
024*/
025
026package org.eigenbase.xom;
027import java.io.*;
028
029/**
030 * Test the MSParser
031 */
032public class ParserTester {
033
034    // parser determines the type of parser to use.  Currently we support
035    // MSXML and XERCES.
036    private int parserType;
037    private static final int MSXML = 1;
038    private static final int XERCES = 2;
039
040    // These members contain the actual parsers to use.  Only one will
041    // ever be set.
042    private Parser parser;
043
044    // This member contain the model document type
045    String modelDocType;
046
047    // This member contain the URL for the DTD file
048    String dtdUrl;
049
050    //Read the XML file
051    public ParserTester(String dtdFile,
052                        int parserType)
053        throws XOMException, IOException
054    {
055        this.parserType = parserType;
056
057        parser = null;
058
059        File dtdPath = new File(dtdFile);
060        this.modelDocType = dtdFile.substring(0, dtdFile.indexOf("."));
061        this.dtdUrl = "file:" + dtdPath.getAbsolutePath();
062
063        switch (parserType) {
064//      case MSXML:
065//          parser = org.eigenbase.xom.wrappers.MSXMLWrapper.createParser(
066//              modelDocType, dtdPath);
067//          break;
068        case XERCES:
069            parser = new org.eigenbase.xom.wrappers.XercesDOMParser(true);
070            break;
071        default:
072            throw new XOMException("Unknown parser type: " + parserType);
073        }
074    }
075
076
077    public void testFile(String testFile)
078        throws XOMException
079    {
080        // parsing directly from an input stream (rather than a reader).
081        String xmlString = null;
082        try {
083            StringWriter sWriter = new StringWriter();
084            FileReader reader = new FileReader(testFile);
085
086            if(parserType != MSXML) {
087                PrintWriter out = new PrintWriter(sWriter);
088                out.println("<?xml version=\"1.0\" ?>");
089                if(modelDocType != null)
090                    out.println("<!DOCTYPE " + modelDocType
091                                + " SYSTEM \"" + dtdUrl + "\">");
092                out.flush();
093            }
094
095            readerToWriter(reader, sWriter);
096            reader.close();
097            xmlString = sWriter.toString();
098        } catch (IOException ex) {
099            throw new XOMException("Unable to read input test "
100                                      + testFile + ": " + ex.getMessage());
101        }
102
103        parser.parse(xmlString);
104
105        System.out.println("Parsing document succeeded.");
106    }
107
108    /**
109     * Helper function to copy from a reader to a writer
110     */
111    private static void readerToWriter(Reader reader, Writer writer)
112        throws IOException
113    {
114        int numChars;
115        final int bufferSize = 16384;
116        char[] buffer = new char[bufferSize];
117        while((numChars = reader.read(buffer)) != -1) {
118            if(numChars > 0)
119                writer.write(buffer, 0, numChars);
120        }
121    }
122
123    /**
124     * The ParserTester tests MSXML parser and Xerces Parser. Arguments:
125     * <ol>
126     * <li> The DTD file of the XML file
127     * <li> The XML file for this DTD file
128     * </ol>
129     * </p>
130     */
131    public static void main(String args[])
132        throws XOMException, IOException
133    {
134        int firstArg = 0;
135        if(args.length > 0 && args[0].equals("-debug")){
136            System.err.println("parserTest pausing for debugging. "
137                               + "Attach your debugger "
138                               + "and press return.");
139            try {
140                System.in.read();
141                firstArg++;
142            }
143            catch(IOException ex) {
144                // Do nothing
145            }
146        }
147
148        int parserType = MSXML;
149        if (firstArg < args.length && args[firstArg].equals("-msxml")) {
150            parserType = MSXML;
151            firstArg++;
152        }
153        else if (firstArg < args.length && args[firstArg].equals("-xerces")) {
154            parserType = XERCES;
155            firstArg++;
156        }
157
158        if(args.length < firstArg+2) {
159            System.err.println(
160                "Usage: java ParserTester [-debug] [-msxml | -xerces] "
161                + "<DTD file> <XML file>");
162            System.exit(-1);
163        }
164
165        ParserTester parserTester = new ParserTester(args[firstArg], parserType);
166        firstArg++;
167
168        parserTester.testFile(args[firstArg]);
169    }
170
171}
172
173
174// End ParserTester.java