2020-01-03 15:40:43 +01:00
|
|
|
package envoy.server.net;
|
2019-12-28 14:48:39 +01:00
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
2020-01-29 16:20:57 +01:00
|
|
|
import com.jenkov.nioserver.IMessageReader;
|
|
|
|
import com.jenkov.nioserver.Message;
|
|
|
|
import com.jenkov.nioserver.MessageBuffer;
|
|
|
|
import com.jenkov.nioserver.Socket;
|
2020-01-06 17:40:19 +01:00
|
|
|
|
|
|
|
import envoy.util.SerializationUtils;
|
2019-12-28 14:48:39 +01:00
|
|
|
|
|
|
|
/**
|
2019-12-30 15:15:25 +01:00
|
|
|
* This {@link IMessageReader} decodes serialized Java objects.<br>
|
|
|
|
* <br>
|
2019-12-28 14:48:39 +01:00
|
|
|
* Project: <strong>envoy-server-standalone</strong><br>
|
|
|
|
* File: <strong>ObjectMessageReader.java</strong><br>
|
|
|
|
* Created: <strong>28.12.2019</strong><br>
|
2019-12-30 15:15:25 +01:00
|
|
|
*
|
2019-12-28 14:48:39 +01:00
|
|
|
* @author Kai S. K. Engelbart
|
|
|
|
* @since Envoy Server Standalone v0.1-alpha
|
|
|
|
*/
|
|
|
|
public class ObjectMessageReader implements IMessageReader {
|
|
|
|
|
|
|
|
private List<Message> completeMessages = new ArrayList<>();
|
|
|
|
private Message nextMessage;
|
|
|
|
private MessageBuffer messageBuffer;
|
|
|
|
|
2019-12-30 15:15:25 +01:00
|
|
|
@Override
|
|
|
|
public List<Message> getMessages() { return completeMessages; }
|
|
|
|
|
2019-12-28 14:48:39 +01:00
|
|
|
@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);
|
2020-01-29 07:45:59 +01:00
|
|
|
buffer.clear();
|
2019-12-29 09:48:15 +01:00
|
|
|
|
|
|
|
// Get message length
|
2020-01-27 18:36:13 +01:00
|
|
|
if (nextMessage.length < 4) return;
|
2020-01-06 17:40:19 +01:00
|
|
|
int length = SerializationUtils.bytesToInt(nextMessage.sharedArray, nextMessage.offset) + 4;
|
2020-01-29 07:45:59 +01:00
|
|
|
do {
|
2019-12-29 09:48:15 +01:00
|
|
|
|
2020-01-29 07:45:59 +01:00
|
|
|
// Separate first complete message
|
|
|
|
if (nextMessage.length >= length) {
|
|
|
|
Message message = messageBuffer.getMessage();
|
2020-01-29 16:20:57 +01:00
|
|
|
message.writePartialMessageToMessage(nextMessage, length);
|
|
|
|
message.length = nextMessage.length - length;
|
|
|
|
nextMessage.length = length;
|
2020-01-29 07:45:59 +01:00
|
|
|
completeMessages.add(nextMessage);
|
|
|
|
nextMessage = message;
|
|
|
|
}
|
2019-12-29 09:48:15 +01:00
|
|
|
|
2020-01-29 07:45:59 +01:00
|
|
|
// Get message length
|
|
|
|
if (nextMessage.length < 4) return;
|
|
|
|
length = SerializationUtils.bytesToInt(nextMessage.sharedArray, nextMessage.offset) + 4;
|
|
|
|
|
|
|
|
} while (nextMessage.length >= length);
|
2019-12-28 14:48:39 +01:00
|
|
|
}
|
|
|
|
}
|