This repository has been archived on 2021-12-05. You can view files and clone it, but cannot push or open issues or pull requests.
envoy/client/src/main/java/envoy/client/net/WriteProxy.java

85 lines
2.4 KiB
Java

package envoy.client.net;
import java.util.logging.*;
import envoy.data.Message;
import envoy.event.MessageStatusChange;
import envoy.util.EnvoyLog;
import envoy.client.data.*;
/**
* Implements methods to send {@link Message}s and {@link MessageStatusChange}s to the server or
* cache them inside a {@link LocalDB} depending on the online status.
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.3-alpha
*/
public final class WriteProxy {
private final Client client;
private final LocalDB localDB;
private static final Logger logger = EnvoyLog.getLogger(WriteProxy.class);
/**
* Initializes a write proxy using a client and a local database. The corresponding cache
* processors are injected into the caches.
*
* @param client the client instance used to send messages and events if online
* @param localDB the local database used to cache messages and events if offline
* @since Envoy Client 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.getCacheMap().get(Message.class).setProcessor(msg -> {
logger.log(Level.FINER, "Sending cached " + msg);
client.sendMessage(msg);
});
localDB.getCacheMap().get(MessageStatusChange.class).setProcessor(evt -> {
logger.log(Level.FINER, "Sending cached " + evt);
client.send(evt);
});
}
/**
* Sends cached {@link Message}s and {@link MessageStatusChange}s to the server.
*
* @since Envoy Client v0.3-alpha
*/
public void flushCache() {
localDB.getCacheMap().getMap().values().forEach(Cache::relay);
}
/**
* Delivers a message to the server if online. Otherwise the message is cached inside the local
* database.
*
* @param message the message to send
* @since Envoy Client v0.3-alpha
*/
public void writeMessage(Message message) {
if (client.isOnline())
client.sendMessage(message);
else
localDB.getCacheMap().getApplicable(Message.class).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
* @since Envoy Client v0.3-alpha
*/
public void writeMessageStatusChange(MessageStatusChange evt) {
if (client.isOnline())
client.send(evt);
else
localDB.getCacheMap().getApplicable(MessageStatusChange.class).accept(evt);
}
}