blob: a1d366cb28c0512c3ceca53ddd33044577c1cd39 [file] [log] [blame]
package org.apache.maven.execution;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toSet;
/**
* Container for storing the request from the user to activate or deactivate certain projects and optionally fail the
* build if those projects do not exist.
*/
public class ProjectActivation
{
private static class ProjectActivationSettings
{
/**
* The selector of a project. This can be the project directory, [groupId]:[artifactId] or :[artifactId].
*/
final String selector;
/**
* This describes how/when to active or deactivate the project.
*/
final ActivationSettings activationSettings;
ProjectActivationSettings( String selector, ActivationSettings activationSettings )
{
this.selector = selector;
this.activationSettings = activationSettings;
}
}
/**
* List of activated and deactivated projects.
*/
private final List<ProjectActivationSettings> activations = new ArrayList<>();
/**
* Adds a project activation to the request.
* @param selector The selector of the project.
* @param active Should the project be activated?
* @param optional Can the build continue if the project does not exist?
*/
public void addProjectActivation( String selector, boolean active, boolean optional )
{
final ActivationSettings settings = ActivationSettings.of( active, optional );
this.activations.add( new ProjectActivationSettings( selector, settings ) );
}
private Stream<ProjectActivationSettings> getProjects( final Predicate<ActivationSettings> predicate )
{
return this.activations.stream()
.filter( activation -> predicate.test( activation.activationSettings ) );
}
private Set<String> getProjectSelectors( final Predicate<ActivationSettings> predicate )
{
return getProjects( predicate )
.map( activation -> activation.selector )
.collect( toSet() );
}
/**
* @return Required active project selectors, never {@code null}.
*/
public Set<String> getRequiredActiveProjectSelectors()
{
return getProjectSelectors( pa -> !pa.optional && pa.active );
}
/**
* @return Optional active project selectors, never {@code null}.
*/
public Set<String> getOptionalActiveProjectSelectors()
{
return getProjectSelectors( pa -> pa.optional && pa.active );
}
/**
* @return Required inactive project selectors, never {@code null}.
*/
public Set<String> getRequiredInactiveProjectSelectors()
{
return getProjectSelectors( pa -> !pa.optional && !pa.active );
}
/**
* @return Optional inactive project selectors, never {@code null}.
*/
public Set<String> getOptionalInactiveProjectSelectors()
{
return getProjectSelectors( pa -> pa.optional && !pa.active );
}
/**
* Mimics the pre-Maven 4 "selected projects" list.
* @deprecated Use {@link #getRequiredActiveProjectSelectors()} and {@link #getOptionalActiveProjectSelectors()}
* instead.
*/
@Deprecated
public List<String> getSelectedProjects()
{
return Collections.unmodifiableList( new ArrayList<>( getProjectSelectors( pa -> pa.active ) ) );
}
/**
* Mimics the pre-Maven 4 "excluded projects" list.
* @deprecated Use {@link #getRequiredInactiveProjectSelectors()} and {@link #getOptionalInactiveProjectSelectors()}
* instead.
*/
@Deprecated
public List<String> getExcludedProjects()
{
return Collections.unmodifiableList( new ArrayList<>( getProjectSelectors( pa -> !pa.active ) ) );
}
/**
* Overwrites the active projects based on a pre-Maven 4 "active projects" list.
* @param activeProjectSelectors A {@link List} of project selectors that must be activated.
* @deprecated Use {@link #activateOptionalProject(String)} or {@link #activateRequiredProject(String)} instead.
*/
@Deprecated
public void overwriteActiveProjects( List<String> activeProjectSelectors )
{
List<ProjectActivationSettings> projects = getProjects( pa -> pa.active ).collect( Collectors.toList() );
this.activations.removeAll( projects );
activeProjectSelectors.forEach( this::activateOptionalProject );
}
/**
* Overwrites the inactive projects based on a pre-Maven 4 "inactive projects" list.
* @param inactiveProjectSelectors A {@link List} of project selectors that must be deactivated.
* @deprecated Use {@link #deactivateOptionalProject(String)} or {@link #deactivateRequiredProject(String)} instead.
*/
@Deprecated
public void overwriteInactiveProjects( List<String> inactiveProjectSelectors )
{
List<ProjectActivationSettings> projects = getProjects( pa -> !pa.active ).collect( Collectors.toList() );
this.activations.removeAll( projects );
inactiveProjectSelectors.forEach( this::deactivateOptionalProject );
}
/**
* Mark a project as required and activated.
* @param selector The selector of the project.
*/
public void activateRequiredProject( String selector )
{
this.activations.add( new ProjectActivationSettings( selector, ActivationSettings.ACTIVATION_REQUIRED ) );
}
/**
* Mark a project as optional and activated.
* @param selector The selector of the project.
*/
public void activateOptionalProject( String selector )
{
this.activations.add( new ProjectActivationSettings( selector, ActivationSettings.ACTIVATION_OPTIONAL ) );
}
/**
* Mark a project as required and deactivated.
* @param selector The selector of the project.
*/
public void deactivateRequiredProject( String selector )
{
this.activations.add( new ProjectActivationSettings( selector, ActivationSettings.DEACTIVATION_REQUIRED ) );
}
/**
* Mark a project as optional and deactivated.
* @param selector The selector of the project.
*/
public void deactivateOptionalProject( String selector )
{
this.activations.add( new ProjectActivationSettings( selector, ActivationSettings.DEACTIVATION_OPTIONAL ) );
}
public boolean isEmpty()
{
return this.activations.isEmpty();
}
}