package aQute.libg.sax.filters; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import aQute.libg.sax.ContentFilterImpl; import aQute.libg.sax.SAXElement; public class MergeContentFilter extends ContentFilterImpl { private int elementDepth = 0; private final List<SAXElement> rootElements = new LinkedList<SAXElement>(); @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { if (elementDepth++ == 0) { if (rootElements.isEmpty()) super.startElement(uri, localName, qName, atts); else if (!rootElements.get(0).getqName().equals(qName)) throw new SAXException( String.format("Documents have inconsistent root element names: first was %s, current is %s.", rootElements.get(0).getqName(), qName)); rootElements.add(new SAXElement(uri, localName, qName, atts)); } else { super.startElement(uri, localName, qName, atts); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (--elementDepth > 0) { super.endElement(uri, localName, qName); } } @Override public void processingInstruction(String target, String data) throws SAXException { if (rootElements.isEmpty()) super.processingInstruction(target, data); } public void closeRootAndDocument() throws SAXException { if (!rootElements.isEmpty()) { SAXElement root = rootElements.get(0); super.endElement(root.getUri(), root.getLocalName(), root.getqName()); } super.endDocument(); } public List<SAXElement> getRootElements() { return Collections.unmodifiableList(rootElements); } }