ODK Briefcase is a Java application for fetching and pushing forms and their contents. It helps make billions of data points from ODK portable. Contribute and make the world a better place! ✨💼✨
Paths are stored using the standard directory separators from each platform, which means that Windows hosts will use \ and macOS/Linux hosts will use /.
This causes problems when moving a storage directory created in Windows into a macOS/Linux host and vice versa.
Steps to reproduce the problem
Run Briefcase in Windows and pull some forms.
Copy the SD folder into a macOS/Linux host, and run Briefcase there
Expected behavior
SDs should be portable between WIndows and macOS/Linux hosts. No error should be present in the logs.
Other information
Exception in thread "AWT-EventQueue-0" java.io.UncheckedIOException: java.nio.file.NoSuchFileException: /home/guillermo/Downloads/ODK Briefcase Storage/forms\PSS D28 DRC v4/metadata.json
at org.opendatakit.briefcase.reused.UncheckedFiles.write(UncheckedFiles.java:80)
at org.opendatakit.briefcase.reused.UncheckedFiles.write(UncheckedFiles.java:73)
at org.opendatakit.briefcase.model.form.FileSystemFormMetadataAdapter.serialize(FileSystemFormMetadataAdapter.java:133)
at org.opendatakit.briefcase.model.form.FileSystemFormMetadataAdapter.persist(FileSystemFormMetadataAdapter.java:106)
at java.base/java.util.stream.ReferencePipeline$11$1.accept(ReferencePipeline.java:441)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at org.opendatakit.briefcase.model.form.FileSystemFormMetadataAdapter.syncWithFilesAt(FileSystemFormMetadataAdapter.java:78)
at org.opendatakit.briefcase.ui.settings.SettingsPanel.lambda$new$2(SettingsPanel.java:61)
at org.opendatakit.briefcase.ui.settings.SettingsPanelForm.lambda$setStorageLocation$7(SettingsPanelForm.java:131)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at org.opendatakit.briefcase.ui.settings.SettingsPanelForm.setStorageLocation(SettingsPanelForm.java:131)
at org.opendatakit.briefcase.ui.settings.SettingsPanelForm.lambda$new$0(SettingsPanelForm.java:85)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at org.opendatakit.briefcase.ui.settings.SettingsPanelForm.lambda$new$1(SettingsPanelForm.java:85)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6632)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6397)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5008)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.nio.file.NoSuchFileException: /home/guillermo/Downloads/ODK Briefcase Storage/forms\PSS D28 DRC v4/metadata.json
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)
at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:219)
at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:478)
at java.base/java.nio.file.Files.newOutputStream(Files.java:219)
at java.base/java.nio.file.Files.write(Files.java:3422)
at org.opendatakit.briefcase.reused.UncheckedFiles.write(UncheckedFiles.java:78)
... 53 more
Software versions
Briefcase v1.17
Problem description
Paths are stored using the standard directory separators from each platform, which means that Windows hosts will use
\
and macOS/Linux hosts will use/
.This causes problems when moving a storage directory created in Windows into a macOS/Linux host and vice versa.
Steps to reproduce the problem
Run Briefcase in Windows and pull some forms. Copy the SD folder into a macOS/Linux host, and run Briefcase there
Expected behavior
SDs should be portable between WIndows and macOS/Linux hosts. No error should be present in the logs.
Other information