package envoy.server.net; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import com.jenkov.nioserver.IMessageProcessor; import com.jenkov.nioserver.Message; import com.jenkov.nioserver.WriteProxy; import envoy.server.processors.ObjectProcessor; import envoy.util.EnvoyLog; /** * Handles incoming objects.
*
* Project: envoy-server-standalone
* File: ObjectMessageProcessor.java
* Created: 28.12.2019
* * @author Kai S. K. Engelbart * @since Envoy Server Standalone v0.1-alpha */ public class ObjectMessageProcessor implements IMessageProcessor { private final Set> processors; private static final Logger logger = EnvoyLog.getLogger(ObjectMessageProcessor.class); /** * The constructor to set the {@link ObjectProcessor}s. * * @param processors the {@link ObjectProcessor} to set * @since Envoy Server Standalone v0.1-alpha */ public ObjectMessageProcessor(Set> processors) { this.processors = processors; } @SuppressWarnings("unchecked") @Override public void process(Message message, WriteProxy writeProxy) { try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(message.sharedArray, message.offset + 4, message.length - 4))) { Object obj = in.readObject(); if (obj == null) { logger.warning("Received a null object"); return; } logger.fine("Received " + obj); // Process object processors.stream().filter(p -> p.getInputClass().equals(obj.getClass())).forEach((@SuppressWarnings("rawtypes") ObjectProcessor p) -> { try { p.process(p.getInputClass().cast(obj), message.socketId, new ObjectWriteProxy(writeProxy)); } catch (IOException e) { logger.log(Level.SEVERE, "Exception during processor execution: ", e); } }); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }