--- old/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/unmarshaller/DOMScanner.java 2018-01-30 20:30:52.000000000 -0500 +++ /dev/null 2018-01-30 20:30:52.000000000 -0500 @@ -1,316 +0,0 @@ -/* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.xml.internal.bind.unmarshaller; - -import java.util.Enumeration; - -import javax.xml.bind.ValidationEventLocator; -import javax.xml.bind.helpers.AbstractUnmarshallerImpl; -import javax.xml.bind.helpers.ValidationEventLocatorImpl; - -import com.sun.xml.internal.bind.v2.runtime.unmarshaller.LocatorEx; - -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.ProcessingInstruction; -import org.xml.sax.ContentHandler; -import org.xml.sax.Locator; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; -import org.xml.sax.helpers.NamespaceSupport; - -/** - * Visits a W3C DOM tree and generates SAX2 events from it. - * - *

- * This class is just intended to be used by {@link AbstractUnmarshallerImpl}. - * The javax.xml.bind.helpers package is generally a wrong place to put - * classes like this. - * - * @author

- * @since JAXB 1.0 - */ -public class DOMScanner implements LocatorEx,InfosetScanner/* --- but can't do this to protect 1.0 clients, or can I? */ -{ - - /** reference to the current node being scanned - used for determining - * location info for validation events */ - private Node currentNode = null; - - /** To save memory, only one instance of AttributesImpl will be used. */ - private final AttributesImpl atts = new AttributesImpl(); - - /** This handler will receive SAX2 events. */ - private ContentHandler receiver=null; - - private Locator locator=this; - - public DOMScanner() { - } - - - /** - * Configures the locator object that the SAX {@link ContentHandler} will see. - */ - public void setLocator( Locator loc ) { - this.locator = loc; - } - - public void scan(Object node) throws SAXException { - if( node instanceof Document ) { - scan( (Document)node ); - } else { - scan( (Element)node ); - } - } - - public void scan( Document doc ) throws SAXException { - scan( doc.getDocumentElement() ); - } - - public void scan( Element e) throws SAXException { - setCurrentLocation( e ); - - receiver.setDocumentLocator(locator); - receiver.startDocument(); - - NamespaceSupport nss = new NamespaceSupport(); - buildNamespaceSupport( nss, e.getParentNode() ); - - for( Enumeration en = nss.getPrefixes(); en.hasMoreElements(); ) { - String prefix = (String)en.nextElement(); - receiver.startPrefixMapping( prefix, nss.getURI(prefix) ); - } - - visit(e); - - for( Enumeration en = nss.getPrefixes(); en.hasMoreElements(); ) { - String prefix = (String)en.nextElement(); - receiver.endPrefixMapping( prefix ); - } - - - setCurrentLocation( e ); - receiver.endDocument(); - } - - /** - * Parses a subtree starting from the element e and - * reports SAX2 events to the specified handler. - * - * @deprecated in JAXB 2.0 - * Use {@link #scan(Element)} - */ - public void parse( Element e, ContentHandler handler ) throws SAXException { - // it might be better to set receiver at the constructor. - receiver = handler; - - setCurrentLocation( e ); - receiver.startDocument(); - - receiver.setDocumentLocator(locator); - visit(e); - - setCurrentLocation( e ); - receiver.endDocument(); - } - - /** - * Similar to the parse method but it visits the ancestor nodes - * and properly emulate the all in-scope namespace declarations. - * - * @deprecated in JAXB 2.0 - * Use {@link #scan(Element)} - */ - public void parseWithContext( Element e, ContentHandler handler ) throws SAXException { - setContentHandler(handler); - scan(e); - } - - /** - * Recursively visit ancestors and build up {@link NamespaceSupport} oject. - */ - private void buildNamespaceSupport(NamespaceSupport nss, Node node) { - if(node==null || node.getNodeType()!=Node.ELEMENT_NODE) - return; - - buildNamespaceSupport( nss, node.getParentNode() ); - - nss.pushContext(); - NamedNodeMap atts = node.getAttributes(); - for( int i=0; i=0; i-- ) { - Attr a = (Attr)attributes.item(i); - String name = a.getName(); - // start namespace binding - if(name.startsWith("xmlns")) { - if(name.length()==5) { - receiver.startPrefixMapping( "", a.getValue() ); - } else { - String localName = a.getLocalName(); - if(localName==null) { - // DOM built without namespace support has this problem - localName = name.substring(6); - } - receiver.startPrefixMapping( localName, a.getValue() ); - } - continue; - } - - String uri = a.getNamespaceURI(); - if(uri==null) uri=""; - - String local = a.getLocalName(); - if(local==null) local = a.getName(); - // add other attributes to the attribute list - // that we will pass to the ContentHandler - atts.addAttribute( - uri, - local, - a.getName(), - "CDATA", - a.getValue()); - } - - String uri = e.getNamespaceURI(); - if(uri==null) uri=""; - String local = e.getLocalName(); - String qname = e.getTagName(); - if(local==null) local = qname; - receiver.startElement( uri, local, qname, atts ); - - // visit its children - NodeList children = e.getChildNodes(); - int clen = children.getLength(); - for( int i=0; i=0; i-- ) { - Attr a = (Attr)attributes.item(i); - String name = a.getName(); - if(name.startsWith("xmlns")) { - if(name.length()==5) - receiver.endPrefixMapping(""); - else - receiver.endPrefixMapping(a.getLocalName()); - } - } - } - - private void visit( Node n ) throws SAXException { - setCurrentLocation( n ); - - // if a case statement gets too big, it should be made into a separate method. - switch(n.getNodeType()) { - case Node.CDATA_SECTION_NODE: - case Node.TEXT_NODE: - String value = n.getNodeValue(); - receiver.characters( value.toCharArray(), 0, value.length() ); - break; - case Node.ELEMENT_NODE: - visit( (Element)n ); - break; - case Node.ENTITY_REFERENCE_NODE: - receiver.skippedEntity(n.getNodeName()); - break; - case Node.PROCESSING_INSTRUCTION_NODE: - ProcessingInstruction pi = (ProcessingInstruction)n; - receiver.processingInstruction(pi.getTarget(),pi.getData()); - break; - } - } - - private void setCurrentLocation( Node currNode ) { - currentNode = currNode; - } - - /** - * The same as {@link #getCurrentElement()} but - * better typed. - */ - public Node getCurrentLocation() { - return currentNode; - } - - public Object getCurrentElement() { - return currentNode; - } - - public LocatorEx getLocator() { - return this; - } - - public void setContentHandler(ContentHandler handler) { - this.receiver = handler; - } - - public ContentHandler getContentHandler() { - return this.receiver; - } - - - // LocatorEx implementation - public String getPublicId() { return null; } - public String getSystemId() { return null; } - public int getLineNumber() { return -1; } - public int getColumnNumber() { return -1; } - - public ValidationEventLocator getLocation() { - return new ValidationEventLocatorImpl(getCurrentLocation()); - } -}