FileDocCategorySizeDatePackage
SAX2DOM.javaAPI DocJava SE 6 API8820Tue Jun 10 00:22:34 BST 2008com.sun.org.apache.xalan.internal.xsltc.trax

SAX2DOM

public class SAX2DOM extends Object implements LexicalHandler, Constants, ContentHandler
author
G. Todd Miller
author
Sunitha Reddy

Fields Summary
private Node
_root
private Document
_document
private Node
_nextSibling
private Stack
_nodeStk
private Vector
_namespaceDecls
private Node
_lastSibling
private Locator
locator
private boolean
needToSetDocumentInfo
static final DocumentBuilderFactory
_factory
JAXP document builder factory. Create a single instance and use synchronization because the Javadoc is not explicit about thread safety.
Constructors Summary
public SAX2DOM()

            
        
        synchronized (SAX2DOM.class) {
          _document = _factory.newDocumentBuilder().newDocument();
        }
	_root = _document;
    
public SAX2DOM(Node root, Node nextSibling)

	_root = root;
	if (root instanceof Document) {
	  _document = (Document)root;
	}
	else if (root != null) {
	  _document = root.getOwnerDocument();
	}
	else {
          synchronized (SAX2DOM.class) {
              _document = _factory.newDocumentBuilder().newDocument();
          }
	  _root = _document;
	}
	
	_nextSibling = nextSibling;
    
public SAX2DOM(Node root)

        this(root, null);
    
Methods Summary
public voidcharacters(char[] ch, int start, int length)

        // Ignore text nodes of length 0
        if (length == 0) {
            return;
        }
        
	final Node last = (Node)_nodeStk.peek();

        // No text nodes can be children of root (DOM006 exception)
        if (last != _document) {
            final String text = new String(ch, start, length);
            if( _lastSibling != null && _lastSibling.getNodeType() == Node.TEXT_NODE ){
                  ((Text)_lastSibling).appendData(text);
            }
            else if (last == _root && _nextSibling != null) {
                _lastSibling = last.insertBefore(_document.createTextNode(text), _nextSibling);
            }
            else {
                _lastSibling = last.appendChild(_document.createTextNode(text));
            }
        }
    
public voidcomment(char[] ch, int start, int length)
Lexical Handler method to create comment node in DOM tree.

	final Node last = (Node)_nodeStk.peek();
	Comment comment = _document.createComment(new String(ch,start,length));
	if (comment != null){
          if (last == _root && _nextSibling != null)
              last.insertBefore(comment, _nextSibling);
          else
              last.appendChild(comment);
          
          _lastSibling = comment;
        }
    
public voidendCDATA()

 
public voidendDTD()

 
public voidendDocument()

        _nodeStk.pop();
    
public voidendElement(java.lang.String namespace, java.lang.String localName, java.lang.String qName)

	_nodeStk.pop();
        _lastSibling = null;
    
public voidendEntity(java.lang.String name)

 
public voidendPrefixMapping(java.lang.String prefix)

	// do nothing
    
public org.w3c.dom.NodegetDOM()

	return _root;
    
public voidignorableWhitespace(char[] ch, int start, int length)
This class is only used internally so this method should never be called.

    
public voidprocessingInstruction(java.lang.String target, java.lang.String data)
adds processing instruction node to DOM.

	final Node last = (Node)_nodeStk.peek();
	ProcessingInstruction pi = _document.createProcessingInstruction(
		target, data);
	if (pi != null){
          if (last == _root && _nextSibling != null)
              last.insertBefore(pi, _nextSibling);
          else
              last.appendChild(pi);
          
          _lastSibling = pi;
        }
    
private voidsetDocumentInfo()

        //try to set document version
        if (locator == null) return;
        try{
            _document.setXmlVersion(((Locator2)locator).getXMLVersion());
        }catch(ClassCastException e){}
        
    
public voidsetDocumentLocator(org.xml.sax.Locator locator)
This class is only used internally so this method should never be called.

        this.locator = locator;
    
public voidskippedEntity(java.lang.String name)
This class is only used internally so this method should never be called.

    
public voidstartCDATA()

 
public voidstartDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)

public voidstartDocument()

	_nodeStk.push(_root);
    
public voidstartElement(java.lang.String namespace, java.lang.String localName, java.lang.String qName, org.xml.sax.Attributes attrs)

        
        if (needToSetDocumentInfo) {
            setDocumentInfo();
            needToSetDocumentInfo = false;
        }
        
	final Element tmp = (Element)_document.createElementNS(namespace, qName);

	// Add namespace declarations first
	if (_namespaceDecls != null) {
	    final int nDecls = _namespaceDecls.size();
	    for (int i = 0; i < nDecls; i++) {
		final String prefix = (String) _namespaceDecls.elementAt(i++);

		if (prefix == null || prefix.equals(EMPTYSTRING)) {
		    tmp.setAttributeNS(XMLNS_URI, XMLNS_PREFIX,
			(String) _namespaceDecls.elementAt(i));
		}
		else {
		    tmp.setAttributeNS(XMLNS_URI, XMLNS_STRING + prefix,
			(String) _namespaceDecls.elementAt(i));
		}
	    }
	    _namespaceDecls.clear();
	}

	// Add attributes to element
/*	final int nattrs = attrs.getLength();
	for (int i = 0; i < nattrs; i++) {
	    if (attrs.getLocalName(i) == null) {
		tmp.setAttribute(attrs.getQName(i), attrs.getValue(i));
	    }
	    else {
		tmp.setAttributeNS(attrs.getURI(i), attrs.getQName(i),
		    attrs.getValue(i));
	    }
	} */
        
        
	// Add attributes to element
        final int nattrs = attrs.getLength();
        for (int i = 0; i < nattrs; i++) {
            // checking if Namespace processing is being done
            String attQName = attrs.getQName(i);
            String attURI = attrs.getURI(i);
            if (attrs.getLocalName(i).equals("")) {
                tmp.setAttribute(attQName, attrs.getValue(i));
                if (attrs.getType(i).equals("ID")) {
                    tmp.setIdAttribute(attQName, true);
                }
            } else {
                tmp.setAttributeNS(attURI, attQName, attrs.getValue(i));
                if (attrs.getType(i).equals("ID")) {
                    tmp.setIdAttributeNS(attURI, attrs.getLocalName(i), true);
                }
            }
        }
        

	// Append this new node onto current stack node
	Node last = (Node)_nodeStk.peek();
	
	// If the SAX2DOM is created with a non-null next sibling node,
	// insert the result nodes before the next sibling under the root.
	if (last == _root && _nextSibling != null)
	    last.insertBefore(tmp, _nextSibling);
	else
	    last.appendChild(tmp);

	// Push this node onto stack
	_nodeStk.push(tmp);
        _lastSibling = null;
    
public voidstartEntity(java.lang.String name)

 
public voidstartPrefixMapping(java.lang.String prefix, java.lang.String uri)

	if (_namespaceDecls == null) {
	    _namespaceDecls = new Vector(2);
	}
	_namespaceDecls.addElement(prefix);
	_namespaceDecls.addElement(uri);