diff --git a/briar-android/res/values/roboguice.xml b/briar-android/res/values/roboguice.xml
index 32110839f..3ac5b40bf 100644
--- a/briar-android/res/values/roboguice.xml
+++ b/briar-android/res/values/roboguice.xml
@@ -4,6 +4,7 @@
- org.briarproject.android.AndroidModule
- org.briarproject.crypto.CryptoModule
- org.briarproject.db.DatabaseModule
+ - org.briarproject.event.EventModule
- org.briarproject.invitation.InvitationModule
- org.briarproject.lifecycle.LifecycleModule
- org.briarproject.messaging.MessagingModule
diff --git a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
index f65d71f70..597988cf9 100644
--- a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
+++ b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
@@ -27,6 +27,7 @@ import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DatabaseExecutor;
import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.SettingsUpdatedEvent;
import org.briarproject.api.lifecycle.Service;
@@ -52,6 +53,7 @@ Service, EventListener {
private final DatabaseComponent db;
private final Executor dbExecutor;
+ private final EventBus eventBus;
private final Context appContext;
private final Map contactCounts =
new HashMap(); // Locking: this
@@ -65,14 +67,16 @@ Service, EventListener {
@Inject
public AndroidNotificationManagerImpl(DatabaseComponent db,
- @DatabaseExecutor Executor dbExecutor, Application app) {
+ @DatabaseExecutor Executor dbExecutor, EventBus eventBus,
+ Application app) {
this.db = db;
this.dbExecutor = dbExecutor;
+ this.eventBus = eventBus;
appContext = app.getApplicationContext();
}
public boolean start() {
- db.addListener(this);
+ eventBus.addListener(this);
loadSettings();
return true;
}
@@ -91,7 +95,7 @@ Service, EventListener {
}
public boolean stop() {
- db.removeListener(this);
+ eventBus.removeListener(this);
return true;
}
diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java
index 36493ee44..ab28acce7 100644
--- a/briar-android/src/org/briarproject/android/BriarService.java
+++ b/briar-android/src/org/briarproject/android/BriarService.java
@@ -23,6 +23,7 @@ import org.briarproject.api.db.DatabaseConfig;
import org.briarproject.api.db.DatabaseExecutor;
import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.MessageAddedEvent;
import org.briarproject.api.lifecycle.LifecycleManager;
@@ -58,6 +59,7 @@ public class BriarService extends RoboService implements EventListener {
@Inject private volatile AndroidExecutor androidExecutor;
@Inject @DatabaseExecutor private volatile Executor dbExecutor;
@Inject private volatile DatabaseComponent db;
+ @Inject private volatile EventBus eventBus;
private volatile boolean started = false;
@Override
@@ -92,7 +94,7 @@ public class BriarService extends RoboService implements EventListener {
public void run() {
StartResult result = lifecycleManager.startServices();
if(result == SUCCESS) {
- db.addListener(BriarService.this);
+ eventBus.addListener(BriarService.this);
started = true;
} else if(result == ALREADY_RUNNING) {
LOG.info("Already running");
@@ -146,7 +148,7 @@ public class BriarService extends RoboService implements EventListener {
@Override
public void run() {
if(started) {
- db.removeListener(BriarService.this);
+ eventBus.removeListener(BriarService.this);
lifecycleManager.stopServices();
}
androidExecutor.shutdown();
diff --git a/briar-android/src/org/briarproject/android/SettingsActivity.java b/briar-android/src/org/briarproject/android/SettingsActivity.java
index f5f4e8236..0d508bba0 100644
--- a/briar-android/src/org/briarproject/android/SettingsActivity.java
+++ b/briar-android/src/org/briarproject/android/SettingsActivity.java
@@ -35,6 +35,7 @@ import org.briarproject.api.TransportId;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.SettingsUpdatedEvent;
import org.briarproject.util.StringUtils;
@@ -72,6 +73,7 @@ OnClickListener {
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
+ @Inject private volatile EventBus eventBus;
private volatile Settings settings;
private volatile boolean bluetoothSetting = true;
@@ -201,7 +203,7 @@ OnClickListener {
@Override
public void onResume() {
super.onResume();
- db.addListener(this);
+ eventBus.addListener(this);
loadSettings();
}
@@ -262,7 +264,7 @@ OnClickListener {
@Override
public void onPause() {
super.onPause();
- db.removeListener(this);
+ eventBus.removeListener(this);
}
public void onClick(View view) {
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListActivity.java b/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
index 895332d35..b72a0276b 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
@@ -33,6 +33,7 @@ import org.briarproject.api.db.NoSuchContactException;
import org.briarproject.api.event.ContactAddedEvent;
import org.briarproject.api.event.ContactRemovedEvent;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.MessageAddedEvent;
import org.briarproject.api.event.MessageExpiredEvent;
@@ -75,6 +76,7 @@ EventListener, ConnectionListener {
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
+ @Inject private volatile EventBus eventBus;
@Override
public void onCreate(Bundle state) {
@@ -125,7 +127,7 @@ EventListener, ConnectionListener {
@Override
public void onResume() {
super.onResume();
- db.addListener(this);
+ eventBus.addListener(this);
connectionRegistry.addListener(this);
loadContacts();
}
@@ -210,7 +212,7 @@ EventListener, ConnectionListener {
@Override
public void onPause() {
super.onPause();
- db.removeListener(this);
+ eventBus.removeListener(this);
connectionRegistry.removeListener(this);
}
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index d097024fb..b951ae91e 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -50,6 +50,7 @@ import org.briarproject.api.db.NoSuchMessageException;
import org.briarproject.api.db.NoSuchSubscriptionException;
import org.briarproject.api.event.ContactRemovedEvent;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.MessageAddedEvent;
import org.briarproject.api.event.MessageExpiredEvent;
@@ -96,6 +97,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
+ @Inject private volatile EventBus eventBus;
@Inject private volatile MessageFactory messageFactory;
private volatile ContactId contactId = null;
private volatile String contactName = null;
@@ -188,7 +190,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
@Override
public void onResume() {
super.onResume();
- db.addListener(this);
+ eventBus.addListener(this);
loadContactAndGroup();
loadHeaders();
}
@@ -331,7 +333,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
@Override
public void onPause() {
super.onPause();
- db.removeListener(this);
+ eventBus.removeListener(this);
if(isFinishing()) markMessagesRead();
}
diff --git a/briar-android/src/org/briarproject/android/groups/ConfigureGroupActivity.java b/briar-android/src/org/briarproject/android/groups/ConfigureGroupActivity.java
index b0ba112b3..4c7a2079e 100644
--- a/briar-android/src/org/briarproject/android/groups/ConfigureGroupActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/ConfigureGroupActivity.java
@@ -30,6 +30,7 @@ import org.briarproject.api.ContactId;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.LocalSubscriptionsUpdatedEvent;
import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
@@ -69,6 +70,7 @@ SelectContactsDialog.Listener {
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
+ @Inject private volatile EventBus eventBus;
private volatile GroupId groupId = null;
private volatile Group group = null;
private volatile boolean subscribed = false;
@@ -171,7 +173,7 @@ SelectContactsDialog.Listener {
@Override
public void onResume() {
super.onResume();
- db.addListener(this);
+ eventBus.addListener(this);
loadSubscribers();
}
@@ -224,7 +226,7 @@ SelectContactsDialog.Listener {
@Override
public void onPause() {
super.onPause();
- db.removeListener(this);
+ eventBus.removeListener(this);
}
public void onClick(View view) {
diff --git a/briar-android/src/org/briarproject/android/groups/GroupActivity.java b/briar-android/src/org/briarproject/android/groups/GroupActivity.java
index d5fffe6e9..7d8aa13d4 100644
--- a/briar-android/src/org/briarproject/android/groups/GroupActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/GroupActivity.java
@@ -35,6 +35,7 @@ import org.briarproject.api.db.MessageHeader;
import org.briarproject.api.db.NoSuchMessageException;
import org.briarproject.api.db.NoSuchSubscriptionException;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.MessageAddedEvent;
import org.briarproject.api.event.MessageExpiredEvent;
@@ -72,6 +73,7 @@ OnClickListener, OnItemClickListener {
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
+ @Inject private volatile EventBus eventBus;
private volatile GroupId groupId = null;
private volatile Group group = null;
@@ -139,7 +141,7 @@ OnClickListener, OnItemClickListener {
@Override
public void onResume() {
super.onResume();
- db.addListener(this);
+ eventBus.addListener(this);
loadGroup();
loadHeaders();
}
@@ -272,7 +274,7 @@ OnClickListener, OnItemClickListener {
@Override
public void onPause() {
super.onPause();
- db.removeListener(this);
+ eventBus.removeListener(this);
if(isFinishing()) markMessagesRead();
}
diff --git a/briar-android/src/org/briarproject/android/groups/GroupListActivity.java b/briar-android/src/org/briarproject/android/groups/GroupListActivity.java
index 531b63e95..769818a42 100644
--- a/briar-android/src/org/briarproject/android/groups/GroupListActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/GroupListActivity.java
@@ -30,6 +30,7 @@ import org.briarproject.api.db.DbException;
import org.briarproject.api.db.MessageHeader;
import org.briarproject.api.db.NoSuchSubscriptionException;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.MessageAddedEvent;
import org.briarproject.api.event.MessageExpiredEvent;
@@ -70,6 +71,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
+ @Inject private volatile EventBus eventBus;
@Override
public void onCreate(Bundle state) {
@@ -143,7 +145,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
@Override
public void onResume() {
super.onResume();
- db.addListener(this);
+ eventBus.addListener(this);
loadHeaders();
}
@@ -210,7 +212,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
adapter.sort(GroupListItemComparator.INSTANCE);
adapter.notifyDataSetChanged();
selectFirstUnread();
- }
+ }
});
}
@@ -255,7 +257,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
@Override
public void onPause() {
super.onPause();
- db.removeListener(this);
+ eventBus.removeListener(this);
}
public void eventOccurred(Event e) {
diff --git a/briar-android/src/org/briarproject/android/groups/ManageGroupsActivity.java b/briar-android/src/org/briarproject/android/groups/ManageGroupsActivity.java
index 7ac4f3065..799bc84b2 100644
--- a/briar-android/src/org/briarproject/android/groups/ManageGroupsActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/ManageGroupsActivity.java
@@ -16,6 +16,7 @@ import org.briarproject.android.util.ListLoadingProgressBar;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
import org.briarproject.api.event.SubscriptionAddedEvent;
@@ -44,6 +45,7 @@ implements EventListener, OnItemClickListener {
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
+ @Inject private volatile EventBus eventBus;
@Override
public void onCreate(Bundle state) {
@@ -69,7 +71,7 @@ implements EventListener, OnItemClickListener {
@Override
public void onResume() {
super.onResume();
- db.addListener(this);
+ eventBus.addListener(this);
loadGroups();
}
@@ -111,7 +113,7 @@ implements EventListener, OnItemClickListener {
@Override
public void onPause() {
super.onPause();
- db.removeListener(this);
+ eventBus.removeListener(this);
}
public void eventOccurred(Event e) {
diff --git a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
index 2d3540256..751ef78c9 100644
--- a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
+++ b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
@@ -13,7 +13,6 @@ import org.briarproject.api.Settings;
import org.briarproject.api.TransportConfig;
import org.briarproject.api.TransportId;
import org.briarproject.api.TransportProperties;
-import org.briarproject.api.event.EventListener;
import org.briarproject.api.messaging.Ack;
import org.briarproject.api.messaging.Group;
import org.briarproject.api.messaging.GroupId;
@@ -43,12 +42,6 @@ public interface DatabaseComponent {
/** Waits for any open transactions to finish and closes the database. */
void close() throws DbException, IOException;
- /** Adds a listener to be notified when database events occur. */
- void addListener(EventListener l);
-
- /** Removes a listener. */
- void removeListener(EventListener l);
-
/**
* Stores a contact associated with the given local and remote pseudonyms,
* and returns an ID for the contact.
diff --git a/briar-api/src/org/briarproject/api/event/EventBus.java b/briar-api/src/org/briarproject/api/event/EventBus.java
new file mode 100644
index 000000000..0b49d81e6
--- /dev/null
+++ b/briar-api/src/org/briarproject/api/event/EventBus.java
@@ -0,0 +1,13 @@
+package org.briarproject.api.event;
+
+public interface EventBus {
+
+ /** Adds a listener to be notified when events occur. */
+ void addListener(EventListener l);
+
+ /** Removes a listener. */
+ void removeListener(EventListener l);
+
+ /** Notifies all listeners of an event. */
+ void broadcast(Event e);
+}
diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
index 79113fbd4..6683d3670 100644
--- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
+++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
@@ -15,7 +15,6 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.logging.Logger;
@@ -42,8 +41,7 @@ import org.briarproject.api.db.NoSuchSubscriptionException;
import org.briarproject.api.db.NoSuchTransportException;
import org.briarproject.api.event.ContactAddedEvent;
import org.briarproject.api.event.ContactRemovedEvent;
-import org.briarproject.api.event.Event;
-import org.briarproject.api.event.EventListener;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.LocalAuthorAddedEvent;
import org.briarproject.api.event.LocalAuthorRemovedEvent;
import org.briarproject.api.event.LocalSubscriptionsUpdatedEvent;
@@ -95,21 +93,21 @@ DatabaseCleaner.Callback {
private final Database db;
private final DatabaseCleaner cleaner;
+ private final EventBus eventBus;
private final ShutdownManager shutdown;
private final ReentrantReadWriteLock lock =
new ReentrantReadWriteLock(true);
- private final Collection listeners =
- new CopyOnWriteArrayList();
private boolean open = false; // Locking: lock.writeLock
private int shutdownHandle = -1; // Locking: lock.writeLock
@Inject
DatabaseComponentImpl(Database db, DatabaseCleaner cleaner,
- ShutdownManager shutdown) {
+ EventBus eventBus, ShutdownManager shutdown) {
this.db = db;
this.cleaner = cleaner;
+ this.eventBus = eventBus;
this.shutdown = shutdown;
}
@@ -158,19 +156,6 @@ DatabaseCleaner.Callback {
}
}
- public void addListener(EventListener l) {
- listeners.add(l);
- }
-
- public void removeListener(EventListener l) {
- listeners.remove(l);
- }
-
- /** Notifies all listeners of a database event. */
- private void callListeners(Event e) {
- for(EventListener l : listeners) l.eventOccurred(e);
- }
-
public ContactId addContact(Author remote, AuthorId local)
throws DbException {
ContactId c;
@@ -191,7 +176,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- callListeners(new ContactAddedEvent(c));
+ eventBus.broadcast(new ContactAddedEvent(c));
return c;
}
@@ -231,7 +216,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- if(added) callListeners(new SubscriptionAddedEvent(g));
+ if(added) eventBus.broadcast(new SubscriptionAddedEvent(g));
return added;
}
@@ -251,18 +236,18 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- callListeners(new LocalAuthorAddedEvent(a.getId()));
+ eventBus.broadcast(new LocalAuthorAddedEvent(a.getId()));
}
public void addLocalMessage(Message m) throws DbException {
- boolean duplicate;
+ boolean duplicate, subscribed;
lock.writeLock().lock();
try {
T txn = db.startTransaction();
try {
duplicate = db.containsMessage(txn, m.getId());
- if(!duplicate && db.containsGroup(txn, m.getGroup().getId()))
- addMessage(txn, m, null);
+ subscribed = db.containsGroup(txn, m.getGroup().getId());
+ if(!duplicate && subscribed) addMessage(txn, m, null);
db.commitTransaction(txn);
} catch(DbException e) {
db.abortTransaction(txn);
@@ -271,7 +256,8 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- if(!duplicate) callListeners(new MessageAddedEvent(m.getGroup(), null));
+ if(!duplicate && subscribed)
+ eventBus.broadcast(new MessageAddedEvent(m.getGroup(), null));
}
/**
@@ -344,7 +330,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- if(added) callListeners(new TransportAddedEvent(t, maxLatency));
+ if(added) eventBus.broadcast(new TransportAddedEvent(t, maxLatency));
return added;
}
@@ -1062,7 +1048,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- if(changed) callListeners(new LocalTransportsUpdatedEvent());
+ if(changed) eventBus.broadcast(new LocalTransportsUpdatedEvent());
}
public void mergeSettings(Settings s) throws DbException {
@@ -1083,7 +1069,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- if(changed) callListeners(new SettingsUpdatedEvent());
+ if(changed) eventBus.broadcast(new SettingsUpdatedEvent());
}
public void receiveAck(ContactId c, Ack a) throws DbException {
@@ -1108,7 +1094,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- callListeners(new MessagesAckedEvent(c, acked));
+ eventBus.broadcast(new MessagesAckedEvent(c, acked));
}
public void receiveMessage(ContactId c, Message m) throws DbException {
@@ -1135,8 +1121,8 @@ DatabaseCleaner.Callback {
}
if(visible) {
if(!duplicate)
- callListeners(new MessageAddedEvent(m.getGroup(), c));
- callListeners(new MessageToAckEvent(c));
+ eventBus.broadcast(new MessageAddedEvent(m.getGroup(), c));
+ eventBus.broadcast(new MessageToAckEvent(c));
}
}
@@ -1168,8 +1154,8 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- if(ack) callListeners(new MessageToAckEvent(c));
- if(request) callListeners(new MessageToRequestEvent(c));
+ if(ack) eventBus.broadcast(new MessageToAckEvent(c));
+ if(request) eventBus.broadcast(new MessageToRequestEvent(c));
}
public void receiveRequest(ContactId c, Request r) throws DbException {
@@ -1195,7 +1181,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- if(requested) callListeners(new MessageRequestedEvent(c));
+ if(requested) eventBus.broadcast(new MessageRequestedEvent(c));
}
public void receiveRetentionAck(ContactId c, RetentionAck a)
@@ -1236,7 +1222,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- if(updated) callListeners(new RemoteRetentionTimeUpdatedEvent(c));
+ if(updated) eventBus.broadcast(new RemoteRetentionTimeUpdatedEvent(c));
}
public void receiveSubscriptionAck(ContactId c, SubscriptionAck a)
@@ -1276,7 +1262,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- if(updated) callListeners(new RemoteSubscriptionsUpdatedEvent(c));
+ if(updated) eventBus.broadcast(new RemoteSubscriptionsUpdatedEvent(c));
}
public void receiveTransportAck(ContactId c, TransportAck a)
@@ -1322,7 +1308,7 @@ DatabaseCleaner.Callback {
lock.writeLock().unlock();
}
if(updated)
- callListeners(new RemoteTransportsUpdatedEvent(c, u.getId()));
+ eventBus.broadcast(new RemoteTransportsUpdatedEvent(c, u.getId()));
}
public void removeContact(ContactId c) throws DbException {
@@ -1343,7 +1329,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- callListeners(new ContactRemovedEvent(c));
+ eventBus.broadcast(new ContactRemovedEvent(c));
}
public void removeGroup(Group g) throws DbException {
@@ -1365,8 +1351,8 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- callListeners(new SubscriptionRemovedEvent(g));
- callListeners(new LocalSubscriptionsUpdatedEvent(affected));
+ eventBus.broadcast(new SubscriptionRemovedEvent(g));
+ eventBus.broadcast(new LocalSubscriptionsUpdatedEvent(affected));
}
public void removeLocalAuthor(AuthorId a) throws DbException {
@@ -1391,8 +1377,9 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- for(ContactId c : affected) callListeners(new ContactRemovedEvent(c));
- callListeners(new LocalAuthorRemovedEvent(a));
+ for(ContactId c : affected)
+ eventBus.broadcast(new ContactRemovedEvent(c));
+ eventBus.broadcast(new LocalAuthorRemovedEvent(a));
}
public void removeTransport(TransportId t) throws DbException {
@@ -1411,7 +1398,7 @@ DatabaseCleaner.Callback {
} finally {
lock.writeLock().unlock();
}
- callListeners(new TransportRemovedEvent(t));
+ eventBus.broadcast(new TransportRemovedEvent(t));
}
public void setConnectionWindow(ContactId c, TransportId t, long period,
@@ -1526,7 +1513,7 @@ DatabaseCleaner.Callback {
lock.writeLock().unlock();
}
if(!affected.isEmpty())
- callListeners(new LocalSubscriptionsUpdatedEvent(affected));
+ eventBus.broadcast(new LocalSubscriptionsUpdatedEvent(affected));
}
public void setVisibleToAll(GroupId g, boolean all) throws DbException {
@@ -1559,7 +1546,7 @@ DatabaseCleaner.Callback {
lock.writeLock().unlock();
}
if(!affected.isEmpty())
- callListeners(new LocalSubscriptionsUpdatedEvent(affected));
+ eventBus.broadcast(new LocalSubscriptionsUpdatedEvent(affected));
}
public void checkFreeSpaceAndClean() throws DbException {
@@ -1603,7 +1590,7 @@ DatabaseCleaner.Callback {
lock.writeLock().unlock();
}
if(expired.isEmpty()) return false;
- callListeners(new MessageExpiredEvent());
+ eventBus.broadcast(new MessageExpiredEvent());
return true;
}
diff --git a/briar-core/src/org/briarproject/db/DatabaseModule.java b/briar-core/src/org/briarproject/db/DatabaseModule.java
index 11719acb6..824b3e9dc 100644
--- a/briar-core/src/org/briarproject/db/DatabaseModule.java
+++ b/briar-core/src/org/briarproject/db/DatabaseModule.java
@@ -15,6 +15,7 @@ import javax.inject.Singleton;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DatabaseConfig;
import org.briarproject.api.db.DatabaseExecutor;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.lifecycle.ShutdownManager;
import org.briarproject.api.system.FileUtils;
@@ -38,6 +39,7 @@ public class DatabaseModule extends AbstractModule {
policy);
}
+ @Override
protected void configure() {
bind(DatabaseCleaner.class).to(DatabaseCleanerImpl.class);
}
@@ -50,8 +52,10 @@ public class DatabaseModule extends AbstractModule {
@Provides @Singleton
DatabaseComponent getDatabaseComponent(Database db,
- DatabaseCleaner cleaner, ShutdownManager shutdown) {
- return new DatabaseComponentImpl(db, cleaner, shutdown);
+ DatabaseCleaner cleaner, EventBus eventBus,
+ ShutdownManager shutdown) {
+ return new DatabaseComponentImpl(db, cleaner, eventBus,
+ shutdown);
}
@Provides @Singleton @DatabaseExecutor
diff --git a/briar-core/src/org/briarproject/event/EventBusImpl.java b/briar-core/src/org/briarproject/event/EventBusImpl.java
new file mode 100644
index 000000000..9db72310b
--- /dev/null
+++ b/briar-core/src/org/briarproject/event/EventBusImpl.java
@@ -0,0 +1,26 @@
+package org.briarproject.event;
+
+import java.util.Collection;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
+import org.briarproject.api.event.EventListener;
+
+class EventBusImpl implements EventBus {
+
+ private final Collection listeners =
+ new CopyOnWriteArrayList();
+
+ public void addListener(EventListener l) {
+ listeners.add(l);
+ }
+
+ public void removeListener(EventListener l) {
+ listeners.remove(l);
+ }
+
+ public void broadcast(Event e) {
+ for(EventListener l : listeners) l.eventOccurred(e);
+ }
+}
diff --git a/briar-core/src/org/briarproject/event/EventModule.java b/briar-core/src/org/briarproject/event/EventModule.java
new file mode 100644
index 000000000..34aa23eb6
--- /dev/null
+++ b/briar-core/src/org/briarproject/event/EventModule.java
@@ -0,0 +1,14 @@
+package org.briarproject.event;
+
+import org.briarproject.api.event.EventBus;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+
+public class EventModule extends AbstractModule {
+
+ @Override
+ protected void configure() {
+ bind(EventBus.class).to(EventBusImpl.class).in(Singleton.class);
+ }
+}
diff --git a/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java b/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java
index de6d569a5..88c7fbbe8 100644
--- a/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java
+++ b/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java
@@ -22,6 +22,7 @@ import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException;
import org.briarproject.api.event.ContactRemovedEvent;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.LocalSubscriptionsUpdatedEvent;
import org.briarproject.api.event.LocalTransportsUpdatedEvent;
@@ -72,6 +73,7 @@ abstract class DuplexConnection implements EventListener {
};
protected final DatabaseComponent db;
+ protected final EventBus eventBus;
protected final ConnectionRegistry connRegistry;
protected final ConnectionReaderFactory connReaderFactory;
protected final ConnectionWriterFactory connWriterFactory;
@@ -92,7 +94,7 @@ abstract class DuplexConnection implements EventListener {
DuplexConnection(Executor dbExecutor, Executor cryptoExecutor,
MessageVerifier messageVerifier, DatabaseComponent db,
- ConnectionRegistry connRegistry,
+ EventBus eventBus, ConnectionRegistry connRegistry,
ConnectionReaderFactory connReaderFactory,
ConnectionWriterFactory connWriterFactory,
PacketReaderFactory packetReaderFactory,
@@ -102,6 +104,7 @@ abstract class DuplexConnection implements EventListener {
this.cryptoExecutor = cryptoExecutor;
this.messageVerifier = messageVerifier;
this.db = db;
+ this.eventBus = eventBus;
this.connRegistry = connRegistry;
this.connReaderFactory = connReaderFactory;
this.connWriterFactory = connWriterFactory;
@@ -218,7 +221,7 @@ abstract class DuplexConnection implements EventListener {
void write() {
connRegistry.registerConnection(contactId, transportId);
- db.addListener(this);
+ eventBus.addListener(this);
try {
OutputStream out = createConnectionWriter().getOutputStream();
writer = packetWriterFactory.createPacketWriter(out, true);
@@ -260,7 +263,7 @@ abstract class DuplexConnection implements EventListener {
if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
dispose(true, true);
}
- db.removeListener(this);
+ eventBus.removeListener(this);
connRegistry.unregisterConnection(contactId, transportId);
}
diff --git a/briar-core/src/org/briarproject/messaging/duplex/DuplexConnectionFactoryImpl.java b/briar-core/src/org/briarproject/messaging/duplex/DuplexConnectionFactoryImpl.java
index 94d14c021..dfb71541d 100644
--- a/briar-core/src/org/briarproject/messaging/duplex/DuplexConnectionFactoryImpl.java
+++ b/briar-core/src/org/briarproject/messaging/duplex/DuplexConnectionFactoryImpl.java
@@ -11,6 +11,7 @@ import org.briarproject.api.crypto.CryptoExecutor;
import org.briarproject.api.crypto.KeyManager;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DatabaseExecutor;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.messaging.MessageVerifier;
import org.briarproject.api.messaging.PacketReaderFactory;
import org.briarproject.api.messaging.PacketWriterFactory;
@@ -29,6 +30,7 @@ class DuplexConnectionFactoryImpl implements DuplexConnectionFactory {
private final Executor dbExecutor, cryptoExecutor;
private final MessageVerifier messageVerifier;
private final DatabaseComponent db;
+ private final EventBus eventBus;
private final KeyManager keyManager;
private final ConnectionRegistry connRegistry;
private final ConnectionReaderFactory connReaderFactory;
@@ -40,7 +42,8 @@ class DuplexConnectionFactoryImpl implements DuplexConnectionFactory {
DuplexConnectionFactoryImpl(@DatabaseExecutor Executor dbExecutor,
@CryptoExecutor Executor cryptoExecutor,
MessageVerifier messageVerifier, DatabaseComponent db,
- KeyManager keyManager, ConnectionRegistry connRegistry,
+ EventBus eventBus, KeyManager keyManager,
+ ConnectionRegistry connRegistry,
ConnectionReaderFactory connReaderFactory,
ConnectionWriterFactory connWriterFactory,
PacketReaderFactory packetReaderFactory,
@@ -49,6 +52,7 @@ class DuplexConnectionFactoryImpl implements DuplexConnectionFactory {
this.cryptoExecutor = cryptoExecutor;
this.messageVerifier = messageVerifier;
this.db = db;
+ this.eventBus = eventBus;
this.keyManager = keyManager;
this.connRegistry = connRegistry;
this.connReaderFactory = connReaderFactory;
@@ -60,7 +64,7 @@ class DuplexConnectionFactoryImpl implements DuplexConnectionFactory {
public void createIncomingConnection(ConnectionContext ctx,
DuplexTransportConnection transport) {
final DuplexConnection conn = new IncomingDuplexConnection(dbExecutor,
- cryptoExecutor, messageVerifier, db, connRegistry,
+ cryptoExecutor, messageVerifier, db, eventBus, connRegistry,
connReaderFactory, connWriterFactory, packetReaderFactory,
packetWriterFactory, ctx, transport);
Runnable write = new Runnable() {
@@ -85,7 +89,7 @@ class DuplexConnectionFactoryImpl implements DuplexConnectionFactory {
return;
}
final DuplexConnection conn = new OutgoingDuplexConnection(dbExecutor,
- cryptoExecutor, messageVerifier, db, connRegistry,
+ cryptoExecutor, messageVerifier, db, eventBus, connRegistry,
connReaderFactory, connWriterFactory, packetReaderFactory,
packetWriterFactory, ctx, transport);
Runnable write = new Runnable() {
diff --git a/briar-core/src/org/briarproject/messaging/duplex/IncomingDuplexConnection.java b/briar-core/src/org/briarproject/messaging/duplex/IncomingDuplexConnection.java
index 513c1821d..ed63fe015 100644
--- a/briar-core/src/org/briarproject/messaging/duplex/IncomingDuplexConnection.java
+++ b/briar-core/src/org/briarproject/messaging/duplex/IncomingDuplexConnection.java
@@ -6,6 +6,7 @@ import java.io.OutputStream;
import java.util.concurrent.Executor;
import org.briarproject.api.db.DatabaseComponent;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.messaging.MessageVerifier;
import org.briarproject.api.messaging.PacketReaderFactory;
import org.briarproject.api.messaging.PacketWriterFactory;
@@ -21,15 +22,15 @@ class IncomingDuplexConnection extends DuplexConnection {
IncomingDuplexConnection(Executor dbExecutor, Executor cryptoExecutor,
MessageVerifier messageVerifier, DatabaseComponent db,
- ConnectionRegistry connRegistry,
+ EventBus eventBus, ConnectionRegistry connRegistry,
ConnectionReaderFactory connReaderFactory,
ConnectionWriterFactory connWriterFactory,
PacketReaderFactory packetReaderFactory,
PacketWriterFactory packetWriterFactory,
ConnectionContext ctx, DuplexTransportConnection transport) {
- super(dbExecutor, cryptoExecutor, messageVerifier, db, connRegistry,
- connReaderFactory, connWriterFactory, packetReaderFactory,
- packetWriterFactory, ctx, transport);
+ super(dbExecutor, cryptoExecutor, messageVerifier, db, eventBus,
+ connRegistry, connReaderFactory, connWriterFactory,
+ packetReaderFactory, packetWriterFactory, ctx, transport);
}
@Override
diff --git a/briar-core/src/org/briarproject/messaging/duplex/OutgoingDuplexConnection.java b/briar-core/src/org/briarproject/messaging/duplex/OutgoingDuplexConnection.java
index 8a3fadb0e..4305674c1 100644
--- a/briar-core/src/org/briarproject/messaging/duplex/OutgoingDuplexConnection.java
+++ b/briar-core/src/org/briarproject/messaging/duplex/OutgoingDuplexConnection.java
@@ -6,6 +6,7 @@ import java.io.OutputStream;
import java.util.concurrent.Executor;
import org.briarproject.api.db.DatabaseComponent;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.messaging.MessageVerifier;
import org.briarproject.api.messaging.PacketReaderFactory;
import org.briarproject.api.messaging.PacketWriterFactory;
@@ -21,15 +22,15 @@ class OutgoingDuplexConnection extends DuplexConnection {
OutgoingDuplexConnection(Executor dbExecutor, Executor cryptoExecutor,
MessageVerifier messageVerifier, DatabaseComponent db,
- ConnectionRegistry connRegistry,
+ EventBus eventBus, ConnectionRegistry connRegistry,
ConnectionReaderFactory connReaderFactory,
ConnectionWriterFactory connWriterFactory,
PacketReaderFactory packetReaderFactory,
PacketWriterFactory packetWriterFactory, ConnectionContext ctx,
DuplexTransportConnection transport) {
- super(dbExecutor, cryptoExecutor, messageVerifier, db, connRegistry,
- connReaderFactory, connWriterFactory, packetReaderFactory,
- packetWriterFactory, ctx, transport);
+ super(dbExecutor, cryptoExecutor, messageVerifier, db, eventBus,
+ connRegistry, connReaderFactory, connWriterFactory,
+ packetReaderFactory, packetWriterFactory, ctx, transport);
}
@Override
diff --git a/briar-core/src/org/briarproject/transport/KeyManagerImpl.java b/briar-core/src/org/briarproject/transport/KeyManagerImpl.java
index 6bffe0f62..3b0ff81c8 100644
--- a/briar-core/src/org/briarproject/transport/KeyManagerImpl.java
+++ b/briar-core/src/org/briarproject/transport/KeyManagerImpl.java
@@ -23,6 +23,7 @@ import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException;
import org.briarproject.api.event.ContactRemovedEvent;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.TransportAddedEvent;
import org.briarproject.api.event.TransportRemovedEvent;
@@ -44,6 +45,7 @@ class KeyManagerImpl extends TimerTask implements KeyManager, EventListener {
private final CryptoComponent crypto;
private final DatabaseComponent db;
+ private final EventBus eventBus;
private final ConnectionRecogniser connectionRecogniser;
private final Clock clock;
private final Timer timer;
@@ -56,10 +58,11 @@ class KeyManagerImpl extends TimerTask implements KeyManager, EventListener {
@Inject
KeyManagerImpl(CryptoComponent crypto, DatabaseComponent db,
- ConnectionRecogniser connectionRecogniser, Clock clock,
- Timer timer) {
+ EventBus eventBus, ConnectionRecogniser connectionRecogniser,
+ Clock clock, Timer timer) {
this.crypto = crypto;
this.db = db;
+ this.eventBus = eventBus;
this.connectionRecogniser = connectionRecogniser;
this.clock = clock;
this.timer = timer;
@@ -70,7 +73,7 @@ class KeyManagerImpl extends TimerTask implements KeyManager, EventListener {
}
public synchronized boolean start() {
- db.addListener(this);
+ eventBus.addListener(this);
// Load the temporary secrets and transport latencies from the database
Collection secrets;
try {
@@ -213,7 +216,7 @@ class KeyManagerImpl extends TimerTask implements KeyManager, EventListener {
}
public synchronized boolean stop() {
- db.removeListener(this);
+ eventBus.removeListener(this);
timer.cancel();
connectionRecogniser.removeSecrets();
maxLatencies.clear();
@@ -290,6 +293,7 @@ class KeyManagerImpl extends TimerTask implements KeyManager, EventListener {
connectionRecogniser.addSecret(s3);
}
+ @Override
public synchronized void run() {
// Rebuild the maps because we may be running a whole period late
Collection secrets = new ArrayList();
@@ -399,6 +403,7 @@ class KeyManagerImpl extends TimerTask implements KeyManager, EventListener {
this.event = event;
}
+ @Override
public void run() {
ContactId c = event.getContactId();
connectionRecogniser.removeSecrets(c);
@@ -418,6 +423,7 @@ class KeyManagerImpl extends TimerTask implements KeyManager, EventListener {
this.event = event;
}
+ @Override
public void run() {
synchronized(KeyManagerImpl.this) {
maxLatencies.put(event.getTransportId(), event.getMaxLatency());
@@ -433,6 +439,7 @@ class KeyManagerImpl extends TimerTask implements KeyManager, EventListener {
this.event = event;
}
+ @Override
public void run() {
TransportId t = event.getTransportId();
connectionRecogniser.removeSecrets(t);
diff --git a/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java b/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
index a32c463a8..6441b83e4 100644
--- a/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
+++ b/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
@@ -43,6 +43,7 @@ import org.briarproject.api.transport.ConnectionWriter;
import org.briarproject.api.transport.ConnectionWriterFactory;
import org.briarproject.crypto.CryptoModule;
import org.briarproject.db.DatabaseModule;
+import org.briarproject.event.EventModule;
import org.briarproject.messaging.MessagingModule;
import org.briarproject.messaging.duplex.DuplexMessagingModule;
import org.briarproject.messaging.simplex.SimplexMessagingModule;
@@ -79,9 +80,10 @@ public class ProtocolIntegrationTest extends BriarTestCase {
Injector i = Guice.createInjector(new TestDatabaseModule(),
new TestLifecycleModule(), new TestSystemModule(),
new TestUiModule(), new CryptoModule(), new DatabaseModule(),
- new MessagingModule(), new DuplexMessagingModule(),
- new SimplexMessagingModule(), new ReliabilityModule(),
- new SerialModule(), new TransportModule());
+ new EventModule(), new MessagingModule(),
+ new DuplexMessagingModule(), new SimplexMessagingModule(),
+ new ReliabilityModule(), new SerialModule(),
+ new TransportModule());
connectionReaderFactory = i.getInstance(ConnectionReaderFactory.class);
connectionWriterFactory = i.getInstance(ConnectionWriterFactory.class);
packetReaderFactory = i.getInstance(PacketReaderFactory.class);
diff --git a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
index f1906dcdf..f694e90c7 100644
--- a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
+++ b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
@@ -7,6 +7,7 @@ import java.util.Collections;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException;
+import org.briarproject.api.event.EventBus;
import org.briarproject.api.lifecycle.ShutdownManager;
import org.briarproject.db.DatabaseCleaner.Callback;
import org.jmock.Expectations;
@@ -26,11 +27,13 @@ public class DatabaseComponentImplTest extends DatabaseComponentTest {
final Database