/*
* 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.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.guvnor.ala.config.BuildConfig;
import org.guvnor.ala.config.Config;
import org.guvnor.ala.pipeline.BiFunctionConfigExecutor;
import org.uberfire.backend.vfs.Path;
import org.uberfire.backend.vfs.PathFactory;
import org.uberfire.workbench.events.ResourceChange;
import org.uberfire.workbench.events.ResourceChangeType;
/**
* Executor for a LocalBuildConfig configuration.
*/
@ApplicationScoped
public class LocalBuildConfigExecutor
implements BiFunctionConfigExecutor< LocalProject, LocalBuildConfig, BuildConfig > {
public LocalBuildConfigExecutor( ) {
//Empty constructor for Weld proxying
}
/**
* This executor mainly translates the local project configuration and the build configuration parameters provided
* by the pipeline input into an internal format convenient for building the project in the local build system.
*
* @param localProject the internal representation of the project in the local build system.
*
* @param localBuildConfig the build configuration.
*
* @return the internal build configuration for building the project in the local build system.
*/
@Override
public Optional< BuildConfig > apply( LocalProject localProject, LocalBuildConfig localBuildConfig ) {
Optional< BuildConfig > result = Optional.empty( );
LocalBuildConfig.BuildType buildType = decodeBuildType( localBuildConfig.getBuildType( ) );
switch ( buildType ) {
case FULL_BUILD:
result = Optional.of( new LocalBuildConfigInternal( localProject.getProject( ) ) );
break;
case INCREMENTAL_ADD_RESOURCE:
case INCREMENTAL_DELETE_RESOURCE:
case INCREMENTAL_UPDATE_RESOURCE:
result = Optional.of( new LocalBuildConfigInternal( localProject.getProject( ), buildType,
decodePath( localBuildConfig.getResource( ) ) ) );
break;
case INCREMENTAL_BATCH_CHANGES:
result = Optional.of( new LocalBuildConfigInternal( localProject.getProject( ),
getResourceChanges( localBuildConfig.getResourceChanges( ) ) ) );
break;
case FULL_BUILD_AND_DEPLOY:
result = Optional.of( new LocalBuildConfigInternal( localProject.getProject( ),
decodeDeploymentType( localBuildConfig.getDeploymentType( ) ),
decodeSuppressHandlers( localBuildConfig.getSuppressHandlers( ) ) ) );
}
return result;
}
@Override
public Class< ? extends Config > executeFor( ) {
return LocalBuildConfig.class;
}
@Override
public String outputId( ) {
return "local-build";
}
private LocalBuildConfig.BuildType decodeBuildType( String value ) {
return LocalBuildConfig.BuildType.valueOf( value );
}
private Map< Path, Collection< ResourceChange > > getResourceChanges( Map< String, String > input ) {
Map< Path, Collection< ResourceChange > > resourceChanges = new HashMap<>( );
input.entrySet( )
.stream( )
.filter( entry -> entry.getKey( ).startsWith( LocalBuildConfig.RESOURCE_CHANGE ) )
.forEach( entry -> {
resourceChanges.put( decodePath( entry.getKey( ), LocalBuildConfig.RESOURCE_CHANGE ), decodeChanges( entry.getValue( ) ) );
} );
return resourceChanges;
}
private Collection< ResourceChange > decodeChanges( String value ) {
return Arrays.stream( value.split( "," ) )
.map( s -> new ResourceChange( ) {
@Override
public ResourceChangeType getType( ) {
return ResourceChangeType.valueOf( s.trim( ) );
}
@Override
public String getMessage( ) {
return null;
}
} )
.collect( Collectors.toList( ) );
}
private Path decodePath( String uri ) {
return decodePath( uri, "" );
}
private Path decodePath( String uri, String prefix ) {
final String name = uri.substring( uri.lastIndexOf( '/' ) + 1, uri.length( ) );
final String decodedURI = uri.substring( prefix.length( ), uri.length( ) );
return PathFactory.newPath( name, decodedURI );
}
private LocalBuildConfig.DeploymentType decodeDeploymentType( String value ) {
return LocalBuildConfig.DeploymentType.valueOf( value );
}
private boolean decodeSuppressHandlers( String suppressHandlers ) {
return Boolean.parseBoolean( suppressHandlers );
}
}