package edu.harvard.i2b2.crc.loader.xml;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.EventFilter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.crc.datavo.pdo.ObservationType;
public class TypePullParser {
StartElementListener listener = null;
String filename = null;
String typeName = null;
Class jaxbClass = null;
public TypePullParser(StartElementListener listener, String typeName,
Class jaxbClass, String filename) {
this.listener = listener;
this.typeName = typeName;
this.jaxbClass = jaxbClass;
this.filename = filename;
}
public void doParsing() throws I2B2Exception {
XMLInputFactory xmlif = XMLInputFactory.newInstance();
FileReader fr = null;
try {
fr = new FileReader(filename);
XMLEventReader xmler = xmlif.createXMLEventReader(fr);
EventFilter filter = new EventFilter() {
public boolean accept(XMLEvent event) {
return event.isStartElement();
}
};
XMLEventReader xmlfer = xmlif.createFilteredReader(xmler, filter);
// Jump to the first element in the document, the enclosing
// BugCollection
StartElement e = (StartElement) xmlfer.nextEvent();
// System.out.println(e.getName().getLocalPart());
JAXBContext ctx = JAXBContext
.newInstance("edu.harvard.i2b2.crc.datavo.i2b2message:edu.harvard.i2b2.crc.datavo.pdo");
Unmarshaller um = ctx.createUnmarshaller();
Marshaller ma = ctx.createMarshaller();
int bugs = 0;
while (xmlfer.hasNext()) {
StartElement startElement = (StartElement) xmlfer.peek();
if (startElement == null) {
break;
}
if (startElement.getName().getLocalPart().trim().equals(
typeName)) {
JAXBElement<ObservationType> element = um.unmarshal(xmler,
jaxbClass);
listener.process(element.getValue());
} else {
xmlfer.nextEvent();
}
}
} catch (JAXBException jaxEx) {
throw new I2B2Exception("<" + typeName + "> parsing failed", jaxEx);
} catch (XMLStreamException streamEx) {
throw new I2B2Exception("<" + typeName + "> parsing failed",
streamEx);
} catch (FileNotFoundException fileEx) {
throw new I2B2Exception("<" + typeName + "> parsing failed", fileEx);
} finally {
try {
fr.close();
} catch (IOException ioe) {
;
}
}
}
}