package com.cmos.msgframe.common.message;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import com.cmos.msgframe.common.util.StringUtils;



/**
 * 
 * msgframe的消息对象基类
 * 
 * @author yangping5
 * @version [版本号, 2016年5月4日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public abstract class MsgFMessage<T> implements Serializable
{

    public static final String HEADER_IS_NEED_RETURN = "msg_isNeedReturn";

    public static final String HEADER_SUBJECT_NAME = "msg_subject_name";

    public static final String HEADER_CLUSTER = "msg_cluster";

    public static final String HEADER_INDEX = "msg_index";

    public static final String HEADER_TAG = "msg_tag";

    public static final String HEADER_BROKER_URL = "msg_broker_url";

    public static final String HEADER_MESSAGE_ID = "msg_message_id";
    //接入log4x消息头属性
    public static final String HEADER_MESSAGE_LOG4X = "msg_log4x_trace";
    //消息key的属性可以放在消息头中，在消息跟踪时可以根据key来查询
    public static final String MESSAGE_KEY = "msg_key";
    //延迟推送，作为定时消息时使用
    public static final String MQ_SCHEDULED_DELAY = "MQ_SCHEDULED_DELAY";
    //消息有效期
    public static final String MQ_LIVE_TO_TIME = "MQ_LIVE_TO_TIME";
    //消息优先级
    public static final String MQ_PRIORITY = "MQ_PRIORITY";
    

    private String msgId = UUID.randomUUID().toString();

    private boolean iShalfMessage;

    private T extInfo;

    // 发送的消息报文头信息 add zhangxp
    private Map<String, String> headerMap = new HashMap<String, String>();

    public MsgFMessage()
    {
        super();
        setHeaderAttribute(HEADER_MESSAGE_ID, msgId);
    }

    public void setHeaderAttribute(String key, String value)
    {
        headerMap.put(key, value);
    }

    public String getHeaderAttribute(String key)
    {
        return headerMap.get(key);
    }

    public void setHeaderAttribute(Map<String, String> header)
    {
        headerMap.putAll(header);
    }

    public String getMsgId()
    {
        return msgId;
    }

    public void setMsgId(String msgId)
    {
        this.msgId = msgId;
    }

    public boolean isNeedReturn()
    {
        return "true"
                .equalsIgnoreCase(getHeaderAttribute(HEADER_IS_NEED_RETURN));
    }

    public Map<String, String> getHeaderMap()
    {
        return headerMap;
    }

    public boolean isHalfMessage()
    {
        return iShalfMessage;
    }

    public String getFilterTag()
    {
        return StringUtils.isBlank(this.getHeaderMap().get(HEADER_TAG)) ? "*"
                : this.getHeaderMap().get(HEADER_TAG);
    }

    public String setFilterTag(String filterTag)
    {
        return this.getHeaderMap().put(HEADER_TAG, filterTag);
    }

    public T getExtInfo()
    {
        return extInfo;
    }

    public void setExtInfo(T extInfo)
    {
        this.extInfo = extInfo;
    }

    @Override
    public String toString()
    {
        return "消息id｛" + this.getMsgId() + "｝ 消息条件｛" + this.getFilterTag()
                + "}";
    }

}
