protected BuildOperationExecutor createBuildOperationExecutor(
     ListenerManager listenerManager,
     TimeProvider timeProvider,
     ProgressLoggerFactory progressLoggerFactory) {
   return new DefaultBuildOperationExecutor(
       listenerManager.getBroadcaster(InternalBuildListener.class),
       timeProvider,
       progressLoggerFactory);
 }
 protected ScriptCompilerFactory createScriptCompileFactory(
     ListenerManager listenerManager,
     FileCacheBackedScriptClassCompiler scriptCompiler,
     CrossBuildInMemoryCachingScriptClassCache cache) {
   ScriptExecutionListener scriptExecutionListener =
       listenerManager.getBroadcaster(ScriptExecutionListener.class);
   return new DefaultScriptCompilerFactory(
       new BuildScopeInMemoryCachingScriptClassCompiler(cache, scriptCompiler),
       new DefaultScriptRunnerFactory(scriptExecutionListener, DirectInstantiator.INSTANCE));
 }
  TaskExecuter createTaskExecuter(
      TaskArtifactStateRepository repository, ListenerManager listenerManager, Gradle gradle) {
    // TODO - need a more comprehensible way to only collect inputs for the outer build
    //      - we are trying to ignore buildSrc here, but also avoid weirdness with use of
    // GradleBuild tasks
    boolean isOuterBuild = gradle.getParent() == null;
    TaskInputsListener taskInputsListener =
        isOuterBuild
            ? listenerManager.getBroadcaster(TaskInputsListener.class)
            : TaskInputsListener.NOOP;

    return new ExecuteAtMostOnceTaskExecuter(
        new SkipOnlyIfTaskExecuter(
            new SkipTaskWithNoActionsExecuter(
                new SkipEmptySourceFilesTaskExecuter(
                    taskInputsListener,
                    new ValidatingTaskExecuter(
                        new SkipUpToDateTaskExecuter(
                            repository,
                            new PostExecutionAnalysisTaskExecuter(
                                new ExecuteActionsTaskExecuter(
                                    listenerManager.getBroadcaster(
                                        TaskActionListener.class)))))))));
  }
 protected TaskExecutionStatisticsEventAdapter createTaskExecutionStatisticsEventAdapter(
     ListenerManager listenerManager) {
   return new TaskExecutionStatisticsEventAdapter(
       listenerManager.getBroadcaster(TaskExecutionStatisticsListener.class));
 }
 protected ListenerManager createListenerManager(ListenerManager listenerManager) {
   return listenerManager.createChild();
 }