@Override
public synchronized RuntimeInfo run(Program program, ProgramOptions options) {
ProgramRunner runner = programRunnerFactory.create(ProgramRunnerFactory.Type.valueOf(program.getType().name()));
Preconditions.checkNotNull(runner, "Fail to get ProgramRunner for type " + program.getType());
final SimpleRuntimeInfo runtimeInfo = new SimpleRuntimeInfo(runner.run(program, options), program);
addRemover(runtimeInfo);
runtimeInfos.put(runtimeInfo.getType(), runtimeInfo.getController().getRunId(), runtimeInfo);
return runtimeInfo;
}