package org.krakenapps.logdb.query.parser;
import static org.krakenapps.bnf.Syntax.*;
import java.util.ArrayList;
import java.util.List;
import org.krakenapps.bnf.Binding;
import org.krakenapps.bnf.Syntax;
import org.krakenapps.logdb.LogScript;
import org.krakenapps.logdb.LogScriptRegistry;
import org.krakenapps.logdb.LogQueryParser;
import org.krakenapps.logdb.query.StringPlaceholder;
import org.krakenapps.logdb.query.command.Script;
import org.osgi.framework.BundleContext;
public class ScriptParser implements LogQueryParser {
private BundleContext bc;
private LogScriptRegistry scriptRegistry;
public ScriptParser(BundleContext bc, LogScriptRegistry scriptRegistry) {
this.bc = bc;
this.scriptRegistry = scriptRegistry;
}
@Override
public void addSyntax(Syntax syntax) {
syntax.add("script", this, k("script "), new StringPlaceholder(), repeat(rule(new StringPlaceholder())));
syntax.addRoot("script");
}
@Override
public Object parse(Binding b) {
String name = (String) b.getChildren()[1].getValue();
LogScript script = scriptRegistry.newScript("localhost", name, null);
if (script == null)
throw new IllegalArgumentException("log script not found: " + name);
// TODO: parameter passing
script.init(null);
List<String> args = new ArrayList<String>();
if (b.getChildren().length >= 3)
parseArgs(args, b.getChildren()[2]);
return new Script(bc, script, args.toArray(new String[0]));
}
private void parseArgs(List<String> args, Binding b) {
if (b.getValue() != null)
args.add((String) b.getValue());
else {
if (b.getChildren() != null) {
for (Binding c : b.getChildren())
parseArgs(args, c);
}
}
}
}