AeroflexCodecFactory.java 3.6 KB
package com.example.mina.box.aeroflex;

import com.example.mina.util.StrUtil;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.*;

/**
 * @author 杜云山
 * @date 20/07/07
 */
public class AeroflexCodecFactory implements ProtocolCodecFactory {

    @Override
    public ProtocolEncoder getEncoder(IoSession session) {
        return new AeroflexMessageEncoder();
    }

    @Override
    public ProtocolDecoder getDecoder(IoSession session) {
        return new AeroflexMessageDecoder();
    }

    static class AeroflexMessageEncoder implements ProtocolEncoder {

        @Override
        public void encode(IoSession session, Object message, ProtocolEncoderOutput out) {

            if (message instanceof AeroflexResponseMessage) {

                byte[] result = ((AeroflexResponseMessage) message).getResult();
                session.write(IoBuffer.wrap(result));
            }
        }

        @Override
        public void dispose(IoSession session) {
        }

    }

    static class AeroflexMessageDecoder implements ProtocolDecoder {

        @Override
        public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {

            byte[] bytes = new byte[in.limit()];
            in.get(bytes);

            AeroflexRequestMessage requestMessage = getAeroflexRequestMessage(bytes);
            out.write(requestMessage);
        }

        private AeroflexRequestMessage getAeroflexRequestMessage(byte[] bytes) {

            String cmd = new String(bytes).trim();

            AeroflexRequestMessage requestMessage = AeroflexRequestMessage.builder()
                    .cmd(cmd)
                    .build();

            // eg: "ATTN ALL MAX"
            if (cmd.startsWith(AeroflexRequestMessage.SET_ALL)) {
                requestMessage.setRequestSetAllMax(true);
                return requestMessage;
            }

            // eg: "ATTN? 1"
            if (cmd.startsWith(AeroflexRequestMessage.GET_ONE)) {

                // eg: ["ATTN?", "1"]
                String[] sss = cmd.split(AeroflexRequestMessage.SPACE_SPLIT);

                if (sss.length < 2) {
                    requestMessage.setHasError(true);
                    return requestMessage;
                }

                int row = StrUtil.toInt(sss[1]);
                requestMessage.setRequestGetOne(true);
                requestMessage.setRequestGetOneRow(row);
                return requestMessage;

            }

            // eg: "ATTN 2 3;"
            if (cmd.startsWith(AeroflexRequestMessage.SET_ONE)) {

                // eg: ["ATTN 2 3"]
                String[] aa = cmd.split(AeroflexRequestMessage.SEMICOLON_SPLIT);

                // eg: ["ATTN", "2", "3"]
                String[] sss = aa[0].split(AeroflexRequestMessage.SPACE_SPLIT);

                if (sss.length < 3) {
                    requestMessage.setHasError(true);
                    return requestMessage;
                }

                int row = StrUtil.toInt(sss[1]);
                int val = StrUtil.toInt(sss[2]);
                requestMessage.setRequestSetOne(true);
                requestMessage.setRequestSetOneRow(row);
                requestMessage.setRequestSetOneValue(val);
                return requestMessage;
            }

            requestMessage.setHasError(true);
            return requestMessage;
        }

        @Override
        public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws Exception {

        }

        @Override
        public void dispose(IoSession session) throws Exception {

        }

    }

}