use of ca.corefacility.bioinformatics.irida.model.enums.ExportUploadState in project irida by phac-nml.
the class ExportUploadService method updateSubmissionForXml.
/**
* Get the updates from the result.#.xml file for the given submission and
* update the object. XML will look like the following:
*
* <pre>
* <?xml version='1.0' encoding='utf-8'?>
* <SubmissionStatus submission_id="SUB1234" status="processed-ok">
* <Action action_id="SUB1234-submission12345" target_db="SRA" status="processed-ok" notify_submitter="true">
* <Response status="processed-ok">
* <Object target_db="SRA" object_id="RUN:4567" spuid_namespace="NML" spuid="submission12345" accession="SRR6789" status="updated">
* <Meta>
* <SRAStudy>SRP012345</SRAStudy>
* </Meta>
* </Object>
* </Response>
* </Action>
* </SubmissionStatus>
* </pre>
*
* @param submission
* {@link NcbiExportSubmission} to update
* @param xml
* {@link InputStream} of xml
* @return Updated {@link NcbiExportSubmission}
* @throws NcbiXmlParseException
* if the xml couldn't be parsed
*/
private NcbiExportSubmission updateSubmissionForXml(NcbiExportSubmission submission, InputStream xml) throws NcbiXmlParseException {
try {
// read the incoming xml file
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(xml);
XPath xPath = XPathFactory.newInstance().newXPath();
// get the submission status and set it in the submission
String submissionStatusString = xPath.compile("SubmissionStatus/@status").evaluate(doc);
if (submissionStatusString == null) {
throw new NcbiXmlParseException("result file should have 1 SubmissionStatus element with a status");
}
ExportUploadState submissionStatus = ExportUploadState.fromString(submissionStatusString);
submission.setUploadState(submissionStatus);
logger.trace("Root export state is " + submissionStatus);
// get all the sample files objects by name
Map<String, NcbiBioSampleFiles> sampleMap = getSampleNameMap(submission);
// get the actions
NodeList actions = (NodeList) xPath.compile("SubmissionStatus/Action").evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < actions.getLength(); i++) {
if (actions.item(i).getNodeType() == Node.ELEMENT_NODE) {
Element action = (Element) actions.item(i);
// get the status and action id
String status = action.getAttribute("status");
String actionId = action.getAttribute("action_id");
// action id is of the form SUBMISSIONID-sampleid
String sampleId = actionId.substring(actionId.indexOf("-") + 1);
// get the sample for this action
NcbiBioSampleFiles ncbiBioSampleFiles = sampleMap.get(sampleId);
ExportUploadState sampleStatus = ExportUploadState.fromString(status);
ncbiBioSampleFiles.setSubmissionStatus(sampleStatus);
logger.trace("Sample export state for sample " + ncbiBioSampleFiles.getId() + " is " + sampleStatus);
String accession = xPath.compile("Response/Object/@accession").evaluate(action);
if (accession != null && !accession.isEmpty()) {
logger.trace("Found accession " + accession);
ncbiBioSampleFiles.setAccession(accession);
}
}
}
} catch (XPathExpressionException | ParserConfigurationException | SAXException | IOException e) {
logger.error("Couldn't parse response XML", e);
throw new NcbiXmlParseException("Error parsing NCBI response", e);
}
return submission;
}
Aggregations