diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java new file mode 100644 index 000000000..3fdc9c908 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java @@ -0,0 +1,114 @@ +package org.briarproject.bramble.plugin.file; + +import org.briarproject.bramble.api.Pair; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.ConnectionHandler; +import org.briarproject.bramble.api.plugin.TransportConnectionReader; +import org.briarproject.bramble.api.plugin.TransportConnectionWriter; +import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin; +import org.briarproject.bramble.api.properties.TransportProperties; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Collection; +import java.util.logging.Logger; + +import javax.annotation.concurrent.Immutable; + +import static java.util.logging.Level.WARNING; +import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; +import static org.briarproject.bramble.api.plugin.RemovableDriveConstants.ID; +import static org.briarproject.bramble.util.LogUtils.logException; + +@Immutable +@NotNullByDefault +abstract class AbstractRemovableDrivePlugin implements SimplexPlugin { + + private static final Logger LOG = + getLogger(AbstractRemovableDrivePlugin.class.getName()); + + private final int maxLatency; + + abstract InputStream openInputStream(TransportProperties p) + throws IOException; + + abstract OutputStream openOutputStream(TransportProperties p) + throws IOException; + + AbstractRemovableDrivePlugin(int maxLatency) { + this.maxLatency = maxLatency; + } + + @Override + public TransportId getId() { + return ID; + } + + @Override + public int getMaxLatency() { + return maxLatency; + } + + @Override + public int getMaxIdleTime() { + // Unused for simplex transports + throw new UnsupportedOperationException(); + } + + @Override + public void start() { + } + + @Override + public void stop() { + } + + @Override + public State getState() { + return ACTIVE; + } + + @Override + public int getReasonsDisabled() { + return 0; + } + + @Override + public boolean shouldPoll() { + return false; + } + + @Override + public int getPollingInterval() { + throw new UnsupportedOperationException(); + } + + @Override + public void poll( + Collection> properties) { + throw new UnsupportedOperationException(); + } + + @Override + public TransportConnectionReader createReader(TransportProperties p) { + try { + return new TransportInputStreamReader(openInputStream(p)); + } catch (IOException e) { + logException(LOG, WARNING, e); + return null; + } + } + + @Override + public TransportConnectionWriter createWriter(TransportProperties p) { + try { + return new TransportOutputStreamWriter(this, openOutputStream(p)); + } catch (IOException e) { + logException(LOG, WARNING, e); + return null; + } + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePlugin.java index 3cb3d6c98..b59f4f85f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePlugin.java @@ -1,96 +1,38 @@ package org.briarproject.bramble.plugin.file; -import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.plugin.ConnectionHandler; -import org.briarproject.bramble.api.plugin.PluginCallback; -import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.properties.TransportProperties; -import java.io.File; -import java.util.Collection; -import java.util.logging.Logger; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import javax.annotation.concurrent.Immutable; -import static java.util.logging.Level.INFO; -import static java.util.logging.Logger.getLogger; -import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; -import static org.briarproject.bramble.api.plugin.RemovableDriveConstants.ID; +import static org.briarproject.bramble.api.plugin.FileConstants.PROP_PATH; +import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; @Immutable @NotNullByDefault -class RemovableDrivePlugin extends FilePlugin { +class RemovableDrivePlugin extends AbstractRemovableDrivePlugin { - private static final Logger LOG = - getLogger(RemovableDrivePlugin.class.getName()); - - RemovableDrivePlugin(PluginCallback callback, int maxLatency) { - super(callback, maxLatency); + RemovableDrivePlugin(int maxLatency) { + super(maxLatency); } @Override - protected void writerFinished(File f, boolean exception) { - if (LOG.isLoggable(INFO)) { - LOG.info("Writer finished, exception: " + exception); - } + InputStream openInputStream(TransportProperties p) throws IOException { + String path = p.get(PROP_PATH); + if (isNullOrEmpty(path)) throw new IllegalArgumentException(); + return new FileInputStream(path); } @Override - protected void readerFinished(File f, boolean exception, - boolean recognised) { - if (LOG.isLoggable(INFO)) { - LOG.info("Reader finished, exception: " + exception - + ", recognised: " + recognised); - } - // Try to delete the file if the read finished successfully - if (recognised && !exception && !f.delete()) { - LOG.info("Failed to delete recognised file"); - } - } - - @Override - public TransportId getId() { - return ID; - } - - @Override - public void start() { - } - - @Override - public void stop() { - } - - @Override - public State getState() { - return ACTIVE; - } - - @Override - public int getReasonsDisabled() { - return 0; - } - - @Override - public int getMaxIdleTime() { - // Unused for simplex transports - throw new UnsupportedOperationException(); - } - - @Override - public boolean shouldPoll() { - return false; - } - - @Override - public int getPollingInterval() { - throw new UnsupportedOperationException(); - } - - @Override - public void poll( - Collection> properties) { - throw new UnsupportedOperationException(); + OutputStream openOutputStream(TransportProperties p) throws IOException { + String path = p.get(PROP_PATH); + if (isNullOrEmpty(path)) throw new IllegalArgumentException(); + return new FileOutputStream(path); } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePluginFactory.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePluginFactory.java index 781902678..5d833805d 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePluginFactory.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePluginFactory.java @@ -36,6 +36,6 @@ public class RemovableDrivePluginFactory implements SimplexPluginFactory { @Nullable @Override public SimplexPlugin createPlugin(PluginCallback callback) { - return new RemovableDrivePlugin(callback, MAX_LATENCY); + return new RemovableDrivePlugin(MAX_LATENCY); } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportInputStreamReader.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportInputStreamReader.java new file mode 100644 index 000000000..8971136c9 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportInputStreamReader.java @@ -0,0 +1,34 @@ +package org.briarproject.bramble.plugin.file; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.TransportConnectionReader; + +import java.io.InputStream; +import java.util.logging.Logger; + +import static java.util.logging.Level.WARNING; +import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.util.IoUtils.tryToClose; + +@NotNullByDefault +class TransportInputStreamReader implements TransportConnectionReader { + + private static final Logger LOG = + getLogger(TransportInputStreamReader.class.getName()); + + private final InputStream in; + + TransportInputStreamReader(InputStream in) { + this.in = in; + } + + @Override + public InputStream getInputStream() { + return in; + } + + @Override + public void dispose(boolean exception, boolean recognised) { + tryToClose(in, LOG, WARNING); + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportOutputStreamWriter.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportOutputStreamWriter.java new file mode 100644 index 000000000..be40fbca0 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportOutputStreamWriter.java @@ -0,0 +1,47 @@ +package org.briarproject.bramble.plugin.file; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.Plugin; +import org.briarproject.bramble.api.plugin.TransportConnectionWriter; + +import java.io.OutputStream; +import java.util.logging.Logger; + +import static java.util.logging.Level.WARNING; +import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.util.IoUtils.tryToClose; + +@NotNullByDefault +class TransportOutputStreamWriter implements TransportConnectionWriter { + + private static final Logger LOG = + getLogger(TransportOutputStreamWriter.class.getName()); + + private final Plugin plugin; + private final OutputStream out; + + TransportOutputStreamWriter(Plugin plugin, OutputStream out) { + this.plugin = plugin; + this.out = out; + } + + @Override + public int getMaxLatency() { + return plugin.getMaxLatency(); + } + + @Override + public int getMaxIdleTime() { + return plugin.getMaxIdleTime(); + } + + @Override + public OutputStream getOutputStream() { + return out; + } + + @Override + public void dispose(boolean exception) { + tryToClose(out, LOG, WARNING); + } +}