use of org.opendatakit.briefcase.util.ServerFetcher.SubmissionManifest in project briefcase by opendatakit.
the class XmlManipulationUtils method parseDownloadSubmissionResponse.
public static final SubmissionManifest parseDownloadSubmissionResponse(Document doc) throws ParsingException {
// and parse the document...
List<MediaFile> attachmentList = new ArrayList<>();
Element rootSubmissionElement = null;
String instanceID = null;
// Attempt parsing
Element submissionElement = doc.getRootElement();
if (!submissionElement.getName().equals("submission")) {
String msg = "Parsing downloadSubmission reply -- root element is not <submission> :" + submissionElement.getName();
log.error(msg);
throw new ParsingException(msg);
}
String namespace = submissionElement.getNamespace();
if (!namespace.equalsIgnoreCase(NAMESPACE_OPENDATAKIT_ORG_SUBMISSIONS)) {
String msg = "Parsing downloadSubmission reply -- root element namespace is incorrect:" + namespace;
log.error(msg);
throw new ParsingException(msg);
}
int nElements = submissionElement.getChildCount();
for (int i = 0; i < nElements; ++i) {
if (submissionElement.getType(i) != Element.ELEMENT) {
// e.g., whitespace (text)
continue;
}
Element subElement = (Element) submissionElement.getElement(i);
namespace = subElement.getNamespace();
if (!namespace.equalsIgnoreCase(NAMESPACE_OPENDATAKIT_ORG_SUBMISSIONS)) {
// someone else's extension?
continue;
}
String name = subElement.getName();
if (name.equalsIgnoreCase("data")) {
// find the root submission element and get its instanceID attribute
int nIdElements = subElement.getChildCount();
for (int j = 0; j < nIdElements; ++j) {
if (subElement.getType(j) != Element.ELEMENT) {
// e.g., whitespace (text)
continue;
}
rootSubmissionElement = (Element) subElement.getElement(j);
break;
}
if (rootSubmissionElement == null) {
throw new ParsingException("no submission body found in submissionDownload response");
}
instanceID = rootSubmissionElement.getAttributeValue(null, "instanceID");
if (instanceID == null) {
throw new ParsingException("instanceID attribute value is null");
}
} else if (name.equalsIgnoreCase("mediaFile")) {
int nIdElements = subElement.getChildCount();
String filename = null;
String hash = null;
String downloadUrl = null;
for (int j = 0; j < nIdElements; ++j) {
if (subElement.getType(j) != Element.ELEMENT) {
// e.g., whitespace (text)
continue;
}
Element mediaSubElement = (Element) subElement.getElement(j);
name = mediaSubElement.getName();
if (name.equalsIgnoreCase("filename")) {
filename = XFormParser.getXMLText(mediaSubElement, true);
} else if (name.equalsIgnoreCase("hash")) {
hash = XFormParser.getXMLText(mediaSubElement, true);
} else if (name.equalsIgnoreCase("downloadUrl")) {
downloadUrl = XFormParser.getXMLText(mediaSubElement, true);
}
}
attachmentList.add(new MediaFile(filename, hash, downloadUrl));
} else {
log.warn("Unrecognized tag inside submission: " + name);
}
}
if (rootSubmissionElement == null) {
throw new ParsingException("No submission body found");
}
if (instanceID == null) {
throw new ParsingException("instanceID attribute value is null");
}
// write submission to a string
StringWriter fo = new StringWriter();
KXmlSerializer serializer = new KXmlSerializer();
serializer.setOutput(fo);
// setting the response content type emits the xml header.
// just write the body here...
// this has the xmlns of the submissions download, indicating that it
// originated from a briefcase download. Might be useful for discriminating
// real vs. recovered data?
rootSubmissionElement.setPrefix(null, NAMESPACE_OPENDATAKIT_ORG_SUBMISSIONS);
try {
rootSubmissionElement.write(serializer);
serializer.flush();
serializer.endDocument();
fo.close();
} catch (IOException e) {
String msg = "Unexpected IOException";
log.error(msg, e);
throw new ParsingException(msg + ": " + e.getMessage());
}
return new SubmissionManifest(instanceID, fo.toString(), attachmentList);
}
Aggregations