package com.jenkov.nioserver; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; /** * Created by jjenkov on 21-10-2015. */ public class MessageWriter implements IMessageWriter { private List writeQueue = new ArrayList<>(); private Message messageInProgress = null; private int bytesWritten = 0; public MessageWriter() { } @Override public void enqueue(Message message) { if(this.messageInProgress == null){ this.messageInProgress = message; System.out.println("Message set as message in progress."); } else { this.writeQueue.add(message); System.out.println("Message enqueued."); } //todo register socket for write interest } @Override public void write(Socket socket, ByteBuffer byteBuffer) throws IOException { System.out.println("Writing message to socket"); byteBuffer.put(this.messageInProgress.sharedArray, this.messageInProgress.offset + this.bytesWritten, this.messageInProgress.length - this.bytesWritten); byteBuffer.flip(); this.bytesWritten += socket.write(byteBuffer); byteBuffer.clear(); if(bytesWritten >= this.messageInProgress.length){ if(this.writeQueue.size() > 0){ this.messageInProgress = this.writeQueue.remove(0); } else { this.messageInProgress = null; //todo unregister from selector } } } @Override public boolean isEmpty() { return this.writeQueue.isEmpty() && this.messageInProgress == null; } }