/** * $Id$ */ package com.alibaba.rocketmq.common.protocol.route; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.rocketmq.common.TopicConfig; import com.alibaba.rocketmq.common.namesrv.TopicRuntimeData; import com.alibaba.rocketmq.common.protocol.MQProtos.BrokerDataPair; import com.alibaba.rocketmq.common.protocol.MQProtos.BrokerInfo; import com.alibaba.rocketmq.common.protocol.MQProtos.BrokerInfo.BrokerAddr; import com.alibaba.rocketmq.common.protocol.MQProtos.QueueInfo; import com.alibaba.rocketmq.common.protocol.MQProtos.TopicQueuePair; import com.alibaba.rocketmq.common.protocol.MQProtos.TopicRouteInfo; import com.alibaba.rocketmq.common.protocol.MQProtos.TopicRuntimeInfo; import com.alibaba.rocketmq.remoting.protocol.RemotingProtos; import com.alibaba.rocketmq.remoting.protocol.RemotingProtos.NVPair; import com.alibaba.rocketmq.remoting.protocol.RemotingProtos.NVPairList; import com.alibaba.rocketmq.remoting.protocol.RemotingProtos.StringList; /** * @author lansheng.zj@taobao.com */ public class ObjectConverter { public static TopicRouteInfo topicRouteData2TopicRouteInfo(TopicRouteData topicRouteData) { TopicRouteInfo.Builder topicRouteInfo = TopicRouteInfo.newBuilder(); for (QueueData queueData : topicRouteData.getQueueDatas()) { topicRouteInfo.addQueueInfos(queueData2QueueInfo(queueData)); } for (BrokerData brokerData : topicRouteData.getBrokerDatas()) { topicRouteInfo.addBrokerInfos(brokerData2BrokerInfo(brokerData)); } topicRouteInfo.setOrderTopicConf(topicRouteData.getOrderTopicConf()); return topicRouteInfo.build(); } public static TopicRouteData topicRouteInfo2TopicRouteData(TopicRouteInfo topicRouteInfo) { TopicRouteData topicRouteData = new TopicRouteData(); List<QueueInfo> queueInfoList = topicRouteInfo.getQueueInfosList(); List<QueueData> queueDataList = new ArrayList<QueueData>(); for (QueueInfo queueInfo : queueInfoList) { queueDataList.add(queueInfo2QueueData(queueInfo)); } List<BrokerData> brokerDataList = new ArrayList<BrokerData>(); List<BrokerInfo> brokerInfoList = topicRouteInfo.getBrokerInfosList(); for (BrokerInfo brokerInfo : brokerInfoList) { brokerDataList.add(brokerInfo2BrokerData(brokerInfo)); } topicRouteData.setQueueDatas(queueDataList); topicRouteData.setBrokerDatas(brokerDataList); topicRouteData.setOrderTopicConf(topicRouteInfo.getOrderTopicConf()); return topicRouteData; } public static QueueData queueInfo2QueueData(QueueInfo queueInfo) { QueueData queueData = new QueueData(); queueData.setBrokerName(queueInfo.getBrokerName()); queueData.setReadQueueNums(queueInfo.getReadQueueNums()); queueData.setWriteQueueNums(queueInfo.getWriteQueueNums()); queueData.setPerm(queueInfo.getPerm()); return queueData; } public static QueueInfo queueData2QueueInfo(QueueData queueData) { QueueInfo.Builder qb = QueueInfo.newBuilder(); qb.setBrokerName(queueData.getBrokerName()); qb.setPerm(queueData.getPerm()); qb.setReadQueueNums(queueData.getReadQueueNums()); qb.setWriteQueueNums(queueData.getWriteQueueNums()); return qb.build(); } public static BrokerData brokerInfo2BrokerData(BrokerInfo brokerInfo) { BrokerData brokerData = new BrokerData(); brokerData.setBrokerName(brokerInfo.getBrokerName()); HashMap<Long, String> brokerAddrs = new HashMap<Long, String>(); for (BrokerAddr brokerAddr : brokerInfo.getBrokerAddrsList()) { brokerAddrs.put(brokerAddr.getId(), brokerAddr.getAddr()); } brokerData.setBrokerAddrs(brokerAddrs); return brokerData; } public static BrokerInfo brokerData2BrokerInfo(BrokerData brokerData) { BrokerInfo.Builder bb = BrokerInfo.newBuilder(); bb.setBrokerName(brokerData.getBrokerName()); for (Entry<Long, String> entry : brokerData.getBrokerAddrs().entrySet()) { BrokerAddr.Builder bab = BrokerAddr.newBuilder(); bab.setId(entry.getKey()); bab.setAddr(entry.getValue()); bb.addBrokerAddrs(bab.build()); } return bb.build(); } public static Map<String, String> nvPairList2HashMap(NVPairList nvPairList) { HashMap<String, String> map = new HashMap<String, String>(); for (RemotingProtos.NVPair nvPair : nvPairList.getFieldsList()) { map.put(nvPair.getName(), nvPair.getValue()); } return map; } public static NVPairList hashMap2NVPairList(Map<String, String> map) { NVPairList.Builder nvlb = NVPairList.newBuilder(); int index = 0; for (Entry<String, String> entry : map.entrySet()) { NVPair.Builder nvb = NVPair.newBuilder(); nvb.setName(entry.getKey()); nvb.setValue(entry.getValue()); nvlb.addFields(index, nvb.build()); } return nvlb.build(); } public static TopicRuntimeData topicRuntimeInfo2TopicRuntimeData(TopicRuntimeInfo topicRuntimeInfo) { TopicRuntimeData topicRuntimeData = new TopicRuntimeData(); for (TopicQueuePair topicQueuePair : topicRuntimeInfo.getTopicBrokersList()) { List<QueueInfo> listQueueInfo = topicQueuePair.getQueueInfoList(); List<QueueData> listQueueData = new ArrayList<QueueData>(); for (QueueInfo queueInfo : listQueueInfo) { listQueueData.add(queueInfo2QueueData(queueInfo)); } topicRuntimeData.getTopicBrokers().put(topicQueuePair.getTopic(), listQueueData); } topicRuntimeData.setTopicOrderConfs(nvPairList2HashMap(topicRuntimeInfo.getTopicOrderConfs())); for (BrokerDataPair brokerDataPair : topicRuntimeInfo.getBrokersList()) { topicRuntimeData.getBrokers().put(brokerDataPair.getBrokerName(), brokerInfo2BrokerData(brokerDataPair.getBrokerInfo())); } topicRuntimeData.setBrokerList(topicRuntimeInfo.getBrokerList().getNameList()); return topicRuntimeData; } public static StringList list2StringList(List<String> list) { StringList.Builder slb = StringList.newBuilder(); for (String name : list) { slb.addName(name); } return slb.build(); } public static TopicRuntimeInfo topicRuntimeData2TopicRuntimeInfo(TopicRuntimeData topicRuntimeData) { TopicRuntimeInfo.Builder tri = TopicRuntimeInfo.newBuilder(); for (Entry<String, List<QueueData>> entry : topicRuntimeData.getTopicBrokers().entrySet()) { List<QueueData> queueDataList = entry.getValue(); TopicQueuePair.Builder tqpb = TopicQueuePair.newBuilder(); tqpb.setTopic(entry.getKey()); for (QueueData queueData : queueDataList) { tqpb.addQueueInfo(queueData2QueueInfo(queueData)); } tri.addTopicBrokers(tqpb.build()); } tri.setTopicOrderConfs(hashMap2NVPairList(topicRuntimeData.getTopicOrderConfs())); for (Entry<String, BrokerData> entry : topicRuntimeData.getBrokers().entrySet()) { BrokerDataPair.Builder bdpb = BrokerDataPair.newBuilder(); bdpb.setBrokerName(entry.getKey()); bdpb.setBrokerInfo(brokerData2BrokerInfo(entry.getValue())); tri.addBrokers(bdpb.build()); } tri.setBrokerList(list2StringList(topicRuntimeData.getBrokerList())); return tri.build(); } public static <T> boolean equals(List<T> l1, List<T> l2) { if (l1 == l2) return true; if (null == l1 || null == l2) return false; if (l1.size() != l2.size()) return false; for (T e : l1) { boolean equal = false; for (T a : l2) { equal = e.equals(a); if (equal) break; } if (!equal) return false; } return true; } public static <K, V> boolean equals(Map<K, V> m1, Map<K, V> m2) { if (m1 == m2) return true; if (null == m1 || null == m2) return false; if (m1.size() != m2.size()) return false; for (Entry<K, V> entry : m1.entrySet()) { V newV = m2.get(entry.getKey()); if (!entry.getValue().equals(newV)) return false; } return true; } public static Map<String, TopicConfig> props2TopicConfigTable(Properties prop, Logger log) { Map<String, TopicConfig> topicConfigTable = new HashMap<String, TopicConfig>(); Set<Object> keyset = prop.keySet(); for (Object object : keyset) { String propValue = prop.getProperty(object.toString()); if (propValue != null) { TopicConfig tc = new TopicConfig(null); if (tc.decode(propValue)) { topicConfigTable.put(tc.getTopicName(), tc); if (null != log) log.info("load topic config OK, " + tc); } } } return topicConfigTable; } }