/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jaxp; import java.util.Vector; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler; /** * <p>A sample which demonstrates usage of the JAXP 1.3 Parser API.</p> * * @author Michael Glavassevich, IBM * @author Ankit Pasricha, IBM * * @version $Id: ParserAPIUsage.java 447685 2006-09-19 02:37:49Z mrglavas $ */ public class ParserAPIUsage extends DefaultHandler { // default settings /** Default API to use. */ protected static final String DEFAULT_API_TO_USE = "sax"; /** Default XInclude processing support (false). */ protected static final boolean DEFAULT_XINCLUDE = false; /** Default secure processing support (false). */ protected static final boolean DEFAULT_SECURE_PROCESSING = false; // // Constructors // /** Default constructor. */ public ParserAPIUsage() { } // <init>() // // ErrorHandler methods // /** Warning. */ public void warning(SAXParseException ex) throws SAXException { printError("Warning", ex); } // warning(SAXParseException) /** Error. */ public void error(SAXParseException ex) throws SAXException { printError("Error", ex); } // error(SAXParseException) /** Fatal error. */ public void fatalError(SAXParseException ex) throws SAXException { printError("Fatal Error", ex); throw ex; } // fatalError(SAXParseException) // // Protected methods // /** Prints the error message. */ protected void printError(String type, SAXParseException ex) { System.err.print("["); System.err.print(type); System.err.print("] "); String systemId = ex.getSystemId(); if (systemId != null) { int index = systemId.lastIndexOf('/'); if (index != -1) systemId = systemId.substring(index + 1); System.err.print(systemId); } System.err.print(':'); System.err.print(ex.getLineNumber()); System.err.print(':'); System.err.print(ex.getColumnNumber()); System.err.print(": "); System.err.print(ex.getMessage()); System.err.println(); System.err.flush(); } // printError(String,SAXParseException) public static void main(String[] argv) { // is there anything to do? if (argv.length == 0) { printUsage(); System.exit(1); } // variables ParserAPIUsage parserAPIUsage = new ParserAPIUsage(); Vector schemas = null; String docURI = argv[argv.length - 1]; String apiToUse = DEFAULT_API_TO_USE; boolean xincludeProcessing = DEFAULT_XINCLUDE; boolean secureProcessing = DEFAULT_SECURE_PROCESSING; // process arguments for (int i = 0; i < argv.length - 1; ++i) { String arg = argv[i]; if (arg.startsWith("-")) { String option = arg.substring(1); if (arg.equals("-a")) { // process -a: schema documents if (schemas == null) { schemas = new Vector(); } while (i + 1 < argv.length - 1 && !(arg = argv[i + 1]).startsWith("-")) { schemas.add(arg); ++i; } continue; } if (arg.equals("-api")) { if (i + 1 < argv.length - 1 && !(arg = argv[i + 1]).startsWith("-")) { if (arg.equals("sax") || arg.equals("dom")) { apiToUse = arg; } else { System.err.println("error: unknown source type ("+arg+")."); } } continue; } if (option.equalsIgnoreCase("xi")) { xincludeProcessing = option.equals("xi"); continue; } if (option.equalsIgnoreCase("sp")) { secureProcessing = option.equals("sp"); continue; } if (option.equals("h")) { printUsage(); continue; } System.err.println("error: unknown option ("+option+")."); continue; } } try { // Build Schema from sources if there are any Schema schema = null; if (schemas != null && schemas.size() > 0) { SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); factory.setErrorHandler(parserAPIUsage); final int length = schemas.size(); StreamSource[] sources = new StreamSource[length]; for (int j = 0; j < length; ++j) { sources[j] = new StreamSource((String) schemas.elementAt(j)); } schema = factory.newSchema(sources); } if ("dom".equals(apiToUse)) { // Create a DocumentBuilderFactory DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); dbf.setXIncludeAware(xincludeProcessing); dbf.setSchema(schema); dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, secureProcessing); // Create a DocumentBuilder DocumentBuilder db = dbf.newDocumentBuilder(); // Parse, reset the parser and then parse again. db.setErrorHandler(parserAPIUsage); db.parse(docURI); db.reset(); db.setErrorHandler(parserAPIUsage); db.parse(docURI); } // "sax".equals(apiToUse) else { // Create a SAXParserFactory SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware(true); spf.setXIncludeAware(xincludeProcessing); spf.setSchema(schema); spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, secureProcessing); // Create a SAXParser SAXParser sp = spf.newSAXParser(); // Parse, reset the parser and then parse again. sp.parse(docURI, parserAPIUsage); sp.reset(); sp.parse(docURI, parserAPIUsage); } } catch (SAXParseException e) { // ignore } catch (Exception e) { System.err.println("error: Parse error occurred - "+e.getMessage()); if (e instanceof SAXException) { Exception nested = ((SAXException)e).getException(); if (nested != null) { e = nested; } } e.printStackTrace(System.err); } } // main(String[]) // // Private static methods // private static void printUsage() { System.err.println("usage: java jaxp.ParserAPIUsage (options) uri"); System.err.println(); System.err.println("options:"); System.err.println(" -a uri ... Provide a list of schema documents."); System.err.println(" -api (sax|dom) Select API to use (sax|dom)."); System.err.println(" -xi | -XI Turn on/off XInclude processing."); System.err.println(" -sp | -SP Turn on/off secure processing."); System.err.println(" -h This help screen."); System.err.println(); System.err.println("defaults:"); System.err.println(" API to use: " + DEFAULT_API_TO_USE); System.err.print(" XInclude: "); System.err.println(DEFAULT_XINCLUDE ? "on" : "off"); System.err.print(" Secure processing: "); System.err.println(DEFAULT_SECURE_PROCESSING ? "on" : "off"); } // printUsage() } // ParserAPIUsage