From 3edfa5d1baaf34159b1b08dd289dd45d79c5d63f Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Thu, 11 Aug 2011 15:55:30 +0100
Subject: [PATCH] Call the listeners when contacts are added and removed.

---
 api/net/sf/briar/api/db/DatabaseListener.java |  1 +
 .../db/ReadWriteLockDatabaseComponent.java    | 23 +++++++++++--------
 .../db/SynchronizedDatabaseComponent.java     | 23 +++++++++++--------
 .../sf/briar/db/DatabaseComponentTest.java    | 18 +++++++--------
 4 files changed, 37 insertions(+), 28 deletions(-)

diff --git a/api/net/sf/briar/api/db/DatabaseListener.java b/api/net/sf/briar/api/db/DatabaseListener.java
index 3d52e8fbbe..85433fd03b 100644
--- a/api/net/sf/briar/api/db/DatabaseListener.java
+++ b/api/net/sf/briar/api/db/DatabaseListener.java
@@ -4,6 +4,7 @@ package net.sf.briar.api.db;
 public interface DatabaseListener {
 
 	static enum Event {
+		CONTACTS_UPDATED,
 		MESSAGES_ADDED,
 		SUBSCRIPTIONS_UPDATED,
 		TRANSPORTS_UPDATED
diff --git a/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java b/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java
index 5c984a207e..2eb0dde388 100644
--- a/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java
+++ b/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java
@@ -12,7 +12,7 @@ import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.Rating;
-import net.sf.briar.api.db.DatabaseListener;
+import net.sf.briar.api.db.DatabaseListener.Event;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.NoSuchContactException;
 import net.sf.briar.api.protocol.Ack;
@@ -106,17 +106,17 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 	public ContactId addContact(Map<String, Map<String, String>> transports,
 			byte[] secret) throws DbException {
 		if(LOG.isLoggable(Level.FINE)) LOG.fine("Adding contact");
+		ContactId c;
 		contactLock.writeLock().lock();
 		try {
 			transportLock.writeLock().lock();
 			try {
 				Txn txn = db.startTransaction();
 				try {
-					ContactId c = db.addContact(txn, transports, secret);
+					c = db.addContact(txn, transports, secret);
 					db.commitTransaction(txn);
 					if(LOG.isLoggable(Level.FINE))
 						LOG.fine("Added contact " + c);
-					return c;
 				} catch(DbException e) {
 					db.abortTransaction(txn);
 					throw e;
@@ -127,6 +127,9 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 		} finally {
 			contactLock.writeLock().unlock();
 		}
+		// Call the listeners outside the lock
+		callListeners(Event.CONTACTS_UPDATED);
+		return c;
 	}
 
 	public void addLocallyGeneratedMessage(Message m) throws DbException {
@@ -167,7 +170,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			contactLock.readLock().unlock();
 		}
 		// Call the listeners outside the lock
-		if(added) callListeners(DatabaseListener.Event.MESSAGES_ADDED);
+		if(added) callListeners(Event.MESSAGES_ADDED);
 	}
 
 	public void findLostBatches(ContactId c) throws DbException {
@@ -781,7 +784,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			contactLock.readLock().unlock();
 		}
 		// Call the listeners outside the lock
-		if(anyAdded) callListeners(DatabaseListener.Event.MESSAGES_ADDED);
+		if(anyAdded) callListeners(Event.MESSAGES_ADDED);
 	}
 
 	public void receiveOffer(ContactId c, Offer o, RequestWriter r)
@@ -913,6 +916,8 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 		} finally {
 			contactLock.writeLock().unlock();
 		}
+		// Call the listeners outside the lock
+		callListeners(Event.CONTACTS_UPDATED);
 	}
 
 	public void setConnectionWindow(ContactId c, int transportId,
@@ -984,7 +989,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			transportLock.writeLock().unlock();
 		}
 		// Call the listeners outside the lock
-		if(changed) callListeners(DatabaseListener.Event.TRANSPORTS_UPDATED);
+		if(changed) callListeners(Event.TRANSPORTS_UPDATED);
 	}
 
 	public void setTransportProperties(String name,
@@ -1008,7 +1013,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			transportLock.writeLock().unlock();
 		}
 		// Call the listeners outside the lock
-		if(changed) callListeners(DatabaseListener.Event.TRANSPORTS_UPDATED);
+		if(changed) callListeners(Event.TRANSPORTS_UPDATED);
 	}
 
 	public void setVisibility(GroupId g, Collection<ContactId> visible)
@@ -1059,7 +1064,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			subscriptionLock.writeLock().unlock();
 		}
 		// Call the listeners outside the lock
-		if(added) callListeners(DatabaseListener.Event.SUBSCRIPTIONS_UPDATED);
+		if(added) callListeners(Event.SUBSCRIPTIONS_UPDATED);
 	}
 
 	public void unsubscribe(GroupId g) throws DbException {
@@ -1097,6 +1102,6 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			contactLock.readLock().unlock();
 		}
 		// Call the listeners outside the lock
-		if(removed) callListeners(DatabaseListener.Event.SUBSCRIPTIONS_UPDATED);
+		if(removed) callListeners(Event.SUBSCRIPTIONS_UPDATED);
 	}
 }
\ No newline at end of file
diff --git a/components/net/sf/briar/db/SynchronizedDatabaseComponent.java b/components/net/sf/briar/db/SynchronizedDatabaseComponent.java
index c5ca968e59..d99f65f4ed 100644
--- a/components/net/sf/briar/db/SynchronizedDatabaseComponent.java
+++ b/components/net/sf/briar/db/SynchronizedDatabaseComponent.java
@@ -11,7 +11,7 @@ import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.Rating;
-import net.sf.briar.api.db.DatabaseListener;
+import net.sf.briar.api.db.DatabaseListener.Event;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.NoSuchContactException;
 import net.sf.briar.api.protocol.Ack;
@@ -89,21 +89,24 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 	public ContactId addContact(Map<String, Map<String, String>> transports,
 			byte[] secret) throws DbException {
 		if(LOG.isLoggable(Level.FINE)) LOG.fine("Adding contact");
+		ContactId c;
 		synchronized(contactLock) {
 			synchronized(transportLock) {
 				Txn txn = db.startTransaction();
 				try {
-					ContactId c = db.addContact(txn, transports, secret);
+					c = db.addContact(txn, transports, secret);
 					db.commitTransaction(txn);
 					if(LOG.isLoggable(Level.FINE))
 						LOG.fine("Added contact " + c);
-					return c;
 				} catch(DbException e) {
 					db.abortTransaction(txn);
 					throw e;
 				}
 			}
 		}
+		// Call the listeners outside the lock
+		callListeners(Event.CONTACTS_UPDATED);
+		return c;
 	}
 
 	public void addLocallyGeneratedMessage(Message m) throws DbException {
@@ -139,7 +142,7 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			}
 		}
 		// Call the listeners outside the lock
-		if(added) callListeners(DatabaseListener.Event.MESSAGES_ADDED);
+		if(added) callListeners(Event.MESSAGES_ADDED);
 	}
 
 	public void findLostBatches(ContactId c) throws DbException {
@@ -597,7 +600,7 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			}
 		}
 		// Call the listeners outside the lock
-		if(anyAdded) callListeners(DatabaseListener.Event.MESSAGES_ADDED);
+		if(anyAdded) callListeners(Event.MESSAGES_ADDED);
 	}
 
 	public void receiveOffer(ContactId c, Offer o, RequestWriter r)
@@ -693,6 +696,8 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 				}
 			}
 		}
+		// Call the listeners outside the lock
+		callListeners(Event.CONTACTS_UPDATED);
 	}
 
 	public void setConnectionWindow(ContactId c, int transportId,
@@ -749,7 +754,7 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			}
 		}
 		// Call the listeners outside the lock
-		if(changed) callListeners(DatabaseListener.Event.TRANSPORTS_UPDATED);
+		if(changed) callListeners(Event.TRANSPORTS_UPDATED);
 	}
 
 	public void setTransportProperties(String name,
@@ -770,7 +775,7 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			}
 		}
 		// Call the listeners outside the lock
-		if(changed) callListeners(DatabaseListener.Event.TRANSPORTS_UPDATED);
+		if(changed) callListeners(Event.TRANSPORTS_UPDATED);
 	}
 
 	public void setVisibility(GroupId g, Collection<ContactId> visible)
@@ -812,7 +817,7 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			}
 		}
 		// Call the listeners outside the lock
-		if(added) callListeners(DatabaseListener.Event.SUBSCRIPTIONS_UPDATED);
+		if(added) callListeners(Event.SUBSCRIPTIONS_UPDATED);
 	}
 
 	public void unsubscribe(GroupId g) throws DbException {
@@ -838,6 +843,6 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 			}
 		}
 		// Call the listeners outside the lock
-		if(removed) callListeners(DatabaseListener.Event.SUBSCRIPTIONS_UPDATED);
+		if(removed) callListeners(Event.SUBSCRIPTIONS_UPDATED);
 	}
 }
diff --git a/test/net/sf/briar/db/DatabaseComponentTest.java b/test/net/sf/briar/db/DatabaseComponentTest.java
index b7c1d33a20..193f4392ea 100644
--- a/test/net/sf/briar/db/DatabaseComponentTest.java
+++ b/test/net/sf/briar/db/DatabaseComponentTest.java
@@ -15,6 +15,7 @@ import net.sf.briar.api.db.DatabaseListener;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.NoSuchContactException;
 import net.sf.briar.api.db.Status;
+import net.sf.briar.api.db.DatabaseListener.Event;
 import net.sf.briar.api.protocol.Ack;
 import net.sf.briar.api.protocol.AuthorId;
 import net.sf.briar.api.protocol.Batch;
@@ -101,6 +102,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 			// addContact(transports)
 			oneOf(database).addContact(txn, transports, secret);
 			will(returnValue(contactId));
+			oneOf(listener).eventOccurred(Event.CONTACTS_UPDATED);
 			// getContacts()
 			oneOf(database).getContacts(txn);
 			will(returnValue(Collections.singletonList(contactId)));
@@ -125,8 +127,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 			oneOf(database).containsSubscription(txn, groupId);
 			will(returnValue(false));
 			oneOf(database).addSubscription(txn, group);
-			oneOf(listener).eventOccurred(
-					DatabaseListener.Event.SUBSCRIPTIONS_UPDATED);
+			oneOf(listener).eventOccurred(Event.SUBSCRIPTIONS_UPDATED);
 			// subscribe(group) again
 			oneOf(group).getId();
 			will(returnValue(groupId));
@@ -139,8 +140,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 			oneOf(database).containsSubscription(txn, groupId);
 			will(returnValue(true));
 			oneOf(database).removeSubscription(txn, groupId);
-			oneOf(listener).eventOccurred(
-					DatabaseListener.Event.SUBSCRIPTIONS_UPDATED);
+			oneOf(listener).eventOccurred(Event.SUBSCRIPTIONS_UPDATED);
 			// unsubscribe(groupId) again
 			oneOf(database).containsSubscription(txn, groupId);
 			will(returnValue(false));
@@ -151,6 +151,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 					connectionWindow);
 			// removeContact(contactId)
 			oneOf(database).removeContact(txn, contactId);
+			oneOf(listener).eventOccurred(Event.CONTACTS_UPDATED);
 			// close()
 			oneOf(cleaner).stopCleaning();
 			oneOf(database).close();
@@ -1124,8 +1125,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 			oneOf(database).setSendability(txn, messageId, 0);
 			oneOf(database).commitTransaction(txn);
 			// The message was added, so the listener should be called
-			oneOf(listener).eventOccurred(
-					DatabaseListener.Event.MESSAGES_ADDED);
+			oneOf(listener).eventOccurred(Event.MESSAGES_ADDED);
 		}});
 		DatabaseComponent db = createDatabaseComponent(database, cleaner);
 
@@ -1180,8 +1180,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 			will(returnValue(Collections.singletonMap("foo", properties)));
 			oneOf(database).setTransportProperties(txn, "foo", properties1);
 			oneOf(database).commitTransaction(txn);
-			oneOf(listener).eventOccurred(
-					DatabaseListener.Event.TRANSPORTS_UPDATED);
+			oneOf(listener).eventOccurred(Event.TRANSPORTS_UPDATED);
 		}});
 		DatabaseComponent db = createDatabaseComponent(database, cleaner);
 
@@ -1234,8 +1233,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 			will(returnValue(config));
 			oneOf(database).setTransportConfig(txn, "foo", config1);
 			oneOf(database).commitTransaction(txn);
-			oneOf(listener).eventOccurred(
-					DatabaseListener.Event.TRANSPORTS_UPDATED);
+			oneOf(listener).eventOccurred(Event.TRANSPORTS_UPDATED);
 		}});
 		DatabaseComponent db = createDatabaseComponent(database, cleaner);
 
-- 
GitLab