From d29812f055fcdaa253ae4a69f52ed5209d426da0 Mon Sep 17 00:00:00 2001 From: ialokim Date: Mon, 6 Dec 2021 21:08:05 +0100 Subject: [PATCH] add transactional versions of some API calls --- .../bramble/api/contact/ContactManager.java | 6 ++++ .../bramble/contact/ContactManagerImpl.java | 8 +++-- .../api/conversation/ConversationManager.java | 12 ++++++++ .../briar/api/messaging/MessagingManager.java | 7 +++++ .../conversation/ConversationManagerImpl.java | 29 +++++++++++-------- .../briar/messaging/MessagingManagerImpl.java | 8 ++++- 6 files changed, 55 insertions(+), 15 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java index 0330d443c..9d3d10e50 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java @@ -107,6 +107,12 @@ public interface ContactManager { */ String getHandshakeLink() throws DbException; + /** + * Returns the handshake link that needs to be sent to a contact we want + * to add. + */ + String getHandshakeLink(Transaction txn) throws DbException; + /** * Creates a {@link PendingContact} from the given handshake link and * alias, adds it to the database and returns it. diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java index 3c11e80f6..d4c5b532e 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java @@ -121,8 +121,12 @@ class ContactManagerImpl implements ContactManager, EventListener { @Override public String getHandshakeLink() throws DbException { - KeyPair keyPair = db.transactionWithResult(true, - identityManager::getHandshakeKeys); + return db.transactionWithResult(true, this::getHandshakeLink); + } + + @Override + public String getHandshakeLink(Transaction txn) throws DbException { + KeyPair keyPair = identityManager.getHandshakeKeys(txn); return pendingContactFactory.createHandshakeLink(keyPair.getPublic()); } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationManager.java b/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationManager.java index a867f37cc..2c869d9f3 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationManager.java @@ -38,6 +38,15 @@ public interface ConversationManager { Collection getMessageHeaders(ContactId c) throws DbException; + /** + * Returns the headers of all messages in the given private conversation. + *

+ * Only {@link MessagingManager} returns only headers. + * The others also return the message text. + */ + Collection getMessageHeaders(Transaction txn, ContactId c) + throws DbException; + /** * Returns the unified group count for all private conversation messages. */ @@ -72,6 +81,9 @@ public interface ConversationManager { void setReadFlag(GroupId g, MessageId m, boolean read) throws DbException; + void setReadFlag(Transaction txn, GroupId g, MessageId m, boolean read) + throws DbException; + /** * Returns a timestamp for an outgoing message, which is later than the * timestamp of any message in the conversation with the given contact. diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java index ac5b1acc3..91470b07e 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java @@ -74,6 +74,13 @@ public interface MessagingManager extends ConversationClient { @Nullable String getMessageText(MessageId m) throws DbException; + /** + * Returns the text of the private message with the given ID, or null if + * the private message has no text. + */ + @Nullable + String getMessageText(Transaction txn, MessageId m) throws DbException; + /** * Returns the private message format supported by the given contact. */ diff --git a/briar-core/src/main/java/org/briarproject/briar/conversation/ConversationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/conversation/ConversationManagerImpl.java index 46f0639d9..d1f04ffcc 100644 --- a/briar-core/src/main/java/org/briarproject/briar/conversation/ConversationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/conversation/ConversationManagerImpl.java @@ -58,15 +58,16 @@ class ConversationManagerImpl implements ConversationManager { @Override public Collection getMessageHeaders(ContactId c) throws DbException { + return db.transactionWithResult(true, + txn -> getMessageHeaders(txn, c)); + } + + @Override + public Collection getMessageHeaders(Transaction txn, ContactId c) + throws DbException { List messages = new ArrayList<>(); - Transaction txn = db.startTransaction(true); - try { - for (ConversationClient client : clients) { - messages.addAll(client.getMessageHeaders(txn, c)); - } - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); + for (ConversationClient client : clients) { + messages.addAll(client.getMessageHeaders(txn, c)); } return messages; } @@ -125,10 +126,14 @@ class ConversationManagerImpl implements ConversationManager { @Override public void setReadFlag(GroupId g, MessageId m, boolean read) throws DbException { - db.transaction(false, txn -> { - boolean wasRead = messageTracker.setReadFlag(txn, g, m, read); - if (read && !wasRead) db.startCleanupTimer(txn, m); - }); + db.transaction(false, txn -> setReadFlag(txn, g, m, read)); + } + + @Override + public void setReadFlag(Transaction txn, GroupId g, MessageId m, boolean read) + throws DbException { + boolean wasRead = messageTracker.setReadFlag(txn, g, m, read); + if (read && !wasRead) db.startCleanupTimer(txn, m); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index e27aba0c0..4db04b63b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -466,8 +466,14 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook, @Override public String getMessageText(MessageId m) throws DbException { + return db.transactionWithNullableResult(true, txn -> + getMessageText(txn, m)); + } + + @Override + public String getMessageText(Transaction txn, MessageId m) throws DbException { try { - BdfList body = clientHelper.getMessageAsList(m); + BdfList body = clientHelper.getMessageAsList(txn, m); if (body.size() == 1) return body.getString(0); // Legacy format else return body.getOptionalString(1); } catch (FormatException e) {