@Override
public ProgramController run(Program program, ProgramOptions options) {
try {
// Extract and verify parameters
ApplicationSpecification appSpec = program.getSpecification();
Preconditions.checkNotNull(appSpec, "Missing application specification.");
ProgramType processorType = program.getType();
Preconditions.checkNotNull(processorType, "Missing processor type.");
Preconditions.checkArgument(processorType == ProgramType.PROCEDURE, "Only PROCEDURE process type is supported.");
ProcedureSpecification procedureSpec = appSpec.getProcedures().get(program.getName());
Preconditions.checkNotNull(procedureSpec, "Missing ProcedureSpecification for %s", program.getName());
int instanceId = Integer.parseInt(options.getArguments().getOption(ProgramOptionConstants.INSTANCE_ID, "0"));
int instanceCount = appSpec.getProcedures().get(program.getName()).getInstances();
Preconditions.checkArgument(instanceCount > 0, "Invalid or missing instance count");
RunId runId = RunIds.generate();
BasicProcedureContextFactory contextFactory = createContextFactory(program, runId, instanceId, instanceCount,