// Path: cn.ctodb.push.core/src/main/java/cn/ctodb/push/dto/Command.java
// public enum Command {
//     HEARTBEAT(1),
//     HANDSHAKE_REQ(10),
//     HANDSHAKE_RESP(11),
//     ERROR(2),
//     LOGIN(3),
//     LOGOUT(4),
//     BIND(5),
//     UNBIND(6),
//     PUSH(7),
//     TEXT_MESSAGE(100),
//     UNKNOWN(-1);
// 
//     Command(int cmd) {
//         this.cmd = (byte) cmd;
//     }
// 
//     public final byte cmd;
// 
//     public static Command toCMD(byte b) {
//         for (Command command : values()) {
//             if (command.cmd == b) {
//                 return command;
//             }
//         }
//         return UNKNOWN;
//     }
// 
// }
// 
// Path: cn.ctodb.push.core/src/main/java/cn/ctodb/push/dto/Packet.java
// @Message
// public class Packet {
// 
//     private byte cmd; // 命令
//     private short cc; // 校验码 暂时没有用到
//     private byte flags; // 特性，如是否加密，是否压缩等
//     private String sessionId; // 会话id。客户端生成。
//     private byte lrc; // 校验，纵向冗余校验。只校验head
//     private byte[] body;
// 
// 
//     public Packet(byte cmd) {
//         this.cmd = cmd;
//     }
// 
//     public Packet() {
//     }
// 
//     public Packet(byte cmd, String sessionId) {
//         this.cmd = cmd;
//         this.sessionId = sessionId;
//     }
// 
//     public Packet(Command cmd) {
//         this.cmd = cmd.cmd;
//     }
// 
//     public Packet(Command cmd, String sessionId) {
//         this.cmd = cmd.cmd;
//         this.sessionId = sessionId;
//     }
// 
//     @Override
//     public String toString() {
//         return "{" + "cmd=" + cmd + ", cc=" + cc + ", flags=" + flags + ", sessionId=" + sessionId + ", lrc=" + lrc
//                 + ", body=" + (body == null ? 0 : body.length) + '}';
//     }
// 
//     public byte getCmd() {
//         return cmd;
//     }
// 
//     public void setCmd(byte cmd) {
//         this.cmd = cmd;
//     }
// 
//     public short getCc() {
//         return cc;
//     }
// 
//     public void setCc(short cc) {
//         this.cc = cc;
//     }
// 
//     public byte getFlags() {
//         return flags;
//     }
// 
//     public void setFlags(byte flags) {
//         this.flags = flags;
//     }
// 
//     public String getSessionId() {
//         return sessionId;
//     }
// 
//     public void setSessionId(String sessionId) {
//         this.sessionId = sessionId;
//     }
// 
//     public byte getLrc() {
//         return lrc;
//     }
// 
//     public void setLrc(byte lrc) {
//         this.lrc = lrc;
//     }
// 
//     public byte[] getBody() {
//         return body;
//     }
// 
//     public void setBody(byte[] body) {
//         this.body = body;
//     }
// }
// 
// Path: cn.ctodb.push.core/src/main/java/cn/ctodb/push/handler/PacketHandler.java
// public abstract class PacketHandler {
// 
//     protected final Logger logger = LoggerFactory.getLogger(getClass());
// 
//     public abstract Command cmd();
// 
//     public abstract void handle(Packet packet, Connection connection);
// 
// }


import cn.ctodb.push.dto.Command;
import cn.ctodb.push.dto.Packet;
import cn.ctodb.push.handler.PacketHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
package cn.ctodb.push.core;



/**
 * All rights Reserved, Designed By www.ctodb.cn
 * @author: lichaohn@163.com
 * @version V1.0
 * @Copyright: 2018 www.ctodb.cn Inc. All rights reserved.
 */
public final class PacketReceiver {

    private static final Logger logger = LoggerFactory.getLogger(PacketReceiver.class);
    private static List<Filter> filterList = new ArrayList<>();
    private static final Map<Command, PacketHandler> handlers = new HashMap<>();

// Path: cn.ctodb.push.core/src/main/java/cn/ctodb/push/dto/Command.java
// public enum Command {
//     HEARTBEAT(1),
//     HANDSHAKE_REQ(10),
//     HANDSHAKE_RESP(11),
//     ERROR(2),
//     LOGIN(3),
//     LOGOUT(4),
//     BIND(5),
//     UNBIND(6),
//     PUSH(7),
//     TEXT_MESSAGE(100),
//     UNKNOWN(-1);
// 
//     Command(int cmd) {
//         this.cmd = (byte) cmd;
//     }
// 
//     public final byte cmd;
// 
//     public static Command toCMD(byte b) {
//         for (Command command : values()) {
//             if (command.cmd == b) {
//                 return command;
//             }
//         }
//         return UNKNOWN;
//     }
// 
// }
// 
// Path: cn.ctodb.push.core/src/main/java/cn/ctodb/push/dto/Packet.java
// @Message
// public class Packet {
// 
//     private byte cmd; // 命令
//     private short cc; // 校验码 暂时没有用到
//     private byte flags; // 特性，如是否加密，是否压缩等
//     private String sessionId; // 会话id。客户端生成。
//     private byte lrc; // 校验，纵向冗余校验。只校验head
//     private byte[] body;
// 
// 
//     public Packet(byte cmd) {
//         this.cmd = cmd;
//     }
// 
//     public Packet() {
//     }
// 
//     public Packet(byte cmd, String sessionId) {
//         this.cmd = cmd;
//         this.sessionId = sessionId;
//     }
// 
//     public Packet(Command cmd) {
//         this.cmd = cmd.cmd;
//     }
// 
//     public Packet(Command cmd, String sessionId) {
//         this.cmd = cmd.cmd;
//         this.sessionId = sessionId;
//     }
// 
//     @Override
//     public String toString() {
//         return "{" + "cmd=" + cmd + ", cc=" + cc + ", flags=" + flags + ", sessionId=" + sessionId + ", lrc=" + lrc
//                 + ", body=" + (body == null ? 0 : body.length) + '}';
//     }
// 
//     public byte getCmd() {
//         return cmd;
//     }
// 
//     public void setCmd(byte cmd) {
//         this.cmd = cmd;
//     }
// 
//     public short getCc() {
//         return cc;
//     }
// 
//     public void setCc(short cc) {
//         this.cc = cc;
//     }
// 
//     public byte getFlags() {
//         return flags;
//     }
// 
//     public void setFlags(byte flags) {
//         this.flags = flags;
//     }
// 
//     public String getSessionId() {
//         return sessionId;
//     }
// 
//     public void setSessionId(String sessionId) {
//         this.sessionId = sessionId;
//     }
// 
//     public byte getLrc() {
//         return lrc;
//     }
// 
//     public void setLrc(byte lrc) {
//         this.lrc = lrc;
//     }
// 
//     public byte[] getBody() {
//         return body;
//     }
// 
//     public void setBody(byte[] body) {
//         this.body = body;
//     }
// }
// 
// Path: cn.ctodb.push.core/src/main/java/cn/ctodb/push/handler/PacketHandler.java
// public abstract class PacketHandler {
// 
//     protected final Logger logger = LoggerFactory.getLogger(getClass());
// 
//     public abstract Command cmd();
// 
//     public abstract void handle(Packet packet, Connection connection);
// 
// }


// Path: cn.ctodb.push.core/src/main/java/cn/ctodb/push/core/PacketReceiver.java
import cn.ctodb.push.dto.Command;
import cn.ctodb.push.dto.Packet;
import cn.ctodb.push.handler.PacketHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

package cn.ctodb.push.core;



/**
 * All rights Reserved, Designed By www.ctodb.cn
 * @author: lichaohn@163.com
 * @version V1.0
 * @Copyright: 2018 www.ctodb.cn Inc. All rights reserved.
 */
public final class PacketReceiver {

    private static final Logger logger = LoggerFactory.getLogger(PacketReceiver.class);
    private static List<Filter> filterList = new ArrayList<>();
    private static final Map<Command, PacketHandler> handlers = new HashMap<>();

    public void addHandler(PacketHandler handler) {