2

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

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

这应该只是将给定的查询转发到密码执行引擎。因此,一个示例调用:

osgi>cphr <query>

像这样传递给引擎:

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

CommandProvider-Interface 针对基于令牌的访问进行了优化,因此它的实现将其拆分为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

4

1 回答 1

1

不幸的是,没有办法(一次)从CommandInterpreter. 但我还是会走另一条路。

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

  1. 在命令实现(此处_cphr)中,我会强制要求只有一个参数。
  2. 如果参数(查询)包含空格 - 它通常有,那么这个参数本身必须被引用:> cphr "start n=node(*) where n.pathTime='2013-11-05-10-36-7' return n"
于 2013-11-05T12:48:04.377 回答