Search in sources :

Example 1 with ExportUploadState

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;
}
Also used : XPath(javax.xml.xpath.XPath) DocumentBuilderFactory(javax.xml.parsers.DocumentBuilderFactory) XPathExpressionException(javax.xml.xpath.XPathExpressionException) NodeList(org.w3c.dom.NodeList) Element(org.w3c.dom.Element) IOException(java.io.IOException) Document(org.w3c.dom.Document) NcbiXmlParseException(ca.corefacility.bioinformatics.irida.exceptions.NcbiXmlParseException) SAXException(org.xml.sax.SAXException) NcbiBioSampleFiles(ca.corefacility.bioinformatics.irida.model.export.NcbiBioSampleFiles) DocumentBuilder(javax.xml.parsers.DocumentBuilder) ExportUploadState(ca.corefacility.bioinformatics.irida.model.enums.ExportUploadState) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException)

Aggregations

NcbiXmlParseException (ca.corefacility.bioinformatics.irida.exceptions.NcbiXmlParseException)1 ExportUploadState (ca.corefacility.bioinformatics.irida.model.enums.ExportUploadState)1 NcbiBioSampleFiles (ca.corefacility.bioinformatics.irida.model.export.NcbiBioSampleFiles)1 IOException (java.io.IOException)1 DocumentBuilder (javax.xml.parsers.DocumentBuilder)1 DocumentBuilderFactory (javax.xml.parsers.DocumentBuilderFactory)1 ParserConfigurationException (javax.xml.parsers.ParserConfigurationException)1 XPath (javax.xml.xpath.XPath)1 XPathExpressionException (javax.xml.xpath.XPathExpressionException)1 Document (org.w3c.dom.Document)1 Element (org.w3c.dom.Element)1 NodeList (org.w3c.dom.NodeList)1 SAXException (org.xml.sax.SAXException)1