package sax;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.SAXParser;
import org.xml.sax.*;
import org.xml.sax.ext.DeclHandler;
import org.xml.sax.ext.DefaultHandler2;
import com.fasterxml.aalto.sax.*;
public class TestSaxReader
extends base.BaseTestCase
{
public void testSimpleReader()
throws IOException, SAXException
{
doTest("<root/>", "<root;root></root;root>");
}
public void testComments()
throws IOException, SAXException
{
doTest("<!--c1--><a><!--c2--></a><!--c3-->",
"<!--c1--><a;a><!--c2--></a;a><!--c3-->");
}
public void testPI()
throws IOException, SAXException
{
doTest("<?p?><a><?proc instr ?></a><?p2 ?>",
"<?p?><a;a><?proc instr ?></a;a><?p2?>");
}
/*
//////////////////////////////////////////////////////
// Helper methods:
//////////////////////////////////////////////////////
*/
private void doTest(String inputXml, String expXml)
throws IOException, SAXException
{
SAXParserFactoryImpl spf = new SAXParserFactoryImpl();
SAXParser sp = spf.newSAXParser();
MyContentHandler h = new MyContentHandler();
sp.setProperty(SAXProperty.LEXICAL_HANDLER.toExternal(), (DeclHandler) h);
StringReader str = new StringReader(inputXml);
sp.parse(new InputSource(str), h);
expXml = "[[" + expXml + "]]";
assertEquals(expXml, h.toString());
}
/*
////////////////////////////////////////////////
// Helper class
////////////////////////////////////////////////
*/
final static class MyContentHandler
extends DefaultHandler2
implements DeclHandler
{
final StringBuffer mText = new StringBuffer();
public MyContentHandler() { }
@Override
public String toString() { return mText.toString(); }
@Override
public void characters(char[] ch, int start, int length)
{
mText.append(ch, start, length);
}
@Override
public void endDocument()
{
mText.append("]]");
}
@Override
public void endElement(String namespaceURI, String localName, String qName)
{
mText.append("</");
appendName(mText, localName, qName, namespaceURI);
mText.append(">");
}
@Override
public void endPrefixMapping(String prefix)
{
mText.append("{/");
mText.append(prefix);
mText.append("}");
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length)
{
mText.append(ch, start, length);
}
@Override
public void processingInstruction(String target, String data)
{
mText.append("<?");
mText.append(target);
if (data != null && data.length() > 0) {
mText.append(' ');
mText.append(data);
}
mText.append("?>");
}
@Override
public void setDocumentLocator(Locator locator) { }
@Override
public void skippedEntity(String name)
{
mText.append('&');
mText.append(name);
mText.append(';');
}
@Override
public void startDocument()
{
mText.append("[[");
}
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes attrs)
{
mText.append("<");
appendName(mText, localName, qName, namespaceURI);
for (int i = 0, len = attrs.getLength(); i < len; ++i) {
mText.append(' ');
appendName(mText, attrs.getLocalName(i), attrs.getQName(i),
attrs.getURI(i));
mText.append("='");
mText.append(attrs.getValue(i));
mText.append("'");
}
mText.append(">");
}
@Override
public void startPrefixMapping(String prefix, String uri)
{
// !!! TBI
}
@Override
public void unparsedEntityDecl(String name, String publicId, String systemId, String notationName)
{
// !!! TBI
}
@Override
public void warning(SAXParseException e)
{
// !!! TBI
}
// // // LexicalHandler:
@Override
public void comment(char[] ch, int start, int length)
{
mText.append("<!--");
mText.append(ch, start, length);
mText.append("-->");
}
@Override
public void endCDATA()
{
}
@Override
public void endDTD()
{
mText.append("]>");
}
@Override
public void endEntity(String name)
{
}
@Override
public void startCDATA()
{
}
@Override
public void startDTD(String name, String publicId, String systemId)
{
mText.append("<!DOCTYPE ");
mText.append(name);
if (publicId != null) {
mText.append(" PUBLIC ");
mText.append(publicId);
if (systemId != null) {
mText.append(' ');
mText.append(systemId);
}
} else if (systemId != null) {
mText.append(" SYSTEM ");
mText.append(systemId);
}
mText.append(" [");
}
@Override
public void startEntity(String name) { }
// // // Helper methods:
private void appendName(StringBuffer sb, String ln, String qn, String uri)
{
if (uri != null && uri.length() > 0) {
mText.append('{');
mText.append(uri);
mText.append('}');
}
mText.append(ln);
mText.append(';');
mText.append(qn);
}
}
}