FrameProcessingContext.java

package sprout.server.websocket.framehandler;

import sprout.server.websocket.WebSocketFrame;
import sprout.server.websocket.message.DefaultMessagePayload;
import sprout.server.websocket.message.MessagePayload;

import java.io.ByteArrayOutputStream;

public class FrameProcessingContext {
    private WebSocketFrame currentFrame; // 현재 처리 중인 프레임
    private final StringBuilder textBuffer;
    private final ByteArrayOutputStream binaryBuffer;
    private int fragmentedOpcode;

    public FrameProcessingContext() {
        this.textBuffer = new StringBuilder();
        this.binaryBuffer = new ByteArrayOutputStream();
        this.fragmentedOpcode = -1;
    }

    public void setCurrentFrame(WebSocketFrame frame) {
        this.currentFrame = frame;
    }

    public void setFragmentedOpcode(int fragmentedOpcode) {
        this.fragmentedOpcode = fragmentedOpcode;
    }

    public WebSocketFrame getFrame() { return currentFrame; }
    public StringBuilder getTextBuffer() { return textBuffer; }
    public ByteArrayOutputStream getBinaryBuffer() { return binaryBuffer; }
    public int getFragmentedOpcode() { return fragmentedOpcode; }

    public boolean isFragmented() {
        return fragmentedOpcode != -1;
    }

    public void startFragmentedMessage(int opcode) {
        this.fragmentedOpcode = opcode;
    }

    public void reset() {
        this.textBuffer.setLength(0); // new StringBuilder() 대신 내용만 비움
        this.binaryBuffer.reset();    // new ByteArrayOutputStream() 대신 내용만 비움
        this.fragmentedOpcode = -1;
        this.currentFrame = null;
    }

    public MessagePayload createPayload() {
        String text = textBuffer.length() > 0 ? textBuffer.toString() : null;
        byte[] binary = binaryBuffer.size() > 0 ? binaryBuffer.toByteArray() : null;
        return new DefaultMessagePayload(text, binary);
    }
}