77import lombok .Getter ;
88import lombok .Setter ;
99import lombok .extern .slf4j .Slf4j ;
10+ import org .I0Itec .zkclient .IZkChildListener ;
11+ import org .I0Itec .zkclient .IZkDataListener ;
1012import org .I0Itec .zkclient .ZkClient ;
1113import org .I0Itec .zkclient .exception .ZkMarshallingError ;
1214import org .I0Itec .zkclient .serialize .ZkSerializer ;
1719import org .apache .zookeeper .data .Stat ;
1820
1921import java .io .UnsupportedEncodingException ;
22+ import java .util .HashMap ;
2023import java .util .LinkedHashMap ;
2124import java .util .List ;
2225import java .util .Map ;
@@ -36,6 +39,9 @@ public class ZookeeperToolService {
3639
3740 ZkClient zkClient = null ;
3841
42+ private Map <String , IZkChildListener > childListeners = new HashMap <>();
43+ private Map <String , IZkDataListener > dataListeners = new HashMap <>();
44+
3945 public ZookeeperToolService (ZookeeperToolController zookeeperToolController ) {
4046 this .zookeeperToolController = zookeeperToolController ;
4147 }
@@ -92,7 +98,7 @@ private String getNodePath(TreeItem<String> selectedItem) {
9298 public void nodeSelectionChanged (TreeItem <String > selectedItem ) {
9399 String nodePath = this .getNodePath (selectedItem );
94100 if (!zkClient .exists (nodePath )) {
95- TooltipUtil .showToast ("结点不存在 " );
101+ TooltipUtil .showToast ("节点不存在 " );
96102 return ;
97103 }
98104 zookeeperToolController .getNodeDataValueTextArea ().setText (zkClient .readData (nodePath ));
@@ -155,50 +161,113 @@ public void refreshOnAction() {
155161 public void deleteNodeOnAction () {
156162 TreeItem <String > selectedItem = zookeeperToolController .getNodeTreeView ().getSelectionModel ().getSelectedItem ();
157163 if (selectedItem == null ) {
158- TooltipUtil .showToast ("未选中结点 " );
164+ TooltipUtil .showToast ("未选中节点 " );
159165 return ;
160166 }
161167 String nodePath = this .getNodePath (selectedItem );
162- if (selectedItem .getChildren ().size () > 0 ) {
163- zkClient .deleteRecursive (nodePath );
164- }
165- zkClient .delete (nodePath );
168+ zkClient .deleteRecursive (nodePath );
166169 selectedItem .getParent ().getChildren ().remove (selectedItem );
167170 }
168171
169172 public void addNodeOnAction () {
170173 TreeItem <String > selectedItem = zookeeperToolController .getNodeTreeView ().getSelectionModel ().getSelectedItem ();
171174 if (selectedItem == null ) {
172- TooltipUtil .showToast ("未选中结点" );
175+ TooltipUtil .showToast ("未选中节点" );
176+ return ;
177+ }
178+ String nodeName = AlertUtil .showInputAlert ("请输入节点名称:" );
179+ if (StringUtils .isEmpty (nodeName )) {
180+ TooltipUtil .showToast ("节点名不能为空!" );
173181 return ;
174182 }
175- String nodeName = AlertUtil .showInputAlert ("请输入结点名称:" );
176183 String nodePath = this .getNodePath (selectedItem );
177184 zkClient .createPersistent (StringUtils .appendIfMissing (nodePath , "/" , "/" ) + nodeName );
178185 TreeItem <String > treeItem2 = new TreeItem <>(nodeName );
179186 selectedItem .getChildren ().add (treeItem2 );
180187 }
181188
182- public void renameNodeOnAction () {
189+ public void renameNodeOnAction (boolean isCopy ) {
183190 TreeItem <String > selectedItem = zookeeperToolController .getNodeTreeView ().getSelectionModel ().getSelectedItem ();
184191 if (selectedItem == null ) {
185- TooltipUtil .showToast ("未选中结点 " );
192+ TooltipUtil .showToast ("未选中节点 " );
186193 return ;
187194 }
188- String nodeName = AlertUtil .showInputAlert ("请输入结点新名称:" );
189- String nodePath = this .getNodePath (selectedItem );
190- zkClient .createPersistent (StringUtils .appendIfMissing (nodePath , "/" , "/" ) + nodeName );
191- TreeItem <String > treeItem2 = new TreeItem <>(nodeName );
192- selectedItem .getChildren ().add (treeItem2 );
195+ String nodeName = AlertUtil .showInputAlert ("请输入节点新名称:" );
196+ if (StringUtils .isEmpty (nodeName )) {
197+ TooltipUtil .showToast ("节点名不能为空!" );
198+ return ;
199+ }
200+ // String nodePath = this.getNodePath(selectedItem);
201+ String nodeParent = this .getNodePath (selectedItem .getParent ());
202+ String nodeParentPath = StringUtils .appendIfMissing (nodeParent , "/" , "/" );
203+ copyNode (nodeParentPath + selectedItem .getValue (), nodeParentPath + nodeName );
204+ if (isCopy ) {
205+ TreeItem <String > selectedItem2 = new TreeItem <>(nodeName );
206+ addNodeTree (nodeParentPath + nodeName , selectedItem2 );
207+ selectedItem .getParent ().getChildren ().add (selectedItem2 );
208+ } else {
209+ zkClient .deleteRecursive (nodeParentPath + selectedItem .getValue ());
210+ selectedItem .setValue (nodeName );
211+ }
212+ }
213+
214+ private void copyNode (String path , String copyPath ) {
215+ zkClient .createPersistent (copyPath , zkClient .readData (path ), zkClient .getAcl (path ).getKey ());
216+ List <String > list = zkClient .getChildren (path );
217+ for (String name : list ) {
218+ copyNode (StringUtils .appendIfMissing (path , "/" , "/" ) + name , StringUtils .appendIfMissing (copyPath , "/" , "/" ) + name );
219+ }
193220 }
194221
195222 public void nodeDataSaveOnAction () {
196223 TreeItem <String > selectedItem = zookeeperToolController .getNodeTreeView ().getSelectionModel ().getSelectedItem ();
197224 if (selectedItem == null ) {
198- TooltipUtil .showToast ("未选中结点 " );
225+ TooltipUtil .showToast ("未选中节点 " );
199226 return ;
200227 }
201228 String nodePath = this .getNodePath (selectedItem );
202229 zkClient .writeData (nodePath , zookeeperToolController .getNodeDataValueTextArea ().getText ());
203230 }
231+
232+ public void addNodeNotify () {//添加节点通知
233+ TreeItem <String > selectedItem = zookeeperToolController .getNodeTreeView ().getSelectionModel ().getSelectedItem ();
234+ if (selectedItem == null ) {
235+ TooltipUtil .showToast ("未选中节点" );
236+ return ;
237+ }
238+ String nodePath = this .getNodePath (selectedItem );
239+ if (childListeners .containsKey (nodePath )) {
240+ TooltipUtil .showToast ("该节点已经添加通知!" );
241+ return ;
242+ }
243+ IZkChildListener childListener = (parentPath , currentChilds ) -> TooltipUtil .showToast ("节点Child改变了" , "Path:" + parentPath + "\r \n 子节点:" + currentChilds .toString ());
244+ zkClient .subscribeChildChanges (nodePath , childListener );
245+ childListeners .put (nodePath , childListener );
246+ IZkDataListener dataListener = new IZkDataListener () {
247+ @ Override
248+ public void handleDataChange (String dataPath , Object data ) throws Exception {
249+ TooltipUtil .showToast ("节点Data改变了" , "Path:" + dataPath + "\r \n 新数据:" + data .toString ());
250+ }
251+
252+ @ Override
253+ public void handleDataDeleted (String dataPath ) throws Exception {
254+ TooltipUtil .showToast ("节点删除了" , "Path:" + dataPath );
255+ }
256+ };
257+ zkClient .subscribeDataChanges (nodePath , dataListener );
258+ dataListeners .put (nodePath , dataListener );
259+ TooltipUtil .showToast ("该节点添加通知成功!" );
260+ }
261+
262+ public void removeNodeNotify () {//移除节点通知
263+ TreeItem <String > selectedItem = zookeeperToolController .getNodeTreeView ().getSelectionModel ().getSelectedItem ();
264+ if (selectedItem == null ) {
265+ TooltipUtil .showToast ("未选中节点" );
266+ return ;
267+ }
268+ String nodePath = this .getNodePath (selectedItem );
269+ zkClient .unsubscribeChildChanges (nodePath , childListeners .remove (nodePath ));
270+ zkClient .unsubscribeDataChanges (nodePath , dataListeners .remove (nodePath ));
271+ TooltipUtil .showToast ("该节点通知成功移除!" );
272+ }
204273}
0 commit comments