package net.rrm.ehour.backup.service.restore;
import net.rrm.ehour.backup.domain.ImportException;
import net.rrm.ehour.backup.domain.ParseSession;
import net.rrm.ehour.domain.DomainObject;
import org.apache.log4j.Logger;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
public class EntityTableParser {
private static final Logger LOG = Logger.getLogger(EntityTableParser.class);
private final XMLEventReader xmlReader;
private final EntityParser entityParser;
public EntityTableParser(XMLEventReader xmlReader, EntityParser entityParser) {
this.xmlReader = xmlReader;
this.entityParser = entityParser;
}
public void parseEntityTables(JoinTables joinTables, ParseSession session) throws XMLStreamException, ClassNotFoundException, ImportException, InstantiationException, IllegalAccessException {
LOG.info("Entity tables found, parsing");
while (xmlReader.hasNext()) {
XMLEvent containerEvent = xmlReader.nextTag();
if (containerEvent.isEndElement()) {
break;
}
session.eventProgressed();
parseEntity(joinTables, session, containerEvent);
}
LOG.info("Entity tables parsed");
}
@SuppressWarnings("unchecked")
private void parseEntity(JoinTables joinTables, ParseSession status, XMLEvent event) throws XMLStreamException, InstantiationException, IllegalAccessException, ClassNotFoundException, ImportException {
StartElement element = event.asStartElement();
Attribute attribute = element.getAttributeByName(new QName("CLASS"));
if (attribute != null) {
try {
String aClass = attribute.getValue();
Class<? extends DomainObject> doClass = (Class<? extends DomainObject>) Class.forName(aClass);
entityParser.parse(doClass, joinTables, status);
} catch (Exception e) {
LOG.warn("element " + attribute.getValue() + " threw " + e.getMessage(), e);
throw new ImportException("element " + attribute.getValue() + " threw " + e.getMessage(), e);
}
} else {
throw new ImportException("Invalid XML, no attribute found for element: " + element.getName().getLocalPart());
}
}
}