Minor refactoring.

This commit is contained in:
akwizgran
2011-11-14 22:14:52 +00:00
parent 73aa7d14d7
commit 72be34768b
24 changed files with 130 additions and 177 deletions

View File

@@ -26,8 +26,8 @@ import net.sf.briar.api.protocol.writers.AckWriter;
import net.sf.briar.api.protocol.writers.BatchWriter; import net.sf.briar.api.protocol.writers.BatchWriter;
import net.sf.briar.api.protocol.writers.OfferWriter; import net.sf.briar.api.protocol.writers.OfferWriter;
import net.sf.briar.api.protocol.writers.RequestWriter; import net.sf.briar.api.protocol.writers.RequestWriter;
import net.sf.briar.api.protocol.writers.SubscriptionWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
import net.sf.briar.api.protocol.writers.TransportWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
import net.sf.briar.api.transport.ConnectionWindow; import net.sf.briar.api.transport.ConnectionWindow;
/** /**
@@ -102,12 +102,12 @@ public interface DatabaseComponent {
throws DbException, IOException; throws DbException, IOException;
/** Generates a subscription update for the given contact. */ /** Generates a subscription update for the given contact. */
void generateSubscriptionUpdate(ContactId c, SubscriptionWriter s) throws void generateSubscriptionUpdate(ContactId c, SubscriptionUpdateWriter s)
DbException, IOException; throws DbException, IOException;
/** Generates a transport update for the given contact. */ /** Generates a transport update for the given contact. */
void generateTransportUpdate(ContactId c, TransportWriter t) throws void generateTransportUpdate(ContactId c, TransportUpdateWriter t)
DbException, IOException; throws DbException, IOException;
/** Returns the configuration for the given transport. */ /** Returns the configuration for the given transport. */
TransportConfig getConfig(TransportId t) throws DbException; TransportConfig getConfig(TransportId t) throws DbException;

View File

@@ -1,13 +1,9 @@
package net.sf.briar.api.protocol.writers; package net.sf.briar.api.protocol;
import java.io.IOException; import java.io.IOException;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.security.PrivateKey; import java.security.PrivateKey;
import net.sf.briar.api.protocol.Author;
import net.sf.briar.api.protocol.Group;
import net.sf.briar.api.protocol.Message;
import net.sf.briar.api.protocol.MessageId;
public interface MessageEncoder { public interface MessageEncoder {

View File

@@ -12,10 +12,10 @@ public interface ProtocolConstants {
static final int MAX_PACKET_LENGTH = static final int MAX_PACKET_LENGTH =
TransportConstants.MIN_CONNECTION_LENGTH - 1024; TransportConstants.MIN_CONNECTION_LENGTH - 1024;
/** The maximum number of transport plugins a node may support. */ /** The maximum number of transports a node may support. */
static final int MAX_TRANSPORTS = 50; static final int MAX_TRANSPORTS = 50;
/** The maximum number of properties per transport plugin. */ /** The maximum number of properties per transport. */
static final int MAX_PROPERTIES_PER_TRANSPORT = 100; static final int MAX_PROPERTIES_PER_TRANSPORT = 100;
/** The maximum length of a property's key or value in UTF-8 bytes. */ /** The maximum length of a property's key or value in UTF-8 bytes. */
@@ -27,7 +27,7 @@ public interface ProtocolConstants {
/** The maximum length of a group's name in UTF-8 bytes. */ /** The maximum length of a group's name in UTF-8 bytes. */
static final int MAX_GROUP_NAME_LENGTH = 50; static final int MAX_GROUP_NAME_LENGTH = 50;
/** The maximum length of a serialised public key in bytes. */ /** The maximum length of a public key in bytes. */
static final int MAX_PUBLIC_KEY_LENGTH = 100; static final int MAX_PUBLIC_KEY_LENGTH = 100;
/** The maximum length of an author's name in UTF-8 bytes. */ /** The maximum length of an author's name in UTF-8 bytes. */

View File

@@ -1,11 +0,0 @@
package net.sf.briar.api.protocol.writers;
import java.io.IOException;
import net.sf.briar.api.protocol.Author;
import net.sf.briar.api.serial.Writer;
public interface AuthorWriter {
void writeAuthor(Writer w, Author a) throws IOException;
}

View File

@@ -1,11 +0,0 @@
package net.sf.briar.api.protocol.writers;
import java.io.IOException;
import net.sf.briar.api.protocol.Group;
import net.sf.briar.api.serial.Writer;
public interface GroupWriter {
void writeGroup(Writer w, Group g) throws IOException;
}

View File

@@ -12,7 +12,7 @@ public interface ProtocolWriterFactory {
RequestWriter createRequestWriter(OutputStream out); RequestWriter createRequestWriter(OutputStream out);
SubscriptionWriter createSubscriptionWriter(OutputStream out); SubscriptionUpdateWriter createSubscriptionUpdateWriter(OutputStream out);
TransportWriter createTransportWriter(OutputStream out); TransportUpdateWriter createTransportUpdateWriter(OutputStream out);
} }

View File

@@ -6,7 +6,7 @@ import java.util.Map;
import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.Group;
/** An interface for creating a subscription update. */ /** An interface for creating a subscription update. */
public interface SubscriptionWriter { public interface SubscriptionUpdateWriter {
/** Writes the contents of the update. */ /** Writes the contents of the update. */
void writeSubscriptions(Map<Group, Long> subs, long timestamp) void writeSubscriptions(Map<Group, Long> subs, long timestamp)

View File

@@ -6,7 +6,7 @@ import java.util.Collection;
import net.sf.briar.api.protocol.Transport; import net.sf.briar.api.protocol.Transport;
/** An interface for creating a transport update. */ /** An interface for creating a transport update. */
public interface TransportWriter { public interface TransportUpdateWriter {
/** Writes the contents of the update. */ /** Writes the contents of the update. */
void writeTransports(Collection<Transport> transports, long timestamp) void writeTransports(Collection<Transport> transports, long timestamp)

View File

@@ -58,8 +58,8 @@ import net.sf.briar.api.protocol.writers.AckWriter;
import net.sf.briar.api.protocol.writers.BatchWriter; import net.sf.briar.api.protocol.writers.BatchWriter;
import net.sf.briar.api.protocol.writers.OfferWriter; import net.sf.briar.api.protocol.writers.OfferWriter;
import net.sf.briar.api.protocol.writers.RequestWriter; import net.sf.briar.api.protocol.writers.RequestWriter;
import net.sf.briar.api.protocol.writers.SubscriptionWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
import net.sf.briar.api.protocol.writers.TransportWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
import net.sf.briar.api.transport.ConnectionWindow; import net.sf.briar.api.transport.ConnectionWindow;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -602,8 +602,8 @@ DatabaseCleaner.Callback {
return sent; return sent;
} }
public void generateSubscriptionUpdate(ContactId c, SubscriptionWriter s) public void generateSubscriptionUpdate(ContactId c,
throws DbException, IOException { SubscriptionUpdateWriter s) throws DbException, IOException {
Map<Group, Long> subs = null; Map<Group, Long> subs = null;
long timestamp = 0L; long timestamp = 0L;
contactLock.readLock().lock(); contactLock.readLock().lock();
@@ -644,7 +644,7 @@ DatabaseCleaner.Callback {
return now - sent >= DatabaseConstants.MAX_UPDATE_INTERVAL; return now - sent >= DatabaseConstants.MAX_UPDATE_INTERVAL;
} }
public void generateTransportUpdate(ContactId c, TransportWriter t) public void generateTransportUpdate(ContactId c, TransportUpdateWriter t)
throws DbException, IOException { throws DbException, IOException {
Collection<Transport> transports = null; Collection<Transport> transports = null;
long timestamp = 0L; long timestamp = 0L;

View File

@@ -14,12 +14,10 @@ import net.sf.briar.api.protocol.AuthorId;
import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.Group;
import net.sf.briar.api.protocol.GroupId; import net.sf.briar.api.protocol.GroupId;
import net.sf.briar.api.protocol.Message; import net.sf.briar.api.protocol.Message;
import net.sf.briar.api.protocol.MessageEncoder;
import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.MessageId;
import net.sf.briar.api.protocol.ProtocolConstants; import net.sf.briar.api.protocol.ProtocolConstants;
import net.sf.briar.api.protocol.Types; import net.sf.briar.api.protocol.Types;
import net.sf.briar.api.protocol.writers.AuthorWriter;
import net.sf.briar.api.protocol.writers.GroupWriter;
import net.sf.briar.api.protocol.writers.MessageEncoder;
import net.sf.briar.api.serial.Consumer; import net.sf.briar.api.serial.Consumer;
import net.sf.briar.api.serial.Writer; import net.sf.briar.api.serial.Writer;
import net.sf.briar.api.serial.WriterFactory; import net.sf.briar.api.serial.WriterFactory;
@@ -32,19 +30,14 @@ class MessageEncoderImpl implements MessageEncoder {
private final SecureRandom random; private final SecureRandom random;
private final MessageDigest messageDigest; private final MessageDigest messageDigest;
private final WriterFactory writerFactory; private final WriterFactory writerFactory;
private final AuthorWriter authorWriter;
private final GroupWriter groupWriter;
@Inject @Inject
MessageEncoderImpl(CryptoComponent crypto, WriterFactory writerFactory, MessageEncoderImpl(CryptoComponent crypto, WriterFactory writerFactory) {
AuthorWriter authorWriter, GroupWriter groupWriter) {
authorSignature = crypto.getSignature(); authorSignature = crypto.getSignature();
groupSignature = crypto.getSignature(); groupSignature = crypto.getSignature();
random = crypto.getSecureRandom(); random = crypto.getSecureRandom();
messageDigest = crypto.getMessageDigest(); messageDigest = crypto.getMessageDigest();
this.writerFactory = writerFactory; this.writerFactory = writerFactory;
this.authorWriter = authorWriter;
this.groupWriter = groupWriter;
} }
public Message encodeMessage(MessageId parent, String subject, byte[] body) public Message encodeMessage(MessageId parent, String subject, byte[] body)
@@ -111,9 +104,9 @@ class MessageEncoderImpl implements MessageEncoder {
if(parent == null) w.writeNull(); if(parent == null) w.writeNull();
else w.writeBytes(parent.getBytes()); else w.writeBytes(parent.getBytes());
if(group == null) w.writeNull(); if(group == null) w.writeNull();
else groupWriter.writeGroup(w, group); else writeGroup(w, group);
if(author == null) w.writeNull(); if(author == null) w.writeNull();
else authorWriter.writeAuthor(w, author); else writeAuthor(w, author);
w.writeString(subject); w.writeString(subject);
long timestamp = System.currentTimeMillis(); long timestamp = System.currentTimeMillis();
w.writeInt64(timestamp); w.writeInt64(timestamp);
@@ -151,4 +144,18 @@ class MessageEncoderImpl implements MessageEncoder {
return new MessageImpl(id, parent, groupId, authorId, subject, return new MessageImpl(id, parent, groupId, authorId, subject,
timestamp, raw, bodyStart, body.length); timestamp, raw, bodyStart, body.length);
} }
private void writeGroup(Writer w, Group g) throws IOException {
w.writeUserDefinedId(Types.GROUP);
w.writeString(g.getName());
byte[] publicKey = g.getPublicKey();
if(publicKey == null) w.writeNull();
else w.writeBytes(publicKey);
}
private void writeAuthor(Writer w, Author a) throws IOException {
w.writeUserDefinedId(Types.AUTHOR);
w.writeString(a.getName());
w.writeBytes(a.getPublicKey());
}
} }

View File

@@ -9,13 +9,13 @@ import net.sf.briar.api.protocol.BatchId;
import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.Group;
import net.sf.briar.api.protocol.GroupFactory; import net.sf.briar.api.protocol.GroupFactory;
import net.sf.briar.api.protocol.Message; import net.sf.briar.api.protocol.Message;
import net.sf.briar.api.protocol.MessageEncoder;
import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.MessageId;
import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.Offer;
import net.sf.briar.api.protocol.ProtocolReaderFactory; import net.sf.briar.api.protocol.ProtocolReaderFactory;
import net.sf.briar.api.protocol.Request; import net.sf.briar.api.protocol.Request;
import net.sf.briar.api.protocol.SubscriptionUpdate; import net.sf.briar.api.protocol.SubscriptionUpdate;
import net.sf.briar.api.protocol.TransportUpdate; import net.sf.briar.api.protocol.TransportUpdate;
import net.sf.briar.api.protocol.writers.MessageEncoder;
import net.sf.briar.api.serial.ObjectReader; import net.sf.briar.api.serial.ObjectReader;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;

View File

@@ -1,17 +0,0 @@
package net.sf.briar.protocol.writers;
import java.io.IOException;
import net.sf.briar.api.protocol.Author;
import net.sf.briar.api.protocol.Types;
import net.sf.briar.api.protocol.writers.AuthorWriter;
import net.sf.briar.api.serial.Writer;
class AuthorWriterImpl implements AuthorWriter {
public void writeAuthor(Writer w, Author a) throws IOException {
w.writeUserDefinedId(Types.AUTHOR);
w.writeString(a.getName());
w.writeBytes(a.getPublicKey());
}
}

View File

@@ -1,19 +0,0 @@
package net.sf.briar.protocol.writers;
import java.io.IOException;
import net.sf.briar.api.protocol.Group;
import net.sf.briar.api.protocol.Types;
import net.sf.briar.api.protocol.writers.GroupWriter;
import net.sf.briar.api.serial.Writer;
class GroupWriterImpl implements GroupWriter {
public void writeGroup(Writer w, Group g) throws IOException {
w.writeUserDefinedId(Types.GROUP);
w.writeString(g.getName());
byte[] publicKey = g.getPublicKey();
if(publicKey == null) w.writeNull();
else w.writeBytes(publicKey);
}
}

View File

@@ -9,8 +9,8 @@ import net.sf.briar.api.protocol.writers.BatchWriter;
import net.sf.briar.api.protocol.writers.OfferWriter; import net.sf.briar.api.protocol.writers.OfferWriter;
import net.sf.briar.api.protocol.writers.ProtocolWriterFactory; import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
import net.sf.briar.api.protocol.writers.RequestWriter; import net.sf.briar.api.protocol.writers.RequestWriter;
import net.sf.briar.api.protocol.writers.SubscriptionWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
import net.sf.briar.api.protocol.writers.TransportWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
import net.sf.briar.api.serial.SerialComponent; import net.sf.briar.api.serial.SerialComponent;
import net.sf.briar.api.serial.WriterFactory; import net.sf.briar.api.serial.WriterFactory;
@@ -46,11 +46,12 @@ class ProtocolWriterFactoryImpl implements ProtocolWriterFactory {
return new RequestWriterImpl(out, writerFactory); return new RequestWriterImpl(out, writerFactory);
} }
public SubscriptionWriter createSubscriptionWriter(OutputStream out) { public SubscriptionUpdateWriter createSubscriptionUpdateWriter(
return new SubscriptionWriterImpl(out, writerFactory); OutputStream out) {
return new SubscriptionUpdateWriterImpl(out, writerFactory);
} }
public TransportWriter createTransportWriter(OutputStream out) { public TransportUpdateWriter createTransportUpdateWriter(OutputStream out) {
return new TransportWriterImpl(out, writerFactory); return new TransportUpdateWriterImpl(out, writerFactory);
} }
} }

View File

@@ -1,7 +1,5 @@
package net.sf.briar.protocol.writers; package net.sf.briar.protocol.writers;
import net.sf.briar.api.protocol.writers.AuthorWriter;
import net.sf.briar.api.protocol.writers.GroupWriter;
import net.sf.briar.api.protocol.writers.ProtocolWriterFactory; import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
@@ -10,8 +8,6 @@ public class ProtocolWritersModule extends AbstractModule {
@Override @Override
protected void configure() { protected void configure() {
bind(AuthorWriter.class).to(AuthorWriterImpl.class);
bind(GroupWriter.class).to(GroupWriterImpl.class);
bind(ProtocolWriterFactory.class).to(ProtocolWriterFactoryImpl.class); bind(ProtocolWriterFactory.class).to(ProtocolWriterFactoryImpl.class);
} }
} }

View File

@@ -7,21 +7,19 @@ import java.util.Map.Entry;
import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.Group;
import net.sf.briar.api.protocol.Types; import net.sf.briar.api.protocol.Types;
import net.sf.briar.api.protocol.writers.GroupWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
import net.sf.briar.api.protocol.writers.SubscriptionWriter;
import net.sf.briar.api.serial.Writer; import net.sf.briar.api.serial.Writer;
import net.sf.briar.api.serial.WriterFactory; import net.sf.briar.api.serial.WriterFactory;
class SubscriptionWriterImpl implements SubscriptionWriter { class SubscriptionUpdateWriterImpl implements SubscriptionUpdateWriter {
private final OutputStream out; private final OutputStream out;
private final Writer w; private final Writer w;
private final GroupWriter groupWriter;
SubscriptionWriterImpl(OutputStream out, WriterFactory writerFactory) { SubscriptionUpdateWriterImpl(OutputStream out,
WriterFactory writerFactory) {
this.out = out; this.out = out;
w = writerFactory.createWriter(out); w = writerFactory.createWriter(out);
groupWriter = new GroupWriterImpl();
} }
public void writeSubscriptions(Map<Group, Long> subs, long timestamp) public void writeSubscriptions(Map<Group, Long> subs, long timestamp)
@@ -29,11 +27,19 @@ class SubscriptionWriterImpl implements SubscriptionWriter {
w.writeUserDefinedId(Types.SUBSCRIPTION_UPDATE); w.writeUserDefinedId(Types.SUBSCRIPTION_UPDATE);
w.writeMapStart(); w.writeMapStart();
for(Entry<Group, Long> e : subs.entrySet()) { for(Entry<Group, Long> e : subs.entrySet()) {
groupWriter.writeGroup(w, e.getKey()); writeGroup(w, e.getKey());
w.writeInt64(e.getValue()); w.writeInt64(e.getValue());
} }
w.writeMapEnd(); w.writeMapEnd();
w.writeInt64(timestamp); w.writeInt64(timestamp);
out.flush(); out.flush();
} }
private void writeGroup(Writer w, Group g) throws IOException {
w.writeUserDefinedId(Types.GROUP);
w.writeString(g.getName());
byte[] publicKey = g.getPublicKey();
if(publicKey == null) w.writeNull();
else w.writeBytes(publicKey);
}
} }

View File

@@ -6,16 +6,16 @@ import java.util.Collection;
import net.sf.briar.api.protocol.Transport; import net.sf.briar.api.protocol.Transport;
import net.sf.briar.api.protocol.Types; import net.sf.briar.api.protocol.Types;
import net.sf.briar.api.protocol.writers.TransportWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
import net.sf.briar.api.serial.Writer; import net.sf.briar.api.serial.Writer;
import net.sf.briar.api.serial.WriterFactory; import net.sf.briar.api.serial.WriterFactory;
class TransportWriterImpl implements TransportWriter { class TransportUpdateWriterImpl implements TransportUpdateWriter {
private final OutputStream out; private final OutputStream out;
private final Writer w; private final Writer w;
TransportWriterImpl(OutputStream out, WriterFactory writerFactory) { TransportUpdateWriterImpl(OutputStream out, WriterFactory writerFactory) {
this.out = out; this.out = out;
w = writerFactory.createWriter(out); w = writerFactory.createWriter(out);
} }

View File

@@ -14,8 +14,8 @@ import net.sf.briar.api.protocol.TransportIndex;
import net.sf.briar.api.protocol.writers.AckWriter; import net.sf.briar.api.protocol.writers.AckWriter;
import net.sf.briar.api.protocol.writers.BatchWriter; import net.sf.briar.api.protocol.writers.BatchWriter;
import net.sf.briar.api.protocol.writers.ProtocolWriterFactory; import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
import net.sf.briar.api.protocol.writers.SubscriptionWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
import net.sf.briar.api.protocol.writers.TransportWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
import net.sf.briar.api.transport.BatchTransportWriter; import net.sf.briar.api.transport.BatchTransportWriter;
import net.sf.briar.api.transport.ConnectionWriter; import net.sf.briar.api.transport.ConnectionWriter;
import net.sf.briar.api.transport.ConnectionWriterFactory; import net.sf.briar.api.transport.ConnectionWriterFactory;
@@ -56,13 +56,14 @@ class OutgoingBatchConnection {
long capacity = conn.getRemainingCapacity(); long capacity = conn.getRemainingCapacity();
if(capacity < MAX_PACKET_LENGTH) throw new IOException(); if(capacity < MAX_PACKET_LENGTH) throw new IOException();
// Write a transport update // Write a transport update
TransportWriter t = protoFactory.createTransportWriter(out); TransportUpdateWriter t =
protoFactory.createTransportUpdateWriter(out);
db.generateTransportUpdate(contactId, t); db.generateTransportUpdate(contactId, t);
// If there's space, write a subscription update // If there's space, write a subscription update
capacity = conn.getRemainingCapacity(); capacity = conn.getRemainingCapacity();
if(capacity >= MAX_PACKET_LENGTH) { if(capacity >= MAX_PACKET_LENGTH) {
SubscriptionWriter s = SubscriptionUpdateWriter s =
protoFactory.createSubscriptionWriter(out); protoFactory.createSubscriptionUpdateWriter(out);
db.generateSubscriptionUpdate(contactId, s); db.generateSubscriptionUpdate(contactId, s);
} }
// Write acks until you can't write acks no more // Write acks until you can't write acks no more

View File

@@ -36,8 +36,8 @@ import net.sf.briar.api.protocol.writers.BatchWriter;
import net.sf.briar.api.protocol.writers.OfferWriter; import net.sf.briar.api.protocol.writers.OfferWriter;
import net.sf.briar.api.protocol.writers.ProtocolWriterFactory; import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
import net.sf.briar.api.protocol.writers.RequestWriter; import net.sf.briar.api.protocol.writers.RequestWriter;
import net.sf.briar.api.protocol.writers.SubscriptionWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
import net.sf.briar.api.protocol.writers.TransportWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
import net.sf.briar.api.transport.ConnectionReader; import net.sf.briar.api.transport.ConnectionReader;
import net.sf.briar.api.transport.ConnectionReaderFactory; import net.sf.briar.api.transport.ConnectionReaderFactory;
import net.sf.briar.api.transport.ConnectionWriter; import net.sf.briar.api.transport.ConnectionWriter;
@@ -194,13 +194,13 @@ abstract class StreamConnection implements DatabaseListener {
OfferWriter offerWriter = protoWriterFactory.createOfferWriter(out); OfferWriter offerWriter = protoWriterFactory.createOfferWriter(out);
RequestWriter requestWriter = RequestWriter requestWriter =
protoWriterFactory.createRequestWriter(out); protoWriterFactory.createRequestWriter(out);
SubscriptionWriter subscriptionWriter = SubscriptionUpdateWriter subscriptionUpdateWriter =
protoWriterFactory.createSubscriptionWriter(out); protoWriterFactory.createSubscriptionUpdateWriter(out);
TransportWriter transportWriter = TransportUpdateWriter transportUpdateWriter =
protoWriterFactory.createTransportWriter(out); protoWriterFactory.createTransportUpdateWriter(out);
// Send the initial packets: transports, subs, any waiting acks // Send the initial packets: transports, subs, any waiting acks
sendTransports(transportWriter); sendTransportUpdate(transportUpdateWriter);
sendSubscriptions(subscriptionWriter); sendSubscriptionUpdate(subscriptionUpdateWriter);
sendAcks(ackWriter); sendAcks(ackWriter);
State state = State.SEND_OFFER; State state = State.SEND_OFFER;
// Main loop // Main loop
@@ -234,10 +234,10 @@ abstract class StreamConnection implements DatabaseListener {
return; return;
} }
if((flags & Flags.TRANSPORTS_UPDATED) != 0) { if((flags & Flags.TRANSPORTS_UPDATED) != 0) {
sendTransports(transportWriter); sendTransportUpdate(transportUpdateWriter);
} }
if((flags & Flags.SUBSCRIPTIONS_UPDATED) != 0) { if((flags & Flags.SUBSCRIPTIONS_UPDATED) != 0) {
sendSubscriptions(subscriptionWriter); sendSubscriptionUpdate(subscriptionUpdateWriter);
} }
if((flags & Flags.BATCH_RECEIVED) != 0) { if((flags & Flags.BATCH_RECEIVED) != 0) {
sendAcks(ackWriter); sendAcks(ackWriter);
@@ -274,10 +274,10 @@ abstract class StreamConnection implements DatabaseListener {
return; return;
} }
if((flags & Flags.TRANSPORTS_UPDATED) != 0) { if((flags & Flags.TRANSPORTS_UPDATED) != 0) {
sendTransports(transportWriter); sendTransportUpdate(transportUpdateWriter);
} }
if((flags & Flags.SUBSCRIPTIONS_UPDATED) != 0) { if((flags & Flags.SUBSCRIPTIONS_UPDATED) != 0) {
sendSubscriptions(subscriptionWriter); sendSubscriptionUpdate(subscriptionUpdateWriter);
} }
if((flags & Flags.BATCH_RECEIVED) != 0) { if((flags & Flags.BATCH_RECEIVED) != 0) {
sendAcks(ackWriter); sendAcks(ackWriter);
@@ -305,10 +305,10 @@ abstract class StreamConnection implements DatabaseListener {
return; return;
} }
if((flags & Flags.TRANSPORTS_UPDATED) != 0) { if((flags & Flags.TRANSPORTS_UPDATED) != 0) {
sendTransports(transportWriter); sendTransportUpdate(transportUpdateWriter);
} }
if((flags & Flags.SUBSCRIPTIONS_UPDATED) != 0) { if((flags & Flags.SUBSCRIPTIONS_UPDATED) != 0) {
sendSubscriptions(subscriptionWriter); sendSubscriptionUpdate(subscriptionUpdateWriter);
} }
if((flags & Flags.BATCH_RECEIVED) != 0) { if((flags & Flags.BATCH_RECEIVED) != 0) {
sendAcks(ackWriter); sendAcks(ackWriter);
@@ -388,13 +388,13 @@ abstract class StreamConnection implements DatabaseListener {
db.receiveOffer(contactId, o, r); db.receiveOffer(contactId, o, r);
} }
private void sendTransports(TransportWriter t) throws DbException, private void sendTransportUpdate(TransportUpdateWriter t)
IOException { throws DbException, IOException {
db.generateTransportUpdate(contactId, t); db.generateTransportUpdate(contactId, t);
} }
private void sendSubscriptions(SubscriptionWriter s) throws DbException, private void sendSubscriptionUpdate(SubscriptionUpdateWriter s)
IOException { throws DbException, IOException {
db.generateSubscriptionUpdate(contactId, s); db.generateSubscriptionUpdate(contactId, s);
} }
} }

View File

@@ -24,6 +24,7 @@ import net.sf.briar.api.protocol.BatchId;
import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.Group;
import net.sf.briar.api.protocol.GroupFactory; import net.sf.briar.api.protocol.GroupFactory;
import net.sf.briar.api.protocol.Message; import net.sf.briar.api.protocol.Message;
import net.sf.briar.api.protocol.MessageEncoder;
import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.MessageId;
import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.Offer;
import net.sf.briar.api.protocol.ProtocolReader; import net.sf.briar.api.protocol.ProtocolReader;
@@ -37,12 +38,11 @@ import net.sf.briar.api.protocol.TransportUpdate;
import net.sf.briar.api.protocol.UniqueId; import net.sf.briar.api.protocol.UniqueId;
import net.sf.briar.api.protocol.writers.AckWriter; import net.sf.briar.api.protocol.writers.AckWriter;
import net.sf.briar.api.protocol.writers.BatchWriter; import net.sf.briar.api.protocol.writers.BatchWriter;
import net.sf.briar.api.protocol.writers.MessageEncoder;
import net.sf.briar.api.protocol.writers.OfferWriter; import net.sf.briar.api.protocol.writers.OfferWriter;
import net.sf.briar.api.protocol.writers.ProtocolWriterFactory; import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
import net.sf.briar.api.protocol.writers.RequestWriter; import net.sf.briar.api.protocol.writers.RequestWriter;
import net.sf.briar.api.protocol.writers.SubscriptionWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
import net.sf.briar.api.protocol.writers.TransportWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
import net.sf.briar.api.transport.ConnectionReader; import net.sf.briar.api.transport.ConnectionReader;
import net.sf.briar.api.transport.ConnectionReaderFactory; import net.sf.briar.api.transport.ConnectionReaderFactory;
import net.sf.briar.api.transport.ConnectionWriter; import net.sf.briar.api.transport.ConnectionWriter;
@@ -167,15 +167,16 @@ public class ProtocolIntegrationTest extends TestCase {
requested.set(3); requested.set(3);
r.writeRequest(requested, 4); r.writeRequest(requested, 4);
SubscriptionWriter s = SubscriptionUpdateWriter s =
protocolWriterFactory.createSubscriptionWriter(out1); protocolWriterFactory.createSubscriptionUpdateWriter(out1);
// Use a LinkedHashMap for predictable iteration order // Use a LinkedHashMap for predictable iteration order
Map<Group, Long> subs = new LinkedHashMap<Group, Long>(); Map<Group, Long> subs = new LinkedHashMap<Group, Long>();
subs.put(group, 0L); subs.put(group, 0L);
subs.put(group1, 0L); subs.put(group1, 0L);
s.writeSubscriptions(subs, timestamp); s.writeSubscriptions(subs, timestamp);
TransportWriter t = protocolWriterFactory.createTransportWriter(out1); TransportUpdateWriter t =
protocolWriterFactory.createTransportUpdateWriter(out1);
t.writeTransports(transports, timestamp); t.writeTransports(transports, timestamp);
out1.close(); out1.close();

View File

@@ -40,8 +40,8 @@ import net.sf.briar.api.protocol.writers.AckWriter;
import net.sf.briar.api.protocol.writers.BatchWriter; import net.sf.briar.api.protocol.writers.BatchWriter;
import net.sf.briar.api.protocol.writers.OfferWriter; import net.sf.briar.api.protocol.writers.OfferWriter;
import net.sf.briar.api.protocol.writers.RequestWriter; import net.sf.briar.api.protocol.writers.RequestWriter;
import net.sf.briar.api.protocol.writers.SubscriptionWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
import net.sf.briar.api.protocol.writers.TransportWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
import net.sf.briar.api.transport.ConnectionWindow; import net.sf.briar.api.transport.ConnectionWindow;
import org.jmock.Expectations; import org.jmock.Expectations;
@@ -488,10 +488,10 @@ public abstract class DatabaseComponentTest extends TestCase {
final AckWriter ackWriter = context.mock(AckWriter.class); final AckWriter ackWriter = context.mock(AckWriter.class);
final BatchWriter batchWriter = context.mock(BatchWriter.class); final BatchWriter batchWriter = context.mock(BatchWriter.class);
final OfferWriter offerWriter = context.mock(OfferWriter.class); final OfferWriter offerWriter = context.mock(OfferWriter.class);
final SubscriptionWriter subscriptionWriter = final SubscriptionUpdateWriter subscriptionUpdateWriter =
context.mock(SubscriptionWriter.class); context.mock(SubscriptionUpdateWriter.class);
final TransportWriter transportWriter = final TransportUpdateWriter transportUpdateWriter =
context.mock(TransportWriter.class); context.mock(TransportUpdateWriter.class);
final Ack ack = context.mock(Ack.class); final Ack ack = context.mock(Ack.class);
final Batch batch = context.mock(Batch.class); final Batch batch = context.mock(Batch.class);
final Offer offer = context.mock(Offer.class); final Offer offer = context.mock(Offer.class);
@@ -537,12 +537,12 @@ public abstract class DatabaseComponentTest extends TestCase {
} catch(NoSuchContactException expected) {} } catch(NoSuchContactException expected) {}
try { try {
db.generateSubscriptionUpdate(contactId, subscriptionWriter); db.generateSubscriptionUpdate(contactId, subscriptionUpdateWriter);
fail(); fail();
} catch(NoSuchContactException expected) {} } catch(NoSuchContactException expected) {}
try { try {
db.generateTransportUpdate(contactId, transportWriter); db.generateTransportUpdate(contactId, transportUpdateWriter);
fail(); fail();
} catch(NoSuchContactException expected) {} } catch(NoSuchContactException expected) {}
@@ -771,8 +771,8 @@ public abstract class DatabaseComponentTest extends TestCase {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final Database<Object> database = context.mock(Database.class); final Database<Object> database = context.mock(Database.class);
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class); final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
final SubscriptionWriter subscriptionWriter = final SubscriptionUpdateWriter subscriptionUpdateWriter =
context.mock(SubscriptionWriter.class); context.mock(SubscriptionUpdateWriter.class);
context.checking(new Expectations() {{ context.checking(new Expectations() {{
allowing(database).startTransaction(); allowing(database).startTransaction();
will(returnValue(txn)); will(returnValue(txn));
@@ -787,7 +787,7 @@ public abstract class DatabaseComponentTest extends TestCase {
}}); }});
DatabaseComponent db = createDatabaseComponent(database, cleaner); DatabaseComponent db = createDatabaseComponent(database, cleaner);
db.generateSubscriptionUpdate(contactId, subscriptionWriter); db.generateSubscriptionUpdate(contactId, subscriptionUpdateWriter);
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
@@ -802,8 +802,8 @@ public abstract class DatabaseComponentTest extends TestCase {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final Database<Object> database = context.mock(Database.class); final Database<Object> database = context.mock(Database.class);
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class); final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
final SubscriptionWriter subscriptionWriter = final SubscriptionUpdateWriter subscriptionUpdateWriter =
context.mock(SubscriptionWriter.class); context.mock(SubscriptionUpdateWriter.class);
context.checking(new Expectations() {{ context.checking(new Expectations() {{
allowing(database).startTransaction(); allowing(database).startTransaction();
will(returnValue(txn)); will(returnValue(txn));
@@ -821,13 +821,13 @@ public abstract class DatabaseComponentTest extends TestCase {
oneOf(database).setSubscriptionsSent(with(txn), with(contactId), oneOf(database).setSubscriptionsSent(with(txn), with(contactId),
with(any(long.class))); with(any(long.class)));
// Add the subscriptions to the writer // Add the subscriptions to the writer
oneOf(subscriptionWriter).writeSubscriptions( oneOf(subscriptionUpdateWriter).writeSubscriptions(
with(Collections.singletonMap(group, 0L)), with(Collections.singletonMap(group, 0L)),
with(any(long.class))); with(any(long.class)));
}}); }});
DatabaseComponent db = createDatabaseComponent(database, cleaner); DatabaseComponent db = createDatabaseComponent(database, cleaner);
db.generateSubscriptionUpdate(contactId, subscriptionWriter); db.generateSubscriptionUpdate(contactId, subscriptionUpdateWriter);
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
@@ -839,8 +839,8 @@ public abstract class DatabaseComponentTest extends TestCase {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final Database<Object> database = context.mock(Database.class); final Database<Object> database = context.mock(Database.class);
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class); final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
final TransportWriter transportWriter = final TransportUpdateWriter transportUpdateWriter =
context.mock(TransportWriter.class); context.mock(TransportUpdateWriter.class);
context.checking(new Expectations() {{ context.checking(new Expectations() {{
allowing(database).startTransaction(); allowing(database).startTransaction();
will(returnValue(txn)); will(returnValue(txn));
@@ -855,7 +855,7 @@ public abstract class DatabaseComponentTest extends TestCase {
}}); }});
DatabaseComponent db = createDatabaseComponent(database, cleaner); DatabaseComponent db = createDatabaseComponent(database, cleaner);
db.generateTransportUpdate(contactId, transportWriter); db.generateTransportUpdate(contactId, transportUpdateWriter);
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
@@ -870,8 +870,8 @@ public abstract class DatabaseComponentTest extends TestCase {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final Database<Object> database = context.mock(Database.class); final Database<Object> database = context.mock(Database.class);
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class); final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
final TransportWriter transportWriter = final TransportUpdateWriter transportUpdateWriter =
context.mock(TransportWriter.class); context.mock(TransportUpdateWriter.class);
context.checking(new Expectations() {{ context.checking(new Expectations() {{
allowing(database).startTransaction(); allowing(database).startTransaction();
will(returnValue(txn)); will(returnValue(txn));
@@ -889,12 +889,12 @@ public abstract class DatabaseComponentTest extends TestCase {
oneOf(database).setTransportsSent(with(txn), with(contactId), oneOf(database).setTransportsSent(with(txn), with(contactId),
with(any(long.class))); with(any(long.class)));
// Add the properties to the writer // Add the properties to the writer
oneOf(transportWriter).writeTransports(with(transports), oneOf(transportUpdateWriter).writeTransports(with(transports),
with(any(long.class))); with(any(long.class)));
}}); }});
DatabaseComponent db = createDatabaseComponent(database, cleaner); DatabaseComponent db = createDatabaseComponent(database, cleaner);
db.generateTransportUpdate(contactId, transportWriter); db.generateTransportUpdate(contactId, transportUpdateWriter);
context.assertIsSatisfied(); context.assertIsSatisfied();
} }

View File

@@ -15,6 +15,7 @@ import net.sf.briar.api.protocol.BatchId;
import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.Group;
import net.sf.briar.api.protocol.GroupFactory; import net.sf.briar.api.protocol.GroupFactory;
import net.sf.briar.api.protocol.Message; import net.sf.briar.api.protocol.Message;
import net.sf.briar.api.protocol.MessageEncoder;
import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.Offer;
import net.sf.briar.api.protocol.ProtocolReader; import net.sf.briar.api.protocol.ProtocolReader;
import net.sf.briar.api.protocol.ProtocolReaderFactory; import net.sf.briar.api.protocol.ProtocolReaderFactory;
@@ -26,12 +27,11 @@ import net.sf.briar.api.protocol.TransportIndex;
import net.sf.briar.api.protocol.TransportUpdate; import net.sf.briar.api.protocol.TransportUpdate;
import net.sf.briar.api.protocol.writers.AckWriter; import net.sf.briar.api.protocol.writers.AckWriter;
import net.sf.briar.api.protocol.writers.BatchWriter; import net.sf.briar.api.protocol.writers.BatchWriter;
import net.sf.briar.api.protocol.writers.MessageEncoder;
import net.sf.briar.api.protocol.writers.OfferWriter; import net.sf.briar.api.protocol.writers.OfferWriter;
import net.sf.briar.api.protocol.writers.ProtocolWriterFactory; import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
import net.sf.briar.api.protocol.writers.RequestWriter; import net.sf.briar.api.protocol.writers.RequestWriter;
import net.sf.briar.api.protocol.writers.SubscriptionWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
import net.sf.briar.api.protocol.writers.TransportWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
import net.sf.briar.crypto.CryptoModule; import net.sf.briar.crypto.CryptoModule;
import net.sf.briar.protocol.writers.ProtocolWritersModule; import net.sf.briar.protocol.writers.ProtocolWritersModule;
import net.sf.briar.serial.SerialModule; import net.sf.briar.serial.SerialModule;
@@ -99,10 +99,12 @@ public class ProtocolReadWriteTest extends TestCase {
RequestWriter r = writerFactory.createRequestWriter(out); RequestWriter r = writerFactory.createRequestWriter(out);
r.writeRequest(bitSet, 10); r.writeRequest(bitSet, 10);
SubscriptionWriter s = writerFactory.createSubscriptionWriter(out); SubscriptionUpdateWriter s =
writerFactory.createSubscriptionUpdateWriter(out);
s.writeSubscriptions(subscriptions, timestamp); s.writeSubscriptions(subscriptions, timestamp);
TransportWriter t = writerFactory.createTransportWriter(out); TransportUpdateWriter t =
writerFactory.createTransportUpdateWriter(out);
t.writeTransports(transports, timestamp); t.writeTransports(transports, timestamp);
// Read // Read

View File

@@ -27,6 +27,7 @@ import net.sf.briar.api.protocol.BatchId;
import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.Group;
import net.sf.briar.api.protocol.GroupFactory; import net.sf.briar.api.protocol.GroupFactory;
import net.sf.briar.api.protocol.Message; import net.sf.briar.api.protocol.Message;
import net.sf.briar.api.protocol.MessageEncoder;
import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.MessageId;
import net.sf.briar.api.protocol.Transport; import net.sf.briar.api.protocol.Transport;
import net.sf.briar.api.protocol.TransportId; import net.sf.briar.api.protocol.TransportId;
@@ -34,10 +35,9 @@ import net.sf.briar.api.protocol.TransportIndex;
import net.sf.briar.api.protocol.UniqueId; import net.sf.briar.api.protocol.UniqueId;
import net.sf.briar.api.protocol.writers.AckWriter; import net.sf.briar.api.protocol.writers.AckWriter;
import net.sf.briar.api.protocol.writers.BatchWriter; import net.sf.briar.api.protocol.writers.BatchWriter;
import net.sf.briar.api.protocol.writers.MessageEncoder;
import net.sf.briar.api.protocol.writers.OfferWriter; import net.sf.briar.api.protocol.writers.OfferWriter;
import net.sf.briar.api.protocol.writers.SubscriptionWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
import net.sf.briar.api.protocol.writers.TransportWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
import net.sf.briar.api.serial.SerialComponent; import net.sf.briar.api.serial.SerialComponent;
import net.sf.briar.api.serial.WriterFactory; import net.sf.briar.api.serial.WriterFactory;
import net.sf.briar.crypto.CryptoModule; import net.sf.briar.crypto.CryptoModule;
@@ -61,8 +61,7 @@ public class ConstantsTest extends TestCase {
public ConstantsTest() throws Exception { public ConstantsTest() throws Exception {
super(); super();
Injector i = Guice.createInjector(new CryptoModule(), Injector i = Guice.createInjector(new CryptoModule(),
new ProtocolModule(), new ProtocolWritersModule(), new ProtocolModule(), new SerialModule());
new SerialModule());
writerFactory = i.getInstance(WriterFactory.class); writerFactory = i.getInstance(WriterFactory.class);
crypto = i.getInstance(CryptoComponent.class); crypto = i.getInstance(CryptoComponent.class);
serial = i.getInstance(SerialComponent.class); serial = i.getInstance(SerialComponent.class);
@@ -191,7 +190,8 @@ public class ConstantsTest extends TestCase {
// Add the subscriptions to an update // Add the subscriptions to an update
ByteArrayOutputStream out = ByteArrayOutputStream out =
new ByteArrayOutputStream(MAX_PACKET_LENGTH); new ByteArrayOutputStream(MAX_PACKET_LENGTH);
SubscriptionWriter s = new SubscriptionWriterImpl(out, writerFactory); SubscriptionUpdateWriter s =
new SubscriptionUpdateWriterImpl(out, writerFactory);
s.writeSubscriptions(subs, Long.MAX_VALUE); s.writeSubscriptions(subs, Long.MAX_VALUE);
// Check the size of the serialised update // Check the size of the serialised update
assertTrue(out.size() > MAX_GROUPS * assertTrue(out.size() > MAX_GROUPS *
@@ -218,7 +218,8 @@ public class ConstantsTest extends TestCase {
// Add the transports to an update // Add the transports to an update
ByteArrayOutputStream out = ByteArrayOutputStream out =
new ByteArrayOutputStream(MAX_PACKET_LENGTH); new ByteArrayOutputStream(MAX_PACKET_LENGTH);
TransportWriter t = new TransportWriterImpl(out, writerFactory); TransportUpdateWriter t =
new TransportUpdateWriterImpl(out, writerFactory);
t.writeTransports(transports, Long.MAX_VALUE); t.writeTransports(transports, Long.MAX_VALUE);
// Check the size of the serialised update // Check the size of the serialised update
assertTrue(out.size() > MAX_TRANSPORTS * (UniqueId.LENGTH + 4 + assertTrue(out.size() > MAX_TRANSPORTS * (UniqueId.LENGTH + 4 +

View File

@@ -19,12 +19,12 @@ import net.sf.briar.api.db.event.DatabaseEvent;
import net.sf.briar.api.db.event.DatabaseListener; import net.sf.briar.api.db.event.DatabaseListener;
import net.sf.briar.api.db.event.MessagesAddedEvent; import net.sf.briar.api.db.event.MessagesAddedEvent;
import net.sf.briar.api.protocol.Message; import net.sf.briar.api.protocol.Message;
import net.sf.briar.api.protocol.MessageEncoder;
import net.sf.briar.api.protocol.ProtocolReaderFactory; import net.sf.briar.api.protocol.ProtocolReaderFactory;
import net.sf.briar.api.protocol.Transport; import net.sf.briar.api.protocol.Transport;
import net.sf.briar.api.protocol.TransportId; import net.sf.briar.api.protocol.TransportId;
import net.sf.briar.api.protocol.TransportIndex; import net.sf.briar.api.protocol.TransportIndex;
import net.sf.briar.api.protocol.TransportUpdate; import net.sf.briar.api.protocol.TransportUpdate;
import net.sf.briar.api.protocol.writers.MessageEncoder;
import net.sf.briar.api.protocol.writers.ProtocolWriterFactory; import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
import net.sf.briar.api.transport.BatchTransportReader; import net.sf.briar.api.transport.BatchTransportReader;
import net.sf.briar.api.transport.BatchTransportWriter; import net.sf.briar.api.transport.BatchTransportWriter;