mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-16 12:49:55 +01:00
Removed TransportUpdate and TransportAck.
This commit is contained in:
@@ -2,7 +2,6 @@ package org.briarproject.api.db;
|
|||||||
|
|
||||||
import org.briarproject.api.Settings;
|
import org.briarproject.api.Settings;
|
||||||
import org.briarproject.api.TransportId;
|
import org.briarproject.api.TransportId;
|
||||||
import org.briarproject.api.TransportProperties;
|
|
||||||
import org.briarproject.api.contact.Contact;
|
import org.briarproject.api.contact.Contact;
|
||||||
import org.briarproject.api.contact.ContactId;
|
import org.briarproject.api.contact.ContactId;
|
||||||
import org.briarproject.api.identity.Author;
|
import org.briarproject.api.identity.Author;
|
||||||
@@ -19,8 +18,6 @@ import org.briarproject.api.sync.Offer;
|
|||||||
import org.briarproject.api.sync.Request;
|
import org.briarproject.api.sync.Request;
|
||||||
import org.briarproject.api.sync.SubscriptionAck;
|
import org.briarproject.api.sync.SubscriptionAck;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.TransportAck;
|
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
import org.briarproject.api.transport.TransportKeys;
|
import org.briarproject.api.transport.TransportKeys;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -125,21 +122,6 @@ public interface DatabaseComponent {
|
|||||||
SubscriptionUpdate generateSubscriptionUpdate(ContactId c, int maxLatency)
|
SubscriptionUpdate generateSubscriptionUpdate(ContactId c, int maxLatency)
|
||||||
throws DbException;
|
throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a batch of transport acks for the given contact, or null if no
|
|
||||||
* transport acks are due.
|
|
||||||
*/
|
|
||||||
Collection<TransportAck> generateTransportAcks(ContactId c)
|
|
||||||
throws DbException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a batch of transport updates for the given contact, for
|
|
||||||
* transmission over a transport with the given latency. Returns null if no
|
|
||||||
* updates are due.
|
|
||||||
*/
|
|
||||||
Collection<TransportUpdate> generateTransportUpdates(ContactId c,
|
|
||||||
int maxLatency) throws DbException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all groups belonging to the given client to which the user could
|
* Returns all groups belonging to the given client to which the user could
|
||||||
* subscribe.
|
* subscribe.
|
||||||
@@ -173,13 +155,6 @@ public interface DatabaseComponent {
|
|||||||
/** Returns all local pseudonyms. */
|
/** Returns all local pseudonyms. */
|
||||||
Collection<LocalAuthor> getLocalAuthors() throws DbException;
|
Collection<LocalAuthor> getLocalAuthors() throws DbException;
|
||||||
|
|
||||||
/** Returns the local transport properties for all transports. */
|
|
||||||
Map<TransportId, TransportProperties> getLocalProperties()
|
|
||||||
throws DbException;
|
|
||||||
|
|
||||||
/** Returns the local transport properties for the given transport. */
|
|
||||||
TransportProperties getLocalProperties(TransportId t) throws DbException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the IDs of any messages that need to be validated by the given
|
* Returns the IDs of any messages that need to be validated by the given
|
||||||
* client.
|
* client.
|
||||||
@@ -210,10 +185,6 @@ public interface DatabaseComponent {
|
|||||||
MessageStatus getMessageStatus(ContactId c, MessageId m)
|
MessageStatus getMessageStatus(ContactId c, MessageId m)
|
||||||
throws DbException;
|
throws DbException;
|
||||||
|
|
||||||
/** Returns all remote transport properties for the given transport. */
|
|
||||||
Map<ContactId, TransportProperties> getRemoteProperties(TransportId t)
|
|
||||||
throws DbException;
|
|
||||||
|
|
||||||
/** Returns all settings in the given namespace. */
|
/** Returns all settings in the given namespace. */
|
||||||
Settings getSettings(String namespace) throws DbException;
|
Settings getSettings(String namespace) throws DbException;
|
||||||
|
|
||||||
@@ -243,13 +214,6 @@ public interface DatabaseComponent {
|
|||||||
*/
|
*/
|
||||||
void mergeGroupMetadata(GroupId g, Metadata meta) throws DbException;
|
void mergeGroupMetadata(GroupId g, Metadata meta) throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Merges the given properties with the existing local properties for the
|
|
||||||
* given transport.
|
|
||||||
*/
|
|
||||||
void mergeLocalProperties(TransportId t, TransportProperties p)
|
|
||||||
throws DbException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Merges the given metadata with the existing metadata for the given
|
* Merges the given metadata with the existing metadata for the given
|
||||||
* message.
|
* message.
|
||||||
@@ -282,13 +246,6 @@ public interface DatabaseComponent {
|
|||||||
void receiveSubscriptionUpdate(ContactId c, SubscriptionUpdate u)
|
void receiveSubscriptionUpdate(ContactId c, SubscriptionUpdate u)
|
||||||
throws DbException;
|
throws DbException;
|
||||||
|
|
||||||
/** Processes a transport ack from the given contact. */
|
|
||||||
void receiveTransportAck(ContactId c, TransportAck a) throws DbException;
|
|
||||||
|
|
||||||
/** Processes a transport update from the given contact. */
|
|
||||||
void receiveTransportUpdate(ContactId c, TransportUpdate u)
|
|
||||||
throws DbException;
|
|
||||||
|
|
||||||
/** Removes a contact (and all associated state) from the database. */
|
/** Removes a contact (and all associated state) from the database. */
|
||||||
void removeContact(ContactId c) throws DbException;
|
void removeContact(ContactId c) throws DbException;
|
||||||
|
|
||||||
@@ -320,13 +277,6 @@ public interface DatabaseComponent {
|
|||||||
void setMessageValidity(Message m, ClientId c, boolean valid)
|
void setMessageValidity(Message m, ClientId c, boolean valid)
|
||||||
throws DbException;
|
throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the remote transport properties for the given contact, replacing
|
|
||||||
* any existing properties.
|
|
||||||
*/
|
|
||||||
void setRemoteProperties(ContactId c,
|
|
||||||
Map<TransportId, TransportProperties> p) throws DbException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the reordering window for the given contact and transport in the
|
* Sets the reordering window for the given contact and transport in the
|
||||||
* given rotation period.
|
* given rotation period.
|
||||||
|
|||||||
@@ -23,10 +23,4 @@ public interface PacketReader {
|
|||||||
|
|
||||||
boolean hasSubscriptionUpdate() throws IOException;
|
boolean hasSubscriptionUpdate() throws IOException;
|
||||||
SubscriptionUpdate readSubscriptionUpdate() throws IOException;
|
SubscriptionUpdate readSubscriptionUpdate() throws IOException;
|
||||||
|
|
||||||
boolean hasTransportAck() throws IOException;
|
|
||||||
TransportAck readTransportAck() throws IOException;
|
|
||||||
|
|
||||||
boolean hasTransportUpdate() throws IOException;
|
|
||||||
TransportUpdate readTransportUpdate() throws IOException;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,4 @@ public interface PacketTypes {
|
|||||||
byte REQUEST = 3;
|
byte REQUEST = 3;
|
||||||
byte SUBSCRIPTION_ACK = 6;
|
byte SUBSCRIPTION_ACK = 6;
|
||||||
byte SUBSCRIPTION_UPDATE = 7;
|
byte SUBSCRIPTION_UPDATE = 7;
|
||||||
byte TRANSPORT_ACK = 8;
|
|
||||||
byte TRANSPORT_UPDATE = 9;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,9 +22,5 @@ public interface PacketWriter {
|
|||||||
|
|
||||||
void writeSubscriptionUpdate(SubscriptionUpdate u) throws IOException;
|
void writeSubscriptionUpdate(SubscriptionUpdate u) throws IOException;
|
||||||
|
|
||||||
void writeTransportAck(TransportAck a) throws IOException;
|
|
||||||
|
|
||||||
void writeTransportUpdate(TransportUpdate u) throws IOException;
|
|
||||||
|
|
||||||
void flush() throws IOException;
|
void flush() throws IOException;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
package org.briarproject.api.sync;
|
|
||||||
|
|
||||||
import org.briarproject.api.TransportId;
|
|
||||||
|
|
||||||
/** A packet acknowledging a {@link TransportUpdate}. */
|
|
||||||
public class TransportAck {
|
|
||||||
|
|
||||||
private final TransportId id;
|
|
||||||
private final long version;
|
|
||||||
|
|
||||||
public TransportAck(TransportId id, long version) {
|
|
||||||
this.id = id;
|
|
||||||
this.version = version;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns the identifier of the updated transport. */
|
|
||||||
public TransportId getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns the version number of the acknowledged update. */
|
|
||||||
public long getVersion() {
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package org.briarproject.api.sync;
|
|
||||||
|
|
||||||
import org.briarproject.api.TransportId;
|
|
||||||
import org.briarproject.api.TransportProperties;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A packet updating the recipient's view of the sender's transport properties.
|
|
||||||
*/
|
|
||||||
public class TransportUpdate {
|
|
||||||
|
|
||||||
private final TransportId id;
|
|
||||||
private final TransportProperties properties;
|
|
||||||
private final long version;
|
|
||||||
|
|
||||||
public TransportUpdate(TransportId id, TransportProperties properties,
|
|
||||||
long version) {
|
|
||||||
this.id = id;
|
|
||||||
this.properties = properties;
|
|
||||||
this.version = version;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns the identifier of the updated transport. */
|
|
||||||
public TransportId getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns the transport's updated properties. */
|
|
||||||
public TransportProperties getProperties() {
|
|
||||||
return properties;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns the update's version number. */
|
|
||||||
public long getVersion() {
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,6 @@ package org.briarproject.db;
|
|||||||
|
|
||||||
import org.briarproject.api.Settings;
|
import org.briarproject.api.Settings;
|
||||||
import org.briarproject.api.TransportId;
|
import org.briarproject.api.TransportId;
|
||||||
import org.briarproject.api.TransportProperties;
|
|
||||||
import org.briarproject.api.contact.Contact;
|
import org.briarproject.api.contact.Contact;
|
||||||
import org.briarproject.api.contact.ContactId;
|
import org.briarproject.api.contact.ContactId;
|
||||||
import org.briarproject.api.db.DbException;
|
import org.briarproject.api.db.DbException;
|
||||||
@@ -19,8 +18,6 @@ import org.briarproject.api.sync.MessageId;
|
|||||||
import org.briarproject.api.sync.MessageStatus;
|
import org.briarproject.api.sync.MessageStatus;
|
||||||
import org.briarproject.api.sync.SubscriptionAck;
|
import org.briarproject.api.sync.SubscriptionAck;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.TransportAck;
|
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
import org.briarproject.api.transport.TransportKeys;
|
import org.briarproject.api.transport.TransportKeys;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -302,22 +299,6 @@ interface Database<T> {
|
|||||||
*/
|
*/
|
||||||
Collection<LocalAuthor> getLocalAuthors(T txn) throws DbException;
|
Collection<LocalAuthor> getLocalAuthors(T txn) throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the local transport properties for all transports.
|
|
||||||
* <p>
|
|
||||||
* Locking: read.
|
|
||||||
*/
|
|
||||||
Map<TransportId, TransportProperties> getLocalProperties(T txn)
|
|
||||||
throws DbException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the local transport properties for the given transport.
|
|
||||||
* <p>
|
|
||||||
* Locking: read.
|
|
||||||
*/
|
|
||||||
TransportProperties getLocalProperties(T txn, TransportId t)
|
|
||||||
throws DbException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the metadata for all messages in the given group.
|
* Returns the metadata for all messages in the given group.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -403,14 +384,6 @@ interface Database<T> {
|
|||||||
*/
|
*/
|
||||||
byte[] getRawMessage(T txn, MessageId m) throws DbException;
|
byte[] getRawMessage(T txn, MessageId m) throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns all remote properties for the given transport.
|
|
||||||
* <p>
|
|
||||||
* Locking: read.
|
|
||||||
*/
|
|
||||||
Map<ContactId, TransportProperties> getRemoteProperties(T txn,
|
|
||||||
TransportId t) throws DbException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the IDs of some messages that are eligible to be sent to the
|
* Returns the IDs of some messages that are eligible to be sent to the
|
||||||
* given contact and have been requested by the contact, up to the given
|
* given contact and have been requested by the contact, up to the given
|
||||||
@@ -452,15 +425,6 @@ interface Database<T> {
|
|||||||
SubscriptionUpdate getSubscriptionUpdate(T txn, ContactId c,
|
SubscriptionUpdate getSubscriptionUpdate(T txn, ContactId c,
|
||||||
int maxLatency) throws DbException;
|
int maxLatency) throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a collection of transport acks for the given contact, or null if
|
|
||||||
* no acks are due.
|
|
||||||
* <p>
|
|
||||||
* Locking: write.
|
|
||||||
*/
|
|
||||||
Collection<TransportAck> getTransportAcks(T txn, ContactId c)
|
|
||||||
throws DbException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all transport keys for the given transport.
|
* Returns all transport keys for the given transport.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -476,16 +440,6 @@ interface Database<T> {
|
|||||||
*/
|
*/
|
||||||
Map<TransportId, Integer> getTransportLatencies(T txn) throws DbException;
|
Map<TransportId, Integer> getTransportLatencies(T txn) throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a collection of transport updates for the given contact and
|
|
||||||
* updates their expiry times using the given latency, or returns null if
|
|
||||||
* no updates are due.
|
|
||||||
* <p>
|
|
||||||
* Locking: write.
|
|
||||||
*/
|
|
||||||
Collection<TransportUpdate> getTransportUpdates(T txn, ContactId c,
|
|
||||||
int maxLatency) throws DbException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the IDs of all contacts to which the given group is visible.
|
* Returns the IDs of all contacts to which the given group is visible.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -529,15 +483,6 @@ interface Database<T> {
|
|||||||
void mergeGroupMetadata(T txn, GroupId g, Metadata meta)
|
void mergeGroupMetadata(T txn, GroupId g, Metadata meta)
|
||||||
throws DbException;
|
throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Merges the given properties with the existing local properties for the
|
|
||||||
* given transport.
|
|
||||||
* <p>
|
|
||||||
* Locking: write.
|
|
||||||
*/
|
|
||||||
void mergeLocalProperties(T txn, TransportId t, TransportProperties p)
|
|
||||||
throws DbException;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Merges the given metadata with the existing metadata for the given
|
* Merges the given metadata with the existing metadata for the given
|
||||||
* message.
|
* message.
|
||||||
@@ -689,26 +634,6 @@ interface Database<T> {
|
|||||||
boolean setGroups(T txn, ContactId c, Collection<Group> groups,
|
boolean setGroups(T txn, ContactId c, Collection<Group> groups,
|
||||||
long version) throws DbException;
|
long version) throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the remote transport properties for the given contact, replacing
|
|
||||||
* any existing properties.
|
|
||||||
* <p>
|
|
||||||
* Locking: write.
|
|
||||||
*/
|
|
||||||
void setRemoteProperties(T txn, ContactId c,
|
|
||||||
Map<TransportId, TransportProperties> p) throws DbException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the remote transport properties for the given contact and the
|
|
||||||
* given transport, replacing any existing properties, and returns true,
|
|
||||||
* unless an update with an equal or higher version number has already been
|
|
||||||
* received from the contact.
|
|
||||||
* <p>
|
|
||||||
* Locking: write.
|
|
||||||
*/
|
|
||||||
boolean setRemoteProperties(T txn, ContactId c, TransportId t,
|
|
||||||
TransportProperties p, long version) throws DbException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Records a subscription ack from the given contact for the given version,
|
* Records a subscription ack from the given contact for the given version,
|
||||||
* unless the contact has already acked an equal or higher version.
|
* unless the contact has already acked an equal or higher version.
|
||||||
@@ -718,15 +643,6 @@ interface Database<T> {
|
|||||||
void setSubscriptionUpdateAcked(T txn, ContactId c, long version)
|
void setSubscriptionUpdateAcked(T txn, ContactId c, long version)
|
||||||
throws DbException;
|
throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Records a transport ack from the give contact for the given version,
|
|
||||||
* unless the contact has already acked an equal or higher version.
|
|
||||||
* <p>
|
|
||||||
* Locking: write.
|
|
||||||
*/
|
|
||||||
void setTransportUpdateAcked(T txn, ContactId c, TransportId t,
|
|
||||||
long version) throws DbException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes a group visible or invisible to future contacts by default.
|
* Makes a group visible or invisible to future contacts by default.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package org.briarproject.db;
|
|||||||
|
|
||||||
import org.briarproject.api.Settings;
|
import org.briarproject.api.Settings;
|
||||||
import org.briarproject.api.TransportId;
|
import org.briarproject.api.TransportId;
|
||||||
import org.briarproject.api.TransportProperties;
|
|
||||||
import org.briarproject.api.contact.Contact;
|
import org.briarproject.api.contact.Contact;
|
||||||
import org.briarproject.api.contact.ContactId;
|
import org.briarproject.api.contact.ContactId;
|
||||||
import org.briarproject.api.db.ContactExistsException;
|
import org.briarproject.api.db.ContactExistsException;
|
||||||
@@ -19,7 +18,6 @@ import org.briarproject.api.db.NoSuchTransportException;
|
|||||||
import org.briarproject.api.db.StorageStatus;
|
import org.briarproject.api.db.StorageStatus;
|
||||||
import org.briarproject.api.event.EventBus;
|
import org.briarproject.api.event.EventBus;
|
||||||
import org.briarproject.api.event.LocalSubscriptionsUpdatedEvent;
|
import org.briarproject.api.event.LocalSubscriptionsUpdatedEvent;
|
||||||
import org.briarproject.api.event.LocalTransportsUpdatedEvent;
|
|
||||||
import org.briarproject.api.event.MessageAddedEvent;
|
import org.briarproject.api.event.MessageAddedEvent;
|
||||||
import org.briarproject.api.event.MessageRequestedEvent;
|
import org.briarproject.api.event.MessageRequestedEvent;
|
||||||
import org.briarproject.api.event.MessageToAckEvent;
|
import org.briarproject.api.event.MessageToAckEvent;
|
||||||
@@ -28,7 +26,6 @@ import org.briarproject.api.event.MessageValidatedEvent;
|
|||||||
import org.briarproject.api.event.MessagesAckedEvent;
|
import org.briarproject.api.event.MessagesAckedEvent;
|
||||||
import org.briarproject.api.event.MessagesSentEvent;
|
import org.briarproject.api.event.MessagesSentEvent;
|
||||||
import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
|
import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
|
||||||
import org.briarproject.api.event.RemoteTransportsUpdatedEvent;
|
|
||||||
import org.briarproject.api.event.SettingsUpdatedEvent;
|
import org.briarproject.api.event.SettingsUpdatedEvent;
|
||||||
import org.briarproject.api.event.SubscriptionAddedEvent;
|
import org.briarproject.api.event.SubscriptionAddedEvent;
|
||||||
import org.briarproject.api.event.SubscriptionRemovedEvent;
|
import org.briarproject.api.event.SubscriptionRemovedEvent;
|
||||||
@@ -49,8 +46,6 @@ import org.briarproject.api.sync.Offer;
|
|||||||
import org.briarproject.api.sync.Request;
|
import org.briarproject.api.sync.Request;
|
||||||
import org.briarproject.api.sync.SubscriptionAck;
|
import org.briarproject.api.sync.SubscriptionAck;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.TransportAck;
|
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
import org.briarproject.api.transport.TransportKeys;
|
import org.briarproject.api.transport.TransportKeys;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -475,47 +470,6 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<TransportAck> generateTransportAcks(ContactId c)
|
|
||||||
throws DbException {
|
|
||||||
lock.writeLock().lock();
|
|
||||||
try {
|
|
||||||
T txn = db.startTransaction();
|
|
||||||
try {
|
|
||||||
if (!db.containsContact(txn, c))
|
|
||||||
throw new NoSuchContactException();
|
|
||||||
Collection<TransportAck> acks = db.getTransportAcks(txn, c);
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
return acks;
|
|
||||||
} catch (DbException e) {
|
|
||||||
db.abortTransaction(txn);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
lock.writeLock().unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Collection<TransportUpdate> generateTransportUpdates(ContactId c,
|
|
||||||
int maxLatency) throws DbException {
|
|
||||||
lock.writeLock().lock();
|
|
||||||
try {
|
|
||||||
T txn = db.startTransaction();
|
|
||||||
try {
|
|
||||||
if (!db.containsContact(txn, c))
|
|
||||||
throw new NoSuchContactException();
|
|
||||||
Collection<TransportUpdate> updates =
|
|
||||||
db.getTransportUpdates(txn, c, maxLatency);
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
return updates;
|
|
||||||
} catch (DbException e) {
|
|
||||||
db.abortTransaction(txn);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
lock.writeLock().unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Collection<Group> getAvailableGroups(ClientId c) throws DbException {
|
public Collection<Group> getAvailableGroups(ClientId c) throws DbException {
|
||||||
lock.readLock().lock();
|
lock.readLock().lock();
|
||||||
try {
|
try {
|
||||||
@@ -679,45 +633,6 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<TransportId, TransportProperties> getLocalProperties()
|
|
||||||
throws DbException {
|
|
||||||
lock.readLock().lock();
|
|
||||||
try {
|
|
||||||
T txn = db.startTransaction();
|
|
||||||
try {
|
|
||||||
Map<TransportId, TransportProperties> properties =
|
|
||||||
db.getLocalProperties(txn);
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
return properties;
|
|
||||||
} catch (DbException e) {
|
|
||||||
db.abortTransaction(txn);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
lock.readLock().unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public TransportProperties getLocalProperties(TransportId t)
|
|
||||||
throws DbException {
|
|
||||||
lock.readLock().lock();
|
|
||||||
try {
|
|
||||||
T txn = db.startTransaction();
|
|
||||||
try {
|
|
||||||
if (!db.containsTransport(txn, t))
|
|
||||||
throw new NoSuchTransportException();
|
|
||||||
TransportProperties properties = db.getLocalProperties(txn, t);
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
return properties;
|
|
||||||
} catch (DbException e) {
|
|
||||||
db.abortTransaction(txn);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
lock.readLock().unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Collection<MessageId> getMessagesToValidate(ClientId c)
|
public Collection<MessageId> getMessagesToValidate(ClientId c)
|
||||||
throws DbException {
|
throws DbException {
|
||||||
lock.readLock().lock();
|
lock.readLock().lock();
|
||||||
@@ -840,25 +755,6 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<ContactId, TransportProperties> getRemoteProperties(
|
|
||||||
TransportId t) throws DbException {
|
|
||||||
lock.readLock().lock();
|
|
||||||
try {
|
|
||||||
T txn = db.startTransaction();
|
|
||||||
try {
|
|
||||||
Map<ContactId, TransportProperties> properties =
|
|
||||||
db.getRemoteProperties(txn, t);
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
return properties;
|
|
||||||
} catch (DbException e) {
|
|
||||||
db.abortTransaction(txn);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
lock.readLock().unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Settings getSettings(String namespace) throws DbException {
|
public Settings getSettings(String namespace) throws DbException {
|
||||||
lock.readLock().lock();
|
lock.readLock().lock();
|
||||||
try {
|
try {
|
||||||
@@ -992,30 +888,6 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mergeLocalProperties(TransportId t, TransportProperties p)
|
|
||||||
throws DbException {
|
|
||||||
boolean changed = false;
|
|
||||||
lock.writeLock().lock();
|
|
||||||
try {
|
|
||||||
T txn = db.startTransaction();
|
|
||||||
try {
|
|
||||||
if (!db.containsTransport(txn, t))
|
|
||||||
throw new NoSuchTransportException();
|
|
||||||
if (!p.equals(db.getLocalProperties(txn, t))) {
|
|
||||||
db.mergeLocalProperties(txn, t, p);
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
} catch (DbException e) {
|
|
||||||
db.abortTransaction(txn);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
lock.writeLock().unlock();
|
|
||||||
}
|
|
||||||
if (changed) eventBus.broadcast(new LocalTransportsUpdatedEvent());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mergeMessageMetadata(MessageId m, Metadata meta)
|
public void mergeMessageMetadata(MessageId m, Metadata meta)
|
||||||
throws DbException {
|
throws DbException {
|
||||||
lock.writeLock().lock();
|
lock.writeLock().lock();
|
||||||
@@ -1208,52 +1080,6 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
if (updated) eventBus.broadcast(new RemoteSubscriptionsUpdatedEvent(c));
|
if (updated) eventBus.broadcast(new RemoteSubscriptionsUpdatedEvent(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void receiveTransportAck(ContactId c, TransportAck a)
|
|
||||||
throws DbException {
|
|
||||||
lock.writeLock().lock();
|
|
||||||
try {
|
|
||||||
T txn = db.startTransaction();
|
|
||||||
try {
|
|
||||||
if (!db.containsContact(txn, c))
|
|
||||||
throw new NoSuchContactException();
|
|
||||||
if (!db.containsTransport(txn, a.getId()))
|
|
||||||
throw new NoSuchTransportException();
|
|
||||||
db.setTransportUpdateAcked(txn, c, a.getId(), a.getVersion());
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
} catch (DbException e) {
|
|
||||||
db.abortTransaction(txn);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
lock.writeLock().unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void receiveTransportUpdate(ContactId c, TransportUpdate u)
|
|
||||||
throws DbException {
|
|
||||||
boolean updated;
|
|
||||||
lock.writeLock().lock();
|
|
||||||
try {
|
|
||||||
T txn = db.startTransaction();
|
|
||||||
try {
|
|
||||||
if (!db.containsContact(txn, c))
|
|
||||||
throw new NoSuchContactException();
|
|
||||||
TransportId t = u.getId();
|
|
||||||
TransportProperties p = u.getProperties();
|
|
||||||
long version = u.getVersion();
|
|
||||||
updated = db.setRemoteProperties(txn, c, t, p, version);
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
} catch (DbException e) {
|
|
||||||
db.abortTransaction(txn);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
lock.writeLock().unlock();
|
|
||||||
}
|
|
||||||
if (updated)
|
|
||||||
eventBus.broadcast(new RemoteTransportsUpdatedEvent(c, u.getId()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeContact(ContactId c) throws DbException {
|
public void removeContact(ContactId c) throws DbException {
|
||||||
lock.writeLock().lock();
|
lock.writeLock().lock();
|
||||||
try {
|
try {
|
||||||
@@ -1390,25 +1216,6 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
eventBus.broadcast(new MessageValidatedEvent(m, c, false, valid));
|
eventBus.broadcast(new MessageValidatedEvent(m, c, false, valid));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRemoteProperties(ContactId c,
|
|
||||||
Map<TransportId, TransportProperties> p) throws DbException {
|
|
||||||
lock.writeLock().lock();
|
|
||||||
try {
|
|
||||||
T txn = db.startTransaction();
|
|
||||||
try {
|
|
||||||
if (!db.containsContact(txn, c))
|
|
||||||
throw new NoSuchContactException();
|
|
||||||
db.setRemoteProperties(txn, c, p);
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
} catch (DbException e) {
|
|
||||||
db.abortTransaction(txn);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
lock.writeLock().unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setReorderingWindow(ContactId c, TransportId t,
|
public void setReorderingWindow(ContactId c, TransportId t,
|
||||||
long rotationPeriod, long base, byte[] bitmap) throws DbException {
|
long rotationPeriod, long base, byte[] bitmap) throws DbException {
|
||||||
lock.writeLock().lock();
|
lock.writeLock().lock();
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package org.briarproject.db;
|
|||||||
|
|
||||||
import org.briarproject.api.Settings;
|
import org.briarproject.api.Settings;
|
||||||
import org.briarproject.api.TransportId;
|
import org.briarproject.api.TransportId;
|
||||||
import org.briarproject.api.TransportProperties;
|
|
||||||
import org.briarproject.api.contact.Contact;
|
import org.briarproject.api.contact.Contact;
|
||||||
import org.briarproject.api.contact.ContactId;
|
import org.briarproject.api.contact.ContactId;
|
||||||
import org.briarproject.api.crypto.SecretKey;
|
import org.briarproject.api.crypto.SecretKey;
|
||||||
@@ -21,8 +20,6 @@ import org.briarproject.api.sync.MessageId;
|
|||||||
import org.briarproject.api.sync.MessageStatus;
|
import org.briarproject.api.sync.MessageStatus;
|
||||||
import org.briarproject.api.sync.SubscriptionAck;
|
import org.briarproject.api.sync.SubscriptionAck;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.TransportAck;
|
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
import org.briarproject.api.system.Clock;
|
import org.briarproject.api.system.Clock;
|
||||||
import org.briarproject.api.transport.IncomingKeys;
|
import org.briarproject.api.transport.IncomingKeys;
|
||||||
import org.briarproject.api.transport.OutgoingKeys;
|
import org.briarproject.api.transport.OutgoingKeys;
|
||||||
@@ -210,64 +207,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
+ " maxLatency INT NOT NULL,"
|
+ " maxLatency INT NOT NULL,"
|
||||||
+ " PRIMARY KEY (transportId))";
|
+ " PRIMARY KEY (transportId))";
|
||||||
|
|
||||||
private static final String CREATE_TRANSPORT_CONFIGS =
|
|
||||||
"CREATE TABLE transportConfigs"
|
|
||||||
+ " (transportId VARCHAR NOT NULL,"
|
|
||||||
+ " key VARCHAR NOT NULL,"
|
|
||||||
+ " value VARCHAR NOT NULL,"
|
|
||||||
+ " PRIMARY KEY (transportId, key),"
|
|
||||||
+ " FOREIGN KEY (transportId)"
|
|
||||||
+ " REFERENCES transports (transportId)"
|
|
||||||
+ " ON DELETE CASCADE)";
|
|
||||||
|
|
||||||
private static final String CREATE_TRANSPORT_PROPS =
|
|
||||||
"CREATE TABLE transportProperties"
|
|
||||||
+ " (transportId VARCHAR NOT NULL,"
|
|
||||||
+ " key VARCHAR NOT NULL,"
|
|
||||||
+ " value VARCHAR NOT NULL,"
|
|
||||||
+ " PRIMARY KEY (transportId, key),"
|
|
||||||
+ " FOREIGN KEY (transportId)"
|
|
||||||
+ " REFERENCES transports (transportId)"
|
|
||||||
+ " ON DELETE CASCADE)";
|
|
||||||
|
|
||||||
private static final String CREATE_TRANSPORT_VERSIONS =
|
|
||||||
"CREATE TABLE transportVersions"
|
|
||||||
+ " (contactId INT NOT NULL,"
|
|
||||||
+ " transportId VARCHAR NOT NULL,"
|
|
||||||
+ " localVersion BIGINT NOT NULL,"
|
|
||||||
+ " localAcked BIGINT NOT NULL,"
|
|
||||||
+ " expiry BIGINT NOT NULL,"
|
|
||||||
+ " txCount INT NOT NULL,"
|
|
||||||
+ " PRIMARY KEY (contactId, transportId),"
|
|
||||||
+ " FOREIGN KEY (contactId)"
|
|
||||||
+ " REFERENCES contacts (contactId)"
|
|
||||||
+ " ON DELETE CASCADE,"
|
|
||||||
+ " FOREIGN KEY (transportId)"
|
|
||||||
+ " REFERENCES transports (transportId)"
|
|
||||||
+ " ON DELETE CASCADE)";
|
|
||||||
|
|
||||||
private static final String CREATE_CONTACT_TRANSPORT_PROPS =
|
|
||||||
"CREATE TABLE contactTransportProperties"
|
|
||||||
+ " (contactId INT NOT NULL,"
|
|
||||||
+ " transportId VARCHAR NOT NULL," // Not a foreign key
|
|
||||||
+ " key VARCHAR NOT NULL,"
|
|
||||||
+ " value VARCHAR NOT NULL,"
|
|
||||||
+ " PRIMARY KEY (contactId, transportId, key),"
|
|
||||||
+ " FOREIGN KEY (contactId)"
|
|
||||||
+ " REFERENCES contacts (contactId)"
|
|
||||||
+ " ON DELETE CASCADE)";
|
|
||||||
|
|
||||||
private static final String CREATE_CONTACT_TRANSPORT_VERSIONS =
|
|
||||||
"CREATE TABLE contactTransportVersions"
|
|
||||||
+ " (contactId INT NOT NULL,"
|
|
||||||
+ " transportId VARCHAR NOT NULL," // Not a foreign key
|
|
||||||
+ " remoteVersion BIGINT NOT NULL,"
|
|
||||||
+ " remoteAcked BOOLEAN NOT NULL,"
|
|
||||||
+ " PRIMARY KEY (contactId, transportId),"
|
|
||||||
+ " FOREIGN KEY (contactId)"
|
|
||||||
+ " REFERENCES contacts (contactId)"
|
|
||||||
+ " ON DELETE CASCADE)";
|
|
||||||
|
|
||||||
private static final String CREATE_INCOMING_KEYS =
|
private static final String CREATE_INCOMING_KEYS =
|
||||||
"CREATE TABLE incomingKeys"
|
"CREATE TABLE incomingKeys"
|
||||||
+ " (contactId INT NOT NULL,"
|
+ " (contactId INT NOT NULL,"
|
||||||
@@ -405,11 +344,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
s.executeUpdate(insertTypeNames(CREATE_OFFERS));
|
s.executeUpdate(insertTypeNames(CREATE_OFFERS));
|
||||||
s.executeUpdate(insertTypeNames(CREATE_STATUSES));
|
s.executeUpdate(insertTypeNames(CREATE_STATUSES));
|
||||||
s.executeUpdate(insertTypeNames(CREATE_TRANSPORTS));
|
s.executeUpdate(insertTypeNames(CREATE_TRANSPORTS));
|
||||||
s.executeUpdate(insertTypeNames(CREATE_TRANSPORT_CONFIGS));
|
|
||||||
s.executeUpdate(insertTypeNames(CREATE_TRANSPORT_PROPS));
|
|
||||||
s.executeUpdate(insertTypeNames(CREATE_TRANSPORT_VERSIONS));
|
|
||||||
s.executeUpdate(insertTypeNames(CREATE_CONTACT_TRANSPORT_PROPS));
|
|
||||||
s.executeUpdate(insertTypeNames(CREATE_CONTACT_TRANSPORT_VERSIONS));
|
|
||||||
s.executeUpdate(insertTypeNames(CREATE_INCOMING_KEYS));
|
s.executeUpdate(insertTypeNames(CREATE_INCOMING_KEYS));
|
||||||
s.executeUpdate(insertTypeNames(CREATE_OUTGOING_KEYS));
|
s.executeUpdate(insertTypeNames(CREATE_OUTGOING_KEYS));
|
||||||
s.close();
|
s.close();
|
||||||
@@ -629,31 +563,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
affected = ps.executeUpdate();
|
affected = ps.executeUpdate();
|
||||||
if (affected != 1) throw new DbStateException();
|
if (affected != 1) throw new DbStateException();
|
||||||
ps.close();
|
ps.close();
|
||||||
// Create a transport version row for each local transport
|
|
||||||
sql = "SELECT transportId FROM transports";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
rs = ps.executeQuery();
|
|
||||||
Collection<String> transports = new ArrayList<String>();
|
|
||||||
while (rs.next()) transports.add(rs.getString(1));
|
|
||||||
rs.close();
|
|
||||||
ps.close();
|
|
||||||
if (transports.isEmpty()) return c;
|
|
||||||
sql = "INSERT INTO transportVersions (contactId, transportId,"
|
|
||||||
+ " localVersion, localAcked, expiry, txCount)"
|
|
||||||
+ " VALUES (?, ?, 1, 0, 0, 0)";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(1, c.getInt());
|
|
||||||
for (String t : transports) {
|
|
||||||
ps.setString(2, t);
|
|
||||||
ps.addBatch();
|
|
||||||
}
|
|
||||||
int[] batchAffected = ps.executeBatch();
|
|
||||||
if (batchAffected.length != transports.size())
|
|
||||||
throw new DbStateException();
|
|
||||||
for (int i = 0; i < batchAffected.length; i++) {
|
|
||||||
if (batchAffected[i] != 1) throw new DbStateException();
|
|
||||||
}
|
|
||||||
ps.close();
|
|
||||||
return c;
|
return c;
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
tryToClose(rs);
|
tryToClose(rs);
|
||||||
@@ -851,30 +760,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
int affected = ps.executeUpdate();
|
int affected = ps.executeUpdate();
|
||||||
if (affected != 1) throw new DbStateException();
|
if (affected != 1) throw new DbStateException();
|
||||||
ps.close();
|
ps.close();
|
||||||
// Create a transport version row for each contact
|
|
||||||
sql = "SELECT contactId FROM contacts";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
rs = ps.executeQuery();
|
|
||||||
Collection<Integer> contacts = new ArrayList<Integer>();
|
|
||||||
while (rs.next()) contacts.add(rs.getInt(1));
|
|
||||||
rs.close();
|
|
||||||
ps.close();
|
|
||||||
if (contacts.isEmpty()) return true;
|
|
||||||
sql = "INSERT INTO transportVersions (contactId, transportId,"
|
|
||||||
+ " localVersion, localAcked, expiry, txCount)"
|
|
||||||
+ " VALUES (?, ?, 1, 0, 0, 0)";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setString(2, t.getString());
|
|
||||||
for (Integer c : contacts) {
|
|
||||||
ps.setInt(1, c);
|
|
||||||
ps.addBatch();
|
|
||||||
}
|
|
||||||
int[] batchAffected = ps.executeBatch();
|
|
||||||
if (batchAffected.length != contacts.size())
|
|
||||||
throw new DbStateException();
|
|
||||||
for (int i = 0; i < batchAffected.length; i++) {
|
|
||||||
if (batchAffected[i] != 1) throw new DbStateException();
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
tryToClose(ps);
|
tryToClose(ps);
|
||||||
@@ -1415,62 +1300,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<TransportId, TransportProperties> getLocalProperties(
|
|
||||||
Connection txn) throws DbException {
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
ResultSet rs = null;
|
|
||||||
try {
|
|
||||||
String sql = "SELECT transportId, key, value"
|
|
||||||
+ " FROM transportProperties"
|
|
||||||
+ " ORDER BY transportId";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
rs = ps.executeQuery();
|
|
||||||
Map<TransportId, TransportProperties> properties =
|
|
||||||
new HashMap<TransportId, TransportProperties>();
|
|
||||||
TransportId lastId = null;
|
|
||||||
TransportProperties p = null;
|
|
||||||
while (rs.next()) {
|
|
||||||
TransportId id = new TransportId(rs.getString(1));
|
|
||||||
String key = rs.getString(2), value = rs.getString(3);
|
|
||||||
if (!id.equals(lastId)) {
|
|
||||||
p = new TransportProperties();
|
|
||||||
properties.put(id, p);
|
|
||||||
lastId = id;
|
|
||||||
}
|
|
||||||
p.put(key, value);
|
|
||||||
}
|
|
||||||
rs.close();
|
|
||||||
ps.close();
|
|
||||||
return Collections.unmodifiableMap(properties);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
tryToClose(rs);
|
|
||||||
tryToClose(ps);
|
|
||||||
throw new DbException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public TransportProperties getLocalProperties(Connection txn, TransportId t)
|
|
||||||
throws DbException {
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
ResultSet rs = null;
|
|
||||||
try {
|
|
||||||
String sql = "SELECT key, value FROM transportProperties"
|
|
||||||
+ " WHERE transportId = ?";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setString(1, t.getString());
|
|
||||||
rs = ps.executeQuery();
|
|
||||||
TransportProperties p = new TransportProperties();
|
|
||||||
while (rs.next()) p.put(rs.getString(1), rs.getString(2));
|
|
||||||
rs.close();
|
|
||||||
ps.close();
|
|
||||||
return p;
|
|
||||||
} catch (SQLException e) {
|
|
||||||
tryToClose(rs);
|
|
||||||
tryToClose(ps);
|
|
||||||
throw new DbException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<MessageId, Metadata> getMessageMetadata(Connection txn,
|
public Map<MessageId, Metadata> getMessageMetadata(Connection txn,
|
||||||
GroupId g) throws DbException {
|
GroupId g) throws DbException {
|
||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
@@ -1773,42 +1602,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<ContactId, TransportProperties> getRemoteProperties(
|
|
||||||
Connection txn, TransportId t) throws DbException {
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
ResultSet rs = null;
|
|
||||||
try {
|
|
||||||
String sql = "SELECT contactId, key, value"
|
|
||||||
+ " FROM contactTransportProperties"
|
|
||||||
+ " WHERE transportId = ?"
|
|
||||||
+ " ORDER BY contactId";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setString(1, t.getString());
|
|
||||||
rs = ps.executeQuery();
|
|
||||||
Map<ContactId, TransportProperties> properties =
|
|
||||||
new HashMap<ContactId, TransportProperties>();
|
|
||||||
ContactId lastId = null;
|
|
||||||
TransportProperties p = null;
|
|
||||||
while (rs.next()) {
|
|
||||||
ContactId id = new ContactId(rs.getInt(1));
|
|
||||||
String key = rs.getString(2), value = rs.getString(3);
|
|
||||||
if (!id.equals(lastId)) {
|
|
||||||
p = new TransportProperties();
|
|
||||||
properties.put(id, p);
|
|
||||||
lastId = id;
|
|
||||||
}
|
|
||||||
p.put(key, value);
|
|
||||||
}
|
|
||||||
rs.close();
|
|
||||||
ps.close();
|
|
||||||
return Collections.unmodifiableMap(properties);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
tryToClose(rs);
|
|
||||||
tryToClose(ps);
|
|
||||||
throw new DbException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Collection<MessageId> getRequestedMessagesToSend(Connection txn,
|
public Collection<MessageId> getRequestedMessagesToSend(Connection txn,
|
||||||
ContactId c, int maxLength) throws DbException {
|
ContactId c, int maxLength) throws DbException {
|
||||||
long now = clock.currentTimeMillis();
|
long now = clock.currentTimeMillis();
|
||||||
@@ -1996,48 +1789,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<TransportAck> getTransportAcks(Connection txn,
|
|
||||||
ContactId c) throws DbException {
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
ResultSet rs = null;
|
|
||||||
try {
|
|
||||||
String sql = "SELECT transportId, remoteVersion"
|
|
||||||
+ " FROM contactTransportVersions"
|
|
||||||
+ " WHERE contactId = ? AND remoteAcked = FALSE";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(1, c.getInt());
|
|
||||||
rs = ps.executeQuery();
|
|
||||||
List<TransportAck> acks = new ArrayList<TransportAck>();
|
|
||||||
while (rs.next()) {
|
|
||||||
TransportId id = new TransportId(rs.getString(1));
|
|
||||||
acks.add(new TransportAck(id, rs.getLong(2)));
|
|
||||||
}
|
|
||||||
rs.close();
|
|
||||||
ps.close();
|
|
||||||
if (acks.isEmpty()) return null;
|
|
||||||
sql = "UPDATE contactTransportVersions SET remoteAcked = TRUE"
|
|
||||||
+ " WHERE contactId = ? AND transportId = ?";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(1, c.getInt());
|
|
||||||
for (TransportAck a : acks) {
|
|
||||||
ps.setString(2, a.getId().getString());
|
|
||||||
ps.addBatch();
|
|
||||||
}
|
|
||||||
int[] batchAffected = ps.executeBatch();
|
|
||||||
if (batchAffected.length != acks.size())
|
|
||||||
throw new DbStateException();
|
|
||||||
for (int i = 0; i < batchAffected.length; i++) {
|
|
||||||
if (batchAffected[i] != 1) throw new DbStateException();
|
|
||||||
}
|
|
||||||
ps.close();
|
|
||||||
return Collections.unmodifiableList(acks);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
tryToClose(ps);
|
|
||||||
tryToClose(rs);
|
|
||||||
throw new DbException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<ContactId, TransportKeys> getTransportKeys(Connection txn,
|
public Map<ContactId, TransportKeys> getTransportKeys(Connection txn,
|
||||||
TransportId t) throws DbException {
|
TransportId t) throws DbException {
|
||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
@@ -2123,72 +1874,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<TransportUpdate> getTransportUpdates(Connection txn,
|
|
||||||
ContactId c, int maxLatency) throws DbException {
|
|
||||||
long now = clock.currentTimeMillis();
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
ResultSet rs = null;
|
|
||||||
try {
|
|
||||||
String sql = "SELECT tp.transportId, key, value, localVersion,"
|
|
||||||
+ " txCount"
|
|
||||||
+ " FROM transportProperties AS tp"
|
|
||||||
+ " JOIN transportVersions AS tv"
|
|
||||||
+ " ON tp.transportId = tv.transportId"
|
|
||||||
+ " WHERE tv.contactId = ?"
|
|
||||||
+ " AND localVersion > localAcked"
|
|
||||||
+ " AND expiry < ?"
|
|
||||||
+ " ORDER BY tp.transportId";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(1, c.getInt());
|
|
||||||
ps.setLong(2, now);
|
|
||||||
rs = ps.executeQuery();
|
|
||||||
List<TransportUpdate> updates = new ArrayList<TransportUpdate>();
|
|
||||||
TransportId lastId = null;
|
|
||||||
TransportProperties p = null;
|
|
||||||
List<Integer> txCounts = new ArrayList<Integer>();
|
|
||||||
while (rs.next()) {
|
|
||||||
TransportId id = new TransportId(rs.getString(1));
|
|
||||||
String key = rs.getString(2), value = rs.getString(3);
|
|
||||||
long version = rs.getLong(4);
|
|
||||||
int txCount = rs.getInt(5);
|
|
||||||
if (!id.equals(lastId)) {
|
|
||||||
p = new TransportProperties();
|
|
||||||
updates.add(new TransportUpdate(id, p, version));
|
|
||||||
txCounts.add(txCount);
|
|
||||||
lastId = id;
|
|
||||||
}
|
|
||||||
p.put(key, value);
|
|
||||||
}
|
|
||||||
rs.close();
|
|
||||||
ps.close();
|
|
||||||
if (updates.isEmpty()) return null;
|
|
||||||
sql = "UPDATE transportVersions"
|
|
||||||
+ " SET expiry = ?, txCount = txCount + 1"
|
|
||||||
+ " WHERE contactId = ? AND transportId = ?";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(2, c.getInt());
|
|
||||||
int i = 0;
|
|
||||||
for (TransportUpdate u : updates) {
|
|
||||||
int txCount = txCounts.get(i++);
|
|
||||||
ps.setLong(1, calculateExpiry(now, maxLatency, txCount));
|
|
||||||
ps.setString(3, u.getId().getString());
|
|
||||||
ps.addBatch();
|
|
||||||
}
|
|
||||||
int[] batchAffected = ps.executeBatch();
|
|
||||||
if (batchAffected.length != updates.size())
|
|
||||||
throw new DbStateException();
|
|
||||||
for (i = 0; i < batchAffected.length; i++) {
|
|
||||||
if (batchAffected[i] != 1) throw new DbStateException();
|
|
||||||
}
|
|
||||||
ps.close();
|
|
||||||
return Collections.unmodifiableList(updates);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
tryToClose(ps);
|
|
||||||
tryToClose(rs);
|
|
||||||
throw new DbException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Collection<ContactId> getVisibility(Connection txn, GroupId g)
|
public Collection<ContactId> getVisibility(Connection txn, GroupId g)
|
||||||
throws DbException {
|
throws DbException {
|
||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
@@ -2282,73 +1967,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mergeLocalProperties(Connection txn, TransportId t,
|
|
||||||
TransportProperties p) throws DbException {
|
|
||||||
// Merge the new properties with the existing ones
|
|
||||||
mergeStringMap(txn, t, p, "transportProperties");
|
|
||||||
// Bump the transport version
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
try {
|
|
||||||
String sql = "UPDATE transportVersions"
|
|
||||||
+ " SET localVersion = localVersion + 1, expiry = 0"
|
|
||||||
+ " WHERE transportId = ?";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setString(1, t.getString());
|
|
||||||
ps.executeUpdate();
|
|
||||||
ps.close();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
tryToClose(ps);
|
|
||||||
throw new DbException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void mergeStringMap(Connection txn, TransportId t,
|
|
||||||
Map<String, String> m, String tableName) throws DbException {
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
try {
|
|
||||||
// Update any properties that already exist
|
|
||||||
String sql = "UPDATE " + tableName + " SET value = ?"
|
|
||||||
+ " WHERE transportId = ? AND key = ?";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setString(2, t.getString());
|
|
||||||
for (Entry<String, String> e : m.entrySet()) {
|
|
||||||
ps.setString(1, e.getValue());
|
|
||||||
ps.setString(3, e.getKey());
|
|
||||||
ps.addBatch();
|
|
||||||
}
|
|
||||||
int[] batchAffected = ps.executeBatch();
|
|
||||||
if (batchAffected.length != m.size()) throw new DbStateException();
|
|
||||||
for (int i = 0; i < batchAffected.length; i++) {
|
|
||||||
if (batchAffected[i] < 0) throw new DbStateException();
|
|
||||||
if (batchAffected[i] > 1) throw new DbStateException();
|
|
||||||
}
|
|
||||||
// Insert any properties that don't already exist
|
|
||||||
sql = "INSERT INTO " + tableName + " (transportId, key, value)"
|
|
||||||
+ " VALUES (?, ?, ?)";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setString(1, t.getString());
|
|
||||||
int updateIndex = 0, inserted = 0;
|
|
||||||
for (Entry<String, String> e : m.entrySet()) {
|
|
||||||
if (batchAffected[updateIndex] == 0) {
|
|
||||||
ps.setString(2, e.getKey());
|
|
||||||
ps.setString(3, e.getValue());
|
|
||||||
ps.addBatch();
|
|
||||||
inserted++;
|
|
||||||
}
|
|
||||||
updateIndex++;
|
|
||||||
}
|
|
||||||
batchAffected = ps.executeBatch();
|
|
||||||
if (batchAffected.length != inserted) throw new DbStateException();
|
|
||||||
for (int i = 0; i < batchAffected.length; i++) {
|
|
||||||
if (batchAffected[i] != 1) throw new DbStateException();
|
|
||||||
}
|
|
||||||
ps.close();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
tryToClose(ps);
|
|
||||||
throw new DbException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mergeGroupMetadata(Connection txn, GroupId g, Metadata meta)
|
public void mergeGroupMetadata(Connection txn, GroupId g, Metadata meta)
|
||||||
throws DbException {
|
throws DbException {
|
||||||
mergeMetadata(txn, g.getBytes(), meta, "groupMetadata", "groupId");
|
mergeMetadata(txn, g.getBytes(), meta, "groupMetadata", "groupId");
|
||||||
@@ -2894,127 +2512,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRemoteProperties(Connection txn, ContactId c,
|
|
||||||
Map<TransportId, TransportProperties> p) throws DbException {
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
try {
|
|
||||||
// Delete the existing properties, if any
|
|
||||||
String sql = "DELETE FROM contactTransportProperties"
|
|
||||||
+ " WHERE contactId = ?";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(1, c.getInt());
|
|
||||||
ps.executeUpdate();
|
|
||||||
ps.close();
|
|
||||||
// Store the new properties
|
|
||||||
sql = "INSERT INTO contactTransportProperties"
|
|
||||||
+ " (contactId, transportId, key, value)"
|
|
||||||
+ " VALUES (?, ?, ?, ?)";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(1, c.getInt());
|
|
||||||
int batchSize = 0;
|
|
||||||
for (Entry<TransportId, TransportProperties> e : p.entrySet()) {
|
|
||||||
ps.setString(2, e.getKey().getString());
|
|
||||||
for (Entry<String, String> e1 : e.getValue().entrySet()) {
|
|
||||||
ps.setString(3, e1.getKey());
|
|
||||||
ps.setString(4, e1.getValue());
|
|
||||||
ps.addBatch();
|
|
||||||
batchSize++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int[] batchAffected = ps.executeBatch();
|
|
||||||
if (batchAffected.length != batchSize) throw new DbStateException();
|
|
||||||
for (int i = 0; i < batchAffected.length; i++) {
|
|
||||||
if (batchAffected[i] != 1) throw new DbStateException();
|
|
||||||
}
|
|
||||||
ps.close();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
tryToClose(ps);
|
|
||||||
throw new DbException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean setRemoteProperties(Connection txn, ContactId c,
|
|
||||||
TransportId t, TransportProperties p, long version)
|
|
||||||
throws DbException {
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
ResultSet rs = null;
|
|
||||||
try {
|
|
||||||
// Find the existing version, if any
|
|
||||||
String sql = "SELECT NULL FROM contactTransportVersions"
|
|
||||||
+ " WHERE contactId = ? AND transportId = ?";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(1, c.getInt());
|
|
||||||
ps.setString(2, t.getString());
|
|
||||||
rs = ps.executeQuery();
|
|
||||||
boolean found = rs.next();
|
|
||||||
if (rs.next()) throw new DbStateException();
|
|
||||||
rs.close();
|
|
||||||
ps.close();
|
|
||||||
// Mark the update as needing to be acked
|
|
||||||
if (found) {
|
|
||||||
// The row exists - update it
|
|
||||||
sql = "UPDATE contactTransportVersions"
|
|
||||||
+ " SET remoteVersion = ?, remoteAcked = FALSE"
|
|
||||||
+ " WHERE contactId = ? AND transportId = ?"
|
|
||||||
+ " AND remoteVersion < ?";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setLong(1, version);
|
|
||||||
ps.setInt(2, c.getInt());
|
|
||||||
ps.setString(3, t.getString());
|
|
||||||
ps.setLong(4, version);
|
|
||||||
int affected = ps.executeUpdate();
|
|
||||||
if (affected < 0 || affected > 1) throw new DbStateException();
|
|
||||||
ps.close();
|
|
||||||
// Return false if the update is obsolete
|
|
||||||
if (affected == 0) return false;
|
|
||||||
} else {
|
|
||||||
// The row doesn't exist - create it
|
|
||||||
sql = "INSERT INTO contactTransportVersions (contactId,"
|
|
||||||
+ " transportId, remoteVersion, remoteAcked)"
|
|
||||||
+ " VALUES (?, ?, ?, FALSE)";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(1, c.getInt());
|
|
||||||
ps.setString(2, t.getString());
|
|
||||||
ps.setLong(3, version);
|
|
||||||
int affected = ps.executeUpdate();
|
|
||||||
if (affected != 1) throw new DbStateException();
|
|
||||||
ps.close();
|
|
||||||
}
|
|
||||||
// Delete the existing properties, if any
|
|
||||||
sql = "DELETE FROM contactTransportProperties"
|
|
||||||
+ " WHERE contactId = ? AND transportId = ?";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(1, c.getInt());
|
|
||||||
ps.setString(2, t.getString());
|
|
||||||
ps.executeUpdate();
|
|
||||||
ps.close();
|
|
||||||
// Store the new properties, if any
|
|
||||||
if (p.isEmpty()) return true;
|
|
||||||
sql = "INSERT INTO contactTransportProperties"
|
|
||||||
+ " (contactId, transportId, key, value)"
|
|
||||||
+ " VALUES (?, ?, ?, ?)";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setInt(1, c.getInt());
|
|
||||||
ps.setString(2, t.getString());
|
|
||||||
for (Entry<String, String> e : p.entrySet()) {
|
|
||||||
ps.setString(3, e.getKey());
|
|
||||||
ps.setString(4, e.getValue());
|
|
||||||
ps.addBatch();
|
|
||||||
}
|
|
||||||
int[] batchAffected = ps.executeBatch();
|
|
||||||
if (batchAffected.length != p.size()) throw new DbStateException();
|
|
||||||
for (int i = 0; i < batchAffected.length; i++) {
|
|
||||||
if (batchAffected[i] != 1) throw new DbStateException();
|
|
||||||
}
|
|
||||||
ps.close();
|
|
||||||
return true;
|
|
||||||
} catch (SQLException e) {
|
|
||||||
tryToClose(ps);
|
|
||||||
tryToClose(rs);
|
|
||||||
throw new DbException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSubscriptionUpdateAcked(Connection txn, ContactId c,
|
public void setSubscriptionUpdateAcked(Connection txn, ContactId c,
|
||||||
long version) throws DbException {
|
long version) throws DbException {
|
||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
@@ -3036,28 +2533,6 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTransportUpdateAcked(Connection txn, ContactId c,
|
|
||||||
TransportId t, long version) throws DbException {
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
try {
|
|
||||||
String sql = "UPDATE transportVersions SET localAcked = ?"
|
|
||||||
+ " WHERE contactId = ? AND transportId = ?"
|
|
||||||
+ " AND localAcked < ? AND localVersion >= ?";
|
|
||||||
ps = txn.prepareStatement(sql);
|
|
||||||
ps.setLong(1, version);
|
|
||||||
ps.setInt(2, c.getInt());
|
|
||||||
ps.setString(3, t.getString());
|
|
||||||
ps.setLong(4, version);
|
|
||||||
ps.setLong(5, version);
|
|
||||||
int affected = ps.executeUpdate();
|
|
||||||
if (affected < 0 || affected > 1) throw new DbStateException();
|
|
||||||
ps.close();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
tryToClose(ps);
|
|
||||||
throw new DbException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setVisibleToAll(Connection txn, GroupId g, boolean all)
|
public void setVisibleToAll(Connection txn, GroupId g, boolean all)
|
||||||
throws DbException {
|
throws DbException {
|
||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import org.briarproject.api.db.DatabaseComponent;
|
|||||||
import org.briarproject.api.db.DbException;
|
import org.briarproject.api.db.DbException;
|
||||||
import org.briarproject.api.property.TransportPropertyManager;
|
import org.briarproject.api.property.TransportPropertyManager;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
// Temporary facade during sync protocol refactoring
|
// Temporary facade during sync protocol refactoring
|
||||||
@@ -24,30 +25,33 @@ class TransportPropertyManagerImpl implements TransportPropertyManager {
|
|||||||
@Override
|
@Override
|
||||||
public Map<TransportId, TransportProperties> getLocalProperties()
|
public Map<TransportId, TransportProperties> getLocalProperties()
|
||||||
throws DbException {
|
throws DbException {
|
||||||
return db.getLocalProperties();
|
// TODO
|
||||||
|
return Collections.emptyMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TransportProperties getLocalProperties(TransportId t)
|
public TransportProperties getLocalProperties(TransportId t)
|
||||||
throws DbException {
|
throws DbException {
|
||||||
return db.getLocalProperties(t);
|
// TODO
|
||||||
|
return new TransportProperties();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ContactId, TransportProperties> getRemoteProperties(
|
public Map<ContactId, TransportProperties> getRemoteProperties(
|
||||||
TransportId t) throws DbException {
|
TransportId t) throws DbException {
|
||||||
return db.getRemoteProperties(t);
|
// TODO
|
||||||
|
return Collections.emptyMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mergeLocalProperties(TransportId t, TransportProperties p)
|
public void mergeLocalProperties(TransportId t, TransportProperties p)
|
||||||
throws DbException {
|
throws DbException {
|
||||||
db.mergeLocalProperties(t, p);
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRemoteProperties(ContactId c,
|
public void setRemoteProperties(ContactId c,
|
||||||
Map<TransportId, TransportProperties> p) throws DbException {
|
Map<TransportId, TransportProperties> p) throws DbException {
|
||||||
db.setRemoteProperties(c, p);
|
// TODO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,13 +9,11 @@ import org.briarproject.api.event.Event;
|
|||||||
import org.briarproject.api.event.EventBus;
|
import org.briarproject.api.event.EventBus;
|
||||||
import org.briarproject.api.event.EventListener;
|
import org.briarproject.api.event.EventListener;
|
||||||
import org.briarproject.api.event.LocalSubscriptionsUpdatedEvent;
|
import org.briarproject.api.event.LocalSubscriptionsUpdatedEvent;
|
||||||
import org.briarproject.api.event.LocalTransportsUpdatedEvent;
|
|
||||||
import org.briarproject.api.event.MessageRequestedEvent;
|
import org.briarproject.api.event.MessageRequestedEvent;
|
||||||
import org.briarproject.api.event.MessageToAckEvent;
|
import org.briarproject.api.event.MessageToAckEvent;
|
||||||
import org.briarproject.api.event.MessageToRequestEvent;
|
import org.briarproject.api.event.MessageToRequestEvent;
|
||||||
import org.briarproject.api.event.MessageValidatedEvent;
|
import org.briarproject.api.event.MessageValidatedEvent;
|
||||||
import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
|
import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
|
||||||
import org.briarproject.api.event.RemoteTransportsUpdatedEvent;
|
|
||||||
import org.briarproject.api.event.ShutdownEvent;
|
import org.briarproject.api.event.ShutdownEvent;
|
||||||
import org.briarproject.api.event.TransportRemovedEvent;
|
import org.briarproject.api.event.TransportRemovedEvent;
|
||||||
import org.briarproject.api.sync.Ack;
|
import org.briarproject.api.sync.Ack;
|
||||||
@@ -25,8 +23,6 @@ import org.briarproject.api.sync.Request;
|
|||||||
import org.briarproject.api.sync.SubscriptionAck;
|
import org.briarproject.api.sync.SubscriptionAck;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.SyncSession;
|
import org.briarproject.api.sync.SyncSession;
|
||||||
import org.briarproject.api.sync.TransportAck;
|
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
import org.briarproject.api.system.Clock;
|
import org.briarproject.api.system.Clock;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -91,8 +87,6 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
|
|||||||
eventBus.addListener(this);
|
eventBus.addListener(this);
|
||||||
try {
|
try {
|
||||||
// Start a query for each type of packet, in order of urgency
|
// Start a query for each type of packet, in order of urgency
|
||||||
dbExecutor.execute(new GenerateTransportAcks());
|
|
||||||
dbExecutor.execute(new GenerateTransportUpdates());
|
|
||||||
dbExecutor.execute(new GenerateSubscriptionAck());
|
dbExecutor.execute(new GenerateSubscriptionAck());
|
||||||
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
||||||
dbExecutor.execute(new GenerateAck());
|
dbExecutor.execute(new GenerateAck());
|
||||||
@@ -123,7 +117,6 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
|
|||||||
now = clock.currentTimeMillis();
|
now = clock.currentTimeMillis();
|
||||||
if (now >= nextRetxQuery) {
|
if (now >= nextRetxQuery) {
|
||||||
// Check for retransmittable packets
|
// Check for retransmittable packets
|
||||||
dbExecutor.execute(new GenerateTransportUpdates());
|
|
||||||
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
||||||
dbExecutor.execute(new GenerateBatch());
|
dbExecutor.execute(new GenerateBatch());
|
||||||
dbExecutor.execute(new GenerateOffer());
|
dbExecutor.execute(new GenerateOffer());
|
||||||
@@ -171,8 +164,6 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
|
|||||||
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
||||||
dbExecutor.execute(new GenerateOffer());
|
dbExecutor.execute(new GenerateOffer());
|
||||||
}
|
}
|
||||||
} else if (e instanceof LocalTransportsUpdatedEvent) {
|
|
||||||
dbExecutor.execute(new GenerateTransportUpdates());
|
|
||||||
} else if (e instanceof MessageRequestedEvent) {
|
} else if (e instanceof MessageRequestedEvent) {
|
||||||
if (((MessageRequestedEvent) e).getContactId().equals(contactId))
|
if (((MessageRequestedEvent) e).getContactId().equals(contactId))
|
||||||
dbExecutor.execute(new GenerateBatch());
|
dbExecutor.execute(new GenerateBatch());
|
||||||
@@ -189,11 +180,6 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
|
|||||||
dbExecutor.execute(new GenerateSubscriptionAck());
|
dbExecutor.execute(new GenerateSubscriptionAck());
|
||||||
dbExecutor.execute(new GenerateOffer());
|
dbExecutor.execute(new GenerateOffer());
|
||||||
}
|
}
|
||||||
} else if (e instanceof RemoteTransportsUpdatedEvent) {
|
|
||||||
RemoteTransportsUpdatedEvent r =
|
|
||||||
(RemoteTransportsUpdatedEvent) e;
|
|
||||||
if (r.getContactId().equals(contactId))
|
|
||||||
dbExecutor.execute(new GenerateTransportAcks());
|
|
||||||
} else if (e instanceof ShutdownEvent) {
|
} else if (e instanceof ShutdownEvent) {
|
||||||
interrupt();
|
interrupt();
|
||||||
} else if (e instanceof TransportRemovedEvent) {
|
} else if (e instanceof TransportRemovedEvent) {
|
||||||
@@ -414,76 +400,4 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
|
|||||||
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This task runs on the database thread
|
|
||||||
private class GenerateTransportAcks implements Runnable {
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
if (interrupted) return;
|
|
||||||
try {
|
|
||||||
Collection<TransportAck> acks =
|
|
||||||
db.generateTransportAcks(contactId);
|
|
||||||
if (LOG.isLoggable(INFO))
|
|
||||||
LOG.info("Generated transport acks: " + (acks != null));
|
|
||||||
if (acks != null) writerTasks.add(new WriteTransportAcks(acks));
|
|
||||||
} catch (DbException e) {
|
|
||||||
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
|
|
||||||
interrupt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This tasks runs on the writer thread
|
|
||||||
private class WriteTransportAcks implements ThrowingRunnable<IOException> {
|
|
||||||
|
|
||||||
private final Collection<TransportAck> acks;
|
|
||||||
|
|
||||||
private WriteTransportAcks(Collection<TransportAck> acks) {
|
|
||||||
this.acks = acks;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() throws IOException {
|
|
||||||
if (interrupted) return;
|
|
||||||
for (TransportAck a : acks) packetWriter.writeTransportAck(a);
|
|
||||||
LOG.info("Sent transport acks");
|
|
||||||
dbExecutor.execute(new GenerateTransportAcks());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This task runs on the database thread
|
|
||||||
private class GenerateTransportUpdates implements Runnable {
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
if (interrupted) return;
|
|
||||||
try {
|
|
||||||
Collection<TransportUpdate> t =
|
|
||||||
db.generateTransportUpdates(contactId, maxLatency);
|
|
||||||
if (LOG.isLoggable(INFO))
|
|
||||||
LOG.info("Generated transport updates: " + (t != null));
|
|
||||||
if (t != null) writerTasks.add(new WriteTransportUpdates(t));
|
|
||||||
} catch (DbException e) {
|
|
||||||
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
|
|
||||||
interrupt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This task runs on the writer thread
|
|
||||||
private class WriteTransportUpdates
|
|
||||||
implements ThrowingRunnable<IOException> {
|
|
||||||
|
|
||||||
private final Collection<TransportUpdate> updates;
|
|
||||||
|
|
||||||
private WriteTransportUpdates(Collection<TransportUpdate> updates) {
|
|
||||||
this.updates = updates;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() throws IOException {
|
|
||||||
if (interrupted) return;
|
|
||||||
for (TransportUpdate u : updates)
|
|
||||||
packetWriter.writeTransportUpdate(u);
|
|
||||||
LOG.info("Sent transport updates");
|
|
||||||
dbExecutor.execute(new GenerateTransportUpdates());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,6 @@ import org.briarproject.api.sync.Request;
|
|||||||
import org.briarproject.api.sync.SubscriptionAck;
|
import org.briarproject.api.sync.SubscriptionAck;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.SyncSession;
|
import org.briarproject.api.sync.SyncSession;
|
||||||
import org.briarproject.api.sync.TransportAck;
|
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
@@ -77,12 +75,6 @@ class IncomingSession implements SyncSession, EventListener {
|
|||||||
} else if (packetReader.hasSubscriptionUpdate()) {
|
} else if (packetReader.hasSubscriptionUpdate()) {
|
||||||
SubscriptionUpdate u = packetReader.readSubscriptionUpdate();
|
SubscriptionUpdate u = packetReader.readSubscriptionUpdate();
|
||||||
dbExecutor.execute(new ReceiveSubscriptionUpdate(u));
|
dbExecutor.execute(new ReceiveSubscriptionUpdate(u));
|
||||||
} else if (packetReader.hasTransportAck()) {
|
|
||||||
TransportAck a = packetReader.readTransportAck();
|
|
||||||
dbExecutor.execute(new ReceiveTransportAck(a));
|
|
||||||
} else if (packetReader.hasTransportUpdate()) {
|
|
||||||
TransportUpdate u = packetReader.readTransportUpdate();
|
|
||||||
dbExecutor.execute(new ReceiveTransportUpdate(u));
|
|
||||||
} else {
|
} else {
|
||||||
throw new FormatException();
|
throw new FormatException();
|
||||||
}
|
}
|
||||||
@@ -216,40 +208,4 @@ class IncomingSession implements SyncSession, EventListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ReceiveTransportAck implements Runnable {
|
|
||||||
|
|
||||||
private final TransportAck ack;
|
|
||||||
|
|
||||||
private ReceiveTransportAck(TransportAck ack) {
|
|
||||||
this.ack = ack;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
db.receiveTransportAck(contactId, ack);
|
|
||||||
} catch (DbException e) {
|
|
||||||
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
|
|
||||||
interrupt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ReceiveTransportUpdate implements Runnable {
|
|
||||||
|
|
||||||
private final TransportUpdate update;
|
|
||||||
|
|
||||||
private ReceiveTransportUpdate(TransportUpdate update) {
|
|
||||||
this.update = update;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
db.receiveTransportUpdate(contactId, update);
|
|
||||||
} catch (DbException e) {
|
|
||||||
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
|
|
||||||
interrupt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package org.briarproject.sync;
|
package org.briarproject.sync;
|
||||||
|
|
||||||
import org.briarproject.api.FormatException;
|
import org.briarproject.api.FormatException;
|
||||||
import org.briarproject.api.TransportId;
|
|
||||||
import org.briarproject.api.TransportProperties;
|
|
||||||
import org.briarproject.api.UniqueId;
|
import org.briarproject.api.UniqueId;
|
||||||
import org.briarproject.api.crypto.CryptoComponent;
|
import org.briarproject.api.crypto.CryptoComponent;
|
||||||
import org.briarproject.api.data.BdfReader;
|
import org.briarproject.api.data.BdfReader;
|
||||||
@@ -17,8 +15,6 @@ import org.briarproject.api.sync.PacketReader;
|
|||||||
import org.briarproject.api.sync.Request;
|
import org.briarproject.api.sync.Request;
|
||||||
import org.briarproject.api.sync.SubscriptionAck;
|
import org.briarproject.api.sync.SubscriptionAck;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.TransportAck;
|
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
import org.briarproject.util.ByteUtils;
|
import org.briarproject.util.ByteUtils;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
@@ -26,21 +22,14 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static org.briarproject.api.TransportPropertyConstants.MAX_PROPERTIES_PER_TRANSPORT;
|
|
||||||
import static org.briarproject.api.TransportPropertyConstants.MAX_PROPERTY_LENGTH;
|
|
||||||
import static org.briarproject.api.TransportPropertyConstants.MAX_TRANSPORT_ID_LENGTH;
|
|
||||||
import static org.briarproject.api.sync.PacketTypes.ACK;
|
import static org.briarproject.api.sync.PacketTypes.ACK;
|
||||||
import static org.briarproject.api.sync.PacketTypes.MESSAGE;
|
import static org.briarproject.api.sync.PacketTypes.MESSAGE;
|
||||||
import static org.briarproject.api.sync.PacketTypes.OFFER;
|
import static org.briarproject.api.sync.PacketTypes.OFFER;
|
||||||
import static org.briarproject.api.sync.PacketTypes.REQUEST;
|
import static org.briarproject.api.sync.PacketTypes.REQUEST;
|
||||||
import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_ACK;
|
import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_ACK;
|
||||||
import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_UPDATE;
|
import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_UPDATE;
|
||||||
import static org.briarproject.api.sync.PacketTypes.TRANSPORT_ACK;
|
|
||||||
import static org.briarproject.api.sync.PacketTypes.TRANSPORT_UPDATE;
|
|
||||||
import static org.briarproject.api.sync.SyncConstants.MAX_PACKET_PAYLOAD_LENGTH;
|
import static org.briarproject.api.sync.SyncConstants.MAX_PACKET_PAYLOAD_LENGTH;
|
||||||
import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH;
|
import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH;
|
||||||
import static org.briarproject.api.sync.SyncConstants.PACKET_HEADER_LENGTH;
|
import static org.briarproject.api.sync.SyncConstants.PACKET_HEADER_LENGTH;
|
||||||
@@ -205,66 +194,4 @@ class PacketReaderImpl implements PacketReader {
|
|||||||
state = State.BUFFER_EMPTY;
|
state = State.BUFFER_EMPTY;
|
||||||
return u;
|
return u;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasTransportAck() throws IOException {
|
|
||||||
return !eof() && header[1] == TRANSPORT_ACK;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TransportAck readTransportAck() throws IOException {
|
|
||||||
if (!hasTransportAck()) throw new FormatException();
|
|
||||||
// Set up the reader
|
|
||||||
InputStream bais = new ByteArrayInputStream(payload, 0, payloadLength);
|
|
||||||
BdfReader r = bdfReaderFactory.createReader(bais);
|
|
||||||
// Read the start of the payload
|
|
||||||
r.readListStart();
|
|
||||||
// Read the transport ID and version
|
|
||||||
String idString = r.readString(MAX_TRANSPORT_ID_LENGTH);
|
|
||||||
if (idString.length() == 0) throw new FormatException();
|
|
||||||
TransportId id = new TransportId(idString);
|
|
||||||
long version = r.readInteger();
|
|
||||||
if (version < 0) throw new FormatException();
|
|
||||||
// Read the end of the payload
|
|
||||||
r.readListEnd();
|
|
||||||
if (!r.eof()) throw new FormatException();
|
|
||||||
state = State.BUFFER_EMPTY;
|
|
||||||
// Build and return the transport ack
|
|
||||||
return new TransportAck(id, version);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasTransportUpdate() throws IOException {
|
|
||||||
return !eof() && header[1] == TRANSPORT_UPDATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TransportUpdate readTransportUpdate() throws IOException {
|
|
||||||
if (!hasTransportUpdate()) throw new FormatException();
|
|
||||||
// Set up the reader
|
|
||||||
InputStream bais = new ByteArrayInputStream(payload, 0, payloadLength);
|
|
||||||
BdfReader r = bdfReaderFactory.createReader(bais);
|
|
||||||
// Read the start of the payload
|
|
||||||
r.readListStart();
|
|
||||||
// Read the transport ID
|
|
||||||
String idString = r.readString(MAX_TRANSPORT_ID_LENGTH);
|
|
||||||
if (idString.length() == 0) throw new FormatException();
|
|
||||||
TransportId id = new TransportId(idString);
|
|
||||||
// Read the transport properties
|
|
||||||
Map<String, String> p = new HashMap<String, String>();
|
|
||||||
r.readDictionaryStart();
|
|
||||||
for (int i = 0; !r.hasDictionaryEnd(); i++) {
|
|
||||||
if (i == MAX_PROPERTIES_PER_TRANSPORT)
|
|
||||||
throw new FormatException();
|
|
||||||
String key = r.readString(MAX_PROPERTY_LENGTH);
|
|
||||||
String value = r.readString(MAX_PROPERTY_LENGTH);
|
|
||||||
p.put(key, value);
|
|
||||||
}
|
|
||||||
r.readDictionaryEnd();
|
|
||||||
// Read the version number
|
|
||||||
long version = r.readInteger();
|
|
||||||
if (version < 0) throw new FormatException();
|
|
||||||
// Read the end of the payload
|
|
||||||
r.readListEnd();
|
|
||||||
if (!r.eof()) throw new FormatException();
|
|
||||||
state = State.BUFFER_EMPTY;
|
|
||||||
// Build and return the transport update
|
|
||||||
return new TransportUpdate(id, new TransportProperties(p), version);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ import org.briarproject.api.sync.PacketWriter;
|
|||||||
import org.briarproject.api.sync.Request;
|
import org.briarproject.api.sync.Request;
|
||||||
import org.briarproject.api.sync.SubscriptionAck;
|
import org.briarproject.api.sync.SubscriptionAck;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.TransportAck;
|
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
import org.briarproject.util.ByteUtils;
|
import org.briarproject.util.ByteUtils;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
@@ -25,8 +23,6 @@ import static org.briarproject.api.sync.PacketTypes.OFFER;
|
|||||||
import static org.briarproject.api.sync.PacketTypes.REQUEST;
|
import static org.briarproject.api.sync.PacketTypes.REQUEST;
|
||||||
import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_ACK;
|
import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_ACK;
|
||||||
import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_UPDATE;
|
import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_UPDATE;
|
||||||
import static org.briarproject.api.sync.PacketTypes.TRANSPORT_ACK;
|
|
||||||
import static org.briarproject.api.sync.PacketTypes.TRANSPORT_UPDATE;
|
|
||||||
import static org.briarproject.api.sync.SyncConstants.MAX_PACKET_PAYLOAD_LENGTH;
|
import static org.briarproject.api.sync.SyncConstants.MAX_PACKET_PAYLOAD_LENGTH;
|
||||||
import static org.briarproject.api.sync.SyncConstants.PACKET_HEADER_LENGTH;
|
import static org.briarproject.api.sync.SyncConstants.PACKET_HEADER_LENGTH;
|
||||||
import static org.briarproject.api.sync.SyncConstants.PROTOCOL_VERSION;
|
import static org.briarproject.api.sync.SyncConstants.PROTOCOL_VERSION;
|
||||||
@@ -125,27 +121,6 @@ class PacketWriterImpl implements PacketWriter {
|
|||||||
writePacket(SUBSCRIPTION_UPDATE);
|
writePacket(SUBSCRIPTION_UPDATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeTransportAck(TransportAck a) throws IOException {
|
|
||||||
if (payload.size() != 0) throw new IllegalStateException();
|
|
||||||
BdfWriter w = bdfWriterFactory.createWriter(payload);
|
|
||||||
w.writeListStart();
|
|
||||||
w.writeString(a.getId().getString());
|
|
||||||
w.writeInteger(a.getVersion());
|
|
||||||
w.writeListEnd();
|
|
||||||
writePacket(TRANSPORT_ACK);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void writeTransportUpdate(TransportUpdate u) throws IOException {
|
|
||||||
if (payload.size() != 0) throw new IllegalStateException();
|
|
||||||
BdfWriter w = bdfWriterFactory.createWriter(payload);
|
|
||||||
w.writeListStart();
|
|
||||||
w.writeString(u.getId().getString());
|
|
||||||
w.writeDictionary(u.getProperties());
|
|
||||||
w.writeInteger(u.getVersion());
|
|
||||||
w.writeListEnd();
|
|
||||||
writePacket(TRANSPORT_UPDATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void flush() throws IOException {
|
public void flush() throws IOException {
|
||||||
out.flush();
|
out.flush();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,8 +15,6 @@ import org.briarproject.api.sync.PacketWriter;
|
|||||||
import org.briarproject.api.sync.SubscriptionAck;
|
import org.briarproject.api.sync.SubscriptionAck;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.SyncSession;
|
import org.briarproject.api.sync.SyncSession;
|
||||||
import org.briarproject.api.sync.TransportAck;
|
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -68,7 +66,7 @@ class SimplexOutgoingSession implements SyncSession, EventListener {
|
|||||||
this.transportId = transportId;
|
this.transportId = transportId;
|
||||||
this.maxLatency = maxLatency;
|
this.maxLatency = maxLatency;
|
||||||
this.packetWriter = packetWriter;
|
this.packetWriter = packetWriter;
|
||||||
outstandingQueries = new AtomicInteger(6); // One per type of packet
|
outstandingQueries = new AtomicInteger(4); // One per type of packet
|
||||||
writerTasks = new LinkedBlockingQueue<ThrowingRunnable<IOException>>();
|
writerTasks = new LinkedBlockingQueue<ThrowingRunnable<IOException>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,8 +74,6 @@ class SimplexOutgoingSession implements SyncSession, EventListener {
|
|||||||
eventBus.addListener(this);
|
eventBus.addListener(this);
|
||||||
try {
|
try {
|
||||||
// Start a query for each type of packet, in order of urgency
|
// Start a query for each type of packet, in order of urgency
|
||||||
dbExecutor.execute(new GenerateTransportAcks());
|
|
||||||
dbExecutor.execute(new GenerateTransportUpdates());
|
|
||||||
dbExecutor.execute(new GenerateSubscriptionAck());
|
dbExecutor.execute(new GenerateSubscriptionAck());
|
||||||
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
||||||
dbExecutor.execute(new GenerateAck());
|
dbExecutor.execute(new GenerateAck());
|
||||||
@@ -264,78 +260,4 @@ class SimplexOutgoingSession implements SyncSession, EventListener {
|
|||||||
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
dbExecutor.execute(new GenerateSubscriptionUpdate());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This task runs on the database thread
|
|
||||||
private class GenerateTransportAcks implements Runnable {
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
if (interrupted) return;
|
|
||||||
try {
|
|
||||||
Collection<TransportAck> acks =
|
|
||||||
db.generateTransportAcks(contactId);
|
|
||||||
if (LOG.isLoggable(INFO))
|
|
||||||
LOG.info("Generated transport acks: " + (acks != null));
|
|
||||||
if (acks == null) decrementOutstandingQueries();
|
|
||||||
else writerTasks.add(new WriteTransportAcks(acks));
|
|
||||||
} catch (DbException e) {
|
|
||||||
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
|
|
||||||
interrupt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This tasks runs on the writer thread
|
|
||||||
private class WriteTransportAcks implements ThrowingRunnable<IOException> {
|
|
||||||
|
|
||||||
private final Collection<TransportAck> acks;
|
|
||||||
|
|
||||||
private WriteTransportAcks(Collection<TransportAck> acks) {
|
|
||||||
this.acks = acks;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() throws IOException {
|
|
||||||
if (interrupted) return;
|
|
||||||
for (TransportAck a : acks) packetWriter.writeTransportAck(a);
|
|
||||||
LOG.info("Sent transport acks");
|
|
||||||
dbExecutor.execute(new GenerateTransportAcks());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This task runs on the database thread
|
|
||||||
private class GenerateTransportUpdates implements Runnable {
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
if (interrupted) return;
|
|
||||||
try {
|
|
||||||
Collection<TransportUpdate> t =
|
|
||||||
db.generateTransportUpdates(contactId, maxLatency);
|
|
||||||
if (LOG.isLoggable(INFO))
|
|
||||||
LOG.info("Generated transport updates: " + (t != null));
|
|
||||||
if (t == null) decrementOutstandingQueries();
|
|
||||||
else writerTasks.add(new WriteTransportUpdates(t));
|
|
||||||
} catch (DbException e) {
|
|
||||||
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
|
|
||||||
interrupt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This task runs on the writer thread
|
|
||||||
private class WriteTransportUpdates
|
|
||||||
implements ThrowingRunnable<IOException> {
|
|
||||||
|
|
||||||
private final Collection<TransportUpdate> updates;
|
|
||||||
|
|
||||||
private WriteTransportUpdates(Collection<TransportUpdate> updates) {
|
|
||||||
this.updates = updates;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() throws IOException {
|
|
||||||
if (interrupted) return;
|
|
||||||
for (TransportUpdate u : updates)
|
|
||||||
packetWriter.writeTransportUpdate(u);
|
|
||||||
LOG.info("Sent transport updates");
|
|
||||||
dbExecutor.execute(new GenerateTransportUpdates());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import com.google.inject.Guice;
|
|||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
import org.briarproject.api.TransportId;
|
import org.briarproject.api.TransportId;
|
||||||
import org.briarproject.api.TransportProperties;
|
|
||||||
import org.briarproject.api.contact.ContactId;
|
import org.briarproject.api.contact.ContactId;
|
||||||
import org.briarproject.api.crypto.SecretKey;
|
import org.briarproject.api.crypto.SecretKey;
|
||||||
import org.briarproject.api.sync.Ack;
|
import org.briarproject.api.sync.Ack;
|
||||||
@@ -21,7 +20,6 @@ import org.briarproject.api.sync.PacketWriter;
|
|||||||
import org.briarproject.api.sync.PacketWriterFactory;
|
import org.briarproject.api.sync.PacketWriterFactory;
|
||||||
import org.briarproject.api.sync.Request;
|
import org.briarproject.api.sync.Request;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
import org.briarproject.api.transport.StreamContext;
|
import org.briarproject.api.transport.StreamContext;
|
||||||
import org.briarproject.api.transport.StreamReaderFactory;
|
import org.briarproject.api.transport.StreamReaderFactory;
|
||||||
import org.briarproject.api.transport.StreamWriterFactory;
|
import org.briarproject.api.transport.StreamWriterFactory;
|
||||||
@@ -56,12 +54,11 @@ public class ProtocolIntegrationTest extends BriarTestCase {
|
|||||||
private final PacketWriterFactory packetWriterFactory;
|
private final PacketWriterFactory packetWriterFactory;
|
||||||
|
|
||||||
private final ContactId contactId;
|
private final ContactId contactId;
|
||||||
|
private final TransportId transportId;
|
||||||
private final SecretKey tagKey, headerKey;
|
private final SecretKey tagKey, headerKey;
|
||||||
private final Group group;
|
private final Group group;
|
||||||
private final Message message, message1;
|
private final Message message, message1;
|
||||||
private final Collection<MessageId> messageIds;
|
private final Collection<MessageId> messageIds;
|
||||||
private final TransportId transportId;
|
|
||||||
private final TransportProperties transportProperties;
|
|
||||||
|
|
||||||
public ProtocolIntegrationTest() throws Exception {
|
public ProtocolIntegrationTest() throws Exception {
|
||||||
Injector i = Guice.createInjector(new TestDatabaseModule(),
|
Injector i = Guice.createInjector(new TestDatabaseModule(),
|
||||||
@@ -74,6 +71,7 @@ public class ProtocolIntegrationTest extends BriarTestCase {
|
|||||||
packetReaderFactory = i.getInstance(PacketReaderFactory.class);
|
packetReaderFactory = i.getInstance(PacketReaderFactory.class);
|
||||||
packetWriterFactory = i.getInstance(PacketWriterFactory.class);
|
packetWriterFactory = i.getInstance(PacketWriterFactory.class);
|
||||||
contactId = new ContactId(234);
|
contactId = new ContactId(234);
|
||||||
|
transportId = new TransportId("id");
|
||||||
// Create the transport keys
|
// Create the transport keys
|
||||||
tagKey = TestUtils.createSecretKey();
|
tagKey = TestUtils.createSecretKey();
|
||||||
headerKey = TestUtils.createSecretKey();
|
headerKey = TestUtils.createSecretKey();
|
||||||
@@ -91,10 +89,6 @@ public class ProtocolIntegrationTest extends BriarTestCase {
|
|||||||
message1 = messageFactory.createMessage(group.getId(), timestamp,
|
message1 = messageFactory.createMessage(group.getId(), timestamp,
|
||||||
messageBody.getBytes("UTF-8"));
|
messageBody.getBytes("UTF-8"));
|
||||||
messageIds = Arrays.asList(message.getId(), message1.getId());
|
messageIds = Arrays.asList(message.getId(), message1.getId());
|
||||||
// Create some transport properties
|
|
||||||
transportId = new TransportId("id");
|
|
||||||
transportProperties = new TransportProperties(Collections.singletonMap(
|
|
||||||
"bar", "baz"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -124,10 +118,6 @@ public class ProtocolIntegrationTest extends BriarTestCase {
|
|||||||
Collections.singletonList(group), 1);
|
Collections.singletonList(group), 1);
|
||||||
packetWriter.writeSubscriptionUpdate(su);
|
packetWriter.writeSubscriptionUpdate(su);
|
||||||
|
|
||||||
TransportUpdate tu = new TransportUpdate(transportId,
|
|
||||||
transportProperties, 1);
|
|
||||||
packetWriter.writeTransportUpdate(tu);
|
|
||||||
|
|
||||||
streamWriter.flush();
|
streamWriter.flush();
|
||||||
return out.toByteArray();
|
return out.toByteArray();
|
||||||
}
|
}
|
||||||
@@ -174,13 +164,6 @@ public class ProtocolIntegrationTest extends BriarTestCase {
|
|||||||
assertEquals(Collections.singletonList(group), su.getGroups());
|
assertEquals(Collections.singletonList(group), su.getGroups());
|
||||||
assertEquals(1, su.getVersion());
|
assertEquals(1, su.getVersion());
|
||||||
|
|
||||||
// Read the transport update
|
|
||||||
assertTrue(packetReader.hasTransportUpdate());
|
|
||||||
TransportUpdate tu = packetReader.readTransportUpdate();
|
|
||||||
assertEquals(transportId, tu.getId());
|
|
||||||
assertEquals(transportProperties, tu.getProperties());
|
|
||||||
assertEquals(1, tu.getVersion());
|
|
||||||
|
|
||||||
in.close();
|
in.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package org.briarproject.db;
|
|||||||
import org.briarproject.BriarTestCase;
|
import org.briarproject.BriarTestCase;
|
||||||
import org.briarproject.TestUtils;
|
import org.briarproject.TestUtils;
|
||||||
import org.briarproject.api.TransportId;
|
import org.briarproject.api.TransportId;
|
||||||
import org.briarproject.api.TransportProperties;
|
|
||||||
import org.briarproject.api.contact.Contact;
|
import org.briarproject.api.contact.Contact;
|
||||||
import org.briarproject.api.contact.ContactId;
|
import org.briarproject.api.contact.ContactId;
|
||||||
import org.briarproject.api.crypto.SecretKey;
|
import org.briarproject.api.crypto.SecretKey;
|
||||||
@@ -18,7 +17,6 @@ import org.briarproject.api.db.NoSuchTransportException;
|
|||||||
import org.briarproject.api.db.StorageStatus;
|
import org.briarproject.api.db.StorageStatus;
|
||||||
import org.briarproject.api.event.EventBus;
|
import org.briarproject.api.event.EventBus;
|
||||||
import org.briarproject.api.event.LocalSubscriptionsUpdatedEvent;
|
import org.briarproject.api.event.LocalSubscriptionsUpdatedEvent;
|
||||||
import org.briarproject.api.event.LocalTransportsUpdatedEvent;
|
|
||||||
import org.briarproject.api.event.MessageAddedEvent;
|
import org.briarproject.api.event.MessageAddedEvent;
|
||||||
import org.briarproject.api.event.MessageRequestedEvent;
|
import org.briarproject.api.event.MessageRequestedEvent;
|
||||||
import org.briarproject.api.event.MessageToAckEvent;
|
import org.briarproject.api.event.MessageToAckEvent;
|
||||||
@@ -42,8 +40,6 @@ import org.briarproject.api.sync.Offer;
|
|||||||
import org.briarproject.api.sync.Request;
|
import org.briarproject.api.sync.Request;
|
||||||
import org.briarproject.api.sync.SubscriptionAck;
|
import org.briarproject.api.sync.SubscriptionAck;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.TransportAck;
|
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
import org.briarproject.api.transport.IncomingKeys;
|
import org.briarproject.api.transport.IncomingKeys;
|
||||||
import org.briarproject.api.transport.OutgoingKeys;
|
import org.briarproject.api.transport.OutgoingKeys;
|
||||||
import org.briarproject.api.transport.TransportKeys;
|
import org.briarproject.api.transport.TransportKeys;
|
||||||
@@ -60,7 +56,6 @@ import static org.briarproject.api.sync.SyncConstants.MAX_GROUP_DESCRIPTOR_LENGT
|
|||||||
import static org.briarproject.db.DatabaseConstants.MAX_OFFERED_MESSAGES;
|
import static org.briarproject.db.DatabaseConstants.MAX_OFFERED_MESSAGES;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
@@ -80,7 +75,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
private final Message message;
|
private final Message message;
|
||||||
private final Metadata metadata;
|
private final Metadata metadata;
|
||||||
private final TransportId transportId;
|
private final TransportId transportId;
|
||||||
private final TransportProperties transportProperties;
|
|
||||||
private final int maxLatency;
|
private final int maxLatency;
|
||||||
private final ContactId contactId;
|
private final ContactId contactId;
|
||||||
private final Contact contact;
|
private final Contact contact;
|
||||||
@@ -88,7 +82,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
public DatabaseComponentImplTest() {
|
public DatabaseComponentImplTest() {
|
||||||
clientId = new ClientId(TestUtils.getRandomId());
|
clientId = new ClientId(TestUtils.getRandomId());
|
||||||
groupId = new GroupId(TestUtils.getRandomId());
|
groupId = new GroupId(TestUtils.getRandomId());
|
||||||
ClientId clientId = new ClientId(TestUtils.getRandomId());
|
|
||||||
byte[] descriptor = new byte[MAX_GROUP_DESCRIPTOR_LENGTH];
|
byte[] descriptor = new byte[MAX_GROUP_DESCRIPTOR_LENGTH];
|
||||||
group = new Group(groupId, clientId, descriptor);
|
group = new Group(groupId, clientId, descriptor);
|
||||||
authorId = new AuthorId(TestUtils.getRandomId());
|
authorId = new AuthorId(TestUtils.getRandomId());
|
||||||
@@ -106,8 +99,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
metadata = new Metadata();
|
metadata = new Metadata();
|
||||||
metadata.put("foo", new byte[] {'b', 'a', 'r'});
|
metadata.put("foo", new byte[] {'b', 'a', 'r'});
|
||||||
transportId = new TransportId("id");
|
transportId = new TransportId("id");
|
||||||
transportProperties = new TransportProperties(Collections.singletonMap(
|
|
||||||
"bar", "baz"));
|
|
||||||
maxLatency = Integer.MAX_VALUE;
|
maxLatency = Integer.MAX_VALUE;
|
||||||
contactId = new ContactId(234);
|
contactId = new ContactId(234);
|
||||||
contact = new Contact(contactId, author, localAuthorId,
|
contact = new Contact(contactId, author, localAuthorId,
|
||||||
@@ -128,9 +119,9 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||||
final EventBus eventBus = context.mock(EventBus.class);
|
final EventBus eventBus = context.mock(EventBus.class);
|
||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
exactly(10).of(database).startTransaction();
|
exactly(9).of(database).startTransaction();
|
||||||
will(returnValue(txn));
|
will(returnValue(txn));
|
||||||
exactly(10).of(database).commitTransaction(txn);
|
exactly(9).of(database).commitTransaction(txn);
|
||||||
// open()
|
// open()
|
||||||
oneOf(database).open();
|
oneOf(database).open();
|
||||||
will(returnValue(false));
|
will(returnValue(false));
|
||||||
@@ -150,9 +141,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
// getContacts()
|
// getContacts()
|
||||||
oneOf(database).getContacts(txn);
|
oneOf(database).getContacts(txn);
|
||||||
will(returnValue(Collections.singletonList(contact)));
|
will(returnValue(Collections.singletonList(contact)));
|
||||||
// getRemoteProperties()
|
|
||||||
oneOf(database).getRemoteProperties(txn, transportId);
|
|
||||||
will(returnValue(Collections.emptyMap()));
|
|
||||||
// addGroup()
|
// addGroup()
|
||||||
oneOf(database).containsGroup(txn, groupId);
|
oneOf(database).containsGroup(txn, groupId);
|
||||||
will(returnValue(false));
|
will(returnValue(false));
|
||||||
@@ -194,8 +182,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
db.addLocalAuthor(localAuthor);
|
db.addLocalAuthor(localAuthor);
|
||||||
assertEquals(contactId, db.addContact(author, localAuthorId));
|
assertEquals(contactId, db.addContact(author, localAuthorId));
|
||||||
assertEquals(Collections.singletonList(contact), db.getContacts());
|
assertEquals(Collections.singletonList(contact), db.getContacts());
|
||||||
assertEquals(Collections.emptyMap(),
|
|
||||||
db.getRemoteProperties(transportId));
|
|
||||||
db.addGroup(group); // First time - listeners called
|
db.addGroup(group); // First time - listeners called
|
||||||
db.addGroup(group); // Second time - not called
|
db.addGroup(group); // Second time - not called
|
||||||
assertEquals(Collections.singletonList(group), db.getGroups(clientId));
|
assertEquals(Collections.singletonList(group), db.getGroups(clientId));
|
||||||
@@ -310,11 +296,11 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
final EventBus eventBus = context.mock(EventBus.class);
|
final EventBus eventBus = context.mock(EventBus.class);
|
||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
// Check whether the contact is in the DB (which it's not)
|
// Check whether the contact is in the DB (which it's not)
|
||||||
exactly(21).of(database).startTransaction();
|
exactly(17).of(database).startTransaction();
|
||||||
will(returnValue(txn));
|
will(returnValue(txn));
|
||||||
exactly(21).of(database).containsContact(txn, contactId);
|
exactly(17).of(database).containsContact(txn, contactId);
|
||||||
will(returnValue(false));
|
will(returnValue(false));
|
||||||
exactly(21).of(database).abortTransaction(txn);
|
exactly(17).of(database).abortTransaction(txn);
|
||||||
}});
|
}});
|
||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
||||||
shutdown);
|
shutdown);
|
||||||
@@ -361,20 +347,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
// Expected
|
// Expected
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
db.generateTransportAcks(contactId);
|
|
||||||
fail();
|
|
||||||
} catch (NoSuchContactException expected) {
|
|
||||||
// Expected
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
db.generateTransportUpdates(contactId, 123);
|
|
||||||
fail();
|
|
||||||
} catch (NoSuchContactException expected) {
|
|
||||||
// Expected
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
db.getContact(contactId);
|
db.getContact(contactId);
|
||||||
fail();
|
fail();
|
||||||
@@ -443,23 +415,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
// Expected
|
// Expected
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
TransportAck a = new TransportAck(transportId, 0);
|
|
||||||
db.receiveTransportAck(contactId, a);
|
|
||||||
fail();
|
|
||||||
} catch (NoSuchContactException expected) {
|
|
||||||
// Expected
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
TransportUpdate u = new TransportUpdate(transportId,
|
|
||||||
transportProperties, 1);
|
|
||||||
db.receiveTransportUpdate(contactId, u);
|
|
||||||
fail();
|
|
||||||
} catch (NoSuchContactException expected) {
|
|
||||||
// Expected
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
db.removeContact(contactId);
|
db.removeContact(contactId);
|
||||||
fail();
|
fail();
|
||||||
@@ -677,13 +632,13 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
will(returnValue(contactId));
|
will(returnValue(contactId));
|
||||||
oneOf(database).commitTransaction(txn);
|
oneOf(database).commitTransaction(txn);
|
||||||
// Check whether the transport is in the DB (which it's not)
|
// Check whether the transport is in the DB (which it's not)
|
||||||
exactly(6).of(database).startTransaction();
|
exactly(4).of(database).startTransaction();
|
||||||
will(returnValue(txn));
|
will(returnValue(txn));
|
||||||
exactly(2).of(database).containsContact(txn, contactId);
|
exactly(2).of(database).containsContact(txn, contactId);
|
||||||
will(returnValue(true));
|
will(returnValue(true));
|
||||||
exactly(6).of(database).containsTransport(txn, transportId);
|
exactly(4).of(database).containsTransport(txn, transportId);
|
||||||
will(returnValue(false));
|
will(returnValue(false));
|
||||||
exactly(6).of(database).abortTransaction(txn);
|
exactly(4).of(database).abortTransaction(txn);
|
||||||
}});
|
}});
|
||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
||||||
shutdown);
|
shutdown);
|
||||||
@@ -691,13 +646,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
db.addLocalAuthor(localAuthor);
|
db.addLocalAuthor(localAuthor);
|
||||||
assertEquals(contactId, db.addContact(author, localAuthorId));
|
assertEquals(contactId, db.addContact(author, localAuthorId));
|
||||||
|
|
||||||
try {
|
|
||||||
db.getLocalProperties(transportId);
|
|
||||||
fail();
|
|
||||||
} catch (NoSuchTransportException expected) {
|
|
||||||
// Expected
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
db.getTransportKeys(transportId);
|
db.getTransportKeys(transportId);
|
||||||
fail();
|
fail();
|
||||||
@@ -705,13 +653,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
// Expected
|
// Expected
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
db.mergeLocalProperties(transportId, new TransportProperties());
|
|
||||||
fail();
|
|
||||||
} catch (NoSuchTransportException expected) {
|
|
||||||
// Expected
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
db.incrementStreamCounter(contactId, transportId, 0);
|
db.incrementStreamCounter(contactId, transportId, 0);
|
||||||
fail();
|
fail();
|
||||||
@@ -952,62 +893,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
context.assertIsSatisfied();
|
context.assertIsSatisfied();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGenerateTransportUpdatesNoUpdatesDue() throws Exception {
|
|
||||||
Mockery context = new Mockery();
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
final Database<Object> database = context.mock(Database.class);
|
|
||||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
|
||||||
final EventBus eventBus = context.mock(EventBus.class);
|
|
||||||
context.checking(new Expectations() {{
|
|
||||||
oneOf(database).startTransaction();
|
|
||||||
will(returnValue(txn));
|
|
||||||
oneOf(database).containsContact(txn, contactId);
|
|
||||||
will(returnValue(true));
|
|
||||||
oneOf(database).getTransportUpdates(txn, contactId, maxLatency);
|
|
||||||
will(returnValue(null));
|
|
||||||
oneOf(database).commitTransaction(txn);
|
|
||||||
}});
|
|
||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
|
||||||
shutdown);
|
|
||||||
|
|
||||||
assertNull(db.generateTransportUpdates(contactId, maxLatency));
|
|
||||||
|
|
||||||
context.assertIsSatisfied();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGenerateTransportUpdates() throws Exception {
|
|
||||||
Mockery context = new Mockery();
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
final Database<Object> database = context.mock(Database.class);
|
|
||||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
|
||||||
final EventBus eventBus = context.mock(EventBus.class);
|
|
||||||
context.checking(new Expectations() {{
|
|
||||||
oneOf(database).startTransaction();
|
|
||||||
will(returnValue(txn));
|
|
||||||
oneOf(database).containsContact(txn, contactId);
|
|
||||||
will(returnValue(true));
|
|
||||||
oneOf(database).getTransportUpdates(txn, contactId, maxLatency);
|
|
||||||
will(returnValue(Collections.singletonList(new TransportUpdate(
|
|
||||||
transportId, transportProperties, 1))));
|
|
||||||
oneOf(database).commitTransaction(txn);
|
|
||||||
}});
|
|
||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
|
||||||
shutdown);
|
|
||||||
|
|
||||||
Collection<TransportUpdate> updates =
|
|
||||||
db.generateTransportUpdates(contactId, maxLatency);
|
|
||||||
assertNotNull(updates);
|
|
||||||
assertEquals(1, updates.size());
|
|
||||||
TransportUpdate u = updates.iterator().next();
|
|
||||||
assertEquals(transportId, u.getId());
|
|
||||||
assertEquals(transportProperties, u.getProperties());
|
|
||||||
assertEquals(1, u.getVersion());
|
|
||||||
|
|
||||||
context.assertIsSatisfied();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testReceiveAck() throws Exception {
|
public void testReceiveAck() throws Exception {
|
||||||
Mockery context = new Mockery();
|
Mockery context = new Mockery();
|
||||||
@@ -1253,116 +1138,6 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
context.assertIsSatisfied();
|
context.assertIsSatisfied();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testReceiveTransportAck() throws Exception {
|
|
||||||
Mockery context = new Mockery();
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
final Database<Object> database = context.mock(Database.class);
|
|
||||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
|
||||||
final EventBus eventBus = context.mock(EventBus.class);
|
|
||||||
context.checking(new Expectations() {{
|
|
||||||
oneOf(database).startTransaction();
|
|
||||||
will(returnValue(txn));
|
|
||||||
oneOf(database).containsContact(txn, contactId);
|
|
||||||
will(returnValue(true));
|
|
||||||
oneOf(database).containsTransport(txn, transportId);
|
|
||||||
will(returnValue(true));
|
|
||||||
oneOf(database).setTransportUpdateAcked(txn, contactId,
|
|
||||||
transportId, 1);
|
|
||||||
oneOf(database).commitTransaction(txn);
|
|
||||||
}});
|
|
||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
|
||||||
shutdown);
|
|
||||||
|
|
||||||
TransportAck a = new TransportAck(transportId, 1);
|
|
||||||
db.receiveTransportAck(contactId, a);
|
|
||||||
|
|
||||||
context.assertIsSatisfied();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testReceiveTransportUpdate() throws Exception {
|
|
||||||
Mockery context = new Mockery();
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
final Database<Object> database = context.mock(Database.class);
|
|
||||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
|
||||||
final EventBus eventBus = context.mock(EventBus.class);
|
|
||||||
context.checking(new Expectations() {{
|
|
||||||
oneOf(database).startTransaction();
|
|
||||||
will(returnValue(txn));
|
|
||||||
oneOf(database).containsContact(txn, contactId);
|
|
||||||
will(returnValue(true));
|
|
||||||
oneOf(database).setRemoteProperties(txn, contactId, transportId,
|
|
||||||
transportProperties, 1);
|
|
||||||
oneOf(database).commitTransaction(txn);
|
|
||||||
}});
|
|
||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
|
||||||
shutdown);
|
|
||||||
|
|
||||||
TransportUpdate u = new TransportUpdate(transportId,
|
|
||||||
transportProperties, 1);
|
|
||||||
db.receiveTransportUpdate(contactId, u);
|
|
||||||
|
|
||||||
context.assertIsSatisfied();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testChangingLocalTransportPropertiesCallsListeners()
|
|
||||||
throws Exception {
|
|
||||||
final TransportProperties properties =
|
|
||||||
new TransportProperties(Collections.singletonMap("bar", "baz"));
|
|
||||||
Mockery context = new Mockery();
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
final Database<Object> database = context.mock(Database.class);
|
|
||||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
|
||||||
final EventBus eventBus = context.mock(EventBus.class);
|
|
||||||
context.checking(new Expectations() {{
|
|
||||||
oneOf(database).startTransaction();
|
|
||||||
will(returnValue(txn));
|
|
||||||
oneOf(database).containsTransport(txn, transportId);
|
|
||||||
will(returnValue(true));
|
|
||||||
oneOf(database).getLocalProperties(txn, transportId);
|
|
||||||
will(returnValue(new TransportProperties()));
|
|
||||||
oneOf(database).mergeLocalProperties(txn, transportId, properties);
|
|
||||||
oneOf(database).commitTransaction(txn);
|
|
||||||
oneOf(eventBus).broadcast(with(any(
|
|
||||||
LocalTransportsUpdatedEvent.class)));
|
|
||||||
}});
|
|
||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
|
||||||
shutdown);
|
|
||||||
|
|
||||||
db.mergeLocalProperties(transportId, properties);
|
|
||||||
|
|
||||||
context.assertIsSatisfied();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testNotChangingLocalTransportPropertiesDoesNotCallListeners()
|
|
||||||
throws Exception {
|
|
||||||
final TransportProperties properties =
|
|
||||||
new TransportProperties(Collections.singletonMap("bar", "baz"));
|
|
||||||
Mockery context = new Mockery();
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
final Database<Object> database = context.mock(Database.class);
|
|
||||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
|
||||||
final EventBus eventBus = context.mock(EventBus.class);
|
|
||||||
context.checking(new Expectations() {{
|
|
||||||
oneOf(database).startTransaction();
|
|
||||||
will(returnValue(txn));
|
|
||||||
oneOf(database).containsTransport(txn, transportId);
|
|
||||||
will(returnValue(true));
|
|
||||||
oneOf(database).getLocalProperties(txn, transportId);
|
|
||||||
will(returnValue(properties));
|
|
||||||
oneOf(database).commitTransaction(txn);
|
|
||||||
}});
|
|
||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
|
||||||
shutdown);
|
|
||||||
|
|
||||||
db.mergeLocalProperties(transportId, properties);
|
|
||||||
|
|
||||||
context.assertIsSatisfied();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testChangingVisibilityCallsListeners() throws Exception {
|
public void testChangingVisibilityCallsListeners() throws Exception {
|
||||||
final ContactId contactId1 = new ContactId(123);
|
final ContactId contactId1 = new ContactId(123);
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import org.briarproject.TestDatabaseConfig;
|
|||||||
import org.briarproject.TestUtils;
|
import org.briarproject.TestUtils;
|
||||||
import org.briarproject.api.Settings;
|
import org.briarproject.api.Settings;
|
||||||
import org.briarproject.api.TransportId;
|
import org.briarproject.api.TransportId;
|
||||||
import org.briarproject.api.TransportProperties;
|
|
||||||
import org.briarproject.api.contact.ContactId;
|
import org.briarproject.api.contact.ContactId;
|
||||||
import org.briarproject.api.crypto.SecretKey;
|
import org.briarproject.api.crypto.SecretKey;
|
||||||
import org.briarproject.api.db.DbException;
|
import org.briarproject.api.db.DbException;
|
||||||
@@ -137,8 +136,6 @@ public class H2DatabaseTest extends BriarTestCase {
|
|||||||
db = open(true);
|
db = open(true);
|
||||||
txn = db.startTransaction();
|
txn = db.startTransaction();
|
||||||
assertFalse(db.containsContact(txn, contactId));
|
assertFalse(db.containsContact(txn, contactId));
|
||||||
assertEquals(Collections.emptyMap(),
|
|
||||||
db.getRemoteProperties(txn, transportId));
|
|
||||||
assertFalse(db.containsGroup(txn, groupId));
|
assertFalse(db.containsGroup(txn, groupId));
|
||||||
assertFalse(db.containsMessage(txn, messageId));
|
assertFalse(db.containsMessage(txn, messageId));
|
||||||
db.commitTransaction(txn);
|
db.commitTransaction(txn);
|
||||||
@@ -502,71 +499,6 @@ public class H2DatabaseTest extends BriarTestCase {
|
|||||||
assertFalse(error.get());
|
assertFalse(error.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testUpdateRemoteTransportProperties() throws Exception {
|
|
||||||
Database<Connection> db = open(false);
|
|
||||||
Connection txn = db.startTransaction();
|
|
||||||
|
|
||||||
// Add a contact with a transport
|
|
||||||
db.addLocalAuthor(txn, localAuthor);
|
|
||||||
assertEquals(contactId, db.addContact(txn, author, localAuthorId));
|
|
||||||
TransportProperties p = new TransportProperties(
|
|
||||||
Collections.singletonMap("foo", "bar"));
|
|
||||||
db.setRemoteProperties(txn, contactId, transportId, p, 1);
|
|
||||||
assertEquals(Collections.singletonMap(contactId, p),
|
|
||||||
db.getRemoteProperties(txn, transportId));
|
|
||||||
|
|
||||||
// Replace the transport properties
|
|
||||||
TransportProperties p1 = new TransportProperties(
|
|
||||||
Collections.singletonMap("baz", "bam"));
|
|
||||||
db.setRemoteProperties(txn, contactId, transportId, p1, 2);
|
|
||||||
assertEquals(Collections.singletonMap(contactId, p1),
|
|
||||||
db.getRemoteProperties(txn, transportId));
|
|
||||||
|
|
||||||
// Remove the transport properties
|
|
||||||
TransportProperties p2 = new TransportProperties();
|
|
||||||
db.setRemoteProperties(txn, contactId, transportId, p2, 3);
|
|
||||||
assertEquals(Collections.emptyMap(),
|
|
||||||
db.getRemoteProperties(txn, transportId));
|
|
||||||
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
db.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testUpdateLocalTransportProperties() throws Exception {
|
|
||||||
Database<Connection> db = open(false);
|
|
||||||
Connection txn = db.startTransaction();
|
|
||||||
|
|
||||||
// Add a transport to the database
|
|
||||||
db.addTransport(txn, transportId, 123);
|
|
||||||
|
|
||||||
// Set the transport properties
|
|
||||||
TransportProperties p = new TransportProperties();
|
|
||||||
p.put("foo", "foo");
|
|
||||||
p.put("bar", "bar");
|
|
||||||
db.mergeLocalProperties(txn, transportId, p);
|
|
||||||
assertEquals(p, db.getLocalProperties(txn, transportId));
|
|
||||||
assertEquals(Collections.singletonMap(transportId, p),
|
|
||||||
db.getLocalProperties(txn));
|
|
||||||
|
|
||||||
// Update one of the properties and add another
|
|
||||||
TransportProperties p1 = new TransportProperties();
|
|
||||||
p1.put("bar", "baz");
|
|
||||||
p1.put("bam", "bam");
|
|
||||||
db.mergeLocalProperties(txn, transportId, p1);
|
|
||||||
TransportProperties merged = new TransportProperties();
|
|
||||||
merged.put("foo", "foo");
|
|
||||||
merged.put("bar", "baz");
|
|
||||||
merged.put("bam", "bam");
|
|
||||||
assertEquals(merged, db.getLocalProperties(txn, transportId));
|
|
||||||
assertEquals(Collections.singletonMap(transportId, merged),
|
|
||||||
db.getLocalProperties(txn));
|
|
||||||
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
db.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateSettings() throws Exception {
|
public void testUpdateSettings() throws Exception {
|
||||||
Database<Connection> db = open(false);
|
Database<Connection> db = open(false);
|
||||||
@@ -597,42 +529,6 @@ public class H2DatabaseTest extends BriarTestCase {
|
|||||||
db.close();
|
db.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testTransportsNotUpdatedIfVersionIsOld() throws Exception {
|
|
||||||
Database<Connection> db = open(false);
|
|
||||||
Connection txn = db.startTransaction();
|
|
||||||
|
|
||||||
// Add a contact
|
|
||||||
db.addLocalAuthor(txn, localAuthor);
|
|
||||||
assertEquals(contactId, db.addContact(txn, author, localAuthorId));
|
|
||||||
|
|
||||||
// Initialise the transport properties with version 1
|
|
||||||
TransportProperties p = new TransportProperties(
|
|
||||||
Collections.singletonMap("foo", "bar"));
|
|
||||||
assertTrue(db.setRemoteProperties(txn, contactId, transportId, p, 1));
|
|
||||||
assertEquals(Collections.singletonMap(contactId, p),
|
|
||||||
db.getRemoteProperties(txn, transportId));
|
|
||||||
|
|
||||||
// Replace the transport properties with version 2
|
|
||||||
TransportProperties p1 = new TransportProperties(
|
|
||||||
Collections.singletonMap("baz", "bam"));
|
|
||||||
assertTrue(db.setRemoteProperties(txn, contactId, transportId, p1, 2));
|
|
||||||
assertEquals(Collections.singletonMap(contactId, p1),
|
|
||||||
db.getRemoteProperties(txn, transportId));
|
|
||||||
|
|
||||||
// Try to replace the transport properties with version 1
|
|
||||||
TransportProperties p2 = new TransportProperties(
|
|
||||||
Collections.singletonMap("quux", "etc"));
|
|
||||||
assertFalse(db.setRemoteProperties(txn, contactId, transportId, p2, 1));
|
|
||||||
|
|
||||||
// Version 2 of the properties should still be there
|
|
||||||
assertEquals(Collections.singletonMap(contactId, p1),
|
|
||||||
db.getRemoteProperties(txn, transportId));
|
|
||||||
|
|
||||||
db.commitTransaction(txn);
|
|
||||||
db.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testContainsVisibleMessageRequiresMessageInDatabase()
|
public void testContainsVisibleMessageRequiresMessageInDatabase()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ import org.briarproject.TestDatabaseModule;
|
|||||||
import org.briarproject.TestLifecycleModule;
|
import org.briarproject.TestLifecycleModule;
|
||||||
import org.briarproject.TestSystemModule;
|
import org.briarproject.TestSystemModule;
|
||||||
import org.briarproject.TestUtils;
|
import org.briarproject.TestUtils;
|
||||||
import org.briarproject.api.TransportId;
|
|
||||||
import org.briarproject.api.TransportProperties;
|
|
||||||
import org.briarproject.api.UniqueId;
|
import org.briarproject.api.UniqueId;
|
||||||
import org.briarproject.api.crypto.CryptoComponent;
|
import org.briarproject.api.crypto.CryptoComponent;
|
||||||
import org.briarproject.api.crypto.KeyPair;
|
import org.briarproject.api.crypto.KeyPair;
|
||||||
@@ -34,7 +32,6 @@ import org.briarproject.api.sync.PacketWriter;
|
|||||||
import org.briarproject.api.sync.PacketWriterFactory;
|
import org.briarproject.api.sync.PacketWriterFactory;
|
||||||
import org.briarproject.api.sync.Request;
|
import org.briarproject.api.sync.Request;
|
||||||
import org.briarproject.api.sync.SubscriptionUpdate;
|
import org.briarproject.api.sync.SubscriptionUpdate;
|
||||||
import org.briarproject.api.sync.TransportUpdate;
|
|
||||||
import org.briarproject.contact.ContactModule;
|
import org.briarproject.contact.ContactModule;
|
||||||
import org.briarproject.crypto.CryptoModule;
|
import org.briarproject.crypto.CryptoModule;
|
||||||
import org.briarproject.data.DataModule;
|
import org.briarproject.data.DataModule;
|
||||||
@@ -50,9 +47,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import static org.briarproject.api.TransportPropertyConstants.MAX_PROPERTIES_PER_TRANSPORT;
|
|
||||||
import static org.briarproject.api.TransportPropertyConstants.MAX_PROPERTY_LENGTH;
|
|
||||||
import static org.briarproject.api.TransportPropertyConstants.MAX_TRANSPORT_ID_LENGTH;
|
|
||||||
import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_POST_BODY_LENGTH;
|
import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_POST_BODY_LENGTH;
|
||||||
import static org.briarproject.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
|
import static org.briarproject.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
|
||||||
import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
|
import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
|
||||||
@@ -194,27 +188,6 @@ public class ConstantsTest extends BriarTestCase {
|
|||||||
testMessageIdsFitIntoRequest(1000);
|
testMessageIdsFitIntoRequest(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPropertiesFitIntoTransportUpdate() throws Exception {
|
|
||||||
// Create the maximum number of properties with the maximum length
|
|
||||||
TransportProperties p = new TransportProperties();
|
|
||||||
for (int i = 0; i < MAX_PROPERTIES_PER_TRANSPORT; i++) {
|
|
||||||
String key = TestUtils.createRandomString(MAX_PROPERTY_LENGTH);
|
|
||||||
String value = TestUtils.createRandomString(MAX_PROPERTY_LENGTH);
|
|
||||||
p.put(key, value);
|
|
||||||
}
|
|
||||||
// Create a maximum-length transport update
|
|
||||||
String idString = TestUtils.createRandomString(MAX_TRANSPORT_ID_LENGTH);
|
|
||||||
TransportId id = new TransportId(idString);
|
|
||||||
TransportUpdate u = new TransportUpdate(id, p, Long.MAX_VALUE);
|
|
||||||
// Serialise the update
|
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
||||||
PacketWriter writer = packetWriterFactory.createPacketWriter(out);
|
|
||||||
writer.writeTransportUpdate(u);
|
|
||||||
// Check the size of the serialised transport update
|
|
||||||
assertTrue(out.size() <= MAX_PACKET_PAYLOAD_LENGTH);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGroupsFitIntoSubscriptionUpdate() throws Exception {
|
public void testGroupsFitIntoSubscriptionUpdate() throws Exception {
|
||||||
// Create the maximum number of maximum-length groups
|
// Create the maximum number of maximum-length groups
|
||||||
|
|||||||
@@ -52,12 +52,6 @@ public class SimplexOutgoingSessionTest extends BriarTestCase {
|
|||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
// Add listener
|
// Add listener
|
||||||
oneOf(eventBus).addListener(session);
|
oneOf(eventBus).addListener(session);
|
||||||
// No transport acks to send
|
|
||||||
oneOf(db).generateTransportAcks(contactId);
|
|
||||||
will(returnValue(null));
|
|
||||||
// No transport updates to send
|
|
||||||
oneOf(db).generateTransportUpdates(contactId, maxLatency);
|
|
||||||
will(returnValue(null));
|
|
||||||
// No subscription ack to send
|
// No subscription ack to send
|
||||||
oneOf(db).generateSubscriptionAck(contactId);
|
oneOf(db).generateSubscriptionAck(contactId);
|
||||||
will(returnValue(null));
|
will(returnValue(null));
|
||||||
@@ -92,12 +86,6 @@ public class SimplexOutgoingSessionTest extends BriarTestCase {
|
|||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
// Add listener
|
// Add listener
|
||||||
oneOf(eventBus).addListener(session);
|
oneOf(eventBus).addListener(session);
|
||||||
// No transport acks to send
|
|
||||||
oneOf(db).generateTransportAcks(contactId);
|
|
||||||
will(returnValue(null));
|
|
||||||
// No transport updates to send
|
|
||||||
oneOf(db).generateTransportUpdates(contactId, maxLatency);
|
|
||||||
will(returnValue(null));
|
|
||||||
// No subscription ack to send
|
// No subscription ack to send
|
||||||
oneOf(db).generateSubscriptionAck(contactId);
|
oneOf(db).generateSubscriptionAck(contactId);
|
||||||
will(returnValue(null));
|
will(returnValue(null));
|
||||||
|
|||||||
Reference in New Issue
Block a user