Contact manager hooks. #209

This commit is contained in:
akwizgran
2016-01-19 19:16:35 +00:00
parent 33ef09a6bf
commit 82cf12040f
29 changed files with 333 additions and 195 deletions

View File

@@ -7,38 +7,115 @@ import org.briarproject.api.contact.ContactId;
import org.briarproject.api.contact.ContactManager;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException;
import org.briarproject.api.db.NoSuchContactException;
import org.briarproject.api.event.ContactAddedEvent;
import org.briarproject.api.event.ContactRemovedEvent;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.identity.Author;
import org.briarproject.api.identity.AuthorId;
import org.briarproject.api.lifecycle.Service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
class ContactManagerImpl implements ContactManager {
import static java.util.logging.Level.WARNING;
import static org.briarproject.api.contact.Contact.Status.ACTIVE;
import static org.briarproject.api.contact.Contact.Status.ADDING;
import static org.briarproject.api.contact.Contact.Status.REMOVING;
class ContactManagerImpl implements ContactManager, Service {
private static final Logger LOG =
Logger.getLogger(ContactManagerImpl.class.getName());
private final DatabaseComponent db;
private final EventBus eventBus;
private final List<ContactAddedHook> addHooks;
private final List<ContactRemovedHook> removeHooks;
@Inject
ContactManagerImpl(DatabaseComponent db) {
ContactManagerImpl(DatabaseComponent db, EventBus eventBus) {
this.db = db;
this.eventBus = eventBus;
addHooks = new CopyOnWriteArrayList<ContactAddedHook>();
removeHooks = new CopyOnWriteArrayList<ContactRemovedHook>();
}
@Override
public boolean start() {
// Finish adding/removing any partly added/removed contacts
try {
for (Contact c : db.getContacts()) {
if (c.getStatus().equals(ADDING)) {
for (ContactAddedHook hook : addHooks)
hook.contactAdded(c.getId());
db.setContactStatus(c.getId(), ACTIVE);
eventBus.broadcast(new ContactAddedEvent(c.getId()));
} else if (c.getStatus().equals(REMOVING)) {
for (ContactRemovedHook hook : removeHooks)
hook.contactRemoved(c.getId());
db.removeContact(c.getId());
eventBus.broadcast(new ContactRemovedEvent(c.getId()));
}
}
return true;
} catch (DbException e) {
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
return false;
}
}
@Override
public boolean stop() {
return true;
}
@Override
public void registerContactAddedHook(ContactAddedHook hook) {
addHooks.add(hook);
}
@Override
public void registerContactRemovedHook(ContactRemovedHook hook) {
removeHooks.add(hook);
}
@Override
public ContactId addContact(Author remote, AuthorId local)
throws DbException {
return db.addContact(remote, local);
ContactId c = db.addContact(remote, local);
for (ContactAddedHook hook : addHooks) hook.contactAdded(c);
db.setContactStatus(c, ACTIVE);
eventBus.broadcast(new ContactAddedEvent(c));
return c;
}
@Override
public Contact getContact(ContactId c) throws DbException {
return db.getContact(c);
Contact contact = db.getContact(c);
if (contact.getStatus().equals(ACTIVE)) return contact;
throw new NoSuchContactException();
}
@Override
public Collection<Contact> getContacts() throws DbException {
return db.getContacts();
Collection<Contact> contacts = db.getContacts();
// Filter out any contacts that are being added or removed
List<Contact> active = new ArrayList<Contact>(contacts.size());
for (Contact c : contacts)
if (c.getStatus().equals(ACTIVE)) active.add(c);
return Collections.unmodifiableList(active);
}
@Override
public void removeContact(ContactId c) throws DbException {
db.setContactStatus(c, REMOVING);
for (ContactRemovedHook hook : removeHooks) hook.contactRemoved(c);
db.removeContact(c);
eventBus.broadcast(new ContactRemovedEvent(c));
}
}

View File

@@ -1,13 +1,22 @@
package org.briarproject.contact;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import org.briarproject.api.contact.ContactManager;
import org.briarproject.api.lifecycle.LifecycleManager;
import javax.inject.Singleton;
public class ContactModule extends AbstractModule {
@Override
protected void configure() {
bind(ContactManager.class).to(ContactManagerImpl.class);
protected void configure() {}
@Provides @Singleton
ContactManager getContactManager(LifecycleManager lifecycleManager,
ContactManagerImpl contactManager) {
lifecycleManager.register(contactManager);
return contactManager;
}
}