From 02796df8b0dff2981eae5fd153cab98d279e46e5 Mon Sep 17 00:00:00 2001 From: ileler Date: Fri, 1 Sep 2017 17:54:30 +0800 Subject: [PATCH 1/8] trim input or textarea --- src/main/resources/webapp/js/home.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/webapp/js/home.js b/src/main/resources/webapp/js/home.js index ad6443b..2edf755 100644 --- a/src/main/resources/webapp/js/home.js +++ b/src/main/resources/webapp/js/home.js @@ -44,5 +44,11 @@ $(document).ready(function() { $("#savePropertyBtn").show(); }); + //trim input or textarea + $('.container form').submit(function(){ + $(this).find('input:text,textarea').each(function(){ + $(this).val($.trim($(this).val())); + }); + }); }); \ No newline at end of file From e026e5f753cba9fba7562248a2c617811dfe2c2e Mon Sep 17 00:00:00 2001 From: ileler Date: Sat, 2 Sep 2017 11:53:28 +0800 Subject: [PATCH 2/8] add desc feture --- config.cfg | 2 + .../java/com/deem/zkui/controller/Export.java | 37 +++++++++++----- .../java/com/deem/zkui/controller/Home.java | 44 +++++++++++++++---- .../com/deem/zkui/utils/ZooKeeperUtil.java | 34 +++++++++----- src/main/java/com/deem/zkui/vo/LeafBean.java | 14 +++++- src/main/resources/webapp/css/zkacd.css | 5 +++ src/main/resources/webapp/js/home.js | 2 + .../resources/webapp/template/home.ftl.html | 31 ++++++++----- 8 files changed, 123 insertions(+), 46 deletions(-) diff --git a/config.cfg b/config.cfg index ec7154f..4aa2be6 100644 --- a/config.cfg +++ b/config.cfg @@ -1,3 +1,5 @@ +#Key Description.The value is the path where the Description is stored +#keyDesc=key.desc #Server Port serverPort=9090 #Comma seperated list of all the zookeeper servers diff --git a/src/main/java/com/deem/zkui/controller/Export.java b/src/main/java/com/deem/zkui/controller/Export.java index 8564102..264736d 100644 --- a/src/main/java/com/deem/zkui/controller/Export.java +++ b/src/main/java/com/deem/zkui/controller/Export.java @@ -17,23 +17,25 @@ */ package com.deem.zkui.controller; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.Date; -import java.util.Properties; -import java.util.Set; +import com.deem.zkui.utils.ServletUtil; +import com.deem.zkui.utils.ZooKeeperUtil; +import com.deem.zkui.vo.LeafBean; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.zookeeper.KeeperException; -import com.deem.zkui.utils.ServletUtil; -import com.deem.zkui.utils.ZooKeeperUtil; -import com.deem.zkui.vo.LeafBean; +import java.io.IOException; +import java.io.PrintWriter; import java.util.Arrays; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.Date; +import java.util.Properties; +import java.util.Set; @SuppressWarnings("serial") @WebServlet(urlPatterns = {"/export"}) @@ -53,12 +55,23 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t if (authRole == null) { authRole = ZooKeeperUtil.ROLE_USER; } + + String keyDescPath = globalProps.getProperty("keyDesc"); + if (keyDescPath != null && !"".equals(keyDescPath)) { + keyDescPath = ("/" + keyDescPath + "/"); + } + String zkPath = request.getParameter("zkPath"); StringBuilder output = new StringBuilder(); output.append("#App Config Dashboard (ACD) dump created on :").append(new Date()).append("\n"); - Set leaves = ZooKeeperUtil.INSTANCE.exportTree(zkPath, ServletUtil.INSTANCE.getZookeeper(request, response, zkServerLst[0], globalProps), authRole); + ZooKeeper zk = ServletUtil.INSTANCE.getZookeeper(request, response, zkServerLst[0], globalProps); + Set leaves = ZooKeeperUtil.INSTANCE.exportTree(zkPath, zk, authRole); for (LeafBean leaf : leaves) { output.append(leaf.getPath()).append('=').append(leaf.getName()).append('=').append(ServletUtil.INSTANCE.externalizeNodeValue(leaf.getValue())).append('\n'); + LeafBean nodeValue = ZooKeeperUtil.INSTANCE.getNodeValue(zk, keyDescPath, keyDescPath + leaf.getPath() + "/" + leaf.getName(), leaf.getName(), authRole); + if (nodeValue != null) { + output.append(ZooKeeperUtil.INSTANCE.pathFormat(keyDescPath + leaf.getPath())).append('=').append(nodeValue.getName()).append('=').append(ServletUtil.INSTANCE.externalizeNodeValue(nodeValue.getValue())).append('\n'); + } }// for all leaves response.setContentType("text/plain;charset=UTF-8"); try (PrintWriter out = response.getWriter()) { diff --git a/src/main/java/com/deem/zkui/controller/Home.java b/src/main/java/com/deem/zkui/controller/Home.java index c02afb4..a0912e3 100644 --- a/src/main/java/com/deem/zkui/controller/Home.java +++ b/src/main/java/com/deem/zkui/controller/Home.java @@ -23,6 +23,16 @@ import com.deem.zkui.vo.LeafBean; import com.deem.zkui.vo.ZKNode; import freemarker.template.TemplateException; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; @@ -30,15 +40,6 @@ import java.util.Map; import java.util.Properties; import java.util.Set; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooKeeper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; @SuppressWarnings("serial") @WebServlet(urlPatterns = {"/home"}, loadOnStartup = 1) @@ -54,6 +55,11 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t String zkServer = globalProps.getProperty("zkServer"); String[] zkServerLst = zkServer.split(","); + String keyDescPath = globalProps.getProperty("keyDesc"); + if (keyDescPath != null && !"".equals(keyDescPath)) { + keyDescPath = ("/" + keyDescPath + "/"); + } + Map templateParam = new HashMap<>(); String zkPath = request.getParameter("zkPath"); String navigate = request.getParameter("navigate"); @@ -87,9 +93,17 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t } } + if (leafLst != null && leafLst.size() > 0 && keyDescPath != null && !"".equals(keyDescPath)) { + for (LeafBean leaf : leafLst) { + LeafBean nodeValue = ZooKeeperUtil.INSTANCE.getNodeValue(zk, keyDescPath, keyDescPath + leaf.getPath() + "/" + leaf.getName(), leaf.getName(), authRole); + leaf.setDescription(nodeValue != null ? nodeValue.getStrValue() : ""); + } + } + templateParam.put("displayPath", displayPath); templateParam.put("parentPath", parentPath); templateParam.put("currentPath", currentPath); + templateParam.put("showDesc", (keyDescPath != null && !"".equals(keyDescPath)) ? currentPath.indexOf(keyDescPath) == -1 : false); templateParam.put("nodeLst", nodeLst); templateParam.put("leafLst", leafLst); templateParam.put("breadCrumbLst", displayPath.split("/")); @@ -115,10 +129,16 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) String zkServer = globalProps.getProperty("zkServer"); String[] zkServerLst = zkServer.split(","); + String keyDescPath = globalProps.getProperty("keyDesc"); + if (keyDescPath != null && !"".equals(keyDescPath)) { + keyDescPath = ("/" + keyDescPath + "/"); + } + Map templateParam = new HashMap<>(); String action = request.getParameter("action"); String currentPath = request.getParameter("currentPath"); String displayPath = request.getParameter("displayPath"); + String newDescription = request.getParameter("newDescription"); String newProperty = request.getParameter("newProperty"); String newValue = request.getParameter("newValue"); String newNode = request.getParameter("newNode"); @@ -143,6 +163,9 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) if (!newProperty.equals("") && !currentPath.equals("") && authRole.equals(ZooKeeperUtil.ROLE_ADMIN)) { //Save the new node. ZooKeeperUtil.INSTANCE.createNode(currentPath, newProperty, newValue, ServletUtil.INSTANCE.getZookeeper(request, response, zkServerLst[0], globalProps)); + if (keyDescPath != null && !"".equals(keyDescPath)) { + ZooKeeperUtil.INSTANCE.setPropertyValue(keyDescPath+currentPath, newProperty, newDescription, ServletUtil.INSTANCE.getZookeeper(request, response, zkServerLst[0], globalProps)); + } request.getSession().setAttribute("flashMsg", "Property Saved!"); if (ZooKeeperUtil.INSTANCE.checkIfPwdField(newProperty)) { newValue = ZooKeeperUtil.INSTANCE.SOPA_PIPA; @@ -155,6 +178,9 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) if (!newProperty.equals("") && !currentPath.equals("") && authRole.equals(ZooKeeperUtil.ROLE_ADMIN)) { //Save the new node. ZooKeeperUtil.INSTANCE.setPropertyValue(currentPath, newProperty, newValue, ServletUtil.INSTANCE.getZookeeper(request, response, zkServerLst[0], globalProps)); + if (keyDescPath != null && !"".equals(keyDescPath)) { + ZooKeeperUtil.INSTANCE.setPropertyValue(keyDescPath+currentPath, newProperty, newDescription, ServletUtil.INSTANCE.getZookeeper(request, response, zkServerLst[0], globalProps)); + } request.getSession().setAttribute("flashMsg", "Property Updated!"); if (ZooKeeperUtil.INSTANCE.checkIfPwdField(newProperty)) { newValue = ZooKeeperUtil.INSTANCE.SOPA_PIPA; diff --git a/src/main/java/com/deem/zkui/utils/ZooKeeperUtil.java b/src/main/java/com/deem/zkui/utils/ZooKeeperUtil.java index 3f2b530..0b14fb8 100644 --- a/src/main/java/com/deem/zkui/utils/ZooKeeperUtil.java +++ b/src/main/java/com/deem/zkui/utils/ZooKeeperUtil.java @@ -19,14 +19,6 @@ import com.deem.zkui.vo.LeafBean; import com.deem.zkui.vo.ZKNode; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; @@ -42,6 +34,15 @@ import org.json.simple.parser.ParseException; import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + public enum ZooKeeperUtil { INSTANCE; @@ -234,6 +235,7 @@ private void createPathAndNode(String path, String name, byte[] data, boolean fo private void createIfDoesntExist(String path, byte[] data, boolean force, ZooKeeper zooKeeper) throws InterruptedException, KeeperException { try { + path = pathFormat(path); zooKeeper.create(path, data, defaultAcl(), CreateMode.PERSISTENT); } catch (KeeperException ke) { //Explicit Overwrite @@ -342,7 +344,7 @@ public LeafBean getNodeValue(ZooKeeper zk, String path, String childPath, String //Reason exception is caught here is so that lookup can continue to happen if a particular property is not found at parent level. try { logger.trace("Lookup: path=" + path + ",childPath=" + childPath + ",child=" + child + ",authRole=" + authRole); - byte[] dataBytes = zk.getData(childPath, false, new Stat()); + byte[] dataBytes = zk.getData(pathFormat(childPath), false, new Stat()); if (!authRole.equals(ROLE_ADMIN)) { if (checkIfPwdField(child)) { return (new LeafBean(path, child, SOPA_PIPA.getBytes())); @@ -383,10 +385,13 @@ public void createFolder(String folderPath, String propertyName, String property } public void setPropertyValue(String path, String name, String value, ZooKeeper zk) throws KeeperException, InterruptedException { - String nodePath = path + name; + String nodePath = pathFormat(path + name); logger.debug("Setting property " + nodePath + " to " + value); - zk.setData(nodePath, value.getBytes(), -1); - + if (!nodeExists(nodePath, zk)) { + createPathAndNode(path, name, value.getBytes(), true, zk); + } else { + zk.setData(nodePath, value.getBytes(), -1); + } } public boolean nodeExists(String nodeFullPath, ZooKeeper zk) throws KeeperException, InterruptedException { @@ -431,4 +436,9 @@ public void closeZooKeeper(ZooKeeper zk) throws InterruptedException { } } + + public String pathFormat(String path) { + return null != path && !"".equals(path) ? path.replaceAll("\\\\+", "\\\\").replaceAll("[\\/]+", "/") : path; + } + } diff --git a/src/main/java/com/deem/zkui/vo/LeafBean.java b/src/main/java/com/deem/zkui/vo/LeafBean.java index 6e8e753..c29c45d 100644 --- a/src/main/java/com/deem/zkui/vo/LeafBean.java +++ b/src/main/java/com/deem/zkui/vo/LeafBean.java @@ -17,11 +17,12 @@ */ package com.deem.zkui.vo; -import java.io.UnsupportedEncodingException; -import java.util.Arrays; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.UnsupportedEncodingException; +import java.util.Arrays; + public class LeafBean implements Comparable { private final static Logger logger = LoggerFactory.getLogger(LeafBean.class); @@ -29,6 +30,7 @@ public class LeafBean implements Comparable { private String name; private byte[] value; private String strValue; + private String description; public LeafBean(String path, String name, byte[] value) { super(); @@ -74,6 +76,14 @@ public void setStrValue(String strValue) { this.strValue = strValue; } + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + @Override public int compareTo(LeafBean o) { return (this.path + this.name).compareTo((o.path + o.name)); diff --git a/src/main/resources/webapp/css/zkacd.css b/src/main/resources/webapp/css/zkacd.css index 6175ee3..b4de941 100644 --- a/src/main/resources/webapp/css/zkacd.css +++ b/src/main/resources/webapp/css/zkacd.css @@ -27,6 +27,11 @@ body { max-height: 620px; } +.scroll-pane .tree-node{ + height: 20px; + white-space: nowrap; +} + .wrap-table{ table-layout: fixed; word-wrap: break-word; diff --git a/src/main/resources/webapp/js/home.js b/src/main/resources/webapp/js/home.js index 2edf755..2ce3754 100644 --- a/src/main/resources/webapp/js/home.js +++ b/src/main/resources/webapp/js/home.js @@ -29,6 +29,8 @@ $(document).ready(function() { $(".href-select").click(function() { var propName = $(this).text(); var propVal = $(this).attr('itemprop'); + var propDesc = $(this).attr('itemdesc'); + $("#newDescription").val(propDesc); $("#newProperty").attr('readonly', true); $("#newProperty").val(propName); $("#newValue").val(propVal); diff --git a/src/main/resources/webapp/template/home.ftl.html b/src/main/resources/webapp/template/home.ftl.html index 5af7fbe..92af99c 100644 --- a/src/main/resources/webapp/template/home.ftl.html +++ b/src/main/resources/webapp/template/home.ftl.html @@ -54,10 +54,11 @@ <..>
<#list nodeLst as node> - - - ${node} -
+
+ + + ${node} +
@@ -68,6 +69,9 @@ Name Value + <#if showDesc> + Description + @@ -78,13 +82,9 @@ <#if authRole?? && authRole == 'ADMIN' > - <#if leaf.value??> - ${leaf.name} - <#else> - ${leaf.name} - + ${leaf.name} <#else> - ${leaf.name} + ${leaf.name} <#if navigate?? && navigate == 'true'> @@ -96,7 +96,9 @@ - + <#if showDesc> + ${leaf.description} + @@ -175,6 +177,13 @@ Value + <#if showDesc> +
+
+ Description + +
+