diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/file/RemovableDriveManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/file/RemovableDriveManager.java index 241582dab..081b4362a 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/file/RemovableDriveManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/file/RemovableDriveManager.java @@ -2,8 +2,7 @@ package org.briarproject.bramble.api.plugin.file; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; - -import java.io.File; +import org.briarproject.bramble.api.properties.TransportProperties; import javax.annotation.Nullable; @@ -26,15 +25,17 @@ public interface RemovableDriveManager { /** * Starts and returns a reader task for the given contact, reading from - * the given file. If a reader task for the contact is already running, - * it will be returned and the file argument will be ignored. + * a stream described by the given transport properties. If a reader task + * for the contact is already running, it will be returned and the + * transport properties will be ignored. */ - RemovableDriveTask startReaderTask(ContactId c, File f); + RemovableDriveTask startReaderTask(ContactId c, TransportProperties p); /** * Starts and returns a writer task for the given contact, writing to - * the given file. If a writer task for the contact is already running, - * it will be returned and the file argument will be ignored. + * a stream described by the given transport properties. If a writer task + * for the contact is already running, it will be returned and the + * transport properties will be ignored. */ - RemovableDriveTask startWriterTask(ContactId c, File f); + RemovableDriveTask startWriterTask(ContactId c, TransportProperties p); } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/file/RemovableDriveTask.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/file/RemovableDriveTask.java index 5388dab31..e27413a04 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/file/RemovableDriveTask.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/file/RemovableDriveTask.java @@ -2,16 +2,16 @@ package org.briarproject.bramble.api.plugin.file; import org.briarproject.bramble.api.Consumer; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; - -import java.io.File; +import org.briarproject.bramble.api.properties.TransportProperties; @NotNullByDefault public interface RemovableDriveTask extends Runnable { /** - * Returns the file that this task is reading from or writing to. + * Returns the {@link TransportProperties} that were used for creating + * this task. */ - File getFile(); + TransportProperties getTransportProperties(); /** * Adds an observer to the task. The observer will be notified of state @@ -37,10 +37,19 @@ public interface RemovableDriveTask extends Runnable { this.success = success; } + /** + * Returns the total length in bytes of the messages read or written + * so far. + */ public long getDone() { return done; } + /** + * Returns the total length in bytes of the messages that will have + * been read or written when the task is complete, or zero if the + * total is unknown. + */ public long getTotal() { return total; } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveManagerImpl.java index 3752449fa..262b33a69 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveManagerImpl.java @@ -5,8 +5,8 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.file.RemovableDriveManager; import org.briarproject.bramble.api.plugin.file.RemovableDriveTask; +import org.briarproject.bramble.api.properties.TransportProperties; -import java.io.File; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; @@ -46,8 +46,9 @@ class RemovableDriveManagerImpl } @Override - public RemovableDriveTask startReaderTask(ContactId c, File f) { - RemovableDriveTask task = taskFactory.createReader(this, c, f); + public RemovableDriveTask startReaderTask(ContactId c, + TransportProperties p) { + RemovableDriveTask task = taskFactory.createReader(this, c, p); RemovableDriveTask old = readers.putIfAbsent(c, task); if (old == null) { ioExecutor.execute(task); @@ -58,8 +59,9 @@ class RemovableDriveManagerImpl } @Override - public RemovableDriveTask startWriterTask(ContactId c, File f) { - RemovableDriveTask task = taskFactory.createWriter(this, c, f); + public RemovableDriveTask startWriterTask(ContactId c, + TransportProperties p) { + RemovableDriveTask task = taskFactory.createWriter(this, c, p); RemovableDriveTask old = writers.putIfAbsent(c, task); if (old == null) { ioExecutor.execute(task); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveReaderTask.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveReaderTask.java index cc93c9099..5e5b270af 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveReaderTask.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveReaderTask.java @@ -8,9 +8,9 @@ import org.briarproject.bramble.api.event.EventListener; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.PluginManager; import org.briarproject.bramble.api.plugin.TransportConnectionReader; +import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.sync.event.MessageAddedEvent; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.Executor; @@ -33,22 +33,21 @@ class RemovableDriveReaderTask extends RemovableDriveTaskImpl EventBus eventBus, RemovableDriveTaskRegistry registry, ContactId contactId, - File file) { + TransportProperties transportProperties) { super(eventExecutor, pluginManager, connectionManager, eventBus, - registry, contactId, file); + registry, contactId, transportProperties); } @Override public void run() { TransportConnectionReader r = - getPlugin().createReader(createProperties()); + getPlugin().createReader(transportProperties); if (r == null) { LOG.warning("Failed to create reader"); registry.removeReader(contactId, this); setSuccess(false); return; } - setTotal(file.length()); eventBus.addListener(this); connectionManager.manageIncomingConnection(ID, new DecoratedReader(r)); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskFactory.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskFactory.java index a81f88249..e90019d76 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskFactory.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskFactory.java @@ -3,15 +3,14 @@ package org.briarproject.bramble.plugin.file; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.file.RemovableDriveTask; - -import java.io.File; +import org.briarproject.bramble.api.properties.TransportProperties; @NotNullByDefault interface RemovableDriveTaskFactory { RemovableDriveTask createReader(RemovableDriveTaskRegistry registry, - ContactId c, File f); + ContactId c, TransportProperties p); RemovableDriveTask createWriter(RemovableDriveTaskRegistry registry, - ContactId c, File f); + ContactId c, TransportProperties p); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskFactoryImpl.java index dbf4b3bc7..b493054a0 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskFactoryImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskFactoryImpl.java @@ -8,8 +8,8 @@ import org.briarproject.bramble.api.event.EventExecutor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.PluginManager; import org.briarproject.bramble.api.plugin.file.RemovableDriveTask; +import org.briarproject.bramble.api.properties.TransportProperties; -import java.io.File; import java.util.concurrent.Executor; import javax.annotation.concurrent.Immutable; @@ -41,15 +41,15 @@ class RemovableDriveTaskFactoryImpl implements RemovableDriveTaskFactory { @Override public RemovableDriveTask createReader(RemovableDriveTaskRegistry registry, - ContactId c, File f) { + ContactId c, TransportProperties p) { return new RemovableDriveReaderTask(eventExecutor, pluginManager, - connectionManager, eventBus, registry, c, f); + connectionManager, eventBus, registry, c, p); } @Override public RemovableDriveTask createWriter(RemovableDriveTaskRegistry registry, - ContactId c, File f) { + ContactId c, TransportProperties p) { return new RemovableDriveWriterTask(db, eventExecutor, pluginManager, - connectionManager, eventBus, registry, c, f); + connectionManager, eventBus, registry, c, p); } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskImpl.java index de792f644..442d716e0 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveTaskImpl.java @@ -10,7 +10,6 @@ import org.briarproject.bramble.api.plugin.file.RemovableDriveTask; import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin; import org.briarproject.bramble.api.properties.TransportProperties; -import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; @@ -20,7 +19,6 @@ import javax.annotation.concurrent.ThreadSafe; import static java.lang.Math.min; import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; -import static org.briarproject.bramble.api.plugin.file.FileConstants.PROP_PATH; import static org.briarproject.bramble.api.plugin.file.RemovableDriveConstants.ID; @ThreadSafe @@ -33,7 +31,7 @@ abstract class RemovableDriveTaskImpl implements RemovableDriveTask { final EventBus eventBus; final RemovableDriveTaskRegistry registry; final ContactId contactId; - final File file; + final TransportProperties transportProperties; private final Object lock = new Object(); @GuardedBy("lock") @@ -48,19 +46,19 @@ abstract class RemovableDriveTaskImpl implements RemovableDriveTask { EventBus eventBus, RemovableDriveTaskRegistry registry, ContactId contactId, - File file) { + TransportProperties transportProperties) { this.eventExecutor = eventExecutor; this.pluginManager = pluginManager; this.connectionManager = connectionManager; this.eventBus = eventBus; this.registry = registry; this.contactId = contactId; - this.file = file; + this.transportProperties = transportProperties; } @Override - public File getFile() { - return file; + public TransportProperties getTransportProperties() { + return transportProperties; } @Override @@ -86,12 +84,6 @@ abstract class RemovableDriveTaskImpl implements RemovableDriveTask { return (SimplexPlugin) requireNonNull(pluginManager.getPlugin(ID)); } - TransportProperties createProperties() { - TransportProperties p = new TransportProperties(); - p.put(PROP_PATH, file.getAbsolutePath()); - return p; - } - void setTotal(long total) { synchronized (lock) { state = new State(state.getDone(), total, state.isFinished(), diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java index d9a9ed75c..7d2539557 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java @@ -11,9 +11,9 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.PluginManager; import org.briarproject.bramble.api.plugin.TransportConnectionWriter; import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin; +import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.sync.event.MessagesSentEvent; -import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.concurrent.Executor; @@ -42,16 +42,16 @@ class RemovableDriveWriterTask extends RemovableDriveTaskImpl EventBus eventBus, RemovableDriveTaskRegistry registry, ContactId contactId, - File file) { + TransportProperties transportProperties) { super(eventExecutor, pluginManager, connectionManager, eventBus, - registry, contactId, file); + registry, contactId, transportProperties); this.db = db; } @Override public void run() { SimplexPlugin plugin = getPlugin(); - TransportConnectionWriter w = plugin.createWriter(createProperties()); + TransportConnectionWriter w = plugin.createWriter(transportProperties); if (w == null) { LOG.warning("Failed to create writer"); registry.removeWriter(contactId, this); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTest.java index 56a40bcbe..ab3fa731f 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTest.java @@ -11,6 +11,7 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.file.RemovableDriveTask; +import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.sync.event.MessageStateChangedEvent; import org.briarproject.bramble.test.BrambleTestCase; import org.briarproject.bramble.test.TestDatabaseConfigModule; @@ -22,6 +23,7 @@ import java.io.File; import java.util.concurrent.CountDownLatch; import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.briarproject.bramble.api.plugin.file.FileConstants.PROP_PATH; import static org.briarproject.bramble.api.sync.validation.MessageState.DELIVERED; import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory; import static org.briarproject.bramble.test.TestUtils.getSecretKey; @@ -96,8 +98,10 @@ public class RemovableDriveIntegrationTest extends BrambleTestCase { new MessageDeliveryListener(deliveries); device.getEventBus().addListener(listener); // Read the incoming stream + TransportProperties p = new TransportProperties(); + p.put(PROP_PATH, file.getAbsolutePath()); RemovableDriveTask reader = device.getRemovableDriveManager() - .startReaderTask(contactId, file); + .startReaderTask(contactId, p); CountDownLatch disposedLatch = new CountDownLatch(1); reader.addObserver(state -> { if (state.isFinished()) disposedLatch.countDown(); @@ -114,8 +118,10 @@ public class RemovableDriveIntegrationTest extends BrambleTestCase { ContactId contactId) throws Exception { // Write the outgoing stream to a file File file = File.createTempFile("sync", ".tmp", testDir); + TransportProperties p = new TransportProperties(); + p.put(PROP_PATH, file.getAbsolutePath()); RemovableDriveTask writer = device.getRemovableDriveManager() - .startWriterTask(contactId, file); + .startWriterTask(contactId, p); CountDownLatch disposedLatch = new CountDownLatch(1); writer.addObserver(state -> { if (state.isFinished()) disposedLatch.countDown();