From c386a0f5eb5ec7bcc9663e7d59c17c1629243c9b Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 6 Nov 2018 17:29:08 +0000 Subject: [PATCH] Replace Maybe with nullable transaction method. --- .../org/briarproject/bramble/api/Maybe.java | 33 ------------- .../bramble/api/db/DatabaseComponent.java | 8 ++++ .../bramble/api/db/DbCallable.java | 6 +++ .../bramble/api/db/DbRunnable.java | 3 ++ .../bramble/db/DatabaseComponentImpl.java | 10 +++- .../bramble/sync/DuplexOutgoingSession.java | 47 +++++++++---------- .../bramble/sync/SimplexOutgoingSession.java | 21 ++++----- 7 files changed, 59 insertions(+), 69 deletions(-) delete mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/Maybe.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/Maybe.java b/bramble-api/src/main/java/org/briarproject/bramble/api/Maybe.java deleted file mode 100644 index 1b75eec20..000000000 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/Maybe.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.briarproject.bramble.api; - -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; - -import java.util.NoSuchElementException; - -import javax.annotation.Nullable; -import javax.annotation.concurrent.Immutable; - -/** - * Minimal stand-in for `java.util.Optional`. Functionality from `Optional` - * can be added as needed. - */ -@Immutable -@NotNullByDefault -public class Maybe { - - @Nullable - private final T value; - - public Maybe(@Nullable T value) { - this.value = value; - } - - public boolean isPresent() { - return value != null; - } - - public T get() { - if (value == null) throw new NoSuchElementException(); - return value; - } -} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java index 681e8ec01..73e150542 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java @@ -89,6 +89,14 @@ public interface DatabaseComponent { R transactionWithResult(boolean readOnly, DbCallable task) throws DbException, E; + /** + * Runs the given task within a transaction and returns the result of the + * task, which may be null. + */ + @Nullable + R transactionWithNullableResult(boolean readOnly, + DbCallable task) throws DbException, E; + /** * Stores a contact associated with the given local and remote pseudonyms, * and returns an ID for the contact. diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DbCallable.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DbCallable.java index d90a2e9e4..bb558a5d9 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DbCallable.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DbCallable.java @@ -1,6 +1,12 @@ package org.briarproject.bramble.api.db; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.Nullable; + +@NotNullByDefault public interface DbCallable { + @Nullable R call(Transaction txn) throws DbException, E; } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DbRunnable.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DbRunnable.java index 64d36143c..5d2344e74 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DbRunnable.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DbRunnable.java @@ -1,5 +1,8 @@ package org.briarproject.bramble.api.db; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +@NotNullByDefault public interface DbRunnable { void run(Transaction txn) throws DbException, E; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java index f6fbcd7e7..e12e694a3 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java @@ -183,6 +183,14 @@ class DatabaseComponentImpl implements DatabaseComponent { @Override public R transactionWithResult(boolean readOnly, DbCallable task) throws DbException, E { + R result = transactionWithNullableResult(readOnly, task); + if (result == null) throw new NullPointerException(); + return result; + } + + @Override + public R transactionWithNullableResult( + boolean readOnly, DbCallable task) throws DbException, E { Transaction txn = startTransaction(readOnly); try { R result = task.call(txn); @@ -861,7 +869,7 @@ class DatabaseComponentImpl implements DatabaseComponent { @Override public void setContactAlias(Transaction transaction, ContactId c, - String alias) throws DbException { + @Nullable String alias) throws DbException { if (transaction.isReadOnly()) throw new IllegalArgumentException(); T txn = unbox(transaction); if (!db.containsContact(txn, c)) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java index 23253f3a9..00c50f16c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java @@ -1,6 +1,5 @@ package org.briarproject.bramble.sync; -import org.briarproject.bramble.api.Maybe; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.event.ContactRemovedEvent; import org.briarproject.bramble.api.db.DatabaseComponent; @@ -230,12 +229,11 @@ class DuplexOutgoingSession implements SyncSession, EventListener { if (interrupted) return; if (!generateAckQueued.getAndSet(false)) throw new AssertionError(); try { - Maybe a = db.transactionWithResult(false, txn -> - new Maybe<>(db.generateAck(txn, contactId, - MAX_MESSAGE_IDS))); + Ack a = db.transactionWithNullableResult(false, txn -> + db.generateAck(txn, contactId, MAX_MESSAGE_IDS)); if (LOG.isLoggable(INFO)) - LOG.info("Generated ack: " + a.isPresent()); - if (a.isPresent()) writerTasks.add(new WriteAck(a.get())); + LOG.info("Generated ack: " + (a != null)); + if (a != null) writerTasks.add(new WriteAck(a)); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); @@ -270,16 +268,18 @@ class DuplexOutgoingSession implements SyncSession, EventListener { if (!generateBatchQueued.getAndSet(false)) throw new AssertionError(); try { - Maybe> - b = db.transactionWithResult(false, txn -> { - Collection batch = db.generateRequestedBatch(txn, - contactId, MAX_RECORD_PAYLOAD_BYTES, maxLatency); - setNextSendTime(db.getNextSendTime(txn, contactId)); - return new Maybe<>(batch); - }); + Collection b = + db.transactionWithNullableResult(false, txn -> { + Collection batch = + db.generateRequestedBatch(txn, contactId, + MAX_RECORD_PAYLOAD_BYTES, + maxLatency); + setNextSendTime(db.getNextSendTime(txn, contactId)); + return batch; + }); if (LOG.isLoggable(INFO)) - LOG.info("Generated batch: " + b.isPresent()); - if (b.isPresent()) writerTasks.add(new WriteBatch(b.get())); + LOG.info("Generated batch: " + (b != null)); + if (b != null) writerTasks.add(new WriteBatch(b)); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); @@ -314,15 +314,15 @@ class DuplexOutgoingSession implements SyncSession, EventListener { if (!generateOfferQueued.getAndSet(false)) throw new AssertionError(); try { - Maybe o = db.transactionWithResult(false, txn -> { + Offer o = db.transactionWithNullableResult(false, txn -> { Offer offer = db.generateOffer(txn, contactId, MAX_MESSAGE_IDS, maxLatency); setNextSendTime(db.getNextSendTime(txn, contactId)); - return new Maybe<>(offer); + return offer; }); if (LOG.isLoggable(INFO)) - LOG.info("Generated offer: " + o.isPresent()); - if (o.isPresent()) writerTasks.add(new WriteOffer(o.get())); + LOG.info("Generated offer: " + (o != null)); + if (o != null) writerTasks.add(new WriteOffer(o)); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); @@ -357,12 +357,11 @@ class DuplexOutgoingSession implements SyncSession, EventListener { if (!generateRequestQueued.getAndSet(false)) throw new AssertionError(); try { - Maybe r = db.transactionWithResult(false, txn -> - new Maybe<>(db.generateRequest(txn, contactId, - MAX_MESSAGE_IDS))); + Request r = db.transactionWithNullableResult(false, txn -> + db.generateRequest(txn, contactId, MAX_MESSAGE_IDS)); if (LOG.isLoggable(INFO)) - LOG.info("Generated request: " + r.isPresent()); - if (r.isPresent()) writerTasks.add(new WriteRequest(r.get())); + LOG.info("Generated request: " + (r != null)); + if (r != null) writerTasks.add(new WriteRequest(r)); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java index 48e312312..52b86bf72 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java @@ -1,6 +1,5 @@ package org.briarproject.bramble.sync; -import org.briarproject.bramble.api.Maybe; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.event.ContactRemovedEvent; import org.briarproject.bramble.api.db.DatabaseComponent; @@ -129,12 +128,11 @@ class SimplexOutgoingSession implements SyncSession, EventListener { public void run() { if (interrupted) return; try { - Maybe a = db.transactionWithResult(false, txn -> - new Maybe<>(db.generateAck(txn, contactId, - MAX_MESSAGE_IDS))); + Ack a = db.transactionWithNullableResult(false, txn -> + db.generateAck(txn, contactId, MAX_MESSAGE_IDS)); if (LOG.isLoggable(INFO)) - LOG.info("Generated ack: " + a.isPresent()); - if (a.isPresent()) writerTasks.add(new WriteAck(a.get())); + LOG.info("Generated ack: " + (a != null)); + if (a != null) writerTasks.add(new WriteAck(a)); else decrementOutstandingQueries(); } catch (DbException e) { logException(LOG, WARNING, e); @@ -168,12 +166,13 @@ class SimplexOutgoingSession implements SyncSession, EventListener { public void run() { if (interrupted) return; try { - Maybe> b = db.transactionWithResult(false, - txn -> new Maybe<>(db.generateBatch(txn, contactId, - MAX_RECORD_PAYLOAD_BYTES, maxLatency))); + Collection b = + db.transactionWithNullableResult(false, txn -> + db.generateBatch(txn, contactId, + MAX_RECORD_PAYLOAD_BYTES, maxLatency)); if (LOG.isLoggable(INFO)) - LOG.info("Generated batch: " + b.isPresent()); - if (b.isPresent()) writerTasks.add(new WriteBatch(b.get())); + LOG.info("Generated batch: " + (b != null)); + if (b != null) writerTasks.add(new WriteBatch(b)); else decrementOutstandingQueries(); } catch (DbException e) { logException(LOG, WARNING, e);