/*
* @(#)$Id: SAXEventGenerator.java,v 1.2 2001/10/09 00:06:49 Bear Exp $
*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the proprietary information of Sun Microsystems, Inc.
* Use is subject to license terms.
*
*/
package com.sun.msv.util.xml;
import org.w3c.dom.Node;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Document;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.LocatorImpl;
/**
* produces SAX2 event from a DOM tree.
*
* @author
* <a href="mailto:kohsuke.kawaguchi@sun.com">Kohsuke KAWAGUCHI</a>
*/
public class SAXEventGenerator {
/**
* scans the specified DOM and sends SAX2 events to the handler.
*/
public static void parse( Document dom, final ContentHandler handler ) throws SAXException {
DOMVisitor visitor = new DOMVisitor(){
public void visit( Element e ) {
int attLen = e.getAttributes().getLength();
AttributesImpl atts = new AttributesImpl();
for( int i=0; i<attLen; i++ ) {
Attr a = (Attr)e.getAttributes().item(i);
String uri = a.getNamespaceURI();
String local = a.getLocalName();
if(uri==null) uri="";
if(local==null) local=a.getName();
atts.addAttribute( uri,local,
a.getName(), null/*no type available*/, a.getValue() );
}
try {
String uri = e.getNamespaceURI();
String local = e.getLocalName();
if(uri==null) uri="";
if(local==null) local=e.getNodeName();
handler.startElement( uri, local, e.getNodeName(), atts );
super.visit(e);
handler.endElement( uri, local, e.getNodeName() );
} catch( SAXException x ) {
throw new SAXWrapper(x);
}
}
public void visitNode( Node n ) {
if( n.getNodeType()==n.TEXT_NODE
|| n.getNodeType()==n.CDATA_SECTION_NODE ) {
String text = n.getNodeValue();
try {
handler.characters( text.toCharArray(), 0, text.length() );
} catch( SAXException x ) {
throw new SAXWrapper(x);
}
}
super.visitNode(n);
}
};
// set a dummy locator. We cannot provide location information.
handler.setDocumentLocator( new LocatorImpl() );
handler.startDocument();
try {
visitor.visit(dom);
} catch( SAXWrapper w ) {
throw w.e;
}
handler.endDocument();
}
// wrap SAXException into a RuntimeException so that
// exception can pass through DOMVisitor.
private static class SAXWrapper extends RuntimeException {
SAXWrapper( SAXException e ) { this.e=e; }
SAXException e;
}
}