package eu.dnetlib.iis.wf.ingest.pmc.metadata; import java.util.Map; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * Sax xml handler which can switch between different implementations of * {@link ProcessingFinishedAwareXmlHandler} content handlers. * Each implementation is responsible for processing only part of * xml enclosed by specified tag name. * * @author madryk * */ public class XmlSwitcherHandler extends DefaultHandler { private ProcessingFinishedAwareXmlHandler currentHandler; private final Map<String, ProcessingFinishedAwareXmlHandler> handlers; //------------------------ CONSTRUCTORS -------------------------- /** * Default constructor * * @param handlers - map of handlers responsible for parsing parts of xml. * In key there should be a name of xml tag that is handled by handler specified * as value. */ public XmlSwitcherHandler(Map<String, ProcessingFinishedAwareXmlHandler> handlers) { super(); this.currentHandler = null; this.handlers = handlers; } //------------------------ LOGIC -------------------------- @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (currentHandler == null) { if (handlers.containsKey(qName)) { currentHandler = handlers.get(qName); currentHandler.startDocument(); currentHandler.startElement(uri, localName, qName, attributes); } } else { currentHandler.startElement(uri, localName, qName, attributes); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if (currentHandler != null) { currentHandler.characters(ch, start, length); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (currentHandler != null) { currentHandler.endElement(uri, localName, qName); if (currentHandler.hasFinished()) { currentHandler.endDocument(); currentHandler = null; } } } }