/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.workbench.common.services.backend.builder.ala;
import java.util.ArrayList;
import java.util.Collection;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Named;
import org.guvnor.ala.config.BinaryConfig;
import org.guvnor.ala.config.BuildConfig;
import org.guvnor.ala.config.ProjectConfig;
import org.guvnor.ala.config.SourceConfig;
import org.guvnor.ala.pipeline.ConfigExecutor;
import org.guvnor.ala.pipeline.Input;
import org.guvnor.ala.pipeline.Pipeline;
import org.guvnor.ala.pipeline.PipelineFactory;
import org.guvnor.ala.pipeline.Stage;
import org.guvnor.ala.pipeline.execution.PipelineExecutor;
import org.guvnor.ala.registry.PipelineRegistry;
import org.kie.workbench.common.services.backend.builder.ala.impl.LocalBuildConfigImpl;
import org.uberfire.commons.services.cdi.Startup;
import org.uberfire.commons.services.cdi.StartupType;
import static org.guvnor.ala.pipeline.StageUtil.*;
/**
* This class is responsible for the build pipeline initialization at system startup. Additionally it provides access
* to a pipeline executor for interested parties on having raw access to the build pipeline execution.
*/
@ApplicationScoped
@Startup( StartupType.BOOTSTRAP )
public class BuildPipelineInitializer {
public static final String LOCAL_BUILD_PIPELINE = "local-build-pipeline";
private PipelineRegistry pipelineRegistry;
private Instance< ConfigExecutor > configExecutors;
private PipelineExecutor executor;
public BuildPipelineInitializer( ) {
//Empty constructor for Weld proxying
}
@Inject
public BuildPipelineInitializer( final PipelineRegistry pipelineRegistry,
final Instance< ConfigExecutor > configExecutors ) {
this.pipelineRegistry = pipelineRegistry;
this.configExecutors = configExecutors;
}
/**
* Intended mainly for testing
*/
public BuildPipelineInitializer( PipelineRegistry pipelineRegistry,
Collection< ConfigExecutor > configs ) {
this.pipelineRegistry = pipelineRegistry;
initLocalBuildPipeline();
initExecutor( configs );
}
/**
* @return A pipeline executor for executing the initialized pipelines.
*/
@Produces
@Named("buildPipelineExecutor")
public PipelineExecutor getExecutor( ) {
return executor;
}
@PostConstruct
private void init( ) {
initLocalBuildPipeline( );
initExecutor( );
}
/**
* Initializes a build pipeline based on local structures and optimizations required by the workbench.
*/
private void initLocalBuildPipeline( ) {
final Stage< Input, SourceConfig > sourceConfigStage = config( "Local Source Config",
( s ) -> new LocalSourceConfig( ) { } );
final Stage< SourceConfig, ProjectConfig > projectConfigStage = config( "Local Project Config",
( s ) -> new LocalProjectConfig( ) { } );
final Stage< ProjectConfig, BuildConfig > localBuildConfigStage = config( "Local Build Config",
( s ) -> new LocalBuildConfigImpl( ) );
final Stage< BuildConfig, BinaryConfig > localBuildExecStage = config( "Local Build Exec",
( s ) -> new LocalBuildExecConfig( ) { } );
final Pipeline localBuildPipeline = PipelineFactory
.startFrom( sourceConfigStage )
.andThen( projectConfigStage )
.andThen( localBuildConfigStage )
.andThen( localBuildExecStage )
.buildAs( LOCAL_BUILD_PIPELINE );
pipelineRegistry.registerPipeline( localBuildPipeline );
}
private void initExecutor( ) {
final Collection< ConfigExecutor > configs = new ArrayList<>( );
configExecutors.iterator( ).forEachRemaining( configs::add );
initExecutor( configs );
}
private void initExecutor( final Collection< ConfigExecutor > configs ) {
executor = new PipelineExecutor( configs );
}
}