package aQute.libg.sax;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import aQute.libg.sax.filters.ElementSelectionFilter;
import aQute.libg.sax.filters.MergeContentFilter;
import junit.framework.TestCase;
public class TestSAXFilters extends TestCase {
private static final String SAMPLE1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<root a=\"1\"><a><b><c></c></b></a></root>";
private static final String SAMPLE2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<root b=\"2\"><x><y><z></z></y></x></root>";
private static final String MERGED1_2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<root a=\"1\"><a><b><c/></b></a><x><y><z/></y></x></root>";
private static final String SAMPLE3 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<anotherRoot b=\"2\"><x><y><z></z></y></x></anotherRoot>";
private static final String SAMPLE4 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<root c=\"3\"><a><b><c><d><e><f><g><h></h></g></f></e></d></c></b></a></root>";
private static final String SAMPLE5 = "<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet type='text/xsl' href='http://www2.osgi.org/www/obr2html.xsl'?><root><a/></root>";
public void testMerge() throws Exception {
ByteArrayOutputStream output = new ByteArrayOutputStream();
MergeContentFilter merger = new MergeContentFilter();
XMLReader reader = SAXUtil.buildPipeline(new StreamResult(output), merger);
reader.parse(new InputSource(new ByteArrayInputStream(SAMPLE1.getBytes())));
reader.parse(new InputSource(new ByteArrayInputStream(SAMPLE2.getBytes())));
merger.closeRootAndDocument();
assertEquals(MERGED1_2, output.toString());
assertEquals(2, merger.getRootElements().size());
}
public void testMergeInconsistentRoots() throws Exception {
ByteArrayOutputStream output = new ByteArrayOutputStream();
MergeContentFilter merger = new MergeContentFilter();
XMLReader reader = SAXUtil.buildPipeline(new StreamResult(output), merger);
try {
reader.parse(new InputSource(new ByteArrayInputStream(SAMPLE1.getBytes())));
reader.parse(new InputSource(new ByteArrayInputStream(SAMPLE3.getBytes())));
fail("Should throw exception for inconsistent roots");
} catch (SAXException e) {}
}
public void testDontRepeatProcessingInstruction() throws Exception {
ByteArrayOutputStream output = new ByteArrayOutputStream();
MergeContentFilter merger = new MergeContentFilter();
XMLReader reader = SAXUtil.buildPipeline(new StreamResult(output), merger);
reader.parse(new InputSource(new ByteArrayInputStream(SAMPLE5.getBytes())));
reader.parse(new InputSource(new ByteArrayInputStream(SAMPLE5.getBytes())));
merger.closeRootAndDocument();
String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><?xml-stylesheet type='text/xsl' href='http://www2.osgi.org/www/obr2html.xsl'?><root><a/><a/></root>";
assertEquals(expected, stripLineBreaks(output.toString()));
}
public void testSelectionFilter() throws Exception {
ByteArrayOutputStream output = new ByteArrayOutputStream();
ElementSelectionFilter filter = new ElementSelectionFilter() {
@Override
protected boolean select(int depth, String uri, String localName, String qName, Attributes attribs) {
return !"e".equals(qName);
}
};
XMLReader reader = SAXUtil.buildPipeline(new StreamResult(output), filter);
reader.parse(new InputSource(new ByteArrayInputStream(SAMPLE4.getBytes())));
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root c=\"3\"><a><b><c><d/></c></b></a></root>",
output.toString());
}
// Line breaks in the XML (e.g. after a PI node) seem to vary across
// platforms and even Java versions
// on the same platform. Use this utility method to strip all LFs and CRs
// from an input string.
private String stripLineBreaks(String input) {
return input == null ? null : input.replaceAll("\\r?\\n", "");
}
}