zkCli自动补全

ZooKeeper压缩包中提供了bin/zkCli.sh,可以连接ZooKeeper进行操作,比较方便的是,无论是对命令还是路径zkCli都能够进行自动补全。说到自动补全的库,在tairclient甘大神使用GNU Readline实现了命令补全和历史命令记录。

原理

zkCli中使用的自动补全的库是JLineJLine官网描述中有这样一句话:

JLine is a Java library for handling console input. It is similar in functionality to BSD editline and GNU readline.

zkCli中对应的代码在src/java/main/org/apache/zookeeper/JLineZNodeCompletor.java中,可以看到这个类实现了JLinejline.Completor这个接口。

jline.Completor这个接口中只定义了一个方法:

1
int complete(String var1, int var2, List var3);

实现类JLineZNodeCompletor中,对应的方法实现为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public int complete(String buffer, int cursor, List candidates) {
// Guarantee that the final token is the one we're expanding
buffer = buffer.substring(0,cursor);
String token = "";
if (!buffer.endsWith(" ")) {
String[] tokens = buffer.split(" ");
if (tokens.length != 0) {
token = tokens[tokens.length-1] ;
}
}
if (token.startsWith("/")){
return completeZNode( buffer, token, candidates);
}
return completeCommand(buffer, token, candidates);
}

可以看到,如果需要补全的内容是以/开头,就补全为ZNode的路径;否则,就补全为zkCli的命令。

补全ZNode的路径的时候,zkCli直接调用getChildren方法获取对应ZNode的子节点,然后用String.startsWith去过滤。

参考