11
11
import org .apache .curator .framework .recipes .cache .TreeCacheListener ;
12
12
import org .apache .zookeeper .data .Stat ;
13
13
14
+ import java .io .IOException ;
14
15
import java .util .Map ;
15
16
import java .util .concurrent .ConcurrentHashMap ;
16
17
import java .util .concurrent .atomic .AtomicInteger ;
@@ -86,6 +87,7 @@ private void initialize() {
86
87
initTreeItemListener ();
87
88
// create virtual root item
88
89
initVirtualRoot ("/" );
90
+ zkNodeTreeView .setCellFactory (view -> new TreeCellImpl ());
89
91
}
90
92
91
93
public void viewInit (CuratorFramework client ) {
@@ -112,6 +114,8 @@ private void initTreeItemListener() {
112
114
private void initVirtualRoot (String root ) {
113
115
final ZkNode zkNode = new ZkNode (root , root );
114
116
TreeItem <ZkNode > virtualRoot = new TreeItem <>(zkNode );
117
+ zkNode .setData ("" );
118
+ zkNode .setStat (new Stat ());
115
119
treeItemMap .put (root , virtualRoot );
116
120
zkNodeTreeView .setRoot (virtualRoot );
117
121
}
@@ -194,18 +198,35 @@ private void onNodeAdded(CuratorFramework client, TreeCacheEvent event) {
194
198
}
195
199
196
200
private void showStat (Stat stat ) {
197
- this .ctimeLabel .setText (String .valueOf (stat .getCtime ()));
198
- this .mtimeLabel .setText (String .valueOf (stat .getMtime ()));
199
-
200
- this .numChildrenLabel .setText (String .valueOf (stat .getNumChildren ()));
201
- this .aclVersionLabel .setText (String .valueOf (stat .getAversion ()));
202
- this .cversionLabel .setText (String .valueOf (stat .getCversion ()));
203
- this .cZxidLabel .setText (String .valueOf (stat .getCzxid ()));
204
- this .mZxidLabel .setText (String .valueOf (stat .getMzxid ()));
205
- this .pZxidLabel .setText (String .valueOf (stat .getPzxid ()));
206
- this .dataLengthLabel .setText (String .valueOf (stat .getDataLength ()));
207
- this .dataVersionLabel .setText (String .valueOf (stat .getVersion ()));
208
- this .ephemeralOwnerLabel .setText (String .valueOf (stat .getEphemeralOwner ()));
201
+ if (stat == null ) {
202
+ setDefaultValue ();
203
+ } else {
204
+ this .ctimeLabel .setText (String .valueOf (stat .getCtime ()));
205
+ this .mtimeLabel .setText (String .valueOf (stat .getMtime ()));
206
+ this .numChildrenLabel .setText (String .valueOf (stat .getNumChildren ()));
207
+ this .aclVersionLabel .setText (String .valueOf (stat .getAversion ()));
208
+ this .cversionLabel .setText (String .valueOf (stat .getCversion ()));
209
+ this .cZxidLabel .setText (String .valueOf (stat .getCzxid ()));
210
+ this .mZxidLabel .setText (String .valueOf (stat .getMzxid ()));
211
+ this .pZxidLabel .setText (String .valueOf (stat .getPzxid ()));
212
+ this .dataLengthLabel .setText (String .valueOf (stat .getDataLength ()));
213
+ this .dataVersionLabel .setText (String .valueOf (stat .getVersion ()));
214
+ this .ephemeralOwnerLabel .setText (String .valueOf (stat .getEphemeralOwner ()));
215
+ }
216
+ }
217
+
218
+ private void setDefaultValue () {
219
+ this .ctimeLabel .setText ("" );
220
+ this .mtimeLabel .setText ("" );
221
+ this .numChildrenLabel .setText ("" );
222
+ this .aclVersionLabel .setText ("" );
223
+ this .cversionLabel .setText ("" );
224
+ this .cZxidLabel .setText ("" );
225
+ this .mZxidLabel .setText ("" );
226
+ this .pZxidLabel .setText ("" );
227
+ this .dataLengthLabel .setText ("" );
228
+ this .dataVersionLabel .setText ("" );
229
+ this .ephemeralOwnerLabel .setText ("" );
209
230
}
210
231
211
232
private void showData (String data ) {
@@ -220,4 +241,70 @@ private void updateDataAction() {
220
241
throw new IllegalStateException (e );
221
242
}
222
243
}
244
+
245
+ final class TreeCellImpl extends TreeCell <ZkNode > {
246
+
247
+ private ContextMenu operationMenus ;
248
+
249
+ private final MenuItem deleteMenu ;
250
+
251
+ private final MenuItem addMenu ;
252
+
253
+
254
+ TreeCellImpl () {
255
+ deleteMenu = new MenuItem ("Delete" );
256
+ deleteMenu .setOnAction (event -> {
257
+ try {
258
+ curatorFramework .delete ().forPath (getTreeItem ().getValue ().getPath ());
259
+ } catch (Exception e ) {
260
+ throw new IllegalStateException (e );
261
+ }
262
+ });
263
+
264
+ // TODO @vran add action
265
+ addMenu = new MenuItem ("Add" );
266
+ addMenu .setOnAction (event -> {
267
+ try {
268
+ AddNodeViewController .initController (getTreeItem ().getValue ().getPath (), curatorFramework );
269
+ } catch (IOException e ) {
270
+ throw new IllegalStateException (e );
271
+ }
272
+ });
273
+ operationMenus = new ContextMenu ();
274
+ }
275
+
276
+ @ Override
277
+ protected void updateItem (ZkNode item , boolean empty ) {
278
+ super .updateItem (item , empty );
279
+ if (empty || item == null ) {
280
+ setText (null );
281
+ setGraphic (null );
282
+ } else {
283
+ setText (item .getName ());
284
+ final TreeItem <ZkNode > treeItem = getTreeItem ();
285
+ setGraphic (treeItem .getGraphic ());
286
+ setContextMenu (operationMenus );
287
+
288
+ if (item .getStat () != null && item .getStat ().getEphemeralOwner () == 0 ) {
289
+ addIfAbsent (addMenu );
290
+ } else {
291
+ operationMenus .getItems ().remove (addMenu );
292
+ }
293
+
294
+ // add delete menu for leaf node
295
+ if (treeItem .isLeaf () && treeItem .getParent () != null ) {
296
+ addIfAbsent (deleteMenu );
297
+ } else {
298
+ operationMenus .getItems ().remove (deleteMenu );
299
+ }
300
+
301
+ }
302
+ }
303
+
304
+ private void addIfAbsent (MenuItem menuItem ) {
305
+ if (!operationMenus .getItems ().contains (menuItem )) {
306
+ operationMenus .getItems ().add (menuItem );
307
+ }
308
+ }
309
+ }
223
310
}
0 commit comments