use of org.opendatakit.briefcase.model.DocumentDescription in project briefcase by opendatakit.
the class ServerFetcher method downloadSubmission.
private void downloadSubmission(File formInstancesDir, DatabaseUtils formDatabase, BriefcaseFormDefinition lfd, FormStatus fs, String uri) throws Exception {
File instanceFolder = formDatabase.hasRecordedInstance(uri);
if (instanceFolder != null) {
// check if the submission file is present in the folder before skipping
File instance = new File(instanceFolder, "submission.xml");
File instanceEncrypted = new File(instanceFolder, "submission.xml.enc");
if (instance.exists() || instanceEncrypted.exists()) {
log.info("already present - skipping fetch: " + uri);
return;
}
}
String formId = lfd.getSubmissionKey(uri);
if (isCancelled()) {
fs.setStatusString("aborting fetch of submission...", true);
EventBus.publish(new FormStatusEvent(fs));
throw new SubmissionDownloadException("Transfer cancelled by user.");
}
String baseUrl = serverInfo.getUrl() + "/view/downloadSubmission";
Map<String, String> params = new HashMap<>();
params.put("formId", formId);
String fullUrl = WebUtils.createLinkWithProperties(baseUrl, params);
AggregateUtils.DocumentFetchResult result;
try {
DocumentDescription submissionDescription = new DocumentDescription("Fetch of a submission failed. Detailed error: ", "Fetch of a submission failed.", "submission", terminationFuture);
result = AggregateUtils.getXmlDocument(fullUrl, serverInfo, false, submissionDescription, null);
} catch (XmlDocumentFetchException e) {
throw new SubmissionDownloadException(e.getMessage());
}
// and parse the document...
SubmissionManifest submissionManifest;
try {
submissionManifest = XmlManipulationUtils.parseDownloadSubmissionResponse(result.doc);
} catch (ParsingException e) {
throw new SubmissionDownloadException(e.getMessage());
}
String msg = "Fetched instanceID=" + submissionManifest.instanceID;
log.info(msg);
if (FileSystemUtils.hasFormSubmissionDirectory(formInstancesDir, submissionManifest.instanceID)) {
// create instance directory...
File instanceDir = FileSystemUtils.assertFormSubmissionDirectory(formInstancesDir, submissionManifest.instanceID);
// fetch attachments
for (MediaFile m : submissionManifest.attachmentList) {
downloadMediaFileIfChanged(instanceDir, m, fs);
}
// write submission file -- we rely on instanceId being unique...
File submissionFile = new File(instanceDir, "submission.xml");
OutputStreamWriter fo = new OutputStreamWriter(new FileOutputStream(submissionFile), "UTF-8");
fo.write(submissionManifest.submissionXml);
fo.close();
// if we get here, we know that this is a completed submission
// (because it was in /view/submissionList) and that we safely
// copied it into the storage area (because we didn't get any
// exceptions).
formDatabase.assertRecordedInstanceDirectory(uri, instanceDir);
} else {
// create instance directory...
File instanceDir = FileSystemUtils.assertFormSubmissionDirectory(formInstancesDir, submissionManifest.instanceID);
// fetch attachments
for (MediaFile m : submissionManifest.attachmentList) {
downloadMediaFileIfChanged(instanceDir, m, fs);
}
// write submission file
File submissionFile = new File(instanceDir, "submission.xml");
OutputStreamWriter fo = new OutputStreamWriter(new FileOutputStream(submissionFile), "UTF-8");
fo.write(submissionManifest.submissionXml);
fo.close();
// if we get here, we know that this is a completed submission
// (because it was in /view/submissionList) and that we safely
// copied it into the storage area (because we didn't get any
// exceptions).
formDatabase.assertRecordedInstanceDirectory(uri, instanceDir);
}
}
Aggregations