85 lines
2.4 KiB
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);
|
|
}
|
|
}
|