package envoy.server; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Set; import com.jenkov.nioserver.IMessageProcessor; import com.jenkov.nioserver.Message; import com.jenkov.nioserver.WriteProxy; /** * 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; 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(); System.out.println("Read object: " + obj.toString()); // Process object processors.stream() .filter(p -> p.getInputClass().isInstance(obj)) .forEach((@SuppressWarnings("rawtypes") ObjectProcessor p) -> { Object responseObj = p.process(p.getInputClass().cast(obj)); if (responseObj != null) { // Create message targeted at the client Message response = writeProxy.getMessage(); response.socketId = message.socketId; // Serialize object to byte array ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ObjectOutputStream oout = new ObjectOutputStream(baos)) { oout.writeObject(responseObj); } catch (IOException e) { e.printStackTrace(); } byte[] objBytes = baos.toByteArray(); response.writeToMessage(objBytes); writeProxy.enqueue(response); } }); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }