Renamed validation hooks to incoming message hooks.

This commit is contained in:
akwizgran
2016-03-07 15:38:56 +00:00
parent 8960644273
commit c9276de399
5 changed files with 42 additions and 39 deletions

View File

@@ -30,14 +30,19 @@ public interface ValidationManager {
} }
} }
/** Sets the message validator for the given client. */ /**
* Sets the message validator for the given client.
*/
void registerMessageValidator(ClientId c, MessageValidator v); void registerMessageValidator(ClientId c, MessageValidator v);
/** Registers a hook to be called whenever a message is validated. */ /**
void registerValidationHook(ValidationHook hook); * Sets the incoming message hook for the given client. The hook will be
* called once for each incoming message that passes validation.
*/
void registerIncomingMessageHook(ClientId c, IncomingMessageHook hook);
interface ValidationHook { interface IncomingMessageHook {
void validatingMessage(Transaction txn, Message m, ClientId c, void incomingMessage(Transaction txn, Message m, Metadata meta)
Metadata meta) throws DbException; throws DbException;
} }
} }

View File

@@ -53,7 +53,8 @@ public class ForumModule extends AbstractModule {
ForumSharingManagerImpl forumSharingManager) { ForumSharingManagerImpl forumSharingManager) {
contactManager.registerAddContactHook(forumSharingManager); contactManager.registerAddContactHook(forumSharingManager);
contactManager.registerRemoveContactHook(forumSharingManager); contactManager.registerRemoveContactHook(forumSharingManager);
validationManager.registerValidationHook(forumSharingManager); validationManager.registerIncomingMessageHook(
ForumSharingManagerImpl.CLIENT_ID, forumSharingManager);
return forumSharingManager; return forumSharingManager;
} }
} }

View File

@@ -24,7 +24,7 @@ import org.briarproject.api.sync.GroupFactory;
import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.Message; import org.briarproject.api.sync.Message;
import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageId;
import org.briarproject.api.sync.ValidationManager.ValidationHook; import org.briarproject.api.sync.ValidationManager.IncomingMessageHook;
import org.briarproject.api.system.Clock; import org.briarproject.api.system.Clock;
import org.briarproject.util.StringUtils; import org.briarproject.util.StringUtils;
@@ -44,7 +44,7 @@ import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH;
import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH;
class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook, class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook,
RemoveContactHook, ValidationHook { RemoveContactHook, IncomingMessageHook {
static final ClientId CLIENT_ID = new ClientId(StringUtils.fromHexString( static final ClientId CLIENT_ID = new ClientId(StringUtils.fromHexString(
"cd11a5d04dccd9e2931d6fc3df456313" "cd11a5d04dccd9e2931d6fc3df456313"
@@ -103,15 +103,13 @@ class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook,
} }
@Override @Override
public void validatingMessage(Transaction txn, Message m, ClientId c, public void incomingMessage(Transaction txn, Message m, Metadata meta)
Metadata meta) throws DbException { throws DbException {
if (c.equals(CLIENT_ID)) { try {
try { ContactId contactId = getContactId(txn, m.getGroupId());
ContactId contactId = getContactId(txn, m.getGroupId()); setForumVisibility(txn, contactId, getVisibleForums(txn, m));
setForumVisibility(txn, contactId, getVisibleForums(txn, m)); } catch (FormatException e) {
} catch (FormatException e) { throw new DbException(e);
throw new DbException(e);
}
} }
} }

View File

@@ -25,11 +25,9 @@ import org.briarproject.api.sync.ValidationManager;
import org.briarproject.util.ByteUtils; import org.briarproject.util.ByteUtils;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -46,7 +44,7 @@ class ValidationManagerImpl implements ValidationManager, Service,
private final Executor dbExecutor; private final Executor dbExecutor;
private final Executor cryptoExecutor; private final Executor cryptoExecutor;
private final Map<ClientId, MessageValidator> validators; private final Map<ClientId, MessageValidator> validators;
private final List<ValidationHook> hooks; private final Map<ClientId, IncomingMessageHook> hooks;
@Inject @Inject
ValidationManagerImpl(DatabaseComponent db, ValidationManagerImpl(DatabaseComponent db,
@@ -56,7 +54,7 @@ class ValidationManagerImpl implements ValidationManager, Service,
this.dbExecutor = dbExecutor; this.dbExecutor = dbExecutor;
this.cryptoExecutor = cryptoExecutor; this.cryptoExecutor = cryptoExecutor;
validators = new ConcurrentHashMap<ClientId, MessageValidator>(); validators = new ConcurrentHashMap<ClientId, MessageValidator>();
hooks = new CopyOnWriteArrayList<ValidationHook>(); hooks = new ConcurrentHashMap<ClientId, IncomingMessageHook>();
} }
@Override @Override
@@ -76,8 +74,8 @@ class ValidationManagerImpl implements ValidationManager, Service,
} }
@Override @Override
public void registerValidationHook(ValidationHook hook) { public void registerIncomingMessageHook(ClientId c, IncomingMessageHook hook) {
hooks.add(hook); hooks.put(c, hook);
} }
private void getMessagesToValidate(final ClientId c) { private void getMessagesToValidate(final ClientId c) {
@@ -170,8 +168,9 @@ class ValidationManagerImpl implements ValidationManager, Service,
db.mergeMessageMetadata(txn, m.getId(), meta); db.mergeMessageMetadata(txn, m.getId(), meta);
db.setMessageValid(txn, m, c, true); db.setMessageValid(txn, m, c, true);
db.setMessageShared(txn, m, true); db.setMessageShared(txn, m, true);
for (ValidationHook hook : hooks) IncomingMessageHook hook = hooks.get(c);
hook.validatingMessage(txn, m, c, meta); if (hook != null)
hook.incomingMessage(txn, m, meta);
} }
txn.setComplete(); txn.setComplete();
} finally { } finally {

View File

@@ -17,7 +17,7 @@ import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.Message; import org.briarproject.api.sync.Message;
import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageId;
import org.briarproject.api.sync.MessageValidator; import org.briarproject.api.sync.MessageValidator;
import org.briarproject.api.sync.ValidationManager.ValidationHook; import org.briarproject.api.sync.ValidationManager.IncomingMessageHook;
import org.briarproject.util.ByteUtils; import org.briarproject.util.ByteUtils;
import org.jmock.Expectations; import org.jmock.Expectations;
import org.jmock.Mockery; import org.jmock.Mockery;
@@ -56,7 +56,7 @@ public class ValidationManagerImplTest extends BriarTestCase {
final Executor dbExecutor = new ImmediateExecutor(); final Executor dbExecutor = new ImmediateExecutor();
final Executor cryptoExecutor = new ImmediateExecutor(); final Executor cryptoExecutor = new ImmediateExecutor();
final MessageValidator validator = context.mock(MessageValidator.class); final MessageValidator validator = context.mock(MessageValidator.class);
final ValidationHook hook = context.mock(ValidationHook.class); final IncomingMessageHook hook = context.mock(IncomingMessageHook.class);
final Transaction txn = new Transaction(null); final Transaction txn = new Transaction(null);
final Transaction txn1 = new Transaction(null); final Transaction txn1 = new Transaction(null);
final Transaction txn2 = new Transaction(null); final Transaction txn2 = new Transaction(null);
@@ -87,7 +87,7 @@ public class ValidationManagerImplTest extends BriarTestCase {
oneOf(db).setMessageValid(txn2, message, clientId, true); oneOf(db).setMessageValid(txn2, message, clientId, true);
oneOf(db).setMessageShared(txn2, message, true); oneOf(db).setMessageShared(txn2, message, true);
// Call the hook for the first message // Call the hook for the first message
oneOf(hook).validatingMessage(txn2, message, clientId, metadata); oneOf(hook).incomingMessage(txn2, message, metadata);
oneOf(db).endTransaction(txn2); oneOf(db).endTransaction(txn2);
// Load the second raw message and group // Load the second raw message and group
oneOf(db).startTransaction(); oneOf(db).startTransaction();
@@ -110,7 +110,7 @@ public class ValidationManagerImplTest extends BriarTestCase {
ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor, ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor,
cryptoExecutor); cryptoExecutor);
vm.registerMessageValidator(clientId, validator); vm.registerMessageValidator(clientId, validator);
vm.registerValidationHook(hook); vm.registerIncomingMessageHook(clientId, hook);
vm.start(); vm.start();
context.assertIsSatisfied(); context.assertIsSatisfied();
@@ -124,7 +124,7 @@ public class ValidationManagerImplTest extends BriarTestCase {
final Executor dbExecutor = new ImmediateExecutor(); final Executor dbExecutor = new ImmediateExecutor();
final Executor cryptoExecutor = new ImmediateExecutor(); final Executor cryptoExecutor = new ImmediateExecutor();
final MessageValidator validator = context.mock(MessageValidator.class); final MessageValidator validator = context.mock(MessageValidator.class);
final ValidationHook hook = context.mock(ValidationHook.class); final IncomingMessageHook hook = context.mock(IncomingMessageHook.class);
final Transaction txn = new Transaction(null); final Transaction txn = new Transaction(null);
final Transaction txn1 = new Transaction(null); final Transaction txn1 = new Transaction(null);
final Transaction txn2 = new Transaction(null); final Transaction txn2 = new Transaction(null);
@@ -163,7 +163,7 @@ public class ValidationManagerImplTest extends BriarTestCase {
ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor, ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor,
cryptoExecutor); cryptoExecutor);
vm.registerMessageValidator(clientId, validator); vm.registerMessageValidator(clientId, validator);
vm.registerValidationHook(hook); vm.registerIncomingMessageHook(clientId, hook);
vm.start(); vm.start();
context.assertIsSatisfied(); context.assertIsSatisfied();
@@ -177,7 +177,7 @@ public class ValidationManagerImplTest extends BriarTestCase {
final Executor dbExecutor = new ImmediateExecutor(); final Executor dbExecutor = new ImmediateExecutor();
final Executor cryptoExecutor = new ImmediateExecutor(); final Executor cryptoExecutor = new ImmediateExecutor();
final MessageValidator validator = context.mock(MessageValidator.class); final MessageValidator validator = context.mock(MessageValidator.class);
final ValidationHook hook = context.mock(ValidationHook.class); final IncomingMessageHook hook = context.mock(IncomingMessageHook.class);
final Transaction txn = new Transaction(null); final Transaction txn = new Transaction(null);
final Transaction txn1 = new Transaction(null); final Transaction txn1 = new Transaction(null);
final Transaction txn2 = new Transaction(null); final Transaction txn2 = new Transaction(null);
@@ -219,7 +219,7 @@ public class ValidationManagerImplTest extends BriarTestCase {
ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor, ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor,
cryptoExecutor); cryptoExecutor);
vm.registerMessageValidator(clientId, validator); vm.registerMessageValidator(clientId, validator);
vm.registerValidationHook(hook); vm.registerIncomingMessageHook(clientId, hook);
vm.start(); vm.start();
context.assertIsSatisfied(); context.assertIsSatisfied();
@@ -232,7 +232,7 @@ public class ValidationManagerImplTest extends BriarTestCase {
final Executor dbExecutor = new ImmediateExecutor(); final Executor dbExecutor = new ImmediateExecutor();
final Executor cryptoExecutor = new ImmediateExecutor(); final Executor cryptoExecutor = new ImmediateExecutor();
final MessageValidator validator = context.mock(MessageValidator.class); final MessageValidator validator = context.mock(MessageValidator.class);
final ValidationHook hook = context.mock(ValidationHook.class); final IncomingMessageHook hook = context.mock(IncomingMessageHook.class);
final Transaction txn = new Transaction(null); final Transaction txn = new Transaction(null);
final Transaction txn1 = new Transaction(null); final Transaction txn1 = new Transaction(null);
context.checking(new Expectations() {{ context.checking(new Expectations() {{
@@ -252,14 +252,14 @@ public class ValidationManagerImplTest extends BriarTestCase {
oneOf(db).setMessageValid(txn1, message, clientId, true); oneOf(db).setMessageValid(txn1, message, clientId, true);
oneOf(db).setMessageShared(txn1, message, true); oneOf(db).setMessageShared(txn1, message, true);
// Call the hook // Call the hook
oneOf(hook).validatingMessage(txn1, message, clientId, metadata); oneOf(hook).incomingMessage(txn1, message, metadata);
oneOf(db).endTransaction(txn1); oneOf(db).endTransaction(txn1);
}}); }});
ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor, ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor,
cryptoExecutor); cryptoExecutor);
vm.registerMessageValidator(clientId, validator); vm.registerMessageValidator(clientId, validator);
vm.registerValidationHook(hook); vm.registerIncomingMessageHook(clientId, hook);
vm.eventOccurred(new MessageAddedEvent(message, contactId)); vm.eventOccurred(new MessageAddedEvent(message, contactId));
context.assertIsSatisfied(); context.assertIsSatisfied();
@@ -272,12 +272,12 @@ public class ValidationManagerImplTest extends BriarTestCase {
final Executor dbExecutor = new ImmediateExecutor(); final Executor dbExecutor = new ImmediateExecutor();
final Executor cryptoExecutor = new ImmediateExecutor(); final Executor cryptoExecutor = new ImmediateExecutor();
final MessageValidator validator = context.mock(MessageValidator.class); final MessageValidator validator = context.mock(MessageValidator.class);
final ValidationHook hook = context.mock(ValidationHook.class); final IncomingMessageHook hook = context.mock(IncomingMessageHook.class);
ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor, ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor,
cryptoExecutor); cryptoExecutor);
vm.registerMessageValidator(clientId, validator); vm.registerMessageValidator(clientId, validator);
vm.registerValidationHook(hook); vm.registerIncomingMessageHook(clientId, hook);
vm.eventOccurred(new MessageAddedEvent(message, null)); vm.eventOccurred(new MessageAddedEvent(message, null));
context.assertIsSatisfied(); context.assertIsSatisfied();