package envoy.server.net; import java.io.IOException; import java.nio.ByteBuffer; import java.util.*; import com.jenkov.nioserver.*; import envoy.util.SerializationUtils; /** * This {@link IMessageReader} decodes serialized Java objects. * * @author Kai S. K. Engelbart * @since Envoy Server Standalone v0.1-alpha */ public final class ObjectMessageReader implements IMessageReader { private final List completeMessages = new ArrayList<>(); private Message nextMessage; private MessageBuffer messageBuffer; @Override public List getMessages() { return completeMessages; } @Override public void init(MessageBuffer messageBuffer) { this.messageBuffer = messageBuffer; nextMessage = messageBuffer.getMessage(); } @Override public void read(Socket socket, ByteBuffer buffer) throws IOException { socket.read(buffer); buffer.flip(); if (!buffer.hasRemaining()) { buffer.clear(); return; } nextMessage.writeToMessage(buffer); buffer.clear(); // Get message length if (nextMessage.length < 4) return; int length = SerializationUtils.bytesToInt(nextMessage.sharedArray, nextMessage.offset) + 4; do { // Separate first complete message if (nextMessage.length >= length) { Message message = messageBuffer.getMessage(); message.writePartialMessageToMessage(nextMessage, length); message.length = nextMessage.length - length; nextMessage.length = length; completeMessages.add(nextMessage); nextMessage = message; } // Get message length if (nextMessage.length < 4) return; length = SerializationUtils.bytesToInt(nextMessage.sharedArray, nextMessage.offset) + 4; } while (nextMessage.length >= length); } }