diff --git a/briar-core/src/net/sf/briar/plugins/modem/ReadHandler.java b/briar-api/src/net/sf/briar/api/reliability/ReadHandler.java similarity index 53% rename from briar-core/src/net/sf/briar/plugins/modem/ReadHandler.java rename to briar-api/src/net/sf/briar/api/reliability/ReadHandler.java index 0e2bc8c9717b5bd79b2ad6687bb9643e1178e320..4d91e5877ccb6826d5ce49cce4c96e300772500f 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/ReadHandler.java +++ b/briar-api/src/net/sf/briar/api/reliability/ReadHandler.java @@ -1,8 +1,8 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.api.reliability; import java.io.IOException; -interface ReadHandler { +public interface ReadHandler { void handleRead(byte[] b) throws IOException; } diff --git a/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayer.java b/briar-api/src/net/sf/briar/api/reliability/ReliabilityLayer.java similarity index 59% rename from briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayer.java rename to briar-api/src/net/sf/briar/api/reliability/ReliabilityLayer.java index 6b9160eef7263b33df49a61568c70e453351ea89..0eba9e550afb8c120ac1622fed06dd9d4cdcb66f 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayer.java +++ b/briar-api/src/net/sf/briar/api/reliability/ReliabilityLayer.java @@ -1,9 +1,9 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.api.reliability; import java.io.InputStream; import java.io.OutputStream; -interface ReliabilityLayer extends ReadHandler, WriteHandler { +public interface ReliabilityLayer extends ReadHandler, WriteHandler { void start(); diff --git a/briar-api/src/net/sf/briar/api/reliability/ReliabilityLayerFactory.java b/briar-api/src/net/sf/briar/api/reliability/ReliabilityLayerFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..96b4a51b406e8d3313106572e0dbf997059cdcbb --- /dev/null +++ b/briar-api/src/net/sf/briar/api/reliability/ReliabilityLayerFactory.java @@ -0,0 +1,6 @@ +package net.sf.briar.api.reliability; + +public interface ReliabilityLayerFactory { + + ReliabilityLayer createReliabilityLayer(WriteHandler writeHandler); +} diff --git a/briar-core/src/net/sf/briar/plugins/modem/WriteHandler.java b/briar-api/src/net/sf/briar/api/reliability/WriteHandler.java similarity index 53% rename from briar-core/src/net/sf/briar/plugins/modem/WriteHandler.java rename to briar-api/src/net/sf/briar/api/reliability/WriteHandler.java index fdf4d2c153cecd7ea792de01c52d2a2f66b83849..ef36266ea9d8c78dcd2f100f5ae5b6514062b875 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/WriteHandler.java +++ b/briar-api/src/net/sf/briar/api/reliability/WriteHandler.java @@ -1,8 +1,8 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.api.reliability; import java.io.IOException; -interface WriteHandler { +public interface WriteHandler { void handleWrite(byte[] b) throws IOException; } diff --git a/briar-core/src/net/sf/briar/plugins/PluginsModule.java b/briar-core/src/net/sf/briar/plugins/PluginsModule.java index 5003d1cfc1028edc3eb5d5709ecb072620c801ab..968fb2425f5ed11a3ca24c041c8b01be874b2aac 100644 --- a/briar-core/src/net/sf/briar/plugins/PluginsModule.java +++ b/briar-core/src/net/sf/briar/plugins/PluginsModule.java @@ -14,6 +14,7 @@ import net.sf.briar.api.plugins.duplex.DuplexPluginConfig; import net.sf.briar.api.plugins.duplex.DuplexPluginFactory; import net.sf.briar.api.plugins.simplex.SimplexPluginConfig; import net.sf.briar.api.plugins.simplex.SimplexPluginFactory; +import net.sf.briar.api.reliability.ReliabilityLayerFactory; import net.sf.briar.plugins.bluetooth.BluetoothPluginFactory; import net.sf.briar.plugins.droidtooth.DroidtoothPluginFactory; import net.sf.briar.plugins.file.RemovableDrivePluginFactory; @@ -62,6 +63,7 @@ public class PluginsModule extends AbstractModule { DuplexPluginConfig getDuplexPluginConfig( @PluginExecutor Executor pluginExecutor, AndroidExecutor androidExecutor, Context appContext, + ReliabilityLayerFactory reliabilityFactory, ShutdownManager shutdownManager) { final Collection<DuplexPluginFactory> factories = new ArrayList<DuplexPluginFactory>(); @@ -70,7 +72,8 @@ public class PluginsModule extends AbstractModule { androidExecutor, appContext)); } else { factories.add(new BluetoothPluginFactory(pluginExecutor)); - factories.add(new ModemPluginFactory(pluginExecutor)); + factories.add(new ModemPluginFactory(pluginExecutor, + reliabilityFactory)); } factories.add(new LanTcpPluginFactory(pluginExecutor)); factories.add(new WanTcpPluginFactory(pluginExecutor, shutdownManager)); diff --git a/briar-core/src/net/sf/briar/plugins/modem/ModemFactoryImpl.java b/briar-core/src/net/sf/briar/plugins/modem/ModemFactoryImpl.java index e9be7af29e0ad70768a9788f9a4a4eb6f76df6a1..13ae3084807828a3b7105d1830acacf934b72946 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/ModemFactoryImpl.java +++ b/briar-core/src/net/sf/briar/plugins/modem/ModemFactoryImpl.java @@ -2,6 +2,8 @@ package net.sf.briar.plugins.modem; import java.util.concurrent.Executor; +import net.sf.briar.api.reliability.ReliabilityLayerFactory; + class ModemFactoryImpl implements ModemFactory { private final Executor executor; diff --git a/briar-core/src/net/sf/briar/plugins/modem/ModemImpl.java b/briar-core/src/net/sf/briar/plugins/modem/ModemImpl.java index 2d31dc9ca2b8b37f6a403c091dbb2cad7ea4da56..4266cde927b9552bd30dae2548cb8cc604483812 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/ModemImpl.java +++ b/briar-core/src/net/sf/briar/plugins/modem/ModemImpl.java @@ -12,6 +12,10 @@ import java.util.concurrent.Executor; import java.util.concurrent.Semaphore; import java.util.logging.Logger; +import net.sf.briar.api.reliability.ReliabilityLayer; +import net.sf.briar.api.reliability.ReliabilityLayerFactory; +import net.sf.briar.api.reliability.WriteHandler; + import jssc.SerialPort; import jssc.SerialPortEvent; import jssc.SerialPortEventListener; diff --git a/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java b/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java index 8d7bb6933047efeac6dc52b694d57dbd1f0c0418..272a76a2975145f3789827bd79b52840c74975db 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java +++ b/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java @@ -7,6 +7,7 @@ import net.sf.briar.api.plugins.duplex.DuplexPlugin; import net.sf.briar.api.plugins.duplex.DuplexPluginCallback; import net.sf.briar.api.plugins.duplex.DuplexPluginFactory; import net.sf.briar.api.protocol.TransportId; +import net.sf.briar.api.reliability.ReliabilityLayerFactory; import org.h2.util.StringUtils; @@ -15,9 +16,12 @@ public class ModemPluginFactory implements DuplexPluginFactory { private static final long POLLING_INTERVAL = 60L * 60L * 1000L; // 1 hour private final Executor pluginExecutor; + private final ModemFactory modemFactory; - public ModemPluginFactory(@PluginExecutor Executor pluginExecutor) { + public ModemPluginFactory(@PluginExecutor Executor pluginExecutor, + ReliabilityLayerFactory reliabilityFactory) { this.pluginExecutor = pluginExecutor; + modemFactory = new ModemFactoryImpl(pluginExecutor, reliabilityFactory); } public TransportId getId() { @@ -28,10 +32,6 @@ public class ModemPluginFactory implements DuplexPluginFactory { // This plugin is not enabled by default String enabled = callback.getConfig().get("enabled"); if(StringUtils.isNullOrEmpty(enabled)) return null; - ReliabilityLayerFactory reliabilityFactory = - new ReliabilityLayerFactoryImpl(pluginExecutor); - ModemFactory modemFactory = new ModemFactoryImpl(pluginExecutor, - reliabilityFactory); return new ModemPlugin(pluginExecutor, modemFactory, callback, POLLING_INTERVAL); } diff --git a/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayerFactory.java b/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayerFactory.java deleted file mode 100644 index 0c5a46e3aefa8b040a468b10f0df5799eb98397d..0000000000000000000000000000000000000000 --- a/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayerFactory.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.sf.briar.plugins.modem; - -interface ReliabilityLayerFactory { - - ReliabilityLayer createReliabilityLayer(WriteHandler writeHandler); -} diff --git a/briar-core/src/net/sf/briar/plugins/modem/Ack.java b/briar-core/src/net/sf/briar/reliability/Ack.java similarity index 92% rename from briar-core/src/net/sf/briar/plugins/modem/Ack.java rename to briar-core/src/net/sf/briar/reliability/Ack.java index 4f8e1da8604228a01dd6743a5a04f2d54ec55e71..a8c437bf94124beea0251308a1ac74e691223bdb 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/Ack.java +++ b/briar-core/src/net/sf/briar/reliability/Ack.java @@ -1,4 +1,4 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; import net.sf.briar.util.ByteUtils; diff --git a/briar-core/src/net/sf/briar/plugins/modem/Crc32.java b/briar-core/src/net/sf/briar/reliability/Crc32.java similarity index 93% rename from briar-core/src/net/sf/briar/plugins/modem/Crc32.java rename to briar-core/src/net/sf/briar/reliability/Crc32.java index 8279d3c9715622acf8cc939e95d4b9cc49aa2051..22e4540728fdc2a5f26df8a80893f52cd9f6e7e4 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/Crc32.java +++ b/briar-core/src/net/sf/briar/reliability/Crc32.java @@ -1,4 +1,4 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; class Crc32 { diff --git a/briar-core/src/net/sf/briar/plugins/modem/Data.java b/briar-core/src/net/sf/briar/reliability/Data.java similarity index 94% rename from briar-core/src/net/sf/briar/plugins/modem/Data.java rename to briar-core/src/net/sf/briar/reliability/Data.java index 4cfd7cc8638bfd70b4f56d972b0c5f26ede104ae..63f075dff6474862d3e7859d8a093d4b3d648645 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/Data.java +++ b/briar-core/src/net/sf/briar/reliability/Data.java @@ -1,4 +1,4 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; class Data extends Frame { diff --git a/briar-core/src/net/sf/briar/plugins/modem/Frame.java b/briar-core/src/net/sf/briar/reliability/Frame.java similarity index 96% rename from briar-core/src/net/sf/briar/plugins/modem/Frame.java rename to briar-core/src/net/sf/briar/reliability/Frame.java index 288c606844b1ac9b9dc349803ef9a43c0df65d84..2cbc117004f08d946dc36a38cdda1f0e5bfd9c23 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/Frame.java +++ b/briar-core/src/net/sf/briar/reliability/Frame.java @@ -1,4 +1,4 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; import net.sf.briar.util.ByteUtils; diff --git a/briar-core/src/net/sf/briar/plugins/modem/Receiver.java b/briar-core/src/net/sf/briar/reliability/Receiver.java similarity index 97% rename from briar-core/src/net/sf/briar/plugins/modem/Receiver.java rename to briar-core/src/net/sf/briar/reliability/Receiver.java index e4813f6932b36f5a8abe91a9a977f5e0ab4433fe..ddb3394aa67663a3d1123d4f0946151a171e4dfa 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/Receiver.java +++ b/briar-core/src/net/sf/briar/reliability/Receiver.java @@ -1,4 +1,4 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; import java.io.IOException; import java.util.Comparator; @@ -6,6 +6,8 @@ import java.util.Iterator; import java.util.SortedSet; import java.util.TreeSet; +import net.sf.briar.api.reliability.ReadHandler; + class Receiver implements ReadHandler { static final int MAX_WINDOW_SIZE = 8 * Data.MAX_PAYLOAD_LENGTH; diff --git a/briar-core/src/net/sf/briar/plugins/modem/ReceiverInputStream.java b/briar-core/src/net/sf/briar/reliability/ReceiverInputStream.java similarity index 97% rename from briar-core/src/net/sf/briar/plugins/modem/ReceiverInputStream.java rename to briar-core/src/net/sf/briar/reliability/ReceiverInputStream.java index 11e707acdf88777ccf897013210e7821d8e7d2f5..27b26c311caa1bdc71486dd8c99d0d0e80261ab7 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/ReceiverInputStream.java +++ b/briar-core/src/net/sf/briar/reliability/ReceiverInputStream.java @@ -1,4 +1,4 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; import java.io.IOException; import java.io.InputStream; diff --git a/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayerFactoryImpl.java b/briar-core/src/net/sf/briar/reliability/ReliabilityLayerFactoryImpl.java similarity index 64% rename from briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayerFactoryImpl.java rename to briar-core/src/net/sf/briar/reliability/ReliabilityLayerFactoryImpl.java index 2b72b72ffb9193dbabe45e8c43089bd184a77158..5d32324c6d9c520d06e844fa3f560dcb5a39b272 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayerFactoryImpl.java +++ b/briar-core/src/net/sf/briar/reliability/ReliabilityLayerFactoryImpl.java @@ -1,7 +1,11 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; import java.util.concurrent.Executor; +import net.sf.briar.api.reliability.ReliabilityLayer; +import net.sf.briar.api.reliability.ReliabilityLayerFactory; +import net.sf.briar.api.reliability.WriteHandler; + class ReliabilityLayerFactoryImpl implements ReliabilityLayerFactory { private final Executor executor; diff --git a/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayerImpl.java b/briar-core/src/net/sf/briar/reliability/ReliabilityLayerImpl.java similarity index 95% rename from briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayerImpl.java rename to briar-core/src/net/sf/briar/reliability/ReliabilityLayerImpl.java index 2dc2f801d56171f22f55902b886c7f68ce83b369..825c8ee7ca6aa0589149646cdce5c3ce5abc6556 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayerImpl.java +++ b/briar-core/src/net/sf/briar/reliability/ReliabilityLayerImpl.java @@ -1,4 +1,4 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.logging.Level.WARNING; @@ -11,6 +11,9 @@ import java.util.concurrent.Executor; import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Logger; +import net.sf.briar.api.reliability.ReliabilityLayer; +import net.sf.briar.api.reliability.WriteHandler; + class ReliabilityLayerImpl implements ReliabilityLayer { private static final int TICK_INTERVAL = 500; // Milliseconds diff --git a/briar-core/src/net/sf/briar/reliability/ReliabilityModule.java b/briar-core/src/net/sf/briar/reliability/ReliabilityModule.java new file mode 100644 index 0000000000000000000000000000000000000000..9f8e20034de8273318fa5408e4e6084d06744c2c --- /dev/null +++ b/briar-core/src/net/sf/briar/reliability/ReliabilityModule.java @@ -0,0 +1,14 @@ +package net.sf.briar.reliability; + +import net.sf.briar.api.reliability.ReliabilityLayerFactory; + +import com.google.inject.AbstractModule; + +public class ReliabilityModule extends AbstractModule { + + @Override + protected void configure() { + bind(ReliabilityLayerFactory.class).to( + ReliabilityLayerFactoryImpl.class); + } +} diff --git a/briar-core/src/net/sf/briar/plugins/modem/Sender.java b/briar-core/src/net/sf/briar/reliability/Sender.java similarity index 98% rename from briar-core/src/net/sf/briar/plugins/modem/Sender.java rename to briar-core/src/net/sf/briar/reliability/Sender.java index bb2ad8a7bb4b4d676e2a3ea5b7b4a22f40b3bf32..313c1cb71b4c859a0760869092a828d996189a2a 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/Sender.java +++ b/briar-core/src/net/sf/briar/reliability/Sender.java @@ -1,4 +1,4 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; import java.io.IOException; import java.util.ArrayList; @@ -6,6 +6,8 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import net.sf.briar.api.reliability.WriteHandler; + class Sender { // All times are in milliseconds diff --git a/briar-core/src/net/sf/briar/plugins/modem/SenderOutputStream.java b/briar-core/src/net/sf/briar/reliability/SenderOutputStream.java similarity index 98% rename from briar-core/src/net/sf/briar/plugins/modem/SenderOutputStream.java rename to briar-core/src/net/sf/briar/reliability/SenderOutputStream.java index bed178ca55e593408214bdcf4f0035873abf0fc9..3f3df7df1d3ca29daebb427097bf462483fda86a 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/SenderOutputStream.java +++ b/briar-core/src/net/sf/briar/reliability/SenderOutputStream.java @@ -1,4 +1,4 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; import java.io.IOException; import java.io.OutputStream; diff --git a/briar-core/src/net/sf/briar/plugins/modem/SlipDecoder.java b/briar-core/src/net/sf/briar/reliability/SlipDecoder.java similarity index 95% rename from briar-core/src/net/sf/briar/plugins/modem/SlipDecoder.java rename to briar-core/src/net/sf/briar/reliability/SlipDecoder.java index a179f3d0ab44f78260e9bdc3482ba633bec0dc47..cfe3a464e9e84018b3eab80b7d3a1a60ba72165e 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/SlipDecoder.java +++ b/briar-core/src/net/sf/briar/reliability/SlipDecoder.java @@ -1,7 +1,9 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; import java.io.IOException; +import net.sf.briar.api.reliability.ReadHandler; + class SlipDecoder implements ReadHandler { // https://tools.ietf.org/html/rfc1055 diff --git a/briar-core/src/net/sf/briar/plugins/modem/SlipEncoder.java b/briar-core/src/net/sf/briar/reliability/SlipEncoder.java similarity index 92% rename from briar-core/src/net/sf/briar/plugins/modem/SlipEncoder.java rename to briar-core/src/net/sf/briar/reliability/SlipEncoder.java index 0fc327a43f07687b01216eb3f0342c0368ab93e8..4f2459779a167d368651ef2015035f4b796fed55 100644 --- a/briar-core/src/net/sf/briar/plugins/modem/SlipEncoder.java +++ b/briar-core/src/net/sf/briar/reliability/SlipEncoder.java @@ -1,7 +1,9 @@ -package net.sf.briar.plugins.modem; +package net.sf.briar.reliability; import java.io.IOException; +import net.sf.briar.api.reliability.WriteHandler; + class SlipEncoder implements WriteHandler { // https://tools.ietf.org/html/rfc1055 diff --git a/briar-tests/src/net/sf/briar/plugins/modem/ModemClientTest.java b/briar-tests/src/net/sf/briar/plugins/modem/ModemClientTest.java deleted file mode 100644 index 1a6deac1bb4f7aab579821177575a855a0a9c0a0..0000000000000000000000000000000000000000 --- a/briar-tests/src/net/sf/briar/plugins/modem/ModemClientTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.sf.briar.plugins.modem; - -import static java.util.logging.Level.INFO; - -import java.util.Collections; -import java.util.Map; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.logging.Logger; - -import net.sf.briar.api.ContactId; -import net.sf.briar.api.TransportConfig; -import net.sf.briar.api.TransportProperties; -import net.sf.briar.plugins.DuplexClientTest; - -//This is not a JUnit test - it has to be run manually while the server test -//is running on another machine -public class ModemClientTest extends DuplexClientTest { - - private ModemClientTest(Executor executor, String number) { - // Store the server's phone number - TransportProperties p = new TransportProperties(); - p.put("number", number); - Map<ContactId, TransportProperties> remote = - Collections.singletonMap(contactId, p); - // Create the plugin - callback = new ClientCallback(new TransportConfig(), - new TransportProperties(), remote); - plugin = new ModemPlugin(executor, new ModemFactoryImpl(executor, - new ReliabilityLayerFactoryImpl(executor)), callback, 0L); - } - - public static void main(String[] args) throws Exception { - if(args.length != 1) { - System.err.println("Please specify the server's phone number"); - System.exit(1); - } - Logger.getLogger("net.sf.briar").setLevel(INFO); - ExecutorService executor = Executors.newCachedThreadPool(); - try { - new ModemClientTest(executor, args[0]).run(); - } finally { - executor.shutdown(); - } - } -} diff --git a/briar-tests/src/net/sf/briar/plugins/modem/ModemServerTest.java b/briar-tests/src/net/sf/briar/plugins/modem/ModemServerTest.java deleted file mode 100644 index 3b2850d707738750515a5e3cd9d0fb01af191d8f..0000000000000000000000000000000000000000 --- a/briar-tests/src/net/sf/briar/plugins/modem/ModemServerTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.sf.briar.plugins.modem; - -import static java.util.logging.Level.INFO; - -import java.util.Collections; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.logging.Logger; - -import net.sf.briar.api.TransportConfig; -import net.sf.briar.api.TransportProperties; -import net.sf.briar.plugins.DuplexServerTest; - -//This is not a JUnit test - it has to be run manually while the client test -//is running on another machine -public class ModemServerTest extends DuplexServerTest { - - private ModemServerTest(Executor executor) { - // Create the plugin - callback = new ServerCallback(new TransportConfig(), - new TransportProperties(), Collections.singletonMap(contactId, - new TransportProperties())); - plugin = new ModemPlugin(executor, new ModemFactoryImpl(executor, - new ReliabilityLayerFactoryImpl(executor)), callback, 0L); - } - - public static void main(String[] args) throws Exception { - Logger.getLogger("net.sf.briar").setLevel(INFO); - ExecutorService executor = Executors.newCachedThreadPool(); - try { - new ModemServerTest(executor).run(); - } finally { - executor.shutdown(); - } - } -}