| /******************************************************************************* |
| * Copyright (c) 2005, 2009 Andrea Bittau, University College London, and others |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Andrea Bittau - initial API and implementation from the PsychoPath XPath 2.0 |
| * Mukul Gandhi - bug 276134 - improvements to schema aware primitive type support |
| * for attribute/element nodes |
| * Jesper Steen Moller - Fixed namespace awareness |
| * David Carver - bug 281186 - implementation of fn:id and fn:idref. Correct |
| * loading of grammars if non-validating. |
| *******************************************************************************/ |
| |
| package org.eclipse.wst.xml.xpath2.processor; |
| |
| import java.io.*; |
| |
| import org.w3c.dom.*; |
| import javax.xml.parsers.*; |
| import javax.xml.validation.Schema; |
| |
| import org.xml.sax.*; |
| |
| /** |
| * Xerces loader class. The loading is always namespace aware. |
| */ |
| public class XercesLoader implements DOMLoader { |
| |
| private static final String NONVALIDATING_LOAD_DTD_GRAMMAR = "http://apache.org/xml/features/nonvalidating/load-dtd-grammar"; |
| |
| public static final String NAMESPACES_FEATURE = "http://xml.org/sax/features/namespaces"; |
| |
| public static final String VALIDATION_FEATURE = "http://xml.org/sax/features/validation"; |
| |
| public static final String SCHEMA_VALIDATION_FEATURE = "http://apache.org/xml/features/validation/schema"; |
| |
| public static final String SCHEMA_FULL_CHECKING_FEATURE = "http://apache.org/xml/features/validation/schema-full-checking"; |
| |
| public static final String DYNAMIC_VALIDATION_FEATURE = "http://apache.org/xml/features/validation/dynamic"; |
| |
| public static final String LOAD_EXTERNAL_DTD_FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd"; |
| |
| public static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; |
| public static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; |
| |
| public static final String DOCUMENT_IMPLEMENTATION_PROPERTY = "http://apache.org/xml/properties/dom/document-class-name"; |
| public static final String DOCUMENT_PSVI_IMPLEMENTATION = "org.apache.xerces.dom.PSVIDocumentImpl"; |
| |
| boolean _validating; |
| |
| Schema _schema = null;; |
| |
| /** |
| * Constructor for Xerces loader. |
| */ |
| public XercesLoader() { |
| _validating = false; |
| } |
| |
| /** |
| * @since 1.1 |
| */ |
| public XercesLoader(Schema schema) { |
| _validating = false; |
| _schema = schema; |
| } |
| |
| /** |
| * The Xerces loader loads the XML document |
| * |
| * @param in |
| * is the input stream. |
| * @throws DOMLoaderException |
| * DOM loader exception. |
| * @return The loaded document. |
| */ |
| public Document load(InputStream in) throws DOMLoaderException { |
| |
| DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); |
| |
| factory.setNamespaceAware(true); |
| factory.setAttribute(SCHEMA_VALIDATION_FEATURE, |
| Boolean.valueOf(_validating)); |
| factory.setAttribute(LOAD_EXTERNAL_DTD_FEATURE, true); |
| factory.setAttribute(NONVALIDATING_LOAD_DTD_GRAMMAR, true); |
| factory.setAttribute(DOCUMENT_IMPLEMENTATION_PROPERTY, |
| DOCUMENT_PSVI_IMPLEMENTATION); |
| |
| if (_schema != null) { |
| factory.setSchema(_schema); |
| } |
| else { |
| factory.setValidating(_validating); |
| } |
| |
| try { |
| DocumentBuilder builder = factory.newDocumentBuilder(); |
| |
| if (_validating) { |
| builder.setErrorHandler(new ErrorHandler() { |
| public void fatalError(SAXParseException e) |
| throws SAXException { |
| throw e; |
| } |
| |
| public void error(SAXParseException e) |
| throws SAXParseException { |
| throw e; |
| } |
| |
| public void warning(SAXParseException e) |
| throws SAXParseException { |
| throw e; // XXX |
| } |
| }); |
| } |
| return builder.parse(in); |
| } catch (SAXException e) { |
| //throw new DOMLoaderException("SAX exception: " + e.getMessage()); |
| e.printStackTrace(); |
| } catch (ParserConfigurationException e) { |
| throw new DOMLoaderException("Parser configuration exception: " |
| + e.getMessage()); |
| } catch (IOException e) { |
| throw new DOMLoaderException("IO exception: " + e.getMessage()); |
| } |
| |
| return null; |
| |
| } |
| |
| /** |
| * Set validating boolean. |
| * |
| * @param x |
| * is the value to set the validating boolean to. |
| */ |
| public void set_validating(boolean x) { |
| _validating = x; |
| } |
| } |