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
026 package org.eigenbase.xom;
027 import java.io.*;
028
029 /**
030 * Test the MSParser
031 */
032 public 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