diff --git a/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java b/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java index 072268f34e0acb4289cfe40f60a547f638ecf07b..71a5721cf5cf4315460bd8a77d0e150c93d1918e 100644 --- a/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java +++ b/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java @@ -44,9 +44,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Logger; @@ -550,8 +552,6 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, new BdfEntry(KEY_TYPE, COMMENT.getInt()) ); - // TODO this could be optimized by looking up author status once (#625) - Collection<BlogPostHeader> headers = new ArrayList<BlogPostHeader>(); Transaction txn = db.startTransaction(true); try { @@ -564,10 +564,26 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, metadata1.size() + metadata2.size()); metadata.putAll(metadata1); metadata.putAll(metadata2); + // get all authors we need to get the status for + Set<AuthorId> authors = new HashSet<AuthorId>(); + for (Entry<MessageId, BdfDictionary> entry : metadata.entrySet()) { + authors.add(new AuthorId( + entry.getValue().getDictionary(KEY_AUTHOR) + .getRaw(KEY_AUTHOR_ID))); + } + // get statuses for all authors + Map<AuthorId, Status> authorStatuses = + new HashMap<AuthorId, Status>(); + for (AuthorId authorId : authors) { + authorStatuses.put(authorId, + identityManager.getAuthorStatus(txn, authorId)); + } + // get post headers for (Entry<MessageId, BdfDictionary> entry : metadata.entrySet()) { BdfDictionary meta = entry.getValue(); BlogPostHeader h = - getPostHeaderFromMetadata(txn, g, entry.getKey(), meta); + getPostHeaderFromMetadata(txn, g, entry.getKey(), meta, + authorStatuses); headers.add(h); } txn.setComplete(); @@ -611,6 +627,14 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, private BlogPostHeader getPostHeaderFromMetadata(Transaction txn, GroupId groupId, MessageId id, BdfDictionary meta) throws DbException, FormatException { + return getPostHeaderFromMetadata(txn, groupId, id, meta, + Collections.<AuthorId, Status>emptyMap()); + } + + private BlogPostHeader getPostHeaderFromMetadata(Transaction txn, + GroupId groupId, MessageId id, BdfDictionary meta, + Map<AuthorId, Status> authorStatuses) + throws DbException, FormatException { MessageType type = getMessageType(meta); @@ -622,7 +646,12 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, String name = d.getString(KEY_AUTHOR_NAME); byte[] publicKey = d.getRaw(KEY_PUBLIC_KEY); Author author = new Author(authorId, name, publicKey); - Status authorStatus = identityManager.getAuthorStatus(txn, authorId); + Status authorStatus; + if (authorStatuses.containsKey(authorId)) { + authorStatus = authorStatuses.get(authorId); + } else { + authorStatus = identityManager.getAuthorStatus(txn, authorId); + } boolean read = meta.getBoolean(KEY_READ, false); diff --git a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumManagerImpl.java index 09c8b82bd8523324b173346699307458ccb4f8a7..6289e1ec367d39834d7f42fb41f0792d7049abbd 100644 --- a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java +++ b/briar-core/src/org/briarproject/forum/ForumManagerImpl.java @@ -29,9 +29,12 @@ import org.briarproject.util.StringUtils; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import javax.inject.Inject; @@ -192,23 +195,38 @@ class ForumManagerImpl extends BdfIncomingMessageHook implements ForumManager { public Collection<ForumPostHeader> getPostHeaders(GroupId g) throws DbException { - Map<MessageId, BdfDictionary> metadata; - try { - metadata = clientHelper.getMessageMetadataAsDictionary(g); - } catch (FormatException e) { - throw new DbException(e); - } - // Parse the metadata Collection<ForumPostHeader> headers = new ArrayList<ForumPostHeader>(); - for (Entry<MessageId, BdfDictionary> entry : metadata.entrySet()) { - try { + Transaction txn = db.startTransaction(true); + try { + Map<MessageId, BdfDictionary> metadata = + clientHelper.getMessageMetadataAsDictionary(txn, g); + // get all authors we need to get the status for + Set<AuthorId> authors = new HashSet<AuthorId>(); + for (Entry<MessageId, BdfDictionary> entry : metadata.entrySet()) { + BdfDictionary d = + entry.getValue().getDictionary(KEY_AUTHOR, null); + if (d != null) + authors.add(new AuthorId(d.getRaw(KEY_ID))); + } + // get statuses for all authors + Map<AuthorId, Status> statuses = new HashMap<AuthorId, Status>(); + for (AuthorId id : authors) { + statuses.put(id, identityManager.getAuthorStatus(txn, id)); + } + // Parse the metadata + for (Entry<MessageId, BdfDictionary> entry : metadata + .entrySet()) { BdfDictionary meta = entry.getValue(); - headers.add(getForumPostHeader(entry.getKey(), meta)); - } catch (FormatException e) { - throw new DbException(e); + headers.add(getForumPostHeader(txn, entry.getKey(), meta, + statuses)); } + txn.setComplete(); + return headers; + } catch (FormatException e) { + throw new DbException(e); + } finally { + db.endTransaction(txn); } - return headers; } @Override @@ -236,10 +254,17 @@ class ForumManagerImpl extends BdfIncomingMessageHook implements ForumManager { private ForumPostHeader getForumPostHeader(Transaction txn, MessageId id, BdfDictionary meta) throws DbException, FormatException { + return getForumPostHeader(txn, id, meta, + Collections.<AuthorId, Status>emptyMap()); + } + + private ForumPostHeader getForumPostHeader(Transaction txn, MessageId id, + BdfDictionary meta, Map<AuthorId, Status> statuses) + throws DbException, FormatException { long timestamp = meta.getLong(KEY_TIMESTAMP); Author author = null; - Status authorStatus = ANONYMOUS; + Status status = ANONYMOUS; MessageId parentId = null; if (meta.containsKey(KEY_PARENT)) parentId = new MessageId(meta.getRaw(KEY_PARENT)); @@ -249,23 +274,16 @@ class ForumManagerImpl extends BdfIncomingMessageHook implements ForumManager { String name = d1.getString(KEY_NAME); byte[] publicKey = d1.getRaw(KEY_PUBLIC_NAME); author = new Author(authorId, name, publicKey); - if (txn == null) { - authorStatus = identityManager.getAuthorStatus(author.getId()); + if (statuses.containsKey(authorId)) { + status = statuses.get(authorId); } else { - authorStatus = - identityManager.getAuthorStatus(txn, author.getId()); + status = identityManager.getAuthorStatus(txn, author.getId()); } } boolean read = meta.getBoolean(KEY_READ); - return new ForumPostHeader(id, parentId, timestamp, author, - authorStatus, read); - } - - private ForumPostHeader getForumPostHeader(MessageId id, - BdfDictionary meta) throws DbException, FormatException { - - return getForumPostHeader(null, id, meta); + return new ForumPostHeader(id, parentId, timestamp, author, status, + read); } }