Allow messages to be deleted in delivery hook

This commit is contained in:
Torsten Grote
2016-11-03 18:42:26 -02:00
parent e810a1265a
commit 3f9a254a0b
10 changed files with 103 additions and 113 deletions

View File

@@ -14,6 +14,7 @@ import org.briarproject.api.db.DbException;
import org.briarproject.api.db.Metadata;
import org.briarproject.api.db.Transaction;
import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.InvalidMessageException;
import org.briarproject.api.sync.Message;
import org.briarproject.api.sync.MessageId;
import org.briarproject.api.sync.ValidationManager.IncomingMessageHook;
@@ -39,24 +40,39 @@ public abstract class BdfIncomingMessageHook implements IncomingMessageHook,
this.metadataParser = metadataParser;
}
/**
* Called once for each incoming message that passes validation.
*
* @throws DbException Should only be used for real database errors.
* Do not rethrow
* @throws FormatException Use this for any non-database error
* that occurs while handling remotely created data.
* This includes errors that occur while handling locally created data
* in a context controlled by remotely created data
* (for example, parsing the metadata of a dependency
* of an incoming message).
* Throwing this will delete the incoming message and its metadata
* marking it as invalid in the database.
* Never rethrow DbException as FormatException
*/
protected abstract boolean incomingMessage(Transaction txn, Message m,
BdfList body, BdfDictionary meta) throws DbException,
FormatException;
@Override
public boolean incomingMessage(Transaction txn, Message m, Metadata meta)
throws DbException {
throws DbException, InvalidMessageException {
return incomingMessage(txn, m, meta, MESSAGE_HEADER_LENGTH);
}
@Override
public void incomingMessage(Transaction txn, QueueMessage q, Metadata meta)
throws DbException {
throws DbException, InvalidMessageException {
incomingMessage(txn, q, meta, QUEUE_MESSAGE_HEADER_LENGTH);
}
private boolean incomingMessage(Transaction txn, Message m, Metadata meta,
int headerLength) throws DbException {
int headerLength) throws DbException, InvalidMessageException {
try {
byte[] raw = m.getRaw();
BdfList body = clientHelper.toList(raw, headerLength,
@@ -64,7 +80,7 @@ public abstract class BdfIncomingMessageHook implements IncomingMessageHook,
BdfDictionary metaDictionary = metadataParser.parse(meta);
return incomingMessage(txn, m, body, metaDictionary);
} catch (FormatException e) {
throw new DbException(e);
throw new InvalidMessageException(e);
}
}

View File

@@ -132,7 +132,7 @@ class MessageQueueManagerImpl implements MessageQueueManager {
private long outgoingPosition, incomingPosition;
private final TreeMap<Long, MessageId> pending;
QueueState(long outgoingPosition, long incomingPosition,
private QueueState(long outgoingPosition, long incomingPosition,
TreeMap<Long, MessageId> pending) {
this.outgoingPosition = outgoingPosition;
this.incomingPosition = incomingPosition;
@@ -166,7 +166,7 @@ class MessageQueueManagerImpl implements MessageQueueManager {
private final QueueMessageValidator delegate;
DelegatingMessageValidator(QueueMessageValidator delegate) {
private DelegatingMessageValidator(QueueMessageValidator delegate) {
this.delegate = delegate;
}
@@ -193,8 +193,8 @@ class MessageQueueManagerImpl implements MessageQueueManager {
}
@Override
public boolean incomingMessage(Transaction txn, Message m, Metadata meta)
throws DbException {
public boolean incomingMessage(Transaction txn, Message m,
Metadata meta) throws DbException, InvalidMessageException {
long queuePosition = ByteUtils.readUint64(m.getRaw(),
MESSAGE_HEADER_LENGTH);
QueueState queueState = loadQueueState(txn, m.getGroupId());