package envoy.client; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.SocketException; import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; import envoy.client.util.EnvoyLog; /** * Project: envoy-client
* File: Receiver.java
* Created: 30.12.2019
* * @author Kai S. K. Engelbart * @since Envoy v0.3-alpha */ public class Receiver implements Runnable { private final InputStream in; private final Map, Consumer> processors = new HashMap<>(); private static final Logger logger = EnvoyLog.getLogger(Receiver.class.getSimpleName()); /** * Creates an instance of {@link Receiver}. * * @param in the {@link InputStream} to parse objects from */ public Receiver(InputStream in) { this.in = in; } @SuppressWarnings("unchecked") @Override public void run() { try (ObjectInputStream oin = new ObjectInputStream(in)) { while (true) { Object obj = oin.readObject(); logger.finest("Received object " + obj); // Get appropriate processor @SuppressWarnings("rawtypes") Consumer processor = processors.get(obj.getClass()); if (processor == null) logger.severe(String.format("The received object has the class %s for which no processor is defined.", obj.getClass())); else processor.accept(obj); } } catch (SocketException e) { logger.info("Connection probably closed by client. Exiting receiver thread..."); } catch (Exception e) { logger.log(Level.SEVERE, "Error on receiver thread", e); } } /** * Adds an object processor to this {@link Receiver}. It will be called once an * object of the accepted class has been received. * * @param processorClass the object class accepted by the processor * @param processor the object processor */ public void registerProcessor(Class processorClass, Consumer processor) { processors.put(processorClass, processor); } /** * Removes all object processors registered at this {@link Receiver}. */ public void removeAllProcessors() { processors.clear(); } }