public static JobLauncherExecutionDriver create(Configurable sysConfig, JobSpec jobSpec,
Optional<JobLauncherFactory.JobLauncherType> jobLauncherType,
Optional<Logger> log, boolean instrumentationEnabled,
JobExecutionLauncher.StandardMetrics launcherMetrics, SharedResourcesBroker<GobblinScopeTypes> instanceBroker) {
Logger actualLog = log.isPresent() ? log.get() : LoggerFactory.getLogger(JobLauncherExecutionDriver.class);
JobExecutionStateListeners callbackDispatcher = new JobExecutionStateListeners(actualLog);
JobExecutionUpdatable jobExec = JobExecutionUpdatable.createFromJobSpec(jobSpec);
JobExecutionState jobState = new JobExecutionState(jobSpec, jobExec,
Optional.<JobExecutionStateListener>of(callbackDispatcher));
JobLauncher jobLauncher = createLauncher(sysConfig, jobSpec, actualLog, jobLauncherType.isPresent() ?
Optional.of(jobLauncherType.get().toString()) :
Optional.<String>absent(), instanceBroker);
JobListenerToJobStateBridge bridge = new JobListenerToJobStateBridge(actualLog, jobState, instrumentationEnabled, launcherMetrics);
DriverRunnable runnable = new DriverRunnable(jobLauncher, bridge, jobState, callbackDispatcher, jobExec);
return new JobLauncherExecutionDriver(jobSpec, actualLog, runnable);
}