diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java index df10ccdf5..df8e0b1e7 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java @@ -129,6 +129,12 @@ public interface PrivateGroupManager { */ Collection getMembers(GroupId g) throws DbException; + /** + * Returns all members of the given private group. + */ + Collection getMembers(Transaction txn, GroupId g) + throws DbException; + /** * Returns true if the given author is a member of the given private group. */ diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java index ad776aa58..f1e7dbe85 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java @@ -408,35 +408,34 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook @Override public Collection getMembers(GroupId g) throws DbException { - Transaction txn = db.startTransaction(true); - try { - Collection members = new ArrayList<>(); - Map authors = getMembers(txn, g); - LocalAuthor la = identityManager.getLocalAuthor(txn); - PrivateGroup privateGroup = getPrivateGroup(txn, g); - for (Entry m : authors.entrySet()) { - Author a = m.getKey(); - AuthorInfo authorInfo = - authorManager.getAuthorInfo(txn, a.getId()); - Status status = authorInfo.getStatus(); - Visibility v = m.getValue(); - ContactId c = null; - if (v != INVISIBLE && - (status == VERIFIED || status == UNVERIFIED)) { - c = contactManager.getContact(txn, a.getId(), la.getId()) - .getId(); - } - boolean isCreator = privateGroup.getCreator().equals(a); - members.add(new GroupMember(a, authorInfo, isCreator, c, v)); - } - db.commitTransaction(txn); - return members; - } finally { - db.endTransaction(txn); - } + return db.transactionWithResult(true, txn -> getMembers(txn, g)); } - private Map getMembers(Transaction txn, GroupId g) + @Override + public Collection getMembers(Transaction txn, GroupId g) + throws DbException { + Collection members = new ArrayList<>(); + Map authors = getMemberAuthors(txn, g); + LocalAuthor la = identityManager.getLocalAuthor(txn); + PrivateGroup privateGroup = getPrivateGroup(txn, g); + for (Entry m : authors.entrySet()) { + Author a = m.getKey(); + AuthorInfo authorInfo = authorManager.getAuthorInfo(txn, a.getId()); + Status status = authorInfo.getStatus(); + Visibility v = m.getValue(); + ContactId c = null; + if (v != INVISIBLE && + (status == VERIFIED || status == UNVERIFIED)) { + c = contactManager.getContact(txn, a.getId(), la.getId()) + .getId(); + } + boolean isCreator = privateGroup.getCreator().equals(a); + members.add(new GroupMember(a, authorInfo, isCreator, c, v)); + } + return members; + } + + private Map getMemberAuthors(Transaction txn, GroupId g) throws DbException { try { BdfDictionary meta = @@ -458,7 +457,7 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook @Override public boolean isMember(Transaction txn, GroupId g, Author a) throws DbException { - for (Author member : getMembers(txn, g).keySet()) { + for (Author member : getMemberAuthors(txn, g).keySet()) { if (member.equals(a)) return true; } return false;