diff --git a/briar-api/src/org/briarproject/api/sync/ValidationManager.java b/briar-api/src/org/briarproject/api/sync/ValidationManager.java index 690bc54e23f9fa110a7721b8e5f6284fad39752f..2342afdbc2afb98802dfd4d4ad04515e38f5d764 100644 --- a/briar-api/src/org/briarproject/api/sync/ValidationManager.java +++ b/briar-api/src/org/briarproject/api/sync/ValidationManager.java @@ -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); - /** 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 { - void validatingMessage(Transaction txn, Message m, ClientId c, - Metadata meta) throws DbException; + interface IncomingMessageHook { + void incomingMessage(Transaction txn, Message m, Metadata meta) + throws DbException; } } diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java index 56c18546f86f56ec10e675d811f45fdee6803e30..19e7ce06f135b2c2917f5a9142c60bafe3bef460 100644 --- a/briar-core/src/org/briarproject/forum/ForumModule.java +++ b/briar-core/src/org/briarproject/forum/ForumModule.java @@ -53,7 +53,8 @@ public class ForumModule extends AbstractModule { ForumSharingManagerImpl forumSharingManager) { contactManager.registerAddContactHook(forumSharingManager); contactManager.registerRemoveContactHook(forumSharingManager); - validationManager.registerValidationHook(forumSharingManager); + validationManager.registerIncomingMessageHook( + ForumSharingManagerImpl.CLIENT_ID, forumSharingManager); return forumSharingManager; } } diff --git a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java index 834cb94ddb8c787baa1882126d68ae14a9c4d7d0..aa083679df926ce7e8e94cd807657998de42cad3 100644 --- a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java +++ b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java @@ -24,7 +24,7 @@ import org.briarproject.api.sync.GroupFactory; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.Message; 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.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; class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook, - RemoveContactHook, ValidationHook { + RemoveContactHook, IncomingMessageHook { static final ClientId CLIENT_ID = new ClientId(StringUtils.fromHexString( "cd11a5d04dccd9e2931d6fc3df456313" @@ -103,15 +103,13 @@ class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook, } @Override - public void validatingMessage(Transaction txn, Message m, ClientId c, - Metadata meta) throws DbException { - if (c.equals(CLIENT_ID)) { - try { - ContactId contactId = getContactId(txn, m.getGroupId()); - setForumVisibility(txn, contactId, getVisibleForums(txn, m)); - } catch (FormatException e) { - throw new DbException(e); - } + public void incomingMessage(Transaction txn, Message m, Metadata meta) + throws DbException { + try { + ContactId contactId = getContactId(txn, m.getGroupId()); + setForumVisibility(txn, contactId, getVisibleForums(txn, m)); + } catch (FormatException e) { + throw new DbException(e); } } diff --git a/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java b/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java index 248602434ef9cadf46cab96105777a4630c13dad..c6196944d5dc5960dc0c5701e6deef4191f0c3a6 100644 --- a/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java +++ b/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java @@ -25,11 +25,9 @@ import org.briarproject.api.sync.ValidationManager; import org.briarproject.util.ByteUtils; import java.util.LinkedList; -import java.util.List; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -46,7 +44,7 @@ class ValidationManagerImpl implements ValidationManager, Service, private final Executor dbExecutor; private final Executor cryptoExecutor; private final Map<ClientId, MessageValidator> validators; - private final List<ValidationHook> hooks; + private final Map<ClientId, IncomingMessageHook> hooks; @Inject ValidationManagerImpl(DatabaseComponent db, @@ -56,7 +54,7 @@ class ValidationManagerImpl implements ValidationManager, Service, this.dbExecutor = dbExecutor; this.cryptoExecutor = cryptoExecutor; validators = new ConcurrentHashMap<ClientId, MessageValidator>(); - hooks = new CopyOnWriteArrayList<ValidationHook>(); + hooks = new ConcurrentHashMap<ClientId, IncomingMessageHook>(); } @Override @@ -76,8 +74,8 @@ class ValidationManagerImpl implements ValidationManager, Service, } @Override - public void registerValidationHook(ValidationHook hook) { - hooks.add(hook); + public void registerIncomingMessageHook(ClientId c, IncomingMessageHook hook) { + hooks.put(c, hook); } private void getMessagesToValidate(final ClientId c) { @@ -170,8 +168,9 @@ class ValidationManagerImpl implements ValidationManager, Service, db.mergeMessageMetadata(txn, m.getId(), meta); db.setMessageValid(txn, m, c, true); db.setMessageShared(txn, m, true); - for (ValidationHook hook : hooks) - hook.validatingMessage(txn, m, c, meta); + IncomingMessageHook hook = hooks.get(c); + if (hook != null) + hook.incomingMessage(txn, m, meta); } txn.setComplete(); } finally { diff --git a/briar-tests/src/org/briarproject/sync/ValidationManagerImplTest.java b/briar-tests/src/org/briarproject/sync/ValidationManagerImplTest.java index b55bacd90694245b784f41b51f083a31c4186516..a3058745e853ba8cdfd0658b95322fb123c0211d 100644 --- a/briar-tests/src/org/briarproject/sync/ValidationManagerImplTest.java +++ b/briar-tests/src/org/briarproject/sync/ValidationManagerImplTest.java @@ -17,7 +17,7 @@ import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.Message; import org.briarproject.api.sync.MessageId; 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.jmock.Expectations; import org.jmock.Mockery; @@ -56,7 +56,7 @@ public class ValidationManagerImplTest extends BriarTestCase { final Executor dbExecutor = new ImmediateExecutor(); final Executor cryptoExecutor = new ImmediateExecutor(); 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 txn1 = 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).setMessageShared(txn2, message, true); // Call the hook for the first message - oneOf(hook).validatingMessage(txn2, message, clientId, metadata); + oneOf(hook).incomingMessage(txn2, message, metadata); oneOf(db).endTransaction(txn2); // Load the second raw message and group oneOf(db).startTransaction(); @@ -110,7 +110,7 @@ public class ValidationManagerImplTest extends BriarTestCase { ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor, cryptoExecutor); vm.registerMessageValidator(clientId, validator); - vm.registerValidationHook(hook); + vm.registerIncomingMessageHook(clientId, hook); vm.start(); context.assertIsSatisfied(); @@ -124,7 +124,7 @@ public class ValidationManagerImplTest extends BriarTestCase { final Executor dbExecutor = new ImmediateExecutor(); final Executor cryptoExecutor = new ImmediateExecutor(); 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 txn1 = new Transaction(null); final Transaction txn2 = new Transaction(null); @@ -163,7 +163,7 @@ public class ValidationManagerImplTest extends BriarTestCase { ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor, cryptoExecutor); vm.registerMessageValidator(clientId, validator); - vm.registerValidationHook(hook); + vm.registerIncomingMessageHook(clientId, hook); vm.start(); context.assertIsSatisfied(); @@ -177,7 +177,7 @@ public class ValidationManagerImplTest extends BriarTestCase { final Executor dbExecutor = new ImmediateExecutor(); final Executor cryptoExecutor = new ImmediateExecutor(); 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 txn1 = new Transaction(null); final Transaction txn2 = new Transaction(null); @@ -219,7 +219,7 @@ public class ValidationManagerImplTest extends BriarTestCase { ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor, cryptoExecutor); vm.registerMessageValidator(clientId, validator); - vm.registerValidationHook(hook); + vm.registerIncomingMessageHook(clientId, hook); vm.start(); context.assertIsSatisfied(); @@ -232,7 +232,7 @@ public class ValidationManagerImplTest extends BriarTestCase { final Executor dbExecutor = new ImmediateExecutor(); final Executor cryptoExecutor = new ImmediateExecutor(); 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 txn1 = new Transaction(null); context.checking(new Expectations() {{ @@ -252,14 +252,14 @@ public class ValidationManagerImplTest extends BriarTestCase { oneOf(db).setMessageValid(txn1, message, clientId, true); oneOf(db).setMessageShared(txn1, message, true); // Call the hook - oneOf(hook).validatingMessage(txn1, message, clientId, metadata); + oneOf(hook).incomingMessage(txn1, message, metadata); oneOf(db).endTransaction(txn1); }}); ValidationManagerImpl vm = new ValidationManagerImpl(db, dbExecutor, cryptoExecutor); vm.registerMessageValidator(clientId, validator); - vm.registerValidationHook(hook); + vm.registerIncomingMessageHook(clientId, hook); vm.eventOccurred(new MessageAddedEvent(message, contactId)); context.assertIsSatisfied(); @@ -272,12 +272,12 @@ public class ValidationManagerImplTest extends BriarTestCase { final Executor dbExecutor = new ImmediateExecutor(); final Executor cryptoExecutor = new ImmediateExecutor(); 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, cryptoExecutor); vm.registerMessageValidator(clientId, validator); - vm.registerValidationHook(hook); + vm.registerIncomingMessageHook(clientId, hook); vm.eventOccurred(new MessageAddedEvent(message, null)); context.assertIsSatisfied();