在自定义CommandProvider中获取完整/未转义/未分裂的命令字符串

时间:2013-11-05 11:32:09

标签: java osgi

我编写了一个自定义CommandProvider来实现命令(cphr):

public void _cphr(CommandInterpreter ci){
/* ... *
}

应该只是将给定的查询转发给cypher执行引擎。所以,一个示例调用:

osgi>cphr <query>
传递给像这样的引擎:

ExecutionEngine eng = new ExecutionEngine(...);
ExecutionResult er = eng.execute(query);

CommandProvider - 接口针对基于令牌的访问进行了优化,因此它的实现将query拆分为令牌,我可以通过它来迭代ci.nextArgument()

这是有问题的,因为单引号例如被剥离并且必须被显式转义才能被保留。所以,一个有效的查询:

cphr start n=node(*) where n.pathTime='2013-11-05-10-36-7' return n

导致语法错误:

Invalid input '5': expected '.', whitespace, '[', node labels, "=~", IN, IS, '*', '/', '%', '^', '+', '-', '<', '>', "<=", ">=", '=', "<>", "!=", AND, XOR, OR, START, MATCH, MERGE, CREATE, SET, DELETE, REMOVE, FOREACH, WITH, RETURN, UNION, ';' or end of input (line 1, column 44) " start n=node(*) where n.pathTime=2013-11-05-10-36-7 return n"

然而,转义查询有效:

cphr start n=node(*) where n.pathTime=\'2013-11-05-10-36-7\' return n

有没有办法按用户在CommandProvider实现中提供的方式访问命令行?

1 个答案:

答案 0 :(得分:1)

不幸的是,没有办法从CommandInterpreter获得所有参数(一次性)。但我会采取另一种方式。

您正在为命令提供查询。此查询是命令的一个(!)参数。所以我会做两件事:

  1. 在命令实现(这里是_cphr)中,我会强制执行,只有一个参数。
  2. 如果参数(查询)包含空格(通常具有空格),则必须引用此参数本身:> cphr "start n=node(*) where n.pathTime='2013-11-05-10-36-7' return n"