001package gu.dtalk;
002
003import com.google.common.base.Preconditions;
004import com.google.common.base.Strings;
005
006/**
007 * 设备命令响应对象<br>
008 * 此类对象将做为设备命令响应经redis服务器发送到命令发送端,
009 * 数据发到redis服务器以及设备端从redis服务器收到数据的过程要经过JSON序列化和反序列化<br>
010 * @author guyadong
011 *
012 * @param <T> 设备命令执行返回结果类型
013 */
014public class Ack<T> {
015        private long cmdSn;
016        private int deviceId;
017        private T value;
018        private Status status;
019        private String errorMessage;
020        /** 设备命令执行状态 */
021        public enum Status{
022                /** 调用正常返回 */
023                OK,
024                /** 设备端不支持的操作 */
025                UNSUPPORTED,
026                /** 调用出错 */
027                ERROR,
028                /** 
029                 * 响应超时,此错误不是由设备端发送,
030                 * 是由命令发送端(本机)在指定的时间内没有收到任何响应而取消频道订阅时产生
031                 */ 
032                TIMEOUT
033        }
034        public Ack() {
035        }
036        /**
037         * 返回状态信息
038         * @return
039         */
040        public String message(){
041                Preconditions.checkArgument(null != status,"status field is null");
042                StringBuffer buffer = new StringBuffer(String.format("device%d@%d:%s", deviceId,cmdSn,status.name()));
043                switch(status){
044                case ERROR:
045                        if(!Strings.isNullOrEmpty(errorMessage)){
046                                buffer.append(":").append(errorMessage);
047                        }
048                        break;
049                case TIMEOUT:
050                case UNSUPPORTED:
051                case OK:
052                default:
053                        break;
054                }
055                return buffer.toString();
056        }
057        /** 返回设备命令序列号 */
058        public long getCmdSn() {
059                return cmdSn;
060        }
061        public Ack<T> setCmdSn(long cmdSn) {
062                this.cmdSn = cmdSn;
063                return this;
064        }
065        /** 返回执行设备命令的设备ID */
066        public int getDeviceId() {
067                return deviceId;
068        }
069
070        public Ack<T> setDeviceId(int deviceId) {
071                this.deviceId = deviceId;
072                return this;
073        }
074        /** 返回设备命令执行结果对象 */
075        public T getValue() {
076                return value;
077        }
078        public Ack<T> setValue(T value) {
079                this.value = value;
080                return this;
081        }
082        /** 返回设备命令执行状态 */
083        public Status getStatus() {
084                return status;
085        }
086        public Ack<T> setStatus(Status status) {
087                this.status = status;
088                return this;
089        }
090        /** 返回设备命令执行错误信息 */
091        public String getErrorMessage() {
092                return errorMessage;
093        }
094        public Ack<T> setErrorMessage(String errorMessage) {
095                this.errorMessage = errorMessage;
096                return this;
097        }
098        @Override
099        public String toString() {
100                StringBuilder builder = new StringBuilder();
101                builder.append("Ack [cmdSn=");
102                builder.append(cmdSn);
103                builder.append(", deviceId=");
104                builder.append(deviceId);
105                builder.append(", value=");
106                builder.append(value);
107                builder.append(", status=");
108                builder.append(status);
109                builder.append(", errorMessage=");
110                builder.append(errorMessage);
111                builder.append("]");
112                return builder.toString();
113        }
114}