package com.alibaba.rocketmq.common.namesrv; import static com.alibaba.rocketmq.common.protocol.route.ObjectConverter.topicRuntimeData2TopicRuntimeInfo; import static com.alibaba.rocketmq.common.protocol.route.ObjectConverter.topicRuntimeInfo2TopicRuntimeData; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.google.protobuf.InvalidProtocolBufferException; import com.alibaba.rocketmq.common.protocol.route.ObjectConverter; import com.alibaba.rocketmq.common.protocol.MQProtos.TopicRuntimeInfo; import com.alibaba.rocketmq.common.protocol.route.BrokerData; import com.alibaba.rocketmq.common.protocol.route.QueueData; /** * ����ʱ�ռ�������broker��topic��ص���Ϣ,ֻ���л�nameserver�˳־û�����Ϣ * * @author lansheng.zj@taobao.com */ public class TopicRuntimeData { public static final String ORDER_PREFIX = "topic.num."; private transient Map<String/* topic */, List<QueueData>> topicBrokers; private Map<String/* topic */, String/* orderConf */> topicOrderConfs; private transient Map<String/* brokerName */, BrokerData> brokers; private List<String/* address */> brokerList; private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); // FIXME cluster information // private Map<String/*cluster name*/,?> clusterInfo; public TopicRuntimeData() { topicBrokers = new HashMap<String, List<QueueData>>(); topicOrderConfs = new HashMap<String, String>(); brokers = new HashMap<String, BrokerData>(); brokerList = new ArrayList<String>(); } public byte[] encode() { return topicRuntimeData2TopicRuntimeInfo(this).toByteArray(); } public byte[] encodeSpecific() { TopicRuntimeData serial = new TopicRuntimeData(); serial.setTopicOrderConfs(topicOrderConfs); serial.setBrokerList(brokerList); return topicRuntimeData2TopicRuntimeInfo(serial).toByteArray(); } public static TopicRuntimeData decode(byte[] data) throws InvalidProtocolBufferException { TopicRuntimeInfo topicRuntimeInfo = TopicRuntimeInfo.parseFrom(data); return topicRuntimeInfo2TopicRuntimeData(topicRuntimeInfo); } public String encodeOrderTopicAsString() { StringBuilder encode = new StringBuilder(); boolean isFirst = true; for (Entry<String, String> entry : topicOrderConfs.entrySet()) { if (!isFirst) encode.append("\n"); encode.append(entry.getKey() + "=" + entry.getValue()); isFirst = false; } return encode.toString(); } public String encodeBrokerListAsString() { StringBuilder encode = new StringBuilder(); boolean isFirst = true; for (String address : brokerList) { if (!isFirst) encode.append(";"); encode.append(address); isFirst = false; } return encode.toString(); } public String getOrderConfByTopic(String topic) { String conf = topicOrderConfs.get(ORDER_PREFIX + topic); if (null != conf && !"".equals(conf)) { return ORDER_PREFIX + topic + "=" + conf; } return ""; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((topicBrokers == null) ? 0 : topicBrokers.hashCode()); result = prime * result + ((topicOrderConfs == null) ? 0 : topicOrderConfs.hashCode()); result = prime * result + ((brokers == null) ? 0 : brokers.hashCode()); result = prime * result + ((brokerList == null) ? 0 : brokerList.hashCode()); return result; } @Override public boolean equals(Object obj) { // TODO ���ԱȽϵ����ܿ��� if (this == obj) return true; if (!(obj instanceof TopicRuntimeData)) return false; TopicRuntimeData newTrd = (TopicRuntimeData) obj; boolean equal = ObjectConverter.equals(getTopicBrokers(), newTrd.getTopicBrokers()) && ObjectConverter.equals(getTopicOrderConfs(), newTrd.getTopicOrderConfs()) && ObjectConverter.equals(getBrokers(), newTrd.getBrokers()) && ObjectConverter.equals(getBrokerList(), newTrd.getBrokerList()); return equal; } public void addPropertyChangeListener(final String propertyName, final PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(final PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } public void firePropertyChange(String propertyName, Object oldValue, Object newValue) { propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue); } public Map<String, List<QueueData>> getTopicBrokers() { return topicBrokers; } public void setTopicBrokers(Map<String, List<QueueData>> topicBrokers) { this.topicBrokers = topicBrokers; } public Map<String, String> getTopicOrderConfs() { return topicOrderConfs; } public void setTopicOrderConfs(Map<String, String> topicOrderConfs) { this.topicOrderConfs = topicOrderConfs; } public Map<String, BrokerData> getBrokers() { return brokers; } public void setBrokers(Map<String, BrokerData> brokers) { this.brokers = brokers; } public List<String> getBrokerList() { return brokerList; } public void setBrokerList(List<String> brokerList) { this.brokerList = brokerList; } }