package org.zstack.header.message;
import com.rabbitmq.client.AMQP.BasicProperties;
import org.apache.logging.log4j.ThreadContext;
import org.zstack.header.core.AsyncBackup;
import org.zstack.header.rest.APINoSee;
import org.zstack.utils.DebugUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;
public abstract class Message implements Serializable, AsyncBackup {
/**
* @ignore
*/
@GsonTransient
@APINoSee
@NoJsonSchema
private transient MessageProperties props;
/**
* @ignore
*/
@APINoSee
@NoJsonSchema
private Map<String, Object> headers = new LinkedHashMap<String, Object>();
/**
* @ignore
*/
@APINoSee
private String id;
/**
* @ignore
*/
@APINoSee
private String serviceId;
/**
* @ignore
*/
@APINoSee
private long createdTime;
protected static String uuid() {
return UUID.randomUUID().toString().replace("-", "");
}
public Message() {
createdTime = System.currentTimeMillis();
id = uuid();
}
public Map<String, Object> getHeaders() {
return headers;
}
public void setHeaders(Map<String, Object> headers) {
this.headers = headers;
}
public void putHeaderEntry(String key, Object value) {
headers.put(key, value);
}
public <T> T getHeaderEntry(String key) {
return (T) headers.get(key);
}
public BasicProperties getAMQPProperties() {
return props.toBasicProperties();
}
public void setAMQPProperties(BasicProperties amqpProperties) {
props = MessageProperties.valueOf(amqpProperties);
}
public Map<String, Object> getAMQPHeaders() {
DebugUtils.Assert(props != null, "AMQP properties has not been set");
if (props.getHeaders() == null) {
props.setHeaders(new HashMap<String, Object>());
} else if (!(props.getHeaders() instanceof HashMap)) {
// don't trust map generated by rabbitmq library, it may use some map type that cannot call put()
HashMap nmap = new HashMap();
nmap.putAll(props.getHeaders());
props.setHeaders(nmap);
}
return props.getHeaders();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getServiceId() {
return serviceId;
}
public void setServiceId(String serviceId) {
this.serviceId = serviceId;
}
public long getCreatedTime() {
return createdTime;
}
public String getMessageName() {
return this.getClass().getCanonicalName();
}
@Override
public boolean equals(Object t) {
if (t == null || !(t instanceof Message)) {
return false;
}
return ((Message) t).getId().equals(getId());
}
@Override
public int hashCode() {
return getId().hashCode();
}
}