/**
* Copyright 2016 vip.com.
* <p>
* 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.
* </p>
*/
package com.vip.saturn.job.console.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vip.saturn.job.console.domain.RegistryCenterConfiguration;
import com.vip.saturn.job.console.domain.TreeNode;
/**
* @author chembo.huang
*
*/
public final class InitRegistryCenterService {
private static final Logger log = LoggerFactory.getLogger(InitRegistryCenterService.class);
public static TreeNode treeData = new TreeNode();
public static final Map<String/** zkBsKey **/, TreeNode> ZKBSKEY_TO_TREENODE_MAP = new HashMap<>();
/**
* transfer /a/b/b1, /a/b/b2 to
* {"title":"a", "children":["title":"b", "children": ["title": b1, "title": b2]]}
*
* @param registryCenterConfiguration 注册中心配置类
*/
public static void initTreeJson(Set<RegistryCenterConfiguration> registryCenterConfiguration) {
TreeNode treeData = new TreeNode();
for (RegistryCenterConfiguration conf : registryCenterConfiguration) {
String nameAndnameSpace = conf.getNameAndNamespace();
if (nameAndnameSpace.startsWith("/")) {
nameAndnameSpace = nameAndnameSpace.substring(1);
}
treeData = parseDirectory2Tree(nameAndnameSpace, treeData, conf.getNameAndNamespace(), conf.getDegree());
}
log.info("init tree data: {}", treeData);
}
public static void initTreeJson(ArrayList<RegistryCenterConfiguration> registryCenterConfiguration, String zkBsk) {
TreeNode treeData = new TreeNode();
for (RegistryCenterConfiguration conf : registryCenterConfiguration) {
String nameAndnameSpace = conf.getNameAndNamespace();
if (nameAndnameSpace.startsWith("/")) {
nameAndnameSpace = nameAndnameSpace.substring(1);
}
treeData = parseDirectory2Tree(nameAndnameSpace, treeData, conf.getNameAndNamespace(), conf.getDegree());
}
ZKBSKEY_TO_TREENODE_MAP.put(zkBsk, treeData);
log.info("init {} tree data: {}", zkBsk, treeData);
}
/**
* generate a tree recursively.
* @param directory directory
* @param treeNodeParent treeNodeParent
* @param fullPath fullPath
* @return TreeNode
*/
public static TreeNode parseDirectory2Tree(String directory, TreeNode treeNodeParent, String fullPath, String degree) {
String[] nodes = directory.split("/");
String nodeName = nodes[0];
TreeNode node = new TreeNode();
node.setTitle(nodeName);
// if there is only one node left, just saves it to the subs and return.
if (nodes.length == 1) {
node.setTitle("<a title=\"总览\" href=overview?name="+ fullPath +" target=\"contentFrame\">"+nodeName+"</a>");
node.setFullPath(fullPath);
node.setDomain(nodeName);
node.setFolder(false);
node.setLazy(true);
node.setExtraClasses("custom-degree-circle degree-" + degree);
treeNodeParent.getChildren().add(node);
return treeNodeParent;
} else {
directory = directory.replace(nodeName + "/", "");
// check the first node, see if the tree already contains this parent node.
// if not, create new node, otherwise, pass the exist node to next loop.
if (treeNodeParent.getTitle() == null && !treeNodeParent.getChildren().isEmpty()) {
List<TreeNode> listSubTree = treeNodeParent.getChildren();
for(TreeNode tn: listSubTree) {
if (nodeName.equals(tn.getTitle())) {
parseDirectory2Tree(directory, tn, fullPath, degree);
return treeNodeParent;
}
}
treeNodeParent.getChildren().add(parseDirectory2Tree(directory, node, fullPath, degree));
return treeNodeParent;
}
if (nodeName.equals(treeNodeParent.getTitle())) {
parseDirectory2Tree(directory, treeNodeParent, fullPath, degree);
return treeNodeParent;
}
List<TreeNode> listSubTree = treeNodeParent.getChildren();
for(TreeNode tn: listSubTree) {
if (nodeName.equals(tn.getTitle())) {
parseDirectory2Tree(directory, tn, fullPath, degree);
return tn;
}
}
treeNodeParent.getChildren().add(parseDirectory2Tree(directory, node, fullPath, degree));
return treeNodeParent;
}
}
}