diff --git a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
index 123d8e4b1..3f123566f 100644
--- a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
+++ b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
@@ -262,7 +262,7 @@ public interface DatabaseComponent {
byte[] getRawMessage(Transaction txn, MessageId m) throws DbException;
/**
- * Returns the metadata for all messages in the given group.
+ * Returns the metadata for all delivered messages in the given group.
*
* Read-only.
*/
@@ -280,13 +280,22 @@ public interface DatabaseComponent {
Metadata query) throws DbException;
/**
- * Returns the metadata for the given message.
+ * Returns the metadata for the given delivered message.
*
* Read-only.
*/
Metadata getMessageMetadata(Transaction txn, MessageId m)
throws DbException;
+ /**
+ * Returns the metadata for the given delivered and pending message.
+ * This is meant to be only used by the ValidationManager
+ *
+ * Read-only.
+ */
+ Metadata getMessageMetadataForValidator(Transaction txn, MessageId m)
+ throws DbException;
+
/**
* Returns the status of all messages in the given group with respect to
* the given contact.
diff --git a/briar-core/src/org/briarproject/clients/BdfIncomingMessageHook.java b/briar-core/src/org/briarproject/clients/BdfIncomingMessageHook.java
index e8d0b5e2f..f8211623d 100644
--- a/briar-core/src/org/briarproject/clients/BdfIncomingMessageHook.java
+++ b/briar-core/src/org/briarproject/clients/BdfIncomingMessageHook.java
@@ -12,7 +12,6 @@ import org.briarproject.api.db.Metadata;
import org.briarproject.api.db.Transaction;
import org.briarproject.api.sync.Message;
import org.briarproject.api.sync.ValidationManager.IncomingMessageHook;
-import org.briarproject.api.system.Clock;
import static org.briarproject.api.clients.QueueMessage.QUEUE_MESSAGE_HEADER_LENGTH;
import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH;
diff --git a/briar-core/src/org/briarproject/db/Database.java b/briar-core/src/org/briarproject/db/Database.java
index 977921790..a63f411cb 100644
--- a/briar-core/src/org/briarproject/db/Database.java
+++ b/briar-core/src/org/briarproject/db/Database.java
@@ -310,7 +310,7 @@ interface Database {
throws DbException;
/**
- * Returns the metadata for all messages in the given group.
+ * Returns the metadata for all delivered messages in the given group.
*
* Read-only.
*/
@@ -327,6 +327,14 @@ interface Database {
Map getMessageMetadata(T txn, GroupId g,
Metadata query) throws DbException;
+ /**
+ * Returns the metadata for the given delivered message.
+ *
+ * Read-only.
+ */
+ Metadata getMessageMetadataForValidator(T txn, MessageId m)
+ throws DbException;
+
/**
* Returns the metadata for the given message.
*
diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
index 4f84a04bd..f8eabd84c 100644
--- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
+++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
@@ -456,6 +456,15 @@ class DatabaseComponentImpl implements DatabaseComponent {
return db.getMessageMetadata(txn, m);
}
+ public Metadata getMessageMetadataForValidator(Transaction transaction,
+ MessageId m)
+ throws DbException {
+ T txn = unbox(transaction);
+ if (!db.containsMessage(txn, m))
+ throw new NoSuchMessageException();
+ return db.getMessageMetadataForValidator(txn, m);
+ }
+
public Collection getMessageStatus(Transaction transaction,
ContactId c, GroupId g) throws DbException {
T txn = unbox(transaction);
diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java
index a52fbe2a1..363075dfd 100644
--- a/briar-core/src/org/briarproject/db/JdbcDatabase.java
+++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java
@@ -1324,6 +1324,33 @@ abstract class JdbcDatabase implements Database {
}
}
+ public Metadata getMessageMetadataForValidator(Connection txn, MessageId m)
+ throws DbException {
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ try {
+ String sql = "SELECT key, value FROM messageMetadata AS md"
+ + " JOIN messages AS m"
+ + " ON m.messageId = md.messageId"
+ + " WHERE (m.state = ? OR m.state = ?)"
+ + " AND md.messageId = ?";
+ ps = txn.prepareStatement(sql);
+ ps.setInt(1, DELIVERED.getValue());
+ ps.setInt(2, PENDING.getValue());
+ ps.setBytes(3, m.getBytes());
+ rs = ps.executeQuery();
+ Metadata metadata = new Metadata();
+ while (rs.next()) metadata.put(rs.getString(1), rs.getBytes(2));
+ rs.close();
+ ps.close();
+ return metadata;
+ } catch (SQLException e) {
+ tryToClose(rs);
+ tryToClose(ps);
+ throw new DbException(e);
+ }
+ }
+
public Collection getMessageStatus(Connection txn,
ContactId c, GroupId g) throws DbException {
PreparedStatement ps = null;
diff --git a/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java b/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java
index f6aa74c3a..7853f0497 100644
--- a/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java
+++ b/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java
@@ -188,7 +188,7 @@ class ValidationManagerImpl implements ValidationManager, Service,
byte[] raw = db.getRawMessage(txn, id);
m = parseMessage(id, raw);
g = db.getGroup(txn, m.getGroupId());
- meta = db.getMessageMetadata(txn, id);
+ meta = db.getMessageMetadataForValidator(txn, id);
txn.setComplete();
} finally {
db.endTransaction(txn);
diff --git a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
index dbf48a82f..f50dcb2bc 100644
--- a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
+++ b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
@@ -1006,6 +1006,10 @@ public class H2DatabaseTest extends BriarTestCase {
map = db.getMessageMetadata(txn, groupId);
assertTrue(map.isEmpty());
+ // validator gets also metadata for pending messages
+ retrieved = db.getMessageMetadataForValidator(txn, messageId);
+ assertFalse(retrieved.isEmpty());
+
db.commitTransaction(txn);
db.close();
}