All Downloads are FREE. Search and download functionalities are using the official Maven repository.

space.chensheng.wsmessenger.message.converter.NettyMessageConverter Maven / Gradle / Ivy

The newest version!
package space.chensheng.wsmessenger.message.converter;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import space.chensheng.wsmessenger.message.component.MessageHeader;
import space.chensheng.wsmessenger.message.component.WsMessage;

import java.util.ArrayList;
import java.util.List;

public class NettyMessageConverter {
    private static final Logger logger = LoggerFactory.getLogger(NettyMessageConverter.class);

	private static List serializeStrategies = new ArrayList();

	static {
	    serializeStrategies.add(new JsonSerializeStrategy());
    }

	public static WsMessage fromByteBuf(ByteBuf buf) {
		if (buf == null) {
			return null;
		}
		
		int readableBytes = buf.readableBytes();
		byte[] bytes = new byte[readableBytes];
		buf.readBytes(bytes);

		MessageHeader header = null;
		SerializeStrategy serializeStrategy = null;
		for (SerializeStrategy strategy : serializeStrategies) {
		    header = strategy.deserializeHeader(bytes);
		    if (strategy.supports(header)) {
		        serializeStrategy = strategy;
		        break;
            }
        }
		if (serializeStrategy == null) {
		    logger.error("Could not find message serialize strategy");
		    return null;
        }

		return serializeStrategy.deserialize(bytes, header.getMessageClass());
	}
	
	public static ByteBuf toByteBuf(WsMessage message) {
	    if (message == null) {
	        return null;
        }

	    SerializeStrategy serializeStrategy = null;
        for (SerializeStrategy strategy : serializeStrategies) {
            if (strategy.supports(message.getHeader())) {
                serializeStrategy = strategy;
                break;
            }
        }
        if (serializeStrategy == null) {
            logger.error("Could not find message serialize strategy for message {}", message);
            return null;
        }

		byte[] bytes = serializeStrategy.serialize(message);
		return Unpooled.copiedBuffer(bytes);
	}
	
	public static BinaryWebSocketFrame toBinaryWebSocketFrame(WsMessage message) {
		ByteBuf buf = toByteBuf(message);
		return new BinaryWebSocketFrame(buf);
	}
	
	public static WsMessage fromBinaryWebSocketFrame(BinaryWebSocketFrame frame) {
		if (frame == null) {
			throw new NullPointerException("frame may not be null");
		}
		return fromByteBuf(frame.content());
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy