case ROLL: {
List<CommonTree> rollArgs = (List<CommonTree>) t.getChildren();
try {
Preconditions.checkArgument(rollArgs.size() >= 2, "bad parse tree! "
+ t.toStringTree() + "roll requires at least two arguments");
SinkBuilder rollBuilder = RollSink.builder();
Context ctx = new Context(context); // new scope
List<Object> args = new ArrayList<Object>();
// first is the sub sink spec
CommonTree ctbody = rollArgs.get(0);
String body= FlumeSpecGen.genEventSink(ctbody);
args.add(body);
// all others are args
for (int i =1; i< rollArgs.size(); i++) {
CommonTree tr = rollArgs.get(i);
Object arg = buildSimpleArg(tr);
if (arg != null) {
args.add(arg);
} else {
Pair<String, CommonTree> kwarg = buildKWArg(tr);
ctx.putObj(kwarg.getLeft(), buildSimpleArg(kwarg.getRight()));
}
}
return rollBuilder.create(ctx, args.toArray());
} catch (IllegalArgumentException iae) {
throw new FlumeSpecException(iae.getMessage());
}
}
case GEN: {
List<CommonTree> collArgs = (List<CommonTree>) t.getChildren();
try {
Preconditions.checkArgument(collArgs.size() >= 2, "bad parse tree! "
+ t.toStringTree() + " generator takes at least 2 arguments");
String genType = collArgs.get(0).getText();
if (!"collector".equals(genType)) {
throw new FlumeSpecException(
"currently only handle 'collector' gen sinks");
}
CommonTree ctbody = collArgs.remove(1); // remove subsink.
String body = FlumeSpecGen.genEventSink(ctbody);
Context ctx = new Context(context);
Pair<String, List<Object>> idArgs = handleArgs(t, ctx);
String sourceType = idArgs.getLeft();
List<Object> args = idArgs.getRight();
args.add(0, body);
// TODO replace with Generator Sink lookup
Preconditions.checkArgument("collector".equals(sourceType));
SinkBuilder builder = CollectorSink.builder();
return builder.create(ctx, args.toArray());
} catch (IllegalArgumentException iae) {
throw new FlumeSpecException(iae.getMessage());
}