/** * Copyright (C) Zhang,Yuexiang (xfeep) * */ package nginx.clojure; import java.io.IOException; import java.nio.ByteBuffer; public class WholeMessageAdapter<T> extends MessageAdapter<T> { public static int DEFAULT_MAX_MESSAGE_SIZE = 256 * 1024; protected StringBuilder builder; protected ByteBuffer byteBuffer; protected int maxMessageSize; public WholeMessageAdapter() { this(DEFAULT_MAX_MESSAGE_SIZE); } public WholeMessageAdapter(int maxMessageSize) { builder = new StringBuilder(); this.maxMessageSize = maxMessageSize; } @Override public void onTextMessage(T data, String message, boolean remaining) throws IOException { if (!remaining) { if (builder.length() == 0) { onWholeTextMessage(data, message); } else { if (builder.length() + message.length() <= maxMessageSize) { builder.append(message); String wm = builder.toString(); builder.delete(0, builder.length()); onWholeTextMessage(data, wm); } else { throw new IOException("Message size is too large > " + maxMessageSize + "(current setting), we need set a larger value"); } } } else { if (builder.length() + message.length() <= maxMessageSize) { builder.append(message); } else { throw new IOException("Message size is too large > " + maxMessageSize + "(current setting), we need set a larger value"); } } } @Override public void onBinaryMessage(T data, ByteBuffer message, boolean remaining) throws IOException { if (!remaining) { if (byteBuffer == null || byteBuffer.position() == 0) { onWholeBiniaryMessage(data, message); } else { if (byteBuffer == null) { byteBuffer = ByteBuffer.allocate(maxMessageSize); } if (byteBuffer.remaining() >= message.remaining()) { byteBuffer.put(message); byteBuffer.flip(); onWholeBiniaryMessage(data, byteBuffer); byteBuffer = null; } else { throw new IOException("Message size is too large > " + maxMessageSize + "(current setting), we need set a larger value"); } } } else { if (byteBuffer == null) { byteBuffer = ByteBuffer.allocate(maxMessageSize); } if (byteBuffer.remaining() >= message.remaining()) { byteBuffer.put(message); } else { throw new IOException("Message size is too large > " + maxMessageSize + "(current setting), we need set a larger value"); } } } public void onWholeTextMessage(T data, String message) throws IOException { } public void onWholeBiniaryMessage(T data, ByteBuffer message) throws IOException { } }