Replace Maybe with nullable transaction method.

This commit is contained in:
akwizgran
2018-11-06 17:29:08 +00:00
parent 52c778dce3
commit c386a0f5eb
7 changed files with 59 additions and 69 deletions

View File

@@ -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<T> {
@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;
}
}

View File

@@ -89,6 +89,14 @@ public interface DatabaseComponent {
<R, E extends Exception> R transactionWithResult(boolean readOnly,
DbCallable<R, E> task) throws DbException, E;
/**
* Runs the given task within a transaction and returns the result of the
* task, which may be null.
*/
@Nullable
<R, E extends Exception> R transactionWithNullableResult(boolean readOnly,
DbCallable<R, E> task) throws DbException, E;
/**
* Stores a contact associated with the given local and remote pseudonyms,
* and returns an ID for the contact.

View File

@@ -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<R, E extends Exception> {
@Nullable
R call(Transaction txn) throws DbException, E;
}

View File

@@ -1,5 +1,8 @@
package org.briarproject.bramble.api.db;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@NotNullByDefault
public interface DbRunnable<E extends Exception> {
void run(Transaction txn) throws DbException, E;

View File

@@ -183,6 +183,14 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
@Override
public <R, E extends Exception> R transactionWithResult(boolean readOnly,
DbCallable<R, E> task) throws DbException, E {
R result = transactionWithNullableResult(readOnly, task);
if (result == null) throw new NullPointerException();
return result;
}
@Override
public <R, E extends Exception> R transactionWithNullableResult(
boolean readOnly, DbCallable<R, E> task) throws DbException, E {
Transaction txn = startTransaction(readOnly);
try {
R result = task.call(txn);
@@ -861,7 +869,7 @@ class DatabaseComponentImpl<T> 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))

View File

@@ -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<Ack> 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<Collection<Message>>
b = db.transactionWithResult(false, txn -> {
Collection<Message> batch = db.generateRequestedBatch(txn,
contactId, MAX_RECORD_PAYLOAD_BYTES, maxLatency);
setNextSendTime(db.getNextSendTime(txn, contactId));
return new Maybe<>(batch);
});
Collection<Message> b =
db.transactionWithNullableResult(false, txn -> {
Collection<Message> 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<Offer> 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<Request> 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();

View File

@@ -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<Ack> 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<Collection<Message>> b = db.transactionWithResult(false,
txn -> new Maybe<>(db.generateBatch(txn, contactId,
MAX_RECORD_PAYLOAD_BYTES, maxLatency)));
Collection<Message> 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);