consumer.java

来自「kaffe Java 解释器语言,源码,Java的子集系统,开放源代码」· Java 代码 · 共 330 行

JAVA
330
字号
/* * Copyright (C) 2001 David Brownell *  * This file is part of GNU JAXP, a library. * * GNU JAXP is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. *  * GNU JAXP 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 for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License.  */package gnu.xml.dom;import java.io.IOException;import org.w3c.dom.Document;import org.w3c.dom.DocumentType;import org.w3c.dom.DOMImplementation;import org.w3c.dom.Node;import org.w3c.dom.Text;import org.xml.sax.Attributes;import org.xml.sax.ErrorHandler;import org.xml.sax.SAXException;import org.xml.sax.ext.Attributes2;import gnu.xml.pipeline.DomConsumer;import gnu.xml.pipeline.EventConsumer;/** * Event consumer which constructs DOM documents using the implementation * in this package, using SAX2 events.  This packages various backdoors * into this DOM implementation, as needed to address DOM requirements * that can't be met by strictly conforming implementations of DOM. * * <p> These requirements all relate to {@link DocumentType} nodes and * features of that node type.  These features are normally not used, * because that interface only exposes a subset of the information found * in DTDs.  More, that subset does not include the most important typing * information.  For example, it excludes element content models and * attribute typing.  It does expose some entity management issues, * although entity management doesn't relate to document typing. * * <p> Note that SAX2 does not expose the literal text of the DTD's * internal subset, so it will not be present in DOM trees constructed * using this API.  (Though with a good SAX2 implementation, it could * be partially recreated...) * * @author David Brownell */public class Consumer extends DomConsumer{    /**     * Constructs an unconfigured event consumer,     * as a terminus in a SAX event pipeline.     */    // used by PipelineFactory [terminus]    public Consumer ()    throws SAXException    {	super (DomDocument.class);	setHandler (new Backdoor (this));    }    /**     * Constructs an unconfigured event consumer,     * as a stage in a SAX event pipeline.     */    // used by PipelineFactory [filter]    public Consumer (EventConsumer next)    throws SAXException    {	super (DomDocument.class, next);	setHandler (new Backdoor (this));    }    /**     * Implements the backdoors needed by DOM.     * All methods in this class use implementation-specific APIs that are     * implied by the DOM specification (needed to implement testable     * behavior) but which are excluded from the DOM specification.     */    public static class Backdoor extends DomConsumer.Handler    {	/**	 * Constructor.	 * @param consumer must have been initialized to use the	 *	{@link DomDocument} class (or a subclass) for	 *	constructing DOM trees	 */	protected Backdoor (DomConsumer consumer)	throws SAXException	    { super (consumer); }	// helper routine	private DomDoctype getDoctype ()	throws SAXException	{	    DomDocument		doc = (DomDocument) getDocument ();	    DocumentType	dt = doc.getDoctype ();	    if (dt == null)		throw new SAXException ("doctype missing!");	    return (DomDoctype) dt;	}	// SAX2 "lexical" event	public void startDTD (String name, String publicId, String systemId)	throws SAXException	{	    DomDocument		doc = (DomDocument) getDocument ();	    super.startDTD (name, publicId, systemId);	    // DOM L2 doctype creation model is bizarre	    doc.appendChild (new DomDoctype (doc, name, publicId, systemId));	}	// SAX2 "lexical" event	public void endDTD ()	throws SAXException	{	    super.endDTD ();	    // DOM L2 has no way to make things readonly	    getDoctype ().makeReadonly ();	}	// SAX1 DTD event	public void notationDecl (	    String name,	    String publicId, String systemId	) throws SAXException	{	    // DOM L2 can't create/save notation nodes	    getDoctype ().declareNotation (name, publicId, systemId);	}	// SAX1 DTD event	public void unparsedEntityDecl (	    String name,	    String publicId, String systemId,	    String notationName	) throws SAXException	{	    // DOM L2 can't create/save entity nodes	    getDoctype ().declareEntity (name, publicId, systemId,	    	notationName);	}	// SAX2 declaration event	public void internalEntityDecl (String name, String value)	throws SAXException	{	    // DOM L2 can't create/save entity nodes	    // NOTE:  this doesn't save the value as a child of this	    // node, though it could realistically do so.	    getDoctype ().declareEntity (name, null, null, null);	}	// SAX2 declaration event	public void externalEntityDecl (	    String name,	    String publicId,	    String systemId	) throws SAXException	{	    // DOM L2 can't create/save entity nodes	    // NOTE:  DOM allows for these to have children, if	    // they don't have unbound namespace references.	    getDoctype ().declareEntity (name, publicId, systemId, null);	}	// SAX2 element	public void startElement (	    String uri,	    String localName,	    String qName,	    Attributes atts	) throws SAXException	{	    Node		top;	    super.startElement (uri, localName, qName, atts);	    // might there be more work?	    top = getTop ();	    if (!top.hasAttributes () || !(atts instanceof Attributes2))		return;	    // remember any attributes that got defaulted	    DomNamedNodeMap	map = (DomNamedNodeMap) top.getAttributes ();	    Attributes2		attrs = (Attributes2) atts;	    int			length = atts.getLength ();	    map.compact ();	    for (int i = 0; i < length; i++) {		if (attrs.isSpecified (i))		    continue;		// value was defaulted.		String		temp = attrs.getQName (i);		DomAttr		attr;		if ("".equals (temp))		    attr = (DomAttr) map.getNamedItemNS (attrs.getURI (i),			    atts.getLocalName (i));		else		    attr = (DomAttr) map.getNamedItem (temp);		// DOM L2 can't write this flag, only read it		attr.setSpecified (false);	    }	}	public void endElement (	    String uri,	    String localName,	    String qName	) throws SAXException	{	    DomNode	top = (DomNode) getTop ();	    top.compact ();	    super.endElement (uri, localName, qName);	}	protected Text createText (	    boolean	isCDATA,	    char	buf [],	    int		off,	    int		len	) {	    DomDocument	doc = (DomDocument) getDocument ();	    if (isCDATA)		return doc.createCDATASection (buf, off, len);	    else		return doc.createTextNode (buf, off, len);	}	public void attributeDecl (	    String	ename,	    String	aname,	    String	type,	    String	mode,	    String	value	) throws SAXException	{	    if (value == null && !"ID".equals (type))		return;	    	    DomDoctype.ElementInfo	info;	    info = getDoctype ().getElementInfo (ename);	    if (value != null)		info.setAttrDefault (aname, value);	    if ("ID".equals (type))		info.setIdAttr (aname);	}	// force duplicate name checking off while we're	// using parser output (don't duplicate the work)	public void startDocument () throws SAXException	{	    DomDocument		doc;	    super.startDocument ();	    ((DomDocument) getDocument ()).setCheckingCharacters (false);	}	public void endDocument ()	throws SAXException	{	    DomDocument		doc = (DomDocument) getDocument ();	    doc.setCheckingCharacters (true);	    doc.compact ();	    super.endDocument ();	}	// these three methods collaborate to populate entity	// refs, marking contents readonly on end-of-entity	public boolean canPopulateEntityRefs ()	    { return true; }	public void startEntity (String name)	throws SAXException	{	    if (name.charAt (0) == '%' || "[dtd]".equals (name))		return;	    super.startEntity (name);	    DomNode	top = (DomNode) getTop ();	    if (top.getNodeType () == Node.ENTITY_REFERENCE_NODE)		top.readonly = false;	}	public void endEntity (String name)	throws SAXException	{	    if (name.charAt (0) == '%' || "[dtd]".equals (name))		return;	    DomNode	top = (DomNode) getTop ();	    if (top.getNodeType () == Node.ENTITY_REFERENCE_NODE) {		top.compact ();		top.makeReadonly ();	    }	    super.endEntity (name);	}    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?