blob: f5f91a4e437ed17e651e230505b8168e9a21748a [file] [log] [blame]
/*
* 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.
*/
package org.apache.maven.execution;
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();
}
}