diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSession.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSession.java similarity index 87% rename from bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSession.java rename to bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSession.java index 82ba19178510f19be201e05321c2614108cf5442..d114467fd250ed7f7b71bc7d95b2aa093713edb1 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSession.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSession.java @@ -1,4 +1,4 @@ -package org.briarproject.bramble.mailbox; +package org.briarproject.bramble.api.mailbox; import java.io.IOException; diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorage.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorage.java new file mode 100644 index 0000000000000000000000000000000000000000..ea197b405f98b22b5fe590ebe36371361ca3bb0a --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorage.java @@ -0,0 +1,17 @@ +package org.briarproject.bramble.api.mailbox; + +import org.briarproject.bramble.api.contact.ContactId; + +import javax.annotation.Nullable; + +public interface MailboxStorage { + void storeStream(ContactId contactId, byte[] encryptedStream, + boolean forOwner); + + @Nullable + MailboxStorageStream getStream(ContactId contactId, boolean forOwner); + + MailboxStorageStream getStreamForOwner(); + + void deleteStream(MailboxStorageStream stream); +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorageStream.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorageStream.java new file mode 100644 index 0000000000000000000000000000000000000000..feccc4fd3baa5c9f9e8fb0f4a49316fccdd4731f --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorageStream.java @@ -0,0 +1,15 @@ +package org.briarproject.bramble.api.mailbox; + +import org.briarproject.bramble.api.contact.ContactId; + +public interface MailboxStorageStream { + byte[] getStream(); + + boolean isPending(); + + void setPending(boolean pending); + + boolean isForOwner(); + + ContactId getContactId(); +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/AbstractMailboxSession.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/AbstractMailboxSession.java index 16166e5badce36aee11064a516679f02a1c325f8..23df67adcee6e706e3be4df35c921509035348d7 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/AbstractMailboxSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/AbstractMailboxSession.java @@ -5,6 +5,7 @@ import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.mailbox.MailboxConstants; +import org.briarproject.bramble.api.mailbox.MailboxSession; import org.briarproject.bramble.api.sync.SyncSession; import org.briarproject.bramble.api.sync.SyncSessionFactory; import org.briarproject.bramble.api.transport.KeyManager; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxContactSession.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxContactSession.java index ed5ba0050617752c5f791f456f711e92b1f3952e..115f318ee0869b3acac0abce27435acf1da94696 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxContactSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxContactSession.java @@ -2,6 +2,8 @@ package org.briarproject.bramble.mailbox; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DatabaseComponent; +import org.briarproject.bramble.api.mailbox.MailboxStorage; +import org.briarproject.bramble.api.mailbox.MailboxStorageStream; import org.briarproject.bramble.api.sync.SyncSessionFactory; import org.briarproject.bramble.api.transport.KeyManager; import org.briarproject.bramble.api.transport.StreamReaderFactory; @@ -40,8 +42,10 @@ public class MailboxContactSession extends AbstractMailboxSession { StreamWriterFactory streamWriterFactory, StreamReaderFactory streamReaderFactory, MailboxProtocol mailboxProtocol, int transportMaxLatency, - int transportMaxIdleTime, MailboxStorage mailboxStorage, DatabaseComponent db) { - super(ioExecutor, db, keyManager, syncSessionFactory, streamWriterFactory, + int transportMaxIdleTime, MailboxStorage mailboxStorage, + DatabaseComponent db) { + super(ioExecutor, db, keyManager, syncSessionFactory, + streamWriterFactory, streamReaderFactory, mailboxProtocol, transportMaxLatency, transportMaxIdleTime, contactId); this.mailboxProtocol = mailboxProtocol; @@ -76,13 +80,13 @@ public class MailboxContactSession extends AbstractMailboxSession { void sendStoredStreams() throws IOException, InterruptedException { // Get stored sync stream if available - MailboxStorage.MailboxStorageStream nextStream = + MailboxStorageStream nextStream = mailboxStorage.getStream(contactId, false); while (nextStream != null) { // Send TAKE request and delete stream if request was successfull MailboxRequestTake req = - new MailboxRequestTake(nextStream.getEncryptedStream()); + new MailboxRequestTake(nextStream.getStream()); mailboxProtocol.writeRequest(req); if (req.awaitAndGetResponse()) @@ -110,7 +114,8 @@ public class MailboxContactSession extends AbstractMailboxSession { "Contact Id is implicit for contact to mailbox STORE requests"); mailboxStorage - .storeStream(contactId, storeReq.getEncryptedSyncStream(), true); + .storeStream(contactId, storeReq.getEncryptedSyncStream(), + true); } @Override @@ -119,6 +124,7 @@ public class MailboxContactSession extends AbstractMailboxSession { } @Override - public void protocolFinished() {} + public void protocolFinished() { + } } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java index c6257d41841a73cb76629b0911b0cacfb9540ff3..3a9283316a046e56e6aa3b80cbb81dd8dc093327 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java @@ -11,6 +11,7 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.mailbox.MailboxConstants; import org.briarproject.bramble.api.mailbox.MailboxInfo; import org.briarproject.bramble.api.mailbox.MailboxManager; +import org.briarproject.bramble.api.mailbox.MailboxSession; import org.briarproject.bramble.api.plugin.ConnectionRegistry; import org.briarproject.bramble.api.plugin.TransportConnectionReader; import org.briarproject.bramble.api.plugin.TransportConnectionWriter; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxOwnerSession.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxOwnerSession.java index 58977cffa79debeb0cfd8a91d3d3a931419c3278..0e313cf3717f0268d30dd09e0c7661926dc036c2 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxOwnerSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxOwnerSession.java @@ -2,7 +2,8 @@ package org.briarproject.bramble.mailbox; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DatabaseComponent; -import org.briarproject.bramble.api.mailbox.MailboxConstants; +import org.briarproject.bramble.api.mailbox.MailboxStorage; +import org.briarproject.bramble.api.mailbox.MailboxStorageStream; import org.briarproject.bramble.api.sync.SyncSessionFactory; import org.briarproject.bramble.api.transport.KeyManager; import org.briarproject.bramble.api.transport.StreamReaderFactory; @@ -39,9 +40,11 @@ public class MailboxOwnerSession extends AbstractMailboxSession { StreamWriterFactory streamWriterFactory, StreamReaderFactory streamReaderFactory, MailboxProtocol mailboxProtocol, int transportMaxLatency, - int transportMaxIdleTime, MailboxStorage mailboxStorage, DatabaseComponent db) { + int transportMaxIdleTime, MailboxStorage mailboxStorage, + DatabaseComponent db) { - super(ioExecutor, db, keyManager, syncSessionFactory, streamWriterFactory, + super(ioExecutor, db, keyManager, syncSessionFactory, + streamWriterFactory, streamReaderFactory, mailboxProtocol, transportMaxLatency, transportMaxIdleTime, contactId); this.mailboxProtocol = mailboxProtocol; @@ -67,7 +70,7 @@ public class MailboxOwnerSession extends AbstractMailboxSession { void sendStoredStreams() throws IOException, InterruptedException { // Get stored sync stream if available - MailboxStorage.MailboxStorageStream nextStream = + MailboxStorageStream nextStream = mailboxStorage.getStreamForOwner(); // FIXME: If there are no more streams to send at this time, we should @@ -75,7 +78,7 @@ public class MailboxOwnerSession extends AbstractMailboxSession { while (nextStream != null) { // Send TAKE request and delete stream if request was successfull MailboxRequestTake req = - new MailboxRequestTake(nextStream.getEncryptedStream()); + new MailboxRequestTake(nextStream.getStream()); mailboxProtocol.writeRequest(req); if (req.awaitAndGetResponse()) @@ -111,6 +114,7 @@ public class MailboxOwnerSession extends AbstractMailboxSession { } @Override - public void protocolFinished() {} + public void protocolFinished() { + } } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactory.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactory.java index 33fc3f44d45e89740b06428a38f026d2cbcd260a..70331ff9b940f8ea7b08b37b149ccdb793a7d77a 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactory.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactory.java @@ -2,6 +2,7 @@ package org.briarproject.bramble.mailbox; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactType; +import org.briarproject.bramble.api.mailbox.MailboxSession; import org.briarproject.bramble.mailbox.protocol.MailboxProtocol; public interface MailboxSessionFactory { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactoryImpl.java index 65e39e385b90abca80fba55dc595a45649362bb7..9dd424c5706d5dcc5196a16e95ff7f5867672ae2 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactoryImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactoryImpl.java @@ -4,11 +4,13 @@ import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactType; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.lifecycle.IoExecutor; +import org.briarproject.bramble.api.mailbox.MailboxStorage; import org.briarproject.bramble.api.sync.SyncSessionFactory; import org.briarproject.bramble.api.transport.KeyManager; import org.briarproject.bramble.api.transport.StreamReaderFactory; import org.briarproject.bramble.api.transport.StreamWriterFactory; import org.briarproject.bramble.mailbox.protocol.MailboxProtocol; +import org.briarproject.bramble.mailbox.storage.MailboxStorageImpl; import java.util.concurrent.Executor; @@ -16,7 +18,7 @@ import javax.inject.Inject; public class MailboxSessionFactoryImpl implements MailboxSessionFactory { - private final MailboxStorage mailboxStorage; + private MailboxStorage mailboxStorage = null; private Executor ioExecutor; private final KeyManager keyManager; private final SyncSessionFactory syncSessionFactory; @@ -36,9 +38,6 @@ public class MailboxSessionFactoryImpl implements MailboxSessionFactory { this.streamWriterFactory = streamWriterFactory; this.streamReaderFactory = streamReaderFactory; this.db = db; - - // FIXME: using temporary storage for now - this.mailboxStorage = new MailboxStorage(); } @Override @@ -62,15 +61,21 @@ public class MailboxSessionFactoryImpl implements MailboxSessionFactory { streamReaderFactory, mailboxProtocol, transportMaxLatency, transportMaxIdleTime, db); case MAILBOX_OWNER: + if (mailboxStorage == null) { + // FIXME: using temporary storage for now + mailboxStorage = new MailboxStorageImpl(); + } return new MailboxOwnerSession(contactId, ioExecutor, keyManager, syncSessionFactory, streamWriterFactory, streamReaderFactory, mailboxProtocol, - transportMaxLatency, transportMaxIdleTime, mailboxStorage, db); + transportMaxLatency, transportMaxIdleTime, + mailboxStorage, db); case MAILBOX_CONTACT: return new MailboxContactSession(contactId, ioExecutor, keyManager, syncSessionFactory, streamWriterFactory, streamReaderFactory, mailboxProtocol, - transportMaxLatency, transportMaxIdleTime, mailboxStorage, db); + transportMaxLatency, transportMaxIdleTime, + mailboxStorage, db); } return null; } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxStorage.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxStorage.java deleted file mode 100644 index 5e61a7e66d0f6b4a0c3eadf8b6731bb8f2c5dc95..0000000000000000000000000000000000000000 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxStorage.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.briarproject.bramble.mailbox; - -import org.briarproject.bramble.api.contact.ContactId; - -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.concurrent.atomic.AtomicLong; -import java.util.logging.Logger; - -import javax.annotation.Nullable; - -class MailboxStorage { - private static final Logger LOG = Logger.getLogger(MailboxStorage.class.getName()); - static volatile AtomicLong streamCounter = new AtomicLong(); - - // Dummy implementation with a hashmap for now - LinkedHashMap<ContactId, LinkedList<MailboxStorageStream>> contactStreams = - new LinkedHashMap(); - private boolean isClosed; - - synchronized void storeStream(ContactId contactId, byte[] encryptedStream, - boolean forOwner) { - LOG.info("Storing STREAM"); - - MailboxStorageStream stream = - new MailboxStorageStream(contactId, encryptedStream, forOwner); - - if (!contactStreams.containsKey(contactId)) - contactStreams.put(contactId, new LinkedList<>()); - - contactStreams.get(contactId).add(stream); - - if(forOwner) - this.notifyAll(); - - } - - @Nullable - synchronized MailboxStorageStream getStream(ContactId contactId, - boolean forOwner) { - if (contactStreams.get(contactId) == null) - return null; - - for (MailboxStorageStream s : contactStreams.get(contactId)) { - if (!s.pending && (s.forOwner == forOwner)) { - s.pending = true; - return s; - } - } - return null; - } - - public MailboxStorageStream getStreamForOwner() { - for (LinkedList<MailboxStorageStream> streams : contactStreams - .values()) { - for (MailboxStorageStream s : streams) - if (!s.pending && s.forOwner) { - s.pending = true; - return s; - } - } - return null; - } - - - synchronized void deleteStream(MailboxStorageStream stream) { - for (MailboxStorageStream s : contactStreams.get(stream.contactId)) { - if (s.id == stream.id) { - contactStreams.get(stream.contactId).remove(s); - } - } - } - - - protected class MailboxStorageStream { - private final Long id; - private final byte[] encryptedStream; - private final ContactId contactId; - private final boolean forOwner; - - private boolean pending = false; - - protected MailboxStorageStream( - ContactId contactId, - byte[] encryptedStream, boolean forOwner) { - this.contactId = contactId; - this.id = streamCounter.getAndIncrement(); - this.encryptedStream = encryptedStream; - this.forOwner = forOwner; - } - - byte[] getEncryptedStream() { - return encryptedStream; - } - - } -} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..3db14a23be7a39a86f251e6e17d13606dc447911 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageImpl.java @@ -0,0 +1,76 @@ +package org.briarproject.bramble.mailbox.storage; + +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.mailbox.MailboxStorage; +import org.briarproject.bramble.api.mailbox.MailboxStorageStream; + +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Logger; + +import javax.annotation.Nullable; + +public class MailboxStorageImpl implements MailboxStorage { + private static final Logger LOG = + Logger.getLogger(MailboxStorageImpl.class.getName()); + static volatile AtomicLong streamCounter = new AtomicLong(); + + // Dummy implementation with a hashmap for now + LinkedHashMap<ContactId, LinkedList<MailboxStorageStream>> contactStreams = + new LinkedHashMap(); + + public synchronized void storeStream(ContactId contactId, byte[] encryptedStream, + boolean forOwner) { + + LOG.info("Storing STREAM"); + MailboxStorageStream stream = + new MailboxStorageStreamImpl(contactId, encryptedStream, + streamCounter.incrementAndGet(), forOwner); + + if (!contactStreams.containsKey(contactId)) + contactStreams.put(contactId, new LinkedList<>()); + + contactStreams.get(contactId).add(stream); + + if (forOwner) + this.notifyAll(); + + } + + @Nullable + public synchronized MailboxStorageStream getStream(ContactId contactId, + boolean forOwner) { + if (contactStreams.get(contactId) == null) + return null; + + for (MailboxStorageStream s : contactStreams.get(contactId)) { + if (!s.isPending() && (s.isForOwner() == forOwner)) { + s.setPending(true); + return s; + } + } + return null; + } + + public MailboxStorageStream getStreamForOwner() { + for (LinkedList<MailboxStorageStream> streams : contactStreams + .values()) { + for (MailboxStorageStream s : streams) + if (!s.isPending() && s.isForOwner()) { + s.setPending(true); + return s; + } + } + return null; + } + + public synchronized void deleteStream(MailboxStorageStream stream) { + for (MailboxStorageStream s : contactStreams + .get(stream.getContactId())) { + if (s.getContactId() == stream.getContactId()) { + contactStreams.get(stream.getContactId()).remove(s); + } + } + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageStreamImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageStreamImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..4d72a366a7f80fd88f9f4184e9aa503b10707c52 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageStreamImpl.java @@ -0,0 +1,41 @@ +package org.briarproject.bramble.mailbox.storage; + +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.mailbox.MailboxStorageStream; + +public class MailboxStorageStreamImpl implements MailboxStorageStream { + private final Long id; + private final byte[] encryptedStream; + private final ContactId contactId; + private final boolean forOwner; + + private boolean pending = false; + + public MailboxStorageStreamImpl(ContactId contactId, + byte[] encryptedStream, Long id, boolean forOwner) { + this.contactId = contactId; + this.id = id; + this.encryptedStream = encryptedStream; + this.forOwner = forOwner; + } + + public byte[] getStream() { + return encryptedStream; + } + + public boolean isPending() { + return pending; + } + + public void setPending(boolean pending) { + this.pending = pending; + } + + public boolean isForOwner() { + return forOwner; + } + + public ContactId getContactId() { + return contactId; + } +}