From 848872a8035bb6c4bb6cdfbaf112e0899e42d818 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 20 Jul 2022 16:48:37 +0100 Subject: [PATCH] Broadcast events for pairing and unpairing. --- .../api/mailbox/event/MailboxPairedEvent.java | 36 +++++++++++++++++++ .../mailbox/event/MailboxUnpairedEvent.java | 28 +++++++++++++++ .../mailbox/MailboxUpdateManagerImpl.java | 27 +++++++++----- .../mailbox/MailboxUpdateManagerImplTest.java | 4 +++ 4 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxPairedEvent.java create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxUnpairedEvent.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxPairedEvent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxPairedEvent.java new file mode 100644 index 000000000..1bf89529d --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxPairedEvent.java @@ -0,0 +1,36 @@ +package org.briarproject.bramble.api.mailbox.event; + +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.mailbox.MailboxProperties; +import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import java.util.Map; + +import javax.annotation.concurrent.Immutable; + +/** + * An event that is broadcast when a mailbox is paired. + */ +@Immutable +@NotNullByDefault +public class MailboxPairedEvent extends Event { + + private final MailboxProperties properties; + private final Map localUpdates; + + public MailboxPairedEvent(MailboxProperties properties, + Map localUpdates) { + this.properties = properties; + this.localUpdates = localUpdates; + } + + public MailboxProperties getProperties() { + return properties; + } + + public Map getLocalUpdates() { + return localUpdates; + } +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxUnpairedEvent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxUnpairedEvent.java new file mode 100644 index 000000000..846f8298c --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxUnpairedEvent.java @@ -0,0 +1,28 @@ +package org.briarproject.bramble.api.mailbox.event; + +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.mailbox.MailboxUpdate; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import java.util.Map; + +import javax.annotation.concurrent.Immutable; + +/** + * An event that is broadcast when a mailbox is unpaired. + */ +@Immutable +@NotNullByDefault +public class MailboxUnpairedEvent extends Event { + + private final Map localUpdates; + + public MailboxUnpairedEvent(Map localUpdates) { + this.localUpdates = localUpdates; + } + + public Map getLocalUpdates() { + return localUpdates; + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImpl.java index 0345186e0..17857551b 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImpl.java @@ -25,6 +25,8 @@ import org.briarproject.bramble.api.mailbox.MailboxUpdate; import org.briarproject.bramble.api.mailbox.MailboxUpdateManager; import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox; import org.briarproject.bramble.api.mailbox.MailboxVersion; +import org.briarproject.bramble.api.mailbox.event.MailboxPairedEvent; +import org.briarproject.bramble.api.mailbox.event.MailboxUnpairedEvent; import org.briarproject.bramble.api.mailbox.event.RemoteMailboxUpdateEvent; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.Group; @@ -38,6 +40,7 @@ import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -161,17 +164,23 @@ class MailboxUpdateManagerImpl implements MailboxUpdateManager, @Override public void mailboxPaired(Transaction txn, MailboxProperties p) throws DbException { + Map localUpdates = new HashMap<>(); for (Contact c : db.getContacts(txn)) { - createAndSendUpdateWithMailbox(txn, c, p.getServerSupports(), - p.getOnion()); + MailboxUpdateWithMailbox u = createAndSendUpdateWithMailbox(txn, c, + p.getServerSupports(), p.getOnion()); + localUpdates.put(c.getId(), u); } + txn.attach(new MailboxPairedEvent(p, localUpdates)); } @Override public void mailboxUnpaired(Transaction txn) throws DbException { + Map localUpdates = new HashMap<>(); for (Contact c : db.getContacts(txn)) { - sendUpdateNoMailbox(txn, c); + MailboxUpdate u = sendUpdateNoMailbox(txn, c); + localUpdates.put(c.getId(), u); } + txn.attach(new MailboxUnpairedEvent(localUpdates)); } @Override @@ -240,18 +249,19 @@ class MailboxUpdateManagerImpl implements MailboxUpdateManager, * supported Mailbox API version(s). All of which the contact needs to * communicate with our Mailbox. */ - private void createAndSendUpdateWithMailbox(Transaction txn, Contact c, - List serverSupports, String ownOnion) - throws DbException { + private MailboxUpdateWithMailbox createAndSendUpdateWithMailbox( + Transaction txn, Contact c, List serverSupports, + String ownOnion) throws DbException { MailboxProperties properties = new MailboxProperties(ownOnion, new MailboxAuthToken(crypto.generateUniqueId().getBytes()), serverSupports, new MailboxFolderId(crypto.generateUniqueId().getBytes()), new MailboxFolderId(crypto.generateUniqueId().getBytes())); - MailboxUpdate u = + MailboxUpdateWithMailbox u = new MailboxUpdateWithMailbox(clientSupports, properties); Group g = getContactGroup(c); storeMessageReplaceLatest(txn, g.getId(), u); + return u; } /** @@ -260,11 +270,12 @@ class MailboxUpdateManagerImpl implements MailboxUpdateManager, * Mailbox that they can use. It still includes the list of Mailbox API * version(s) that we support as a client. */ - private void sendUpdateNoMailbox(Transaction txn, Contact c) + private MailboxUpdate sendUpdateNoMailbox(Transaction txn, Contact c) throws DbException { Group g = getContactGroup(c); MailboxUpdate u = new MailboxUpdate(clientSupports); storeMessageReplaceLatest(txn, g.getId(), u); + return u; } @Nullable diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImplTest.java index bdcc5a378..d23de7518 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImplTest.java @@ -16,6 +16,8 @@ import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.mailbox.MailboxUpdate; import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox; import org.briarproject.bramble.api.mailbox.MailboxVersion; +import org.briarproject.bramble.api.mailbox.event.MailboxPairedEvent; +import org.briarproject.bramble.api.mailbox.event.MailboxUnpairedEvent; import org.briarproject.bramble.api.mailbox.event.RemoteMailboxUpdateEvent; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.GroupId; @@ -679,6 +681,7 @@ public class MailboxUpdateManagerImplTest extends BrambleMockTestCase { MailboxUpdateManagerImpl t = createInstance(someClientSupportsList); t.mailboxPaired(txn, ownProps); + assertTrue(hasEvent(txn, MailboxPairedEvent.class)); } @Test @@ -717,6 +720,7 @@ public class MailboxUpdateManagerImplTest extends BrambleMockTestCase { MailboxUpdateManagerImpl t = createInstance(someClientSupportsList); t.mailboxUnpaired(txn); + assertTrue(hasEvent(txn, MailboxUnpairedEvent.class)); } @Test