package org.isatools.isacreator.validateconvert.ui.ENAReceipt;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.w3c.dom.NodeList;
import uk.ac.ebi.utils.xml.XPathReader;
import javax.xml.xpath.XPathConstants;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;
public class ENAReceiptParser {
private static Logger log = Logger.getLogger(ENAReceiptParser.class.getName());
public static ENAReceipt parseReceipt(String receipt) {
try {
InputStream stream = IOUtils.toInputStream(receipt, "UTF-8");
XPathReader reader = new XPathReader(stream);
Set<String> experimentAccessions = parseReceiptSection(reader, "EXPERIMENT");
Set<String> sampleAccessions = parseReceiptSection(reader, "SAMPLE");
Set<String> runAccessions = parseReceiptSection(reader, "RUN");
Set<String> studyAccessions = parseReceiptSection(reader, "STUDY");
Set<String> infoMessages = parseReceiptInfoMessages(reader);
Set<String> errors = parseReceiptErrors(reader);
return new ENAReceipt(experimentAccessions, sampleAccessions, runAccessions, studyAccessions, infoMessages, errors);
} catch (IOException e) {
log.error(e);
e.printStackTrace();
return null;
}
}
public static Set<String> parseReceiptSection(XPathReader reader, String section) {
NodeList experiments = (NodeList) reader.read("/RECEIPT/" + section, XPathConstants.NODESET);
Set<String> accessions = new HashSet<String>();
if (experiments.getLength() > 0) {
for (int experimentIndex = 0; experimentIndex <= experiments.getLength(); experimentIndex++) {
String accession = (String) reader.read("/RECEIPT/" + section + "[" + experimentIndex + "]/@accession", XPathConstants.STRING);
if (!accession.isEmpty()) {
accessions.add(accession);
}
}
}
return accessions;
}
public static Set<String> parseReceiptInfoMessages(XPathReader reader) {
Set<String> infoSet = new HashSet<String>();
NodeList infoMessages = (NodeList) reader.read("/RECEIPT/MESSAGES/INFO", XPathConstants.NODESET);
if (infoMessages.getLength() > 0) {
for (int experimentIndex = 0; experimentIndex <= infoMessages.getLength(); experimentIndex++) {
String info = (String) reader.read("/RECEIPT/MESSAGES/INFO[" + experimentIndex + "]", XPathConstants.STRING);
if (!info.isEmpty()) {
infoSet.add(info);
}
}
}
return infoSet;
}
public static Set<String> parseReceiptErrors(XPathReader reader) {
Set<String> errors = new HashSet<String>();
NodeList errorMessages = (NodeList) reader.read("/RECEIPT/MESSAGES/ERROR", XPathConstants.NODESET);
if (errorMessages.getLength() > 0) {
for (int experimentIndex = 0; experimentIndex <= errorMessages.getLength(); experimentIndex++) {
String error = (String) reader.read("/RECEIPT/MESSAGES/ERROR[" + experimentIndex + "]", XPathConstants.STRING);
if (!error.isEmpty()) {
errors.add(error);
}
}
}
return errors;
}
}