/*
* Copyright 2009-2016 Weibo, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.weibo.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.weibo.api.motan.common.MotanConstants;
import com.weibo.service.RegistryService;
import com.weibo.utils.ZkClientWrapper;
import org.I0Itec.zkclient.ZkClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
@Service
@Lazy
public class ZookeeperRegistryService implements RegistryService {
@Autowired
private ZkClientWrapper clientWrapper;
private ZkClient zkClient;
public ZookeeperRegistryService() {
}
public ZookeeperRegistryService(ZkClient zkClient) {
this.zkClient = zkClient;
}
@PostConstruct
void init() {
zkClient = clientWrapper.getZkClient();
}
@Override
public List<String> getGroups() {
return getChildren(MotanConstants.ZOOKEEPER_REGISTRY_NAMESPACE);
}
@Override
public List<String> getServicesByGroup(String group) {
List<String> services = getChildren(toGroupPath(group));
services.remove("command");
return services;
}
@Override
public List<JSONObject> getNodes(String group, String service, String nodeType) {
List<JSONObject> result = new ArrayList<JSONObject>();
List<String> nodes = getChildren(toNodeTypePath(group, service, nodeType));
for (String nodeName : nodes) {
JSONObject node = new JSONObject();
String info = zkClient.readData(toNodePath(group, service, nodeType, nodeName), true);
node.put("host", nodeName);
node.put("info", info);
result.add(node);
}
return result;
}
@Override
public List<JSONObject> getAllNodes(String group) {
List<JSONObject> results = new ArrayList<JSONObject>();
List<String> services = getServicesByGroup(group);
for (String serviceName : services) {
JSONObject service = new JSONObject();
service.put("service", serviceName);
List<JSONObject> availableServer = getNodes(group, serviceName, "server");
service.put("server", availableServer);
List<JSONObject> unavailableServer = getNodes(group, serviceName, "unavailableServer");
service.put("unavailableServer", unavailableServer);
List<JSONObject> clientNode = getNodes(group, serviceName, "client");
service.put("client", clientNode);
results.add(service);
}
return results;
}
private String toGroupPath(String group) {
return MotanConstants.ZOOKEEPER_REGISTRY_NAMESPACE + MotanConstants.PATH_SEPARATOR + group;
}
private String toServicePath(String group, String service) {
return toGroupPath(group) + MotanConstants.PATH_SEPARATOR + service;
}
private String toNodeTypePath(String group, String service, String nodeType) {
return toServicePath(group, service) + MotanConstants.PATH_SEPARATOR + nodeType;
}
private String toNodePath(String group, String service, String nodeType, String node) {
return toNodeTypePath(group, service, nodeType) + MotanConstants.PATH_SEPARATOR + node;
}
private List<String> getChildren(String path) {
List<String> children = new ArrayList<String>();
if (zkClient.exists(path)) {
children = zkClient.getChildren(path);
}
return children;
}
}