Search in sources :

Example 1 with MediaFile

use of org.odk.collect.forms.MediaFile in project collect by opendatakit.

the class ServerFormDownloader method moveMediaFiles.

private static void moveMediaFiles(String tempMediaPath, File formMediaPath) throws IOException {
    File tempMediaFolder = new File(tempMediaPath);
    File[] mediaFiles = tempMediaFolder.listFiles();
    if (mediaFiles != null && mediaFiles.length != 0) {
        for (File mediaFile : mediaFiles) {
            try {
                org.apache.commons.io.FileUtils.copyFileToDirectory(mediaFile, formMediaPath);
            } catch (IllegalArgumentException e) {
                // This can happen if copyFileToDirectory is pointed at a file instead of a dir
                throw new IOException(e);
            }
        }
    }
}
Also used : IOException(java.io.IOException) MediaFile(org.odk.collect.forms.MediaFile) File(java.io.File)

Example 2 with MediaFile

use of org.odk.collect.forms.MediaFile in project collect by opendatakit.

the class OpenRosaFormSource method fetchManifest.

@Override
public ManifestFile fetchManifest(String manifestURL) throws FormSourceException {
    if (manifestURL == null) {
        return null;
    }
    DocumentFetchResult result = mapException(() -> openRosaXMLFetcher.getXML(manifestURL));
    if (result.errorMessage != null) {
        if (result.responseCode != HttpURLConnection.HTTP_OK) {
            throw new FormSourceException.ServerError(result.responseCode, serverURL);
        } else {
            throw new FormSourceException.FetchError();
        }
    }
    if (!result.isOpenRosaResponse) {
        throw new FormSourceException.ParseError(serverURL);
    }
    List<MediaFile> mediaFiles = openRosaResponseParser.parseManifest(result.doc);
    if (mediaFiles != null) {
        return new ManifestFile(result.getHash(), mediaFiles);
    } else {
        throw new FormSourceException.ParseError(serverURL);
    }
}
Also used : MediaFile(org.odk.collect.forms.MediaFile) DocumentFetchResult(org.odk.collect.android.utilities.DocumentFetchResult) ManifestFile(org.odk.collect.forms.ManifestFile)

Example 3 with MediaFile

use of org.odk.collect.forms.MediaFile in project collect by opendatakit.

the class ServerFormDownloaderTest method whenFormHasMediaFiles_downloadsAndSavesFormAndMediaFiles_beforeParsingForm.

/**
 * Form parsing might need access to media files (external secondary instances) for example
 * so we need to make sure we've got those files in the right place before we parse.
 */
@Test
public void whenFormHasMediaFiles_downloadsAndSavesFormAndMediaFiles_beforeParsingForm() throws Exception {
    String xform = createXFormBody("id", "version");
    ServerFormDetails serverFormDetails = new ServerFormDetails("Form", "http://downloadUrl", "id", "version", Md5.getMd5Hash(new ByteArrayInputStream(xform.getBytes())), true, false, new ManifestFile("", asList(new MediaFile("file1", "hash-1", "http://file1"), new MediaFile("file2", "hash-2", "http://file2"))));
    FormSource formSource = mock(FormSource.class);
    when(formSource.fetchForm("http://downloadUrl")).thenReturn(new ByteArrayInputStream(xform.getBytes()));
    when(formSource.fetchMediaFile("http://file1")).thenReturn(new ByteArrayInputStream("contents1".getBytes()));
    when(formSource.fetchMediaFile("http://file2")).thenReturn(new ByteArrayInputStream("contents2".getBytes()));
    FormMetadataParser formMetadataParser = new FormMetadataParser() {

        @Override
        public Map<String, String> parse(File file, File mediaDir) {
            File[] mediaFiles = mediaDir.listFiles();
            assertThat(mediaFiles.length, is(2));
            assertThat(stream(mediaFiles).map(File::getName).collect(toList()), containsInAnyOrder("file1", "file2"));
            return super.parse(file, mediaDir);
        }
    };
    ServerFormDownloader downloader = new ServerFormDownloader(formSource, formsRepository, cacheDir, formsDir.getAbsolutePath(), formMetadataParser, mock(Analytics.class));
    downloader.downloadForm(serverFormDetails, null, null);
}
Also used : MediaFile(org.odk.collect.forms.MediaFile) ByteArrayInputStream(java.io.ByteArrayInputStream) FormSource(org.odk.collect.forms.FormSource) MediaFile(org.odk.collect.forms.MediaFile) File(java.io.File) ManifestFile(org.odk.collect.forms.ManifestFile) ManifestFile(org.odk.collect.forms.ManifestFile) Analytics(org.odk.collect.analytics.Analytics) Test(org.junit.Test)

Example 4 with MediaFile

use of org.odk.collect.forms.MediaFile in project collect by opendatakit.

the class ServerFormDownloaderTest method whenFormAlreadyDownloaded_andFormHasNewMediaFiles_updatesMediaFiles.

@Test
public void whenFormAlreadyDownloaded_andFormHasNewMediaFiles_updatesMediaFiles() throws Exception {
    String xform = createXFormBody("id", "version");
    ServerFormDetails serverFormDetails = new ServerFormDetails("Form", "http://downloadUrl", "id", "version", Md5.getMd5Hash(new ByteArrayInputStream(xform.getBytes())), true, false, new ManifestFile("", asList(new MediaFile("file1", Md5.getMd5Hash(new ByteArrayInputStream("contents".getBytes())), "http://file1"))));
    FormSource formSource = mock(FormSource.class);
    when(formSource.fetchForm("http://downloadUrl")).thenReturn(new ByteArrayInputStream(xform.getBytes()));
    when(formSource.fetchMediaFile("http://file1")).thenReturn(new ByteArrayInputStream("contents".getBytes()));
    ServerFormDownloader downloader = new ServerFormDownloader(formSource, formsRepository, cacheDir, formsDir.getAbsolutePath(), new FormMetadataParser(), mock(Analytics.class));
    // Initial download
    downloader.downloadForm(serverFormDetails, null, null);
    ServerFormDetails serverFormDetailsUpdatedMediaFile = new ServerFormDetails("Form", "http://downloadUrl", "id", "version", Md5.getMd5Hash(new ByteArrayInputStream(xform.getBytes())), false, false, new ManifestFile("", asList(new MediaFile("file1", Md5.getMd5Hash(new ByteArrayInputStream("contents-updated".getBytes())), "http://file1"))));
    when(formSource.fetchForm("http://downloadUrl")).thenReturn(new ByteArrayInputStream(xform.getBytes()));
    when(formSource.fetchMediaFile("http://file1")).thenReturn(new ByteArrayInputStream("contents-updated".getBytes()));
    // Second download
    downloader.downloadForm(serverFormDetailsUpdatedMediaFile, null, null);
    List<Form> allForms = formsRepository.getAll();
    assertThat(allForms.size(), is(1));
    Form form = allForms.get(0);
    assertThat(form.getFormId(), is("id"));
    File formFile = new File(getAbsoluteFilePath(formsDir.getAbsolutePath(), form.getFormFilePath()));
    assertThat(formFile.exists(), is(true));
    assertThat(new String(read(formFile)), is(xform));
    File mediaFile1 = new File(form.getFormMediaPath() + "/file1");
    assertThat(mediaFile1.exists(), is(true));
    assertThat(new String(read(mediaFile1)), is("contents-updated"));
}
Also used : MediaFile(org.odk.collect.forms.MediaFile) ByteArrayInputStream(java.io.ByteArrayInputStream) Form(org.odk.collect.forms.Form) FormUtils.buildForm(org.odk.collect.formstest.FormUtils.buildForm) FormSource(org.odk.collect.forms.FormSource) MediaFile(org.odk.collect.forms.MediaFile) File(java.io.File) ManifestFile(org.odk.collect.forms.ManifestFile) ManifestFile(org.odk.collect.forms.ManifestFile) Analytics(org.odk.collect.analytics.Analytics) Test(org.junit.Test)

Example 5 with MediaFile

use of org.odk.collect.forms.MediaFile in project collect by opendatakit.

the class ServerFormDownloaderTest method afterDownloadingMediaFile_cancelling_throwsDownloadingInterruptedExceptionAndDoesNotSaveAnything.

@Test
public void afterDownloadingMediaFile_cancelling_throwsDownloadingInterruptedExceptionAndDoesNotSaveAnything() throws Exception {
    String xform = createXFormBody("id", "version");
    ServerFormDetails serverFormDetails = new ServerFormDetails("Form", "http://downloadUrl", "id", "version", Md5.getMd5Hash(new ByteArrayInputStream(xform.getBytes())), true, false, new ManifestFile("", asList(new MediaFile("file1", "hash-1", "http://file1"), new MediaFile("file2", "hash-2", "http://file2"))));
    CancelAfterMediaFileDownloadFormSource formListApi = new CancelAfterMediaFileDownloadFormSource(xform);
    ServerFormDownloader downloader = new ServerFormDownloader(formListApi, formsRepository, cacheDir, formsDir.getAbsolutePath(), new FormMetadataParser(), mock(Analytics.class));
    try {
        downloader.downloadForm(serverFormDetails, null, formListApi);
        fail("Excepted exception");
    } catch (FormDownloadException.DownloadingInterrupted e) {
        assertThat(formsRepository.getAll(), is(empty()));
        assertThat(asList(new File(getCacheFilesPath()).listFiles()), is(empty()));
        assertThat(asList(new File(getFormFilesPath()).listFiles()), is(empty()));
    }
}
Also used : MediaFile(org.odk.collect.forms.MediaFile) ByteArrayInputStream(java.io.ByteArrayInputStream) MediaFile(org.odk.collect.forms.MediaFile) File(java.io.File) ManifestFile(org.odk.collect.forms.ManifestFile) ManifestFile(org.odk.collect.forms.ManifestFile) Analytics(org.odk.collect.analytics.Analytics) Test(org.junit.Test)

Aggregations

MediaFile (org.odk.collect.forms.MediaFile)11 File (java.io.File)9 ManifestFile (org.odk.collect.forms.ManifestFile)9 ByteArrayInputStream (java.io.ByteArrayInputStream)8 Test (org.junit.Test)8 Analytics (org.odk.collect.analytics.Analytics)8 FormSource (org.odk.collect.forms.FormSource)7 Form (org.odk.collect.forms.Form)3 FormUtils.buildForm (org.odk.collect.formstest.FormUtils.buildForm)3 FormSourceException (org.odk.collect.forms.FormSourceException)2 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 ArrayList (java.util.ArrayList)1 Arrays.asList (java.util.Arrays.asList)1 List (java.util.List)1 Collectors.toList (java.util.stream.Collectors.toList)1 DocumentFetchResult (org.odk.collect.android.utilities.DocumentFetchResult)1