Added WriteProxy with creation method in Client, added caches to LocalDb
This commit is contained in:
parent
6bbd6936e0
commit
0646445d3c
@ -20,8 +20,8 @@ import envoy.client.util.EnvoyLog;
|
||||
*/
|
||||
public class Cache<T> implements Consumer<T> {
|
||||
|
||||
private final Queue<T> elements = new LinkedList<>();
|
||||
private Consumer<T> processor;
|
||||
private final Queue<T> elements = new LinkedList<>();
|
||||
private transient Consumer<T> processor;
|
||||
|
||||
private static final Logger logger = EnvoyLog.getLogger(Cache.class.getSimpleName());
|
||||
|
||||
@ -54,5 +54,6 @@ public class Cache<T> implements Consumer<T> {
|
||||
public void relay() {
|
||||
if (processor == null) throw new IllegalStateException("Processor is not defined");
|
||||
elements.forEach(processor::accept);
|
||||
elements.clear();
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,9 @@ package envoy.client.data;
|
||||
import java.util.*;
|
||||
|
||||
import envoy.data.IdGenerator;
|
||||
import envoy.data.Message;
|
||||
import envoy.data.User;
|
||||
import envoy.event.MessageStatusChangeEvent;
|
||||
|
||||
/**
|
||||
* Stores information about the current {@link User} and their {@link Chat}s.
|
||||
@ -18,10 +20,12 @@ import envoy.data.User;
|
||||
*/
|
||||
public abstract class LocalDb {
|
||||
|
||||
protected User user;
|
||||
protected Map<String, User> users = new HashMap<>();
|
||||
protected List<Chat> chats = new ArrayList<>();
|
||||
protected IdGenerator idGenerator;
|
||||
protected User user;
|
||||
protected Map<String, User> users = new HashMap<>();
|
||||
protected List<Chat> chats = new ArrayList<>();
|
||||
protected IdGenerator idGenerator;
|
||||
protected Cache<Message> messageCache;
|
||||
protected Cache<MessageStatusChangeEvent> statusCache;
|
||||
|
||||
/**
|
||||
* Initializes a storage space for a user-specific list of chats.
|
||||
@ -115,4 +119,28 @@ public abstract class LocalDb {
|
||||
* @since Envoy v0.3-alpha
|
||||
*/
|
||||
public boolean hasIdGenerator() { return idGenerator != null; }
|
||||
|
||||
/**
|
||||
* @return the offline message cache
|
||||
* @since Envoy v0.3-alpha
|
||||
*/
|
||||
public Cache<Message> getMessageCache() { return messageCache; }
|
||||
|
||||
/**
|
||||
* @param messageCache the offline message cache to set
|
||||
* @since Envoy v0.3-alpha
|
||||
*/
|
||||
public void setMessageCache(Cache<Message> messageCache) { this.messageCache = messageCache; }
|
||||
|
||||
/**
|
||||
* @return the offline status cache
|
||||
* @since Envoy v0.3-alpha
|
||||
*/
|
||||
public Cache<MessageStatusChangeEvent> getStatusCache() { return statusCache; }
|
||||
|
||||
/**
|
||||
* @param statusCache the offline status cache to set
|
||||
* @since Envoy v0.3-alpha
|
||||
*/
|
||||
public void setStatusCache(Cache<MessageStatusChangeEvent> statusCache) { this.statusCache = statusCache; }
|
||||
}
|
||||
|
@ -40,18 +40,18 @@ public class PersistentLocalDb extends LocalDb {
|
||||
* Constructs an empty local database. To serialize any chats to the file
|
||||
* system, call {@link PersistentLocalDb#initializeUserStorage()}.
|
||||
*
|
||||
* @param localDBDir the directory in which to store users and chats
|
||||
* @param localDbDir the directory in which to store users and chats
|
||||
* @throws IOException if the PersistentLocalDb could not be initialized
|
||||
* @since Envoy v0.1-alpha
|
||||
*/
|
||||
public PersistentLocalDb(File localDBDir) throws IOException {
|
||||
this.localDBDir = localDBDir;
|
||||
public PersistentLocalDb(File localDbDir) throws IOException {
|
||||
localDBDir = localDbDir;
|
||||
|
||||
// Initialize local database directory
|
||||
if (localDBDir.exists() && !localDBDir.isDirectory())
|
||||
throw new IOException(String.format("LocalDBDir '%s' is not a directory!", localDBDir.getAbsolutePath()));
|
||||
usersFile = new File(localDBDir, "users.db");
|
||||
idGeneratorFile = new File(localDBDir, "id_generator.db");
|
||||
if (localDbDir.exists() && !localDbDir.isDirectory())
|
||||
throw new IOException(String.format("LocalDbDir '%s' is not a directory!", localDbDir.getAbsolutePath()));
|
||||
usersFile = new File(localDbDir, "users.db");
|
||||
idGeneratorFile = new File(localDbDir, "id_generator.db");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -118,6 +118,17 @@ public class Client implements Closeable {
|
||||
return cache;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new write proxy that uses this client to communicate with the
|
||||
* server.
|
||||
*
|
||||
* @param localDb the local database that the write proxy will use to access
|
||||
* caches
|
||||
* @return a new write proxy
|
||||
* @since Envoy Client v0.3-alpha
|
||||
*/
|
||||
public WriteProxy createWriteProxy(LocalDb localDb) { return new WriteProxy(this, localDb); }
|
||||
|
||||
/**
|
||||
* Sends a message to the server. The message's status will be incremented once
|
||||
* it was delivered successfully.
|
||||
|
102
src/main/java/envoy/client/net/WriteProxy.java
Normal file
102
src/main/java/envoy/client/net/WriteProxy.java
Normal file
@ -0,0 +1,102 @@
|
||||
package envoy.client.net;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import envoy.client.data.LocalDb;
|
||||
import envoy.client.util.EnvoyLog;
|
||||
import envoy.data.Message;
|
||||
import envoy.event.MessageStatusChangeEvent;
|
||||
|
||||
/**
|
||||
* Implements methods to send {@link Message}s and
|
||||
* {@link MessageStatusChangeEvent}s to the server or cache them inside a
|
||||
* {@link LocalDb} depending on the online status.<br>
|
||||
* <br>
|
||||
* Project: <strong>envoy-client</strong><br>
|
||||
* File: <strong>WriteProxy.java</strong><br>
|
||||
* Created: <strong>6 Feb 2020</strong><br>
|
||||
*
|
||||
* @author Kai S. K. Engelbart
|
||||
* @since Envoy v0.3-alpha
|
||||
*/
|
||||
public class WriteProxy {
|
||||
|
||||
private final Client client;
|
||||
private final LocalDb localDb;
|
||||
|
||||
private static final Logger logger = EnvoyLog.getLogger(WriteProxy.class.getSimpleName());
|
||||
|
||||
/**
|
||||
* Initializes a write proxy using a client and a local database. The
|
||||
* corresponding cache processors are injected into the caches.
|
||||
*
|
||||
* @param client the client used to send messages and message status change
|
||||
* events
|
||||
* @param localDb the local database used to cache messages and message status
|
||||
* change events
|
||||
* @since Envoy v0.3-alpha
|
||||
*/
|
||||
public WriteProxy(Client client, LocalDb localDb) {
|
||||
this.client = client;
|
||||
this.localDb = localDb;
|
||||
|
||||
// Initialize cache processors for messages and message status change events
|
||||
localDb.getMessageCache().setProcessor(msg -> {
|
||||
try {
|
||||
client.sendMessage(msg);
|
||||
} catch (IOException e) {
|
||||
logger.log(Level.SEVERE, "Could not send cached message", e);
|
||||
}
|
||||
});
|
||||
localDb.getStatusCache().setProcessor(evt -> {
|
||||
try {
|
||||
client.sendEvent(evt);
|
||||
} catch (IOException e) {
|
||||
logger.log(Level.SEVERE, "Could not send cached message status change event", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends cached {@link Message}s and {@link MessageStatusChangeEvent}s to the
|
||||
* server.
|
||||
*
|
||||
* @since Envoy v0.3-alpha
|
||||
*/
|
||||
public void flushCache() {
|
||||
|
||||
// Send messages
|
||||
localDb.getMessageCache().relay();
|
||||
|
||||
// Send message status change events
|
||||
localDb.getStatusCache().relay();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delivers a message to the server if online. Otherwise the message is cached
|
||||
* inside the local database.
|
||||
*
|
||||
* @param message the message to send
|
||||
* @throws IOException if the message could not be sent
|
||||
* @since Envoy v0.3-alpha
|
||||
*/
|
||||
public void writeMessage(Message message) throws IOException {
|
||||
if (client.isOnline()) client.sendMessage(message);
|
||||
else localDb.getMessageCache().accept(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delivers a message status change event to the server if online. Otherwise the
|
||||
* event is cached inside the local database.
|
||||
*
|
||||
* @param evt the event to send
|
||||
* @throws IOException if the event could not be sent
|
||||
* @since Envoy v0.3-alpha
|
||||
*/
|
||||
public void writeMessageStatusChangeEvent(MessageStatusChangeEvent evt) throws IOException {
|
||||
if (client.isOnline()) client.sendEvent(evt);
|
||||
else localDb.getStatusCache().accept(evt);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user