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); } }