Include author and rating in private message headers.

This commit is contained in:
akwizgran
2013-04-14 21:15:23 +01:00
parent 4ff2b88955
commit da7657ff4d
15 changed files with 969 additions and 901 deletions

View File

@@ -118,7 +118,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
serviceConnection.waitForStartup(); serviceConnection.waitForStartup();
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
Collection<GroupMessageHeader> headers = Collection<GroupMessageHeader> headers =
db.getMessageHeaders(groupId); db.getGroupMessageHeaders(groupId);
long duration = System.currentTimeMillis() - now; long duration = System.currentTimeMillis() - now;
if(LOG.isLoggable(INFO)) if(LOG.isLoggable(INFO))
LOG.info("Load took " + duration + " ms"); LOG.info("Load took " + duration + " ms");

View File

@@ -129,7 +129,7 @@ implements OnClickListener, DatabaseListener, NoBlogsDialog.Listener {
boolean postable = local.contains(g.getId()); boolean postable = local.contains(g.getId());
try { try {
Collection<GroupMessageHeader> headers = Collection<GroupMessageHeader> headers =
db.getMessageHeaders(g.getId()); db.getGroupMessageHeaders(g.getId());
displayHeaders(g, postable, headers); displayHeaders(g, postable, headers);
} catch(NoSuchSubscriptionException e) { } catch(NoSuchSubscriptionException e) {
if(LOG.isLoggable(INFO)) if(LOG.isLoggable(INFO))
@@ -256,7 +256,7 @@ implements OnClickListener, DatabaseListener, NoBlogsDialog.Listener {
serviceConnection.waitForStartup(); serviceConnection.waitForStartup();
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
Collection<GroupMessageHeader> headers = Collection<GroupMessageHeader> headers =
db.getMessageHeaders(g.getId()); db.getGroupMessageHeaders(g.getId());
boolean postable = db.getLocalGroups().contains(g); boolean postable = db.getLocalGroups().contains(g);
long duration = System.currentTimeMillis() - now; long duration = System.currentTimeMillis() - now;
if(LOG.isLoggable(INFO)) if(LOG.isLoggable(INFO))

View File

@@ -116,7 +116,7 @@ OnClickListener, OnItemClickListener {
serviceConnection.waitForStartup(); serviceConnection.waitForStartup();
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
Collection<GroupMessageHeader> headers = Collection<GroupMessageHeader> headers =
db.getMessageHeaders(groupId); db.getGroupMessageHeaders(groupId);
long duration = System.currentTimeMillis() - now; long duration = System.currentTimeMillis() - now;
if(LOG.isLoggable(INFO)) if(LOG.isLoggable(INFO))
LOG.info("Load took " + duration + " ms"); LOG.info("Load took " + duration + " ms");

View File

@@ -124,7 +124,7 @@ implements OnClickListener, DatabaseListener, NoGroupsDialog.Listener {
if(g.isRestricted()) continue; if(g.isRestricted()) continue;
try { try {
Collection<GroupMessageHeader> headers = Collection<GroupMessageHeader> headers =
db.getMessageHeaders(g.getId()); db.getGroupMessageHeaders(g.getId());
displayHeaders(g, headers); displayHeaders(g, headers);
} catch(NoSuchSubscriptionException e) { } catch(NoSuchSubscriptionException e) {
if(LOG.isLoggable(INFO)) if(LOG.isLoggable(INFO))
@@ -244,7 +244,7 @@ implements OnClickListener, DatabaseListener, NoGroupsDialog.Listener {
serviceConnection.waitForStartup(); serviceConnection.waitForStartup();
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
Collection<GroupMessageHeader> headers = Collection<GroupMessageHeader> headers =
db.getMessageHeaders(g.getId()); db.getGroupMessageHeaders(g.getId());
long duration = System.currentTimeMillis() - now; long duration = System.currentTimeMillis() - now;
if(LOG.isLoggable(INFO)) if(LOG.isLoggable(INFO))
LOG.info("Partial load took " + duration + " ms"); LOG.info("Partial load took " + duration + " ms");

View File

@@ -19,7 +19,6 @@ import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.api.AuthorId; import net.sf.briar.api.AuthorId;
import net.sf.briar.api.ContactId; import net.sf.briar.api.ContactId;
import net.sf.briar.api.LocalAuthor;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
@@ -60,7 +59,6 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
@Inject @DatabaseUiExecutor private volatile Executor dbUiExecutor; @Inject @DatabaseUiExecutor private volatile Executor dbUiExecutor;
private volatile ContactId contactId = null; private volatile ContactId contactId = null;
private volatile AuthorId localAuthorId = null; private volatile AuthorId localAuthorId = null;
private volatile String localAuthorName = null;
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
@@ -82,7 +80,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
layout.setOrientation(VERTICAL); layout.setOrientation(VERTICAL);
layout.setGravity(CENTER_HORIZONTAL); layout.setGravity(CENTER_HORIZONTAL);
adapter = new ConversationAdapter(this, contactName); adapter = new ConversationAdapter(this);
list = new ListView(this); list = new ListView(this);
// Give me all the width and all the unused height // Give me all the width and all the unused height
list.setLayoutParams(MATCH_WRAP_1); list.setLayoutParams(MATCH_WRAP_1);
@@ -118,14 +116,12 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
try { try {
serviceConnection.waitForStartup(); serviceConnection.waitForStartup();
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
LocalAuthor localAuthor = db.getLocalAuthor(localAuthorId);
localAuthorName = localAuthor.getName();
Collection<PrivateMessageHeader> headers = Collection<PrivateMessageHeader> headers =
db.getPrivateMessageHeaders(contactId); db.getPrivateMessageHeaders(contactId);
long duration = System.currentTimeMillis() - now; long duration = System.currentTimeMillis() - now;
if(LOG.isLoggable(INFO)) if(LOG.isLoggable(INFO))
LOG.info("Load took " + duration + " ms"); LOG.info("Load took " + duration + " ms");
displayHeaders(localAuthor, headers); displayHeaders(headers);
} catch(NoSuchContactException e) { } catch(NoSuchContactException e) {
if(LOG.isLoggable(INFO)) LOG.info("Contact removed"); if(LOG.isLoggable(INFO)) LOG.info("Contact removed");
finishOnUiThread(); finishOnUiThread();
@@ -141,11 +137,10 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
}); });
} }
private void displayHeaders(final LocalAuthor localAuthor, private void displayHeaders(
final Collection<PrivateMessageHeader> headers) { final Collection<PrivateMessageHeader> headers) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
adapter.setLocalAuthorName(localAuthor.getName());
adapter.clear(); adapter.clear();
for(PrivateMessageHeader h : headers) adapter.add(h); for(PrivateMessageHeader h : headers) adapter.add(h);
adapter.sort(AscendingHeaderComparator.INSTANCE); adapter.sort(AscendingHeaderComparator.INSTANCE);
@@ -228,7 +223,6 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
Intent i = new Intent(this, ReadPrivateMessageActivity.class); Intent i = new Intent(this, ReadPrivateMessageActivity.class);
i.putExtra("net.sf.briar.CONTACT_ID", contactId.getInt()); i.putExtra("net.sf.briar.CONTACT_ID", contactId.getInt());
i.putExtra("net.sf.briar.CONTACT_NAME", contactName); i.putExtra("net.sf.briar.CONTACT_NAME", contactName);
i.putExtra("net.sf.briar.LOCAL_AUTHOR_NAME", localAuthorName);
i.putExtra("net.sf.briar.MESSAGE_ID", item.getId().getBytes()); i.putExtra("net.sf.briar.MESSAGE_ID", item.getId().getBytes());
i.putExtra("net.sf.briar.CONTENT_TYPE", item.getContentType()); i.putExtra("net.sf.briar.CONTENT_TYPE", item.getContentType());
i.putExtra("net.sf.briar.TIMESTAMP", item.getTimestamp()); i.putExtra("net.sf.briar.TIMESTAMP", item.getTimestamp());

View File

@@ -23,23 +23,13 @@ import android.widget.TextView;
class ConversationAdapter extends ArrayAdapter<PrivateMessageHeader> { class ConversationAdapter extends ArrayAdapter<PrivateMessageHeader> {
private final String contactName; ConversationAdapter(Context ctx) {
private String localAuthorName = null;
ConversationAdapter(Context ctx, String contactName) {
super(ctx, android.R.layout.simple_expandable_list_item_1, super(ctx, android.R.layout.simple_expandable_list_item_1,
new ArrayList<PrivateMessageHeader>()); new ArrayList<PrivateMessageHeader>());
this.contactName = contactName;
}
void setLocalAuthorName(String localAuthorName) {
this.localAuthorName = localAuthorName;
} }
@Override @Override
public View getView(int position, View convertView, ViewGroup parent) { public View getView(int position, View convertView, ViewGroup parent) {
if(localAuthorName == null) throw new IllegalStateException();
PrivateMessageHeader item = getItem(position); PrivateMessageHeader item = getItem(position);
Context ctx = getContext(); Context ctx = getContext();
@@ -59,8 +49,7 @@ class ConversationAdapter extends ArrayAdapter<PrivateMessageHeader> {
name.setTextSize(18); name.setTextSize(18);
name.setMaxLines(1); name.setMaxLines(1);
name.setPadding(10, 10, 10, 10); name.setPadding(10, 10, 10, 10);
if(item.isIncoming()) name.setText(contactName); name.setText(item.getAuthor().getName());
else name.setText(localAuthorName);
innerLayout.addView(name); innerLayout.addView(name);
if(item.getContentType().equals("text/plain")) { if(item.getContentType().equals("text/plain")) {

View File

@@ -180,6 +180,10 @@ public interface DatabaseComponent {
/** Returns the group with the given ID, if the user subscribes to it. */ /** Returns the group with the given ID, if the user subscribes to it. */
Group getGroup(GroupId g) throws DbException; Group getGroup(GroupId g) throws DbException;
/** Returns the headers of all messages in the given group. */
Collection<GroupMessageHeader> getGroupMessageHeaders(GroupId g)
throws DbException;
/** Returns the pseudonym with the given ID. */ /** Returns the pseudonym with the given ID. */
LocalAuthor getLocalAuthor(AuthorId a) throws DbException; LocalAuthor getLocalAuthor(AuthorId a) throws DbException;
@@ -199,10 +203,6 @@ public interface DatabaseComponent {
/** Returns the body of the message with the given ID. */ /** Returns the body of the message with the given ID. */
byte[] getMessageBody(MessageId m) throws DbException; byte[] getMessageBody(MessageId m) throws DbException;
/** Returns the headers of all messages in the given group. */
Collection<GroupMessageHeader> getMessageHeaders(GroupId g)
throws DbException;
/** /**
* Returns the headers of all private messages to or from the given * Returns the headers of all private messages to or from the given
* contact. * contact.

View File

@@ -8,35 +8,17 @@ import net.sf.briar.api.messaging.Rating;
public class GroupMessageHeader extends MessageHeader { public class GroupMessageHeader extends MessageHeader {
private final GroupId groupId; private final GroupId groupId;
private final Author author;
private final Rating rating;
public GroupMessageHeader(MessageId id, MessageId parent, public GroupMessageHeader(MessageId id, MessageId parent, Author author,
String contentType, String subject, long timestamp, boolean read, String contentType, String subject, long timestamp, boolean read,
boolean starred, GroupId groupId, Author author, Rating rating) { boolean starred, Rating rating, GroupId groupId) {
super(id, parent, contentType, subject, timestamp, read, starred); super(id, parent, author, contentType, subject, timestamp, read,
starred, rating);
this.groupId = groupId; this.groupId = groupId;
this.author = author;
this.rating = rating;
} }
/** Returns the ID of the group to which the message belongs. */ /** Returns the ID of the group to which the message belongs. */
public GroupId getGroupId() { public GroupId getGroupId() {
return groupId; return groupId;
} }
/**
* Returns the message's author, or null if this is an anonymous message.
*/
public Author getAuthor() {
return author;
}
/**
* Returns the rating for the message's author, or Rating.UNRATED if this
* is an anonymous message.
*/
public Rating getRating() {
return rating;
}
} }

View File

@@ -1,23 +1,30 @@
package net.sf.briar.api.db; package net.sf.briar.api.db;
import net.sf.briar.api.Author;
import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.MessageId;
import net.sf.briar.api.messaging.Rating;
public abstract class MessageHeader { public abstract class MessageHeader {
private final MessageId id, parent; private final MessageId id, parent;
private final Author author;
private final String contentType, subject; private final String contentType, subject;
private final long timestamp; private final long timestamp;
private final boolean read, starred; private final boolean read, starred;
private final Rating rating;
protected MessageHeader(MessageId id, MessageId parent, String contentType, protected MessageHeader(MessageId id, MessageId parent, Author author,
String subject, long timestamp, boolean read, boolean starred) { String contentType, String subject, long timestamp, boolean read,
boolean starred, Rating rating) {
this.id = id; this.id = id;
this.parent = parent; this.parent = parent;
this.author = author;
this.contentType = contentType; this.contentType = contentType;
this.subject = subject; this.subject = subject;
this.timestamp = timestamp; this.timestamp = timestamp;
this.read = read; this.read = read;
this.starred = starred; this.starred = starred;
this.rating = rating;
} }
/** Returns the message's unique identifier. */ /** Returns the message's unique identifier. */
@@ -33,6 +40,13 @@ public abstract class MessageHeader {
return parent; return parent;
} }
/**
* Returns the message's author, or null if this is an anonymous message.
*/
public Author getAuthor() {
return author;
}
/** Returns the message's content type. */ /** Returns the message's content type. */
public String getContentType() { public String getContentType() {
return contentType; return contentType;
@@ -57,4 +71,12 @@ public abstract class MessageHeader {
public boolean isStarred() { public boolean isStarred() {
return starred; return starred;
} }
/**
* Returns the rating for the message's author, or Rating.UNRATED if this
* is an anonymous message.
*/
public Rating getRating() {
return rating;
}
} }

View File

@@ -1,17 +1,21 @@
package net.sf.briar.api.db; package net.sf.briar.api.db;
import net.sf.briar.api.Author;
import net.sf.briar.api.ContactId; import net.sf.briar.api.ContactId;
import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.MessageId;
import net.sf.briar.api.messaging.Rating;
public class PrivateMessageHeader extends MessageHeader { public class PrivateMessageHeader extends MessageHeader {
private final ContactId contactId; private final ContactId contactId;
private final boolean incoming; private final boolean incoming;
public PrivateMessageHeader(MessageId id, MessageId parent, public PrivateMessageHeader(MessageId id, MessageId parent, Author author,
String contentType, String subject, long timestamp, boolean read, String contentType, String subject, long timestamp, boolean read,
boolean starred, ContactId contactId, boolean incoming) { boolean starred, Rating rating, ContactId contactId,
super(id, parent, contentType, subject, timestamp, read, starred); boolean incoming) {
super(id, parent, author, contentType, subject, timestamp, read,
starred, rating);
this.contactId = contactId; this.contactId = contactId;
this.incoming = incoming; this.incoming = incoming;
} }

View File

@@ -101,7 +101,8 @@ interface Database<T> {
* <p> * <p>
* Locking: message write. * Locking: message write.
*/ */
boolean addGroupMessage(T txn, Message m) throws DbException; boolean addGroupMessage(T txn, Message m, boolean incoming)
throws DbException;
/** /**
* Stores a pseudonym that the user can use to sign messages. * Stores a pseudonym that the user can use to sign messages.
@@ -131,7 +132,8 @@ interface Database<T> {
* <p> * <p>
* Locking: message write. * Locking: message write.
*/ */
boolean addPrivateMessage(T txn, Message m, ContactId c) throws DbException; boolean addPrivateMessage(T txn, Message m, ContactId c, boolean incoming)
throws DbException;
/** /**
* Stores the given temporary secrets and deletes any secrets that have * Stores the given temporary secrets and deletes any secrets that have
@@ -272,6 +274,14 @@ interface Database<T> {
*/ */
Group getGroup(T txn, GroupId g) throws DbException; Group getGroup(T txn, GroupId g) throws DbException;
/**
* Returns the headers of all messages in the given group.
* <p>
* Locking: message read, rating read.
*/
Collection<GroupMessageHeader> getGroupMessageHeaders(T txn, GroupId g)
throws DbException;
/** /**
* Returns the parent of the given group message, or null if either the * Returns the parent of the given group message, or null if either the
* message has no parent, or the parent is absent from the database, or the * message has no parent, or the parent is absent from the database, or the
@@ -333,19 +343,11 @@ interface Database<T> {
*/ */
byte[] getMessageBody(T txn, MessageId m) throws DbException; byte[] getMessageBody(T txn, MessageId m) throws DbException;
/**
* Returns the headers of all messages in the given group.
* <p>
* Locking: message read, rating read.
*/
Collection<GroupMessageHeader> getMessageHeaders(T txn, GroupId g)
throws DbException;
/** /**
* Returns the headers of all private messages to or from the given * Returns the headers of all private messages to or from the given
* contact. * contact.
* <p> * <p>
* Locking: message read. * Locking: contact read, identity read, message read, rating read.
*/ */
Collection<PrivateMessageHeader> getPrivateMessageHeaders(T txn, Collection<PrivateMessageHeader> getPrivateMessageHeaders(T txn,
ContactId c) throws DbException; ContactId c) throws DbException;

File diff suppressed because it is too large Load Diff

View File

@@ -161,6 +161,7 @@ abstract class JdbcDatabase implements Database<Connection> {
+ " bodyStart INT NOT NULL," + " bodyStart INT NOT NULL,"
+ " bodyLength INT NOT NULL," + " bodyLength INT NOT NULL,"
+ " raw BLOB NOT NULL," + " raw BLOB NOT NULL,"
+ " incoming BOOLEAN NOT NULL,"
+ " sendability INT UNSIGNED," // Null for private messages + " sendability INT UNSIGNED," // Null for private messages
+ " contactId INT UNSIGNED," // Null for group messages + " contactId INT UNSIGNED," // Null for group messages
+ " read BOOLEAN NOT NULL," + " read BOOLEAN NOT NULL,"
@@ -685,7 +686,7 @@ abstract class JdbcDatabase implements Database<Connection> {
} }
} }
public boolean addGroupMessage(Connection txn, Message m) public boolean addGroupMessage(Connection txn, Message m, boolean incoming)
throws DbException { throws DbException {
if(m.getGroup() == null) throw new IllegalArgumentException(); if(m.getGroup() == null) throw new IllegalArgumentException();
if(containsMessage(txn, m.getId())) return false; if(containsMessage(txn, m.getId())) return false;
@@ -694,9 +695,9 @@ abstract class JdbcDatabase implements Database<Connection> {
String sql = "INSERT INTO messages (messageId, parentId, groupId," String sql = "INSERT INTO messages (messageId, parentId, groupId,"
+ " authorId, authorName, authorKey, contentType, subject," + " authorId, authorName, authorKey, contentType, subject,"
+ " timestamp, length, bodyStart, bodyLength, raw," + " timestamp, length, bodyStart, bodyLength, raw,"
+ " sendability, read, starred)" + " incoming, sendability, read, starred)"
+ " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ZERO()," + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,"
+ " FALSE, FALSE)"; + " ZERO(), FALSE, FALSE)";
ps = txn.prepareStatement(sql); ps = txn.prepareStatement(sql);
ps.setBytes(1, m.getId().getBytes()); ps.setBytes(1, m.getId().getBytes());
if(m.getParent() == null) ps.setNull(2, BINARY); if(m.getParent() == null) ps.setNull(2, BINARY);
@@ -720,6 +721,7 @@ abstract class JdbcDatabase implements Database<Connection> {
ps.setInt(11, m.getBodyStart()); ps.setInt(11, m.getBodyStart());
ps.setInt(12, m.getBodyLength()); ps.setInt(12, m.getBodyLength());
ps.setBytes(13, raw); ps.setBytes(13, raw);
ps.setBoolean(14, incoming);
int affected = ps.executeUpdate(); int affected = ps.executeUpdate();
if(affected != 1) throw new DbStateException(); if(affected != 1) throw new DbStateException();
ps.close(); ps.close();
@@ -803,16 +805,17 @@ abstract class JdbcDatabase implements Database<Connection> {
} }
} }
public boolean addPrivateMessage(Connection txn, Message m, ContactId c) public boolean addPrivateMessage(Connection txn, Message m, ContactId c,
throws DbException { boolean incoming) throws DbException {
if(m.getGroup() != null) throw new IllegalArgumentException(); if(m.getGroup() != null) throw new IllegalArgumentException();
if(m.getAuthor() != null) throw new IllegalArgumentException();
if(containsMessage(txn, m.getId())) return false; if(containsMessage(txn, m.getId())) return false;
PreparedStatement ps = null; PreparedStatement ps = null;
try { try {
String sql = "INSERT INTO messages (messageId, parentId," String sql = "INSERT INTO messages (messageId, parentId,"
+ " contentType, subject, timestamp, length, bodyStart," + " contentType, subject, timestamp, length, bodyStart,"
+ " bodyLength, raw, contactId, read, starred)" + " bodyLength, raw, incoming, contactId, read, starred)"
+ " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, FALSE, FALSE)"; + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, FALSE, FALSE)";
ps = txn.prepareStatement(sql); ps = txn.prepareStatement(sql);
ps.setBytes(1, m.getId().getBytes()); ps.setBytes(1, m.getId().getBytes());
if(m.getParent() == null) ps.setNull(2, BINARY); if(m.getParent() == null) ps.setNull(2, BINARY);
@@ -825,7 +828,8 @@ abstract class JdbcDatabase implements Database<Connection> {
ps.setInt(7, m.getBodyStart()); ps.setInt(7, m.getBodyStart());
ps.setInt(8, m.getBodyLength()); ps.setInt(8, m.getBodyLength());
ps.setBytes(9, raw); ps.setBytes(9, raw);
ps.setInt(10, c.getInt()); ps.setBoolean(10, incoming);
ps.setInt(11, c.getInt());
int affected = ps.executeUpdate(); int affected = ps.executeUpdate();
if(affected != 1) throw new DbStateException(); if(affected != 1) throw new DbStateException();
ps.close(); ps.close();
@@ -1333,6 +1337,60 @@ abstract class JdbcDatabase implements Database<Connection> {
} }
} }
public Collection<GroupMessageHeader> getGroupMessageHeaders(Connection txn,
GroupId g) throws DbException {
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "SELECT messageId, parentId, m.authorId, authorName,"
+ " authorKey, rating, contentType, subject, timestamp,"
+ " read, starred"
+ " FROM messages AS m"
+ " LEFT OUTER JOIN ratings AS r"
+ " ON m.authorId = r.authorId"
+ " WHERE groupId = ?";
ps = txn.prepareStatement(sql);
ps.setBytes(1, g.getBytes());
rs = ps.executeQuery();
List<GroupMessageHeader> headers =
new ArrayList<GroupMessageHeader>();
while(rs.next()) {
MessageId id = new MessageId(rs.getBytes(1));
byte[] b = rs.getBytes(2);
MessageId parent = b == null ? null : new MessageId(b);
Author author;
Rating rating;
b = rs.getBytes(3);
if(b == null) {
author = null;
rating = UNRATED;
} else {
AuthorId authorId = new AuthorId(b);
String authorName = rs.getString(4);
byte[] authorKey = rs.getBytes(5);
author = new Author(authorId, authorName, authorKey);
// NULL == 0 == UNRATED
rating = Rating.values()[rs.getByte(6)];
}
String contentType = rs.getString(7);
String subject = rs.getString(8);
long timestamp = rs.getLong(9);
boolean read = rs.getBoolean(10);
boolean starred = rs.getBoolean(11);
headers.add(new GroupMessageHeader(id, parent, author,
contentType, subject, timestamp, read, starred, rating,
g));
}
rs.close();
ps.close();
return Collections.unmodifiableList(headers);
} catch(SQLException e) {
tryToClose(rs);
tryToClose(ps);
throw new DbException(e);
}
}
public MessageId getGroupMessageParent(Connection txn, MessageId m) public MessageId getGroupMessageParent(Connection txn, MessageId m)
throws DbException { throws DbException {
PreparedStatement ps = null; PreparedStatement ps = null;
@@ -1546,59 +1604,6 @@ abstract class JdbcDatabase implements Database<Connection> {
} }
} }
public Collection<GroupMessageHeader> getMessageHeaders(Connection txn,
GroupId g) throws DbException {
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "SELECT messageId, parentId, m.authorId, authorName,"
+ " authorKey, rating, contentType, subject, timestamp,"
+ " read, starred"
+ " FROM messages AS m"
+ " LEFT OUTER JOIN ratings AS r"
+ " ON m.authorId = r.authorId"
+ " WHERE groupId = ?";
ps = txn.prepareStatement(sql);
ps.setBytes(1, g.getBytes());
rs = ps.executeQuery();
List<GroupMessageHeader> headers =
new ArrayList<GroupMessageHeader>();
while(rs.next()) {
MessageId id = new MessageId(rs.getBytes(1));
byte[] b = rs.getBytes(2);
MessageId parent = b == null ? null : new MessageId(b);
Author author;
Rating rating;
b = rs.getBytes(3);
if(b == null) {
author = null;
rating = UNRATED;
} else {
AuthorId authorId = new AuthorId(b);
String authorName = rs.getString(4);
byte[] authorKey = rs.getBytes(5);
author = new Author(authorId, authorName, authorKey);
// NULL == 0 == UNRATED
rating = Rating.values()[rs.getByte(6)];
}
String contentType = rs.getString(7);
String subject = rs.getString(8);
long timestamp = rs.getLong(9);
boolean read = rs.getBoolean(10);
boolean starred = rs.getBoolean(11);
headers.add(new GroupMessageHeader(id, parent, contentType,
subject, timestamp, read, starred, g, author, rating));
}
rs.close();
ps.close();
return Collections.unmodifiableList(headers);
} catch(SQLException e) {
tryToClose(rs);
tryToClose(ps);
throw new DbException(e);
}
}
public Collection<MessageId> getMessagesByAuthor(Connection txn, AuthorId a) public Collection<MessageId> getMessagesByAuthor(Connection txn, AuthorId a)
throws DbException { throws DbException {
PreparedStatement ps = null; PreparedStatement ps = null;
@@ -1767,13 +1772,18 @@ abstract class JdbcDatabase implements Database<Connection> {
PreparedStatement ps = null; PreparedStatement ps = null;
ResultSet rs = null; ResultSet rs = null;
try { try {
// Get the incoming message headers
String sql = "SELECT m.messageId, parentId, contentType, subject," String sql = "SELECT m.messageId, parentId, contentType, subject,"
+ " timestamp, read, starred, seen" + " timestamp, read, starred, c.authorId, name, publicKey,"
+ " rating"
+ " FROM messages AS m" + " FROM messages AS m"
+ " JOIN statuses AS s" + " JOIN contacts AS c"
+ " ON m.messageId = s.messageId" + " ON m.contactId = c.contactId"
+ " AND m.contactId = s.contactId" + " LEFT OUTER JOIN ratings AS r"
+ " WHERE m.contactId = ? AND groupId IS NULL"; + " ON c.authorId = r.authorId"
+ " WHERE m.contactId = ?"
+ " AND groupId IS NULL"
+ " AND incoming = TRUE";
ps = txn.prepareStatement(sql); ps = txn.prepareStatement(sql);
ps.setInt(1, c.getInt()); ps.setInt(1, c.getInt());
rs = ps.executeQuery(); rs = ps.executeQuery();
@@ -1788,9 +1798,53 @@ abstract class JdbcDatabase implements Database<Connection> {
long timestamp = rs.getLong(5); long timestamp = rs.getLong(5);
boolean read = rs.getBoolean(6); boolean read = rs.getBoolean(6);
boolean starred = rs.getBoolean(7); boolean starred = rs.getBoolean(7);
boolean seen = rs.getBoolean(8); AuthorId authorId = new AuthorId(rs.getBytes(8));
headers.add(new PrivateMessageHeader(id, parent, contentType, String authorName = rs.getString(9);
subject, timestamp, read, starred, c, seen)); byte[] authorKey = rs.getBytes(10);
Author author = new Author(authorId, authorName, authorKey);
// NULL == 0 == UNRATED
Rating rating = Rating.values()[rs.getByte(11)];
headers.add(new PrivateMessageHeader(id, parent, author,
contentType, subject, timestamp, read, starred, rating,
c, true));
}
rs.close();
ps.close();
// Get the outgoing message headers
sql = "SELECT m.messageId, parentId, contentType, subject,"
+ " timestamp, read, starred, a.authorId, a.name,"
+ " a.publicKey, rating"
+ " FROM messages AS m"
+ " JOIN contacts AS c"
+ " ON m.contactId = c.contactId"
+ " JOIN localAuthors AS a"
+ " ON c.localAuthorId = a.authorId"
+ " LEFT OUTER JOIN ratings AS r"
+ " ON c.localAuthorId = r.authorId"
+ " WHERE m.contactId = ?"
+ " AND groupId IS NULL"
+ " AND incoming = FALSE";
ps = txn.prepareStatement(sql);
ps.setInt(1, c.getInt());
rs = ps.executeQuery();
while(rs.next()) {
MessageId id = new MessageId(rs.getBytes(1));
byte[] b = rs.getBytes(2);
MessageId parent = b == null ? null : new MessageId(b);
String contentType = rs.getString(3);
String subject = rs.getString(4);
long timestamp = rs.getLong(5);
boolean read = rs.getBoolean(6);
boolean starred = rs.getBoolean(7);
AuthorId authorId = new AuthorId(rs.getBytes(8));
String authorName = rs.getString(9);
byte[] authorKey = rs.getBytes(10);
Author author = new Author(authorId, authorName, authorKey);
// NULL == 0 == UNRATED
Rating rating = Rating.values()[rs.getByte(11)];
headers.add(new PrivateMessageHeader(id, parent, author,
contentType, subject, timestamp, read, starred, rating,
c, false));
} }
rs.close(); rs.close();
ps.close(); ps.close();

View File

@@ -172,7 +172,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
// getMessageHeaders(groupId) // getMessageHeaders(groupId)
oneOf(database).containsSubscription(txn, groupId); oneOf(database).containsSubscription(txn, groupId);
will(returnValue(true)); will(returnValue(true));
oneOf(database).getMessageHeaders(txn, groupId); oneOf(database).getGroupMessageHeaders(txn, groupId);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
// getSubscriptions() // getSubscriptions()
oneOf(database).getSubscriptions(txn); oneOf(database).getSubscriptions(txn);
@@ -212,7 +212,8 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
db.getRemoteProperties(transportId)); db.getRemoteProperties(transportId));
db.subscribe(group); // First time - listeners called db.subscribe(group); // First time - listeners called
db.subscribe(group); // Second time - not called db.subscribe(group); // Second time - not called
assertEquals(Collections.emptyList(), db.getMessageHeaders(groupId)); assertEquals(Collections.emptyList(),
db.getGroupMessageHeaders(groupId));
assertEquals(Arrays.asList(groupId), db.getSubscriptions()); assertEquals(Arrays.asList(groupId), db.getSubscriptions());
db.unsubscribe(group); db.unsubscribe(group);
db.removeContact(contactId); db.removeContact(contactId);
@@ -367,7 +368,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
will(returnValue(txn)); will(returnValue(txn));
oneOf(database).containsSubscription(txn, groupId); oneOf(database).containsSubscription(txn, groupId);
will(returnValue(true)); will(returnValue(true));
oneOf(database).addGroupMessage(txn, message); oneOf(database).addGroupMessage(txn, message, false);
will(returnValue(false)); will(returnValue(false));
oneOf(database).commitTransaction(txn); oneOf(database).commitTransaction(txn);
}}); }});
@@ -392,7 +393,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
will(returnValue(txn)); will(returnValue(txn));
oneOf(database).containsSubscription(txn, groupId); oneOf(database).containsSubscription(txn, groupId);
will(returnValue(true)); will(returnValue(true));
oneOf(database).addGroupMessage(txn, message); oneOf(database).addGroupMessage(txn, message, false);
will(returnValue(true)); will(returnValue(true));
oneOf(database).setReadFlag(txn, messageId, true); oneOf(database).setReadFlag(txn, messageId, true);
oneOf(database).getContactIds(txn); oneOf(database).getContactIds(txn);
@@ -428,7 +429,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
will(returnValue(txn)); will(returnValue(txn));
oneOf(database).containsSubscription(txn, groupId); oneOf(database).containsSubscription(txn, groupId);
will(returnValue(true)); will(returnValue(true));
oneOf(database).addGroupMessage(txn, message); oneOf(database).addGroupMessage(txn, message, false);
will(returnValue(true)); will(returnValue(true));
oneOf(database).setReadFlag(txn, messageId, true); oneOf(database).setReadFlag(txn, messageId, true);
oneOf(database).getContactIds(txn); oneOf(database).getContactIds(txn);
@@ -467,7 +468,8 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
oneOf(database).containsContact(txn, contactId); oneOf(database).containsContact(txn, contactId);
will(returnValue(true)); will(returnValue(true));
// addLocalPrivateMessage(privateMessage, contactId) // addLocalPrivateMessage(privateMessage, contactId)
oneOf(database).addPrivateMessage(txn, privateMessage, contactId); oneOf(database).addPrivateMessage(txn, privateMessage, contactId,
false);
will(returnValue(false)); will(returnValue(false));
}}); }});
DatabaseComponent db = createDatabaseComponent(database, cleaner, DatabaseComponent db = createDatabaseComponent(database, cleaner,
@@ -492,7 +494,8 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
oneOf(database).containsContact(txn, contactId); oneOf(database).containsContact(txn, contactId);
will(returnValue(true)); will(returnValue(true));
// addLocalPrivateMessage(privateMessage, contactId) // addLocalPrivateMessage(privateMessage, contactId)
oneOf(database).addPrivateMessage(txn, privateMessage, contactId); oneOf(database).addPrivateMessage(txn, privateMessage, contactId,
false);
will(returnValue(true)); will(returnValue(true));
oneOf(database).setReadFlag(txn, messageId, true); oneOf(database).setReadFlag(txn, messageId, true);
oneOf(database).addStatus(txn, contactId, messageId, false); oneOf(database).addStatus(txn, contactId, messageId, false);
@@ -702,7 +705,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
} catch(NoSuchSubscriptionException expected) {} } catch(NoSuchSubscriptionException expected) {}
try { try {
db.getMessageHeaders(groupId); db.getGroupMessageHeaders(groupId);
fail(); fail();
} catch(NoSuchSubscriptionException expected) {} } catch(NoSuchSubscriptionException expected) {}
@@ -1148,7 +1151,8 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
oneOf(database).containsContact(txn, contactId); oneOf(database).containsContact(txn, contactId);
will(returnValue(true)); will(returnValue(true));
// The message is stored // The message is stored
oneOf(database).addPrivateMessage(txn, privateMessage, contactId); oneOf(database).addPrivateMessage(txn, privateMessage, contactId,
true);
will(returnValue(true)); will(returnValue(true));
oneOf(database).addStatus(txn, contactId, messageId, true); oneOf(database).addStatus(txn, contactId, messageId, true);
// The message must be acked // The message must be acked
@@ -1175,8 +1179,9 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
oneOf(database).commitTransaction(txn); oneOf(database).commitTransaction(txn);
oneOf(database).containsContact(txn, contactId); oneOf(database).containsContact(txn, contactId);
will(returnValue(true)); will(returnValue(true));
// The message is stored, but it's a duplicate // The message is not stored, it's a duplicate
oneOf(database).addPrivateMessage(txn, privateMessage, contactId); oneOf(database).addPrivateMessage(txn, privateMessage, contactId,
true);
will(returnValue(false)); will(returnValue(false));
// The message must still be acked // The message must still be acked
oneOf(database).addMessageToAck(txn, contactId, messageId); oneOf(database).addMessageToAck(txn, contactId, messageId);
@@ -1236,8 +1241,8 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
oneOf(database).containsVisibleSubscription(txn, contactId, oneOf(database).containsVisibleSubscription(txn, contactId,
groupId); groupId);
will(returnValue(true)); will(returnValue(true));
// The message is stored, but it's a duplicate // The message is not stored, it's a duplicate
oneOf(database).addGroupMessage(txn, message); oneOf(database).addGroupMessage(txn, message, true);
will(returnValue(false)); will(returnValue(false));
oneOf(database).addStatus(txn, contactId, messageId, true); oneOf(database).addStatus(txn, contactId, messageId, true);
// The message must be acked // The message must be acked
@@ -1269,7 +1274,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
groupId); groupId);
will(returnValue(true)); will(returnValue(true));
// The message is stored, and it's not a duplicate // The message is stored, and it's not a duplicate
oneOf(database).addGroupMessage(txn, message); oneOf(database).addGroupMessage(txn, message, true);
will(returnValue(true)); will(returnValue(true));
oneOf(database).addStatus(txn, contactId, messageId, true); oneOf(database).addStatus(txn, contactId, messageId, true);
// Set the status to seen = true for all other contacts (none) // Set the status to seen = true for all other contacts (none)
@@ -1311,7 +1316,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
groupId); groupId);
will(returnValue(true)); will(returnValue(true));
// The message is stored, and it's not a duplicate // The message is stored, and it's not a duplicate
oneOf(database).addGroupMessage(txn, message); oneOf(database).addGroupMessage(txn, message, true);
will(returnValue(true)); will(returnValue(true));
oneOf(database).addStatus(txn, contactId, messageId, true); oneOf(database).addStatus(txn, contactId, messageId, true);
// Set the status to seen = true for all other contacts (none) // Set the status to seen = true for all other contacts (none)
@@ -1513,7 +1518,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
will(returnValue(txn)); will(returnValue(txn));
oneOf(database).containsSubscription(txn, groupId); oneOf(database).containsSubscription(txn, groupId);
will(returnValue(true)); will(returnValue(true));
oneOf(database).addGroupMessage(txn, message); oneOf(database).addGroupMessage(txn, message, false);
will(returnValue(true)); will(returnValue(true));
oneOf(database).setReadFlag(txn, messageId, true); oneOf(database).setReadFlag(txn, messageId, true);
oneOf(database).getContactIds(txn); oneOf(database).getContactIds(txn);
@@ -1553,7 +1558,8 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
oneOf(database).containsContact(txn, contactId); oneOf(database).containsContact(txn, contactId);
will(returnValue(true)); will(returnValue(true));
// addLocalPrivateMessage(privateMessage, contactId) // addLocalPrivateMessage(privateMessage, contactId)
oneOf(database).addPrivateMessage(txn, privateMessage, contactId); oneOf(database).addPrivateMessage(txn, privateMessage, contactId,
false);
will(returnValue(true)); will(returnValue(true));
oneOf(database).setReadFlag(txn, messageId, true); oneOf(database).setReadFlag(txn, messageId, true);
oneOf(database).addStatus(txn, contactId, messageId, false); oneOf(database).addStatus(txn, contactId, messageId, false);
@@ -1585,7 +1591,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
will(returnValue(txn)); will(returnValue(txn));
oneOf(database).containsSubscription(txn, groupId); oneOf(database).containsSubscription(txn, groupId);
will(returnValue(true)); will(returnValue(true));
oneOf(database).addGroupMessage(txn, message); oneOf(database).addGroupMessage(txn, message, false);
will(returnValue(false)); will(returnValue(false));
oneOf(database).commitTransaction(txn); oneOf(database).commitTransaction(txn);
// The message was not added, so the listener should not be called // The message was not added, so the listener should not be called
@@ -1615,7 +1621,8 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
oneOf(database).containsContact(txn, contactId); oneOf(database).containsContact(txn, contactId);
will(returnValue(true)); will(returnValue(true));
// addLocalPrivateMessage(privateMessage, contactId) // addLocalPrivateMessage(privateMessage, contactId)
oneOf(database).addPrivateMessage(txn, privateMessage, contactId); oneOf(database).addPrivateMessage(txn, privateMessage, contactId,
false);
will(returnValue(false)); will(returnValue(false));
// The message was not added, so the listener should not be called // The message was not added, so the listener should not be called
}}); }});

View File

@@ -110,10 +110,10 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
assertTrue(db.containsSubscription(txn, groupId)); assertTrue(db.containsSubscription(txn, groupId));
assertFalse(db.containsMessage(txn, messageId)); assertFalse(db.containsMessage(txn, messageId));
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, true);
assertTrue(db.containsMessage(txn, messageId)); assertTrue(db.containsMessage(txn, messageId));
assertFalse(db.containsMessage(txn, messageId1)); assertFalse(db.containsMessage(txn, messageId1));
db.addPrivateMessage(txn, privateMessage, contactId); db.addPrivateMessage(txn, privateMessage, contactId, true);
assertTrue(db.containsMessage(txn, messageId1)); assertTrue(db.containsMessage(txn, messageId1));
db.commitTransaction(txn); db.commitTransaction(txn);
db.close(); db.close();
@@ -173,7 +173,7 @@ public class H2DatabaseTest extends BriarTestCase {
// Subscribe to a group and store a message // Subscribe to a group and store a message
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
// Unsubscribing from the group should remove the message // Unsubscribing from the group should remove the message
assertTrue(db.containsMessage(txn, messageId)); assertTrue(db.containsMessage(txn, messageId));
@@ -192,7 +192,7 @@ public class H2DatabaseTest extends BriarTestCase {
// Add a contact and store a private message // Add a contact and store a private message
db.addLocalAuthor(txn, localAuthor); db.addLocalAuthor(txn, localAuthor);
assertEquals(contactId, db.addContact(txn, author, localAuthorId)); assertEquals(contactId, db.addContact(txn, author, localAuthorId));
db.addPrivateMessage(txn, privateMessage, contactId); db.addPrivateMessage(txn, privateMessage, contactId, false);
// Removing the contact should remove the message // Removing the contact should remove the message
assertTrue(db.containsMessage(txn, messageId1)); assertTrue(db.containsMessage(txn, messageId1));
@@ -212,7 +212,7 @@ public class H2DatabaseTest extends BriarTestCase {
// Add a contact and store a private message // Add a contact and store a private message
db.addLocalAuthor(txn, localAuthor); db.addLocalAuthor(txn, localAuthor);
assertEquals(contactId, db.addContact(txn, author, localAuthorId)); assertEquals(contactId, db.addContact(txn, author, localAuthorId));
db.addPrivateMessage(txn, privateMessage, contactId); db.addPrivateMessage(txn, privateMessage, contactId, false);
// The message has no status yet, so it should not be sendable // The message has no status yet, so it should not be sendable
assertFalse(db.hasSendableMessages(txn, contactId)); assertFalse(db.hasSendableMessages(txn, contactId));
@@ -241,7 +241,7 @@ public class H2DatabaseTest extends BriarTestCase {
// Add a contact and store a private message // Add a contact and store a private message
db.addLocalAuthor(txn, localAuthor); db.addLocalAuthor(txn, localAuthor);
assertEquals(contactId, db.addContact(txn, author, localAuthorId)); assertEquals(contactId, db.addContact(txn, author, localAuthorId));
db.addPrivateMessage(txn, privateMessage, contactId); db.addPrivateMessage(txn, privateMessage, contactId, false);
db.addStatus(txn, contactId, messageId1, false); db.addStatus(txn, contactId, messageId1, false);
// The message is sendable, but too large to send // The message is sendable, but too large to send
@@ -273,7 +273,7 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.addStatus(txn, contactId, messageId, false); db.addStatus(txn, contactId, messageId, false);
// The message should not be sendable // The message should not be sendable
@@ -312,7 +312,7 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.setSendability(txn, messageId, 1); db.setSendability(txn, messageId, 1);
// The message has no status yet, so it should not be sendable // The message has no status yet, so it should not be sendable
@@ -349,7 +349,7 @@ public class H2DatabaseTest extends BriarTestCase {
assertEquals(contactId, db.addContact(txn, author, localAuthorId)); assertEquals(contactId, db.addContact(txn, author, localAuthorId));
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.setSendability(txn, messageId, 1); db.setSendability(txn, messageId, 1);
db.addStatus(txn, contactId, messageId, false); db.addStatus(txn, contactId, messageId, false);
@@ -388,7 +388,7 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.setSendability(txn, messageId, 1); db.setSendability(txn, messageId, 1);
db.addStatus(txn, contactId, messageId, false); db.addStatus(txn, contactId, messageId, false);
@@ -419,7 +419,7 @@ public class H2DatabaseTest extends BriarTestCase {
assertEquals(contactId, db.addContact(txn, author, localAuthorId)); assertEquals(contactId, db.addContact(txn, author, localAuthorId));
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.setSendability(txn, messageId, 1); db.setSendability(txn, messageId, 1);
db.addStatus(txn, contactId, messageId, false); db.addStatus(txn, contactId, messageId, false);
@@ -505,7 +505,7 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.setSendability(txn, messageId, 1); db.setSendability(txn, messageId, 1);
db.addStatus(txn, contactId, messageId, false); db.addStatus(txn, contactId, messageId, false);
@@ -545,8 +545,8 @@ public class H2DatabaseTest extends BriarTestCase {
// Subscribe to a group and store two messages // Subscribe to a group and store two messages
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.addGroupMessage(txn, message1); db.addGroupMessage(txn, message1, false);
// Check that each message is retrievable via its author // Check that each message is retrievable via its author
Iterator<MessageId> it = Iterator<MessageId> it =
@@ -583,10 +583,10 @@ public class H2DatabaseTest extends BriarTestCase {
// Subscribe to the groups and store the messages // Subscribe to the groups and store the messages
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addSubscription(txn, group1); db.addSubscription(txn, group1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.addGroupMessage(txn, child1); db.addGroupMessage(txn, child1, false);
db.addGroupMessage(txn, child2); db.addGroupMessage(txn, child2, false);
db.addGroupMessage(txn, child3); db.addGroupMessage(txn, child3, false);
// Make all the children sendable // Make all the children sendable
db.setSendability(txn, childId1, 1); db.setSendability(txn, childId1, 1);
db.setSendability(txn, childId2, 5); db.setSendability(txn, childId2, 5);
@@ -613,8 +613,8 @@ public class H2DatabaseTest extends BriarTestCase {
// Subscribe to a group and store two messages // Subscribe to a group and store two messages
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.addGroupMessage(txn, message1); db.addGroupMessage(txn, message1, false);
// Allowing enough capacity for one message should return the older one // Allowing enough capacity for one message should return the older one
Iterator<MessageId> it = db.getOldMessages(txn, size).iterator(); Iterator<MessageId> it = db.getOldMessages(txn, size).iterator();
@@ -653,7 +653,7 @@ public class H2DatabaseTest extends BriarTestCase {
// Storing a message should reduce the free space // Storing a message should reduce the free space
Connection txn = db.startTransaction(); Connection txn = db.startTransaction();
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addGroupMessage(txn, message1); db.addGroupMessage(txn, message1, false);
db.commitTransaction(txn); db.commitTransaction(txn);
assertTrue(db.getFreeSpace() < free); assertTrue(db.getFreeSpace() < free);
@@ -894,7 +894,7 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
// Set the sendability to > 0 and the status to seen = true // Set the sendability to > 0 and the status to seen = true
db.setSendability(txn, messageId, 1); db.setSendability(txn, messageId, 1);
@@ -919,7 +919,7 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
// Set the sendability to 0 and the status to seen = false // Set the sendability to 0 and the status to seen = false
db.setSendability(txn, messageId, 0); db.setSendability(txn, messageId, 0);
@@ -945,7 +945,7 @@ public class H2DatabaseTest extends BriarTestCase {
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.setRetentionTime(txn, contactId, timestamp + 1, 1); db.setRetentionTime(txn, contactId, timestamp + 1, 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
// Set the sendability to > 0 and the status to seen = false // Set the sendability to > 0 and the status to seen = false
db.setSendability(txn, messageId, 1); db.setSendability(txn, messageId, 1);
@@ -969,7 +969,7 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
// Set the sendability to > 0 and the status to seen = false // Set the sendability to > 0 and the status to seen = false
db.setSendability(txn, messageId, 1); db.setSendability(txn, messageId, 1);
@@ -1032,7 +1032,7 @@ public class H2DatabaseTest extends BriarTestCase {
assertEquals(contactId, db.addContact(txn, author, localAuthorId)); assertEquals(contactId, db.addContact(txn, author, localAuthorId));
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.addStatus(txn, contactId, messageId, false); db.addStatus(txn, contactId, messageId, false);
// There's no contact subscription for the group // There's no contact subscription for the group
@@ -1053,7 +1053,7 @@ public class H2DatabaseTest extends BriarTestCase {
assertEquals(contactId, db.addContact(txn, author, localAuthorId)); assertEquals(contactId, db.addContact(txn, author, localAuthorId));
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
db.addStatus(txn, contactId, messageId, false); db.addStatus(txn, contactId, messageId, false);
// The subscription is not visible // The subscription is not visible
@@ -1075,7 +1075,7 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
// The message has already been seen by the contact // The message has already been seen by the contact
db.addStatus(txn, contactId, messageId, true); db.addStatus(txn, contactId, messageId, true);
@@ -1098,7 +1098,7 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addVisibility(txn, contactId, groupId); db.addVisibility(txn, contactId, groupId);
db.setSubscriptions(txn, contactId, Arrays.asList(group), 1); db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
// The message has not been seen by the contact // The message has not been seen by the contact
db.addStatus(txn, contactId, messageId, false); db.addStatus(txn, contactId, messageId, false);
@@ -1146,7 +1146,7 @@ public class H2DatabaseTest extends BriarTestCase {
MessageId childId = new MessageId(TestUtils.getRandomId()); MessageId childId = new MessageId(TestUtils.getRandomId());
Message child = new TestMessage(childId, null, group, null, contentType, Message child = new TestMessage(childId, null, group, null, contentType,
subject, timestamp, raw); subject, timestamp, raw);
db.addGroupMessage(txn, child); db.addGroupMessage(txn, child, false);
assertTrue(db.containsMessage(txn, childId)); assertTrue(db.containsMessage(txn, childId));
assertNull(db.getGroupMessageParent(txn, childId)); assertNull(db.getGroupMessageParent(txn, childId));
@@ -1167,7 +1167,7 @@ public class H2DatabaseTest extends BriarTestCase {
MessageId parentId = new MessageId(TestUtils.getRandomId()); MessageId parentId = new MessageId(TestUtils.getRandomId());
Message child = new TestMessage(childId, parentId, group, null, Message child = new TestMessage(childId, parentId, group, null,
contentType, subject, timestamp, raw); contentType, subject, timestamp, raw);
db.addGroupMessage(txn, child); db.addGroupMessage(txn, child, false);
assertTrue(db.containsMessage(txn, childId)); assertTrue(db.containsMessage(txn, childId));
assertFalse(db.containsMessage(txn, parentId)); assertFalse(db.containsMessage(txn, parentId));
assertNull(db.getGroupMessageParent(txn, childId)); assertNull(db.getGroupMessageParent(txn, childId));
@@ -1195,8 +1195,8 @@ public class H2DatabaseTest extends BriarTestCase {
contentType, subject, timestamp, raw); contentType, subject, timestamp, raw);
Message parent = new TestMessage(parentId, null, group1, null, Message parent = new TestMessage(parentId, null, group1, null,
contentType, subject, timestamp, raw); contentType, subject, timestamp, raw);
db.addGroupMessage(txn, child); db.addGroupMessage(txn, child, false);
db.addGroupMessage(txn, parent); db.addGroupMessage(txn, parent, false);
assertTrue(db.containsMessage(txn, childId)); assertTrue(db.containsMessage(txn, childId));
assertTrue(db.containsMessage(txn, parentId)); assertTrue(db.containsMessage(txn, parentId));
assertNull(db.getGroupMessageParent(txn, childId)); assertNull(db.getGroupMessageParent(txn, childId));
@@ -1219,8 +1219,8 @@ public class H2DatabaseTest extends BriarTestCase {
MessageId childId = new MessageId(TestUtils.getRandomId()); MessageId childId = new MessageId(TestUtils.getRandomId());
Message child = new TestMessage(childId, messageId1, group, null, Message child = new TestMessage(childId, messageId1, group, null,
contentType, subject, timestamp, raw); contentType, subject, timestamp, raw);
db.addGroupMessage(txn, child); db.addGroupMessage(txn, child, false);
db.addPrivateMessage(txn, privateMessage, contactId); db.addPrivateMessage(txn, privateMessage, contactId, false);
assertTrue(db.containsMessage(txn, childId)); assertTrue(db.containsMessage(txn, childId));
assertTrue(db.containsMessage(txn, messageId1)); assertTrue(db.containsMessage(txn, messageId1));
assertNull(db.getGroupMessageParent(txn, childId)); assertNull(db.getGroupMessageParent(txn, childId));
@@ -1245,8 +1245,8 @@ public class H2DatabaseTest extends BriarTestCase {
contentType, subject, timestamp, raw); contentType, subject, timestamp, raw);
Message parent = new TestMessage(parentId, null, group, null, Message parent = new TestMessage(parentId, null, group, null,
contentType, subject, timestamp, raw); contentType, subject, timestamp, raw);
db.addGroupMessage(txn, child); db.addGroupMessage(txn, child, false);
db.addGroupMessage(txn, parent); db.addGroupMessage(txn, parent, false);
assertTrue(db.containsMessage(txn, childId)); assertTrue(db.containsMessage(txn, childId));
assertTrue(db.containsMessage(txn, parentId)); assertTrue(db.containsMessage(txn, parentId));
assertEquals(parentId, db.getGroupMessageParent(txn, childId)); assertEquals(parentId, db.getGroupMessageParent(txn, childId));
@@ -1271,8 +1271,8 @@ public class H2DatabaseTest extends BriarTestCase {
contentType, subject, timestamp, raw, 5, bodyLength); contentType, subject, timestamp, raw, 5, bodyLength);
Message privateMessage1 = new TestMessage(messageId1, null, null, Message privateMessage1 = new TestMessage(messageId1, null, null,
null, contentType, subject, timestamp, raw, 10, bodyLength); null, contentType, subject, timestamp, raw, 10, bodyLength);
db.addGroupMessage(txn, message1); db.addGroupMessage(txn, message1, false);
db.addPrivateMessage(txn, privateMessage1, contactId); db.addPrivateMessage(txn, privateMessage1, contactId, false);
// Calculate the expected message bodies // Calculate the expected message bodies
byte[] expectedBody = new byte[bodyLength]; byte[] expectedBody = new byte[bodyLength];
@@ -1305,19 +1305,19 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group); db.addSubscription(txn, group);
// Store a couple of messages // Store a couple of messages
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
MessageId messageId1 = new MessageId(TestUtils.getRandomId()); MessageId messageId1 = new MessageId(TestUtils.getRandomId());
MessageId parentId = new MessageId(TestUtils.getRandomId()); MessageId parentId = new MessageId(TestUtils.getRandomId());
long timestamp1 = System.currentTimeMillis(); long timestamp1 = System.currentTimeMillis();
Message message1 = new TestMessage(messageId1, parentId, group, author, Message message1 = new TestMessage(messageId1, parentId, group, author,
contentType, subject, timestamp1, raw); contentType, subject, timestamp1, raw);
db.addGroupMessage(txn, message1); db.addGroupMessage(txn, message1, false);
// Mark one of the messages read // Mark one of the messages read
assertFalse(db.setReadFlag(txn, messageId, true)); assertFalse(db.setReadFlag(txn, messageId, true));
// Retrieve the message headers // Retrieve the message headers
Collection<GroupMessageHeader> headers = Collection<GroupMessageHeader> headers =
db.getMessageHeaders(txn, groupId); db.getGroupMessageHeaders(txn, groupId);
Iterator<GroupMessageHeader> it = headers.iterator(); Iterator<GroupMessageHeader> it = headers.iterator();
boolean messageFound = false, message1Found = false; boolean messageFound = false, message1Found = false;
// First header (order is undefined) // First header (order is undefined)
@@ -1380,7 +1380,7 @@ public class H2DatabaseTest extends BriarTestCase {
// Subscribe to a group and store a message // Subscribe to a group and store a message
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
// The message should be unread by default // The message should be unread by default
assertFalse(db.getReadFlag(txn, messageId)); assertFalse(db.getReadFlag(txn, messageId));
@@ -1406,7 +1406,7 @@ public class H2DatabaseTest extends BriarTestCase {
// Subscribe to a group and store a message // Subscribe to a group and store a message
db.addSubscription(txn, group); db.addSubscription(txn, group);
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
// The message should be unstarred by default // The message should be unstarred by default
assertFalse(db.getStarredFlag(txn, messageId)); assertFalse(db.getStarredFlag(txn, messageId));
@@ -1437,17 +1437,17 @@ public class H2DatabaseTest extends BriarTestCase {
db.addSubscription(txn, group1); db.addSubscription(txn, group1);
// Store two messages in the first group // Store two messages in the first group
db.addGroupMessage(txn, message); db.addGroupMessage(txn, message, false);
MessageId messageId1 = new MessageId(TestUtils.getRandomId()); MessageId messageId1 = new MessageId(TestUtils.getRandomId());
Message message1 = new TestMessage(messageId1, null, group, author, Message message1 = new TestMessage(messageId1, null, group, author,
contentType, subject, timestamp, raw); contentType, subject, timestamp, raw);
db.addGroupMessage(txn, message1); db.addGroupMessage(txn, message1, false);
// Store one message in the second group // Store one message in the second group
MessageId messageId2 = new MessageId(TestUtils.getRandomId()); MessageId messageId2 = new MessageId(TestUtils.getRandomId());
Message message2 = new TestMessage(messageId2, null, group1, author, Message message2 = new TestMessage(messageId2, null, group1, author,
contentType, subject, timestamp, raw); contentType, subject, timestamp, raw);
db.addGroupMessage(txn, message2); db.addGroupMessage(txn, message2, false);
// Mark one of the messages in the first group read // Mark one of the messages in the first group read
assertFalse(db.setReadFlag(txn, messageId, true)); assertFalse(db.setReadFlag(txn, messageId, true));