From d94637b5cf461fbed0ac4de2efa5cf5ceb6ba990 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Fri, 5 Dec 2014 12:46:11 +0000 Subject: [PATCH] Removed polling from ModemPlugin. --- .../plugins/modem/ModemFactoryImpl.java | 8 +- .../briarproject/plugins/modem/ModemImpl.java | 8 +- .../plugins/modem/ModemPlugin.java | 76 +--------- .../plugins/modem/ModemPluginFactory.java | 7 +- .../plugins/modem/ModemPluginTest.java | 136 ++---------------- 5 files changed, 30 insertions(+), 205 deletions(-) diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemFactoryImpl.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemFactoryImpl.java index 892f8f541f..ee2aef1e09 100644 --- a/briar-desktop/src/org/briarproject/plugins/modem/ModemFactoryImpl.java +++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemFactoryImpl.java @@ -8,19 +8,19 @@ import org.briarproject.system.SystemClock; class ModemFactoryImpl implements ModemFactory { - private final Executor executor; + private final Executor ioExecutor; private final ReliabilityLayerFactory reliabilityFactory; private final Clock clock; - ModemFactoryImpl(Executor executor, + ModemFactoryImpl(Executor ioExecutor, ReliabilityLayerFactory reliabilityFactory) { - this.executor = executor; + this.ioExecutor = ioExecutor; this.reliabilityFactory = reliabilityFactory; clock = new SystemClock(); } public Modem createModem(Modem.Callback callback, String portName) { - return new ModemImpl(executor, reliabilityFactory, clock, callback, + return new ModemImpl(ioExecutor, reliabilityFactory, clock, callback, new SerialPortImpl(portName)); } } diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemImpl.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemImpl.java index ea0af1c425..08120a5a6e 100644 --- a/briar-desktop/src/org/briarproject/plugins/modem/ModemImpl.java +++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemImpl.java @@ -32,7 +32,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener { private static final int CONNECT_TIMEOUT = 2 * 60 * 1000; // Milliseconds private static final int ESCAPE_SEQUENCE_GUARD_TIME = 1000; // Milliseconds - private final Executor executor; + private final Executor ioExecutor; private final ReliabilityLayerFactory reliabilityFactory; private final Clock clock; private final Callback callback; @@ -45,9 +45,9 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener { private ReliabilityLayer reliability = null; // Locking: this private boolean initialised = false, connected = false; // Locking: this - ModemImpl(Executor executor, ReliabilityLayerFactory reliabilityFactory, + ModemImpl(Executor ioExecutor, ReliabilityLayerFactory reliabilityFactory, Clock clock, Callback callback, SerialPort port) { - this.executor = executor; + this.ioExecutor = ioExecutor; this.reliabilityFactory = reliabilityFactory; this.clock = clock; this.callback = callback; @@ -333,7 +333,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener { notifyAll(); } } else if(s.equals("RING")) { - executor.execute(new Runnable() { + ioExecutor.execute(new Runnable() { public void run() { try { answer(); diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java index 873fd5e395..686f1c5404 100644 --- a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java +++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java @@ -6,14 +6,8 @@ import static java.util.logging.Level.WARNING; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; @@ -35,29 +29,24 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback { private static final Logger LOG = Logger.getLogger(ModemPlugin.class.getName()); - private final Executor ioExecutor; private final ModemFactory modemFactory; private final SerialPortList serialPortList; private final DuplexPluginCallback callback; private final int maxFrameLength; private final long maxLatency, pollingInterval; - private final boolean shuffle; // Used to disable shuffling for testing private volatile boolean running = false; private volatile Modem modem = null; - ModemPlugin(Executor ioExecutor, ModemFactory modemFactory, - SerialPortList serialPortList, DuplexPluginCallback callback, - int maxFrameLength, long maxLatency, long pollingInterval, - boolean shuffle) { - this.ioExecutor = ioExecutor; + ModemPlugin(ModemFactory modemFactory, SerialPortList serialPortList, + DuplexPluginCallback callback, int maxFrameLength, long maxLatency, + long pollingInterval) { this.modemFactory = modemFactory; this.serialPortList = serialPortList; this.callback = callback; this.maxFrameLength = maxFrameLength; this.maxLatency = maxLatency; this.pollingInterval = pollingInterval; - this.shuffle = shuffle; } public TransportId getId() { @@ -105,9 +94,8 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback { return running; } - // FIXME: Don't poll this plugin public boolean shouldPoll() { - return true; + return false; } public long getPollingInterval() { @@ -115,57 +103,7 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback { } public void poll(Collection<ContactId> connected) { - if(!connected.isEmpty()) return; // One at a time please - ioExecutor.execute(new Runnable() { - public void run() { - poll(); - } - }); - } - - private void poll() { - if(!running) return; - // Get the ISO 3166 code for the caller's country - String callerIso = callback.getLocalProperties().get("iso3166"); - if(StringUtils.isNullOrEmpty(callerIso)) return; - // Call contacts one at a time in a random order - Map<ContactId, TransportProperties> remote = - callback.getRemoteProperties(); - List<ContactId> contacts = new ArrayList<ContactId>(remote.keySet()); - if(shuffle) Collections.shuffle(contacts); - Iterator<ContactId> it = contacts.iterator(); - while(it.hasNext() && running) { - ContactId c = it.next(); - // Get the ISO 3166 code for the callee's country - TransportProperties properties = remote.get(c); - if(properties == null) continue; - String calleeIso = properties.get("iso3166"); - if(StringUtils.isNullOrEmpty(calleeIso)) continue; - // Get the callee's phone number - String number = properties.get("number"); - if(StringUtils.isNullOrEmpty(number)) continue; - // Convert the number into direct dialling form - number = CountryCodes.translate(number, callerIso, calleeIso); - if(number == null) continue; - // Dial the number - try { - if(!modem.dial(number)) continue; - } catch(IOException e) { - if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); - if(resetModem()) continue; - break; - } - LOG.info("Outgoing call connected"); - ModemTransportConnection conn = new ModemTransportConnection(); - callback.outgoingConnectionCreated(c, conn); - try { - conn.waitForDisposal(); - } catch(InterruptedException e) { - LOG.warning("Interrupted while polling"); - Thread.currentThread().interrupt(); - break; - } - } + throw new UnsupportedOperationException(); } boolean resetModem() { @@ -257,10 +195,6 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback { disposalFinished.countDown(); } - private void waitForDisposal() throws InterruptedException { - disposalFinished.await(); - } - private class Reader implements TransportConnectionReader { public int getMaxFrameLength() { diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemPluginFactory.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemPluginFactory.java index 4fff4bbfaa..2732bbbc7c 100644 --- a/briar-desktop/src/org/briarproject/plugins/modem/ModemPluginFactory.java +++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemPluginFactory.java @@ -15,13 +15,11 @@ public class ModemPluginFactory implements DuplexPluginFactory { private static final long MAX_LATENCY = 60 * 1000; // 1 minute private static final long POLLING_INTERVAL = 60 * 60 * 1000; // 1 hour - private final Executor ioExecutor; private final ModemFactory modemFactory; private final SerialPortList serialPortList; public ModemPluginFactory(Executor ioExecutor, ReliabilityLayerFactory reliabilityFactory) { - this.ioExecutor = ioExecutor; modemFactory = new ModemFactoryImpl(ioExecutor, reliabilityFactory); serialPortList = new SerialPortListImpl(); } @@ -34,8 +32,7 @@ public class ModemPluginFactory implements DuplexPluginFactory { // This plugin is not enabled by default String enabled = callback.getConfig().get("enabled"); if(StringUtils.isNullOrEmpty(enabled)) return null; - return new ModemPlugin(ioExecutor, modemFactory, serialPortList, - callback, MAX_FRAME_LENGTH, MAX_LATENCY, POLLING_INTERVAL, - true); + return new ModemPlugin(modemFactory, serialPortList, callback, + MAX_FRAME_LENGTH, MAX_LATENCY, POLLING_INTERVAL); } } diff --git a/briar-tests/src/org/briarproject/plugins/modem/ModemPluginTest.java b/briar-tests/src/org/briarproject/plugins/modem/ModemPluginTest.java index 1abf9d2440..3371bd7e0d 100644 --- a/briar-tests/src/org/briarproject/plugins/modem/ModemPluginTest.java +++ b/briar-tests/src/org/briarproject/plugins/modem/ModemPluginTest.java @@ -1,33 +1,21 @@ package org.briarproject.plugins.modem; -import static java.util.concurrent.TimeUnit.SECONDS; - import java.io.IOException; import java.util.Collections; -import java.util.HashMap; import java.util.Map; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import org.briarproject.BriarTestCase; import org.briarproject.api.ContactId; import org.briarproject.api.TransportProperties; import org.briarproject.api.plugins.duplex.DuplexPluginCallback; -import org.briarproject.api.plugins.duplex.DuplexTransportConnection; -import org.hamcrest.Description; import org.jmock.Expectations; import org.jmock.Mockery; -import org.jmock.api.Action; -import org.jmock.api.Invocation; import org.junit.Test; public class ModemPluginTest extends BriarTestCase { private static final String ISO_1336 = "GB"; - private static final String NUMBER1 = "0123"; - private static final String NUMBER2 = "0234"; - private static final String NUMBER3 = "0345"; + private static final String NUMBER = "0123456789"; @Test public void testModemCreation() throws Exception { @@ -35,8 +23,8 @@ public class ModemPluginTest extends BriarTestCase { final ModemFactory modemFactory = context.mock(ModemFactory.class); final SerialPortList serialPortList = context.mock(SerialPortList.class); - final ModemPlugin plugin = new ModemPlugin(null, modemFactory, - serialPortList, null, 0, 0, 0, true); + final ModemPlugin plugin = new ModemPlugin(modemFactory, + serialPortList, null, 0, 0, 0); final Modem modem = context.mock(Modem.class); context.checking(new Expectations() {{ oneOf(serialPortList).getPortNames(); @@ -69,14 +57,14 @@ public class ModemPluginTest extends BriarTestCase { context.mock(SerialPortList.class); final DuplexPluginCallback callback = context.mock(DuplexPluginCallback.class); - final ModemPlugin plugin = new ModemPlugin(null, modemFactory, - serialPortList, callback, 0, 0, 0, true); + final ModemPlugin plugin = new ModemPlugin(modemFactory, + serialPortList, callback, 0, 0, 0); final Modem modem = context.mock(Modem.class); final TransportProperties local = new TransportProperties(); local.put("iso3166", ISO_1336); TransportProperties p = new TransportProperties(); p.put("iso3166", ISO_1336); - p.put("number", NUMBER1); + p.put("number", NUMBER); ContactId contactId = new ContactId(234); final Map<ContactId, TransportProperties> remote = Collections.singletonMap(contactId, p); @@ -93,7 +81,7 @@ public class ModemPluginTest extends BriarTestCase { will(returnValue(local)); oneOf(callback).getRemoteProperties(); will(returnValue(remote)); - oneOf(modem).dial(NUMBER1); + oneOf(modem).dial(NUMBER); will(returnValue(true)); }}); assertTrue(plugin.start()); @@ -110,14 +98,14 @@ public class ModemPluginTest extends BriarTestCase { context.mock(SerialPortList.class); final DuplexPluginCallback callback = context.mock(DuplexPluginCallback.class); - final ModemPlugin plugin = new ModemPlugin(null, modemFactory, - serialPortList, callback, 0, 0, 0, true); + final ModemPlugin plugin = new ModemPlugin(modemFactory, + serialPortList, callback, 0, 0, 0); final Modem modem = context.mock(Modem.class); final TransportProperties local = new TransportProperties(); local.put("iso3166", ISO_1336); TransportProperties p = new TransportProperties(); p.put("iso3166", ISO_1336); - p.put("number", NUMBER1); + p.put("number", NUMBER); ContactId contactId = new ContactId(234); final Map<ContactId, TransportProperties> remote = Collections.singletonMap(contactId, p); @@ -134,7 +122,7 @@ public class ModemPluginTest extends BriarTestCase { will(returnValue(local)); oneOf(callback).getRemoteProperties(); will(returnValue(remote)); - oneOf(modem).dial(NUMBER1); + oneOf(modem).dial(NUMBER); will(returnValue(false)); }}); assertTrue(plugin.start()); @@ -151,14 +139,14 @@ public class ModemPluginTest extends BriarTestCase { context.mock(SerialPortList.class); final DuplexPluginCallback callback = context.mock(DuplexPluginCallback.class); - final ModemPlugin plugin = new ModemPlugin(null, modemFactory, - serialPortList, callback, 0, 0, 0, true); + final ModemPlugin plugin = new ModemPlugin(modemFactory, + serialPortList, callback, 0, 0, 0); final Modem modem = context.mock(Modem.class); final TransportProperties local = new TransportProperties(); local.put("iso3166", ISO_1336); TransportProperties p = new TransportProperties(); p.put("iso3166", ISO_1336); - p.put("number", NUMBER1); + p.put("number", NUMBER); ContactId contactId = new ContactId(234); final Map<ContactId, TransportProperties> remote = Collections.singletonMap(contactId, p); @@ -175,7 +163,7 @@ public class ModemPluginTest extends BriarTestCase { will(returnValue(local)); oneOf(callback).getRemoteProperties(); will(returnValue(remote)); - oneOf(modem).dial(NUMBER1); + oneOf(modem).dial(NUMBER); will(throwException(new IOException())); // resetModem() oneOf(serialPortList).getPortNames(); @@ -190,98 +178,4 @@ public class ModemPluginTest extends BriarTestCase { assertNull(plugin.createConnection(contactId)); context.assertIsSatisfied(); } - - @Test - public void testPolling() throws Exception { - final ExecutorService ioExecutor = Executors.newSingleThreadExecutor(); - Mockery context = new Mockery(); - final ModemFactory modemFactory = context.mock(ModemFactory.class); - final SerialPortList serialPortList = - context.mock(SerialPortList.class); - final DuplexPluginCallback callback = - context.mock(DuplexPluginCallback.class); - // Disable shuffling for this test, it confuses jMock - final ModemPlugin plugin = new ModemPlugin(ioExecutor, modemFactory, - serialPortList, callback, 0, 0, 0, false); - final Modem modem = context.mock(Modem.class); - final TransportProperties local = new TransportProperties(); - local.put("iso3166", ISO_1336); - TransportProperties p1 = new TransportProperties(); - p1.put("iso3166", ISO_1336); - p1.put("number", NUMBER1); - TransportProperties p2 = new TransportProperties(); - p2.put("iso3166", ISO_1336); - p2.put("number", NUMBER2); - TransportProperties p3 = new TransportProperties(); - p3.put("iso3166", ISO_1336); - p3.put("number", NUMBER3); - ContactId contactId1 = new ContactId(234); - ContactId contactId2 = new ContactId(345); - ContactId contactId3 = new ContactId(456); - final Map<ContactId, TransportProperties> remote = - new HashMap<ContactId, TransportProperties>(); - remote.put(contactId1, p1); - remote.put(contactId2, p2); - remote.put(contactId3, p3); - final DisposeAction disposeAction = new DisposeAction(); - context.checking(new Expectations() {{ - // start() - oneOf(serialPortList).getPortNames(); - will(returnValue(new String[] { "foo" })); - oneOf(modemFactory).createModem(plugin, "foo"); - will(returnValue(modem)); - oneOf(modem).start(); - will(returnValue(true)); - // poll() - oneOf(callback).getLocalProperties(); - will(returnValue(local)); - oneOf(callback).getRemoteProperties(); - will(returnValue(remote)); - // First call to dial() throws an exception - oneOf(modem).dial(NUMBER1); - will(throwException(new IOException())); - // resetModem() - oneOf(serialPortList).getPortNames(); - will(returnValue(new String[] { "foo" })); - oneOf(modemFactory).createModem(plugin, "foo"); - will(returnValue(modem)); - oneOf(modem).start(); - will(returnValue(true)); - // Second call to dial() returns true - oneOf(modem).dial(NUMBER2); - will(returnValue(true)); - // A connection is passed to the callback - dispose of it - oneOf(callback).outgoingConnectionCreated( - with(any(ContactId.class)), - with(any(DuplexTransportConnection.class))); - will(disposeAction); - oneOf(modem).hangUp(); - // Third call to dial() returns false - oneOf(modem).dial(NUMBER3); - will(returnValue(false)); - }}); - assertTrue(plugin.start()); - plugin.poll(Collections.<ContactId>emptyList()); - assertTrue(disposeAction.invoked.await(5, SECONDS)); - ioExecutor.shutdown(); - context.assertIsSatisfied(); - } - - private static class DisposeAction implements Action { - - private final CountDownLatch invoked = new CountDownLatch(1); - - public void describeTo(Description description) { - description.appendText("Disposes of a transport connection"); - } - - public Object invoke(Invocation invocation) throws Throwable { - DuplexTransportConnection conn = - (DuplexTransportConnection) invocation.getParameter(1); - conn.getReader().dispose(false, true); - conn.getWriter().dispose(false); - invoked.countDown(); - return null; - } - } } -- GitLab