/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.alibaba.jstorm.ui.utils;
import backtype.storm.utils.Utils;
import com.alibaba.jstorm.cluster.Cluster;
import com.alibaba.jstorm.cluster.ClusterState;
import com.alibaba.jstorm.cluster.DistributedClusterState;
import com.alibaba.jstorm.ui.model.ZookeeperNode;
import com.alibaba.jstorm.utils.PathUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* @author Donne (lindeqiang1988@gmail.com)
*/
@Service
public class ZookeeperManager {
private static final Logger LOG = LoggerFactory.getLogger(ZookeeperManager.class);
private static ConcurrentMap<String, ClusterState> clusterSates = new ConcurrentHashMap<>();
private static Gson gson = new GsonBuilder().setPrettyPrinting().create();
public static List<ZookeeperNode> listZKNodes(String clusterName, String parent) {
List<ZookeeperNode> nodes = new ArrayList<>();
try {
ClusterState clusterState = getAndCreateClusterState(clusterName);
if (clusterState == null) {
throw new IllegalStateException("Cluster state is null");
}
List<String> elements = clusterState.get_children(parent, false);
for (String element : elements) {
String path = PathUtils.normalize_path(parent + Cluster.ZK_SEPERATOR + element);
nodes.add(new ZookeeperNode(parent, element, hasChildren(clusterState, path)));
}
} catch (Exception e) {
LOG.error("Get zookeeper info error!", e);
}
return nodes;
}
public static String getZKNodeData(String clusterName, String path) {
String out = null;
try {
ClusterState clusterState = getAndCreateClusterState(clusterName);
if (clusterState == null) {
throw new IllegalStateException("Cluster state is null");
}
byte[] data = clusterState.get_data(PathUtils.normalize_path(path), false);
if (data != null && data.length > 0) {
Object obj = Utils.maybe_deserialize(data);
if (obj != null){
out = gson.toJson(obj);
} else {
out = new String(data);
}
}
} catch (Exception e) {
LOG.error("Get zookeeper data error!", e);
}
return out;
}
private static ClusterState getAndCreateClusterState(String clusterName) {
ClusterState state = null;
try {
state = clusterSates.get(clusterName);
if (state == null) {
Map zkConf = UIUtils.resetZKConfig(Utils.readStormConfig(), clusterName);
state = new DistributedClusterState(zkConf);
ClusterState old = clusterSates.putIfAbsent(clusterName, state);
if (old != null) {
try {
state.close();
} catch (Exception e) {
LOG.warn("Close state error!", e);
}
state = old;
}
}
} catch (Exception e) {
LOG.error("Create cluster state error!");
}
return state;
}
public static boolean hasChildren(ClusterState clusterState, String path) throws Exception {
if (clusterState == null || path == null) {
return false;
}
List<String> children = clusterState.get_children(path, false);
return children != null && !children.isEmpty();
}
}