You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/05/03 12:17:49 UTC
[maven-mvnd] 01/01: Drop Maven dupe classes
This is an automated email from the ASF dual-hosted git repository.
cstamas pushed a commit to branch drop-duplicated-maven-classes
in repository https://gitbox.apache.org/repos/asf/maven-mvnd.git
commit 6b96392e38f43573356ab6b5a93eb871a0dfc9cc
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Tue May 3 14:16:56 2022 +0200
Drop Maven dupe classes
That has been fixed in Maven version used by mvnd.
Last bit is MavenCli/DaemonCli that is currently
"almost" a copy, but they do not share any code.
---
.../maven/graph/DefaultProjectDependencyGraph.java | 186 ---
.../maven/lifecycle/internal/MojoExecutor.java | 414 -------
.../maven/model/building/DefaultModelBuilder.java | 1216 --------------------
3 files changed, 1816 deletions(-)
diff --git a/daemon/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java b/daemon/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java
deleted file mode 100644
index 72db9a6..0000000
--- a/daemon/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2019 the original author or authors.
- *
- * 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.apache.maven.graph;
-
-/*
- * 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.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import org.apache.maven.execution.ProjectDependencyGraph;
-import org.apache.maven.project.DuplicateProjectException;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectSorter;
-import org.codehaus.plexus.util.dag.CycleDetectedException;
-
-/**
- * Describes the inter-dependencies between projects in the reactor.
- *
- * @author Benjamin Bentmann
- */
-public class DefaultProjectDependencyGraph
- implements ProjectDependencyGraph {
-
- private ProjectSorter sorter;
-
- private List<MavenProject> allProjects;
-
- private Map<MavenProject, Integer> order;
-
- private Map<String, MavenProject> projects;
-
- /**
- * Creates a new project dependency graph based on the specified projects.
- *
- * @param projects The projects to create the dependency graph with
- * @throws DuplicateProjectException
- * @throws CycleDetectedException
- */
- public DefaultProjectDependencyGraph(Collection<MavenProject> projects)
- throws CycleDetectedException, DuplicateProjectException {
- super();
- this.allProjects = Collections.unmodifiableList(new ArrayList<>(projects));
- this.sorter = new ProjectSorter(projects);
- this.order = new HashMap<>();
- this.projects = new HashMap<>();
- List<MavenProject> sorted = this.sorter.getSortedProjects();
- for (int index = 0; index < sorted.size(); index++) {
- MavenProject project = sorted.get(index);
- String id = ProjectSorter.getId(project);
- this.projects.put(id, project);
- this.order.put(project, index);
- }
- }
-
- /**
- * Creates a new project dependency graph based on the specified projects.
- *
- * @param allProjects All collected projects.
- * @param projects The projects to create the dependency graph with.
- *
- * @throws DuplicateProjectException
- * @throws CycleDetectedException
- * @since 3.5.0
- */
- public DefaultProjectDependencyGraph(final List<MavenProject> allProjects,
- final Collection<MavenProject> projects)
- throws CycleDetectedException, DuplicateProjectException {
- super();
- this.allProjects = Collections.unmodifiableList(new ArrayList<>(allProjects));
- this.sorter = new ProjectSorter(projects);
- this.order = new HashMap<>();
- this.projects = new HashMap<>();
- List<MavenProject> sorted = this.sorter.getSortedProjects();
- for (int index = 0; index < sorted.size(); index++) {
- MavenProject project = sorted.get(index);
- String id = ProjectSorter.getId(project);
- this.projects.put(id, project);
- this.order.put(project, index);
- }
- }
-
- /**
- * @since 3.5.0
- */
- public List<MavenProject> getAllProjects() {
- return this.allProjects;
- }
-
- public List<MavenProject> getSortedProjects() {
- return new ArrayList<>(sorter.getSortedProjects());
- }
-
- public List<MavenProject> getDownstreamProjects(MavenProject project, boolean transitive) {
- Objects.requireNonNull(project, "project cannot be null");
-
- Set<String> projectIds = new HashSet<>();
-
- getDownstreamProjects(ProjectSorter.getId(project), projectIds, transitive);
-
- return getSortedProjects(projectIds);
- }
-
- private void getDownstreamProjects(String projectId, Set<String> projectIds, boolean transitive) {
- for (String id : sorter.getDependents(projectId)) {
- if (projectIds.add(id) && transitive) {
- getDownstreamProjects(id, projectIds, transitive);
- }
- }
- }
-
- public List<MavenProject> getUpstreamProjects(MavenProject project, boolean transitive) {
- Objects.requireNonNull(project, "project cannot be null");
-
- Set<String> projectIds = new HashSet<>();
-
- getUpstreamProjects(ProjectSorter.getId(project), projectIds, transitive);
-
- return getSortedProjects(projectIds);
- }
-
- private void getUpstreamProjects(String projectId, Collection<String> projectIds, boolean transitive) {
- for (String id : sorter.getDependencies(projectId)) {
- if (projectIds.add(id) && transitive) {
- getUpstreamProjects(id, projectIds, transitive);
- }
- }
- }
-
- private List<MavenProject> getSortedProjects(Set<String> projectIds) {
- List<MavenProject> result = new ArrayList<>(projectIds.size());
- for (String projectId : projectIds) {
- result.add(projects.get(projectId));
- }
- result.sort(new MavenProjectComparator());
- return result;
- }
-
- @Override
- public String toString() {
- return sorter.getSortedProjects().toString();
- }
-
- private class MavenProjectComparator implements Comparator<MavenProject> {
- @Override
- public int compare(MavenProject o1, MavenProject o2) {
- return order.get(o1) - order.get(o2);
- }
- }
-
-}
diff --git a/daemon/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java b/daemon/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
deleted file mode 100644
index 68b048a..0000000
--- a/daemon/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Copyright 2019 the original author or authors.
- *
- * 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.apache.maven.lifecycle.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-/*
- * 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 org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.artifact.resolver.filter.CumulativeScopeArtifactFilter;
-import org.apache.maven.execution.ExecutionEvent;
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.lifecycle.LifecycleExecutionException;
-import org.apache.maven.lifecycle.MissingProjectException;
-import org.apache.maven.plugin.BuildPluginManager;
-import org.apache.maven.plugin.MavenPluginManager;
-import org.apache.maven.plugin.MojoExecution;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugin.PluginConfigurationException;
-import org.apache.maven.plugin.PluginIncompatibleException;
-import org.apache.maven.plugin.PluginManagerException;
-import org.apache.maven.plugin.descriptor.MojoDescriptor;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-import org.codehaus.plexus.util.StringUtils;
-import org.eclipse.aether.SessionData;
-
-/**
- * <p>
- * Executes an individual mojo
- * </p>
- * <strong>NOTE:</strong> This class is not part of any public api and can be changed or deleted without prior notice.
- *
- * @author Jason van Zyl
- * @author Benjamin Bentmann
- * @author Kristian Rosenvold
- * @since 3.0
- */
-@Component(role = MojoExecutor.class)
-public class MojoExecutor {
-
- @Requirement
- private BuildPluginManager pluginManager;
-
- @Requirement
- private MavenPluginManager mavenPluginManager;
-
- @Requirement
- private LifecycleDependencyResolver lifeCycleDependencyResolver;
-
- @Requirement
- private ExecutionEventCatapult eventCatapult;
-
- private final ReadWriteLock aggregatorLock = new ReentrantReadWriteLock();
-
- public MojoExecutor() {
- }
-
- public DependencyContext newDependencyContext(MavenSession session, List<MojoExecution> mojoExecutions) {
- Set<String> scopesToCollect = new TreeSet<>();
- Set<String> scopesToResolve = new TreeSet<>();
-
- collectDependencyRequirements(scopesToResolve, scopesToCollect, mojoExecutions);
-
- return new DependencyContext(session.getCurrentProject(), scopesToCollect, scopesToResolve);
- }
-
- private void collectDependencyRequirements(Set<String> scopesToResolve, Set<String> scopesToCollect,
- Collection<MojoExecution> mojoExecutions) {
- for (MojoExecution mojoExecution : mojoExecutions) {
- MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
-
- scopesToResolve.addAll(toScopes(mojoDescriptor.getDependencyResolutionRequired()));
-
- scopesToCollect.addAll(toScopes(mojoDescriptor.getDependencyCollectionRequired()));
- }
- }
-
- private Collection<String> toScopes(String classpath) {
- Collection<String> scopes = Collections.emptyList();
-
- if (StringUtils.isNotEmpty(classpath)) {
- if (Artifact.SCOPE_COMPILE.equals(classpath)) {
- scopes = Arrays.asList(Artifact.SCOPE_COMPILE, Artifact.SCOPE_SYSTEM, Artifact.SCOPE_PROVIDED);
- } else if (Artifact.SCOPE_RUNTIME.equals(classpath)) {
- scopes = Arrays.asList(Artifact.SCOPE_COMPILE, Artifact.SCOPE_RUNTIME);
- } else if (Artifact.SCOPE_COMPILE_PLUS_RUNTIME.equals(classpath)) {
- scopes = Arrays.asList(Artifact.SCOPE_COMPILE, Artifact.SCOPE_SYSTEM, Artifact.SCOPE_PROVIDED,
- Artifact.SCOPE_RUNTIME);
- } else if (Artifact.SCOPE_RUNTIME_PLUS_SYSTEM.equals(classpath)) {
- scopes = Arrays.asList(Artifact.SCOPE_COMPILE, Artifact.SCOPE_SYSTEM, Artifact.SCOPE_RUNTIME);
- } else if (Artifact.SCOPE_TEST.equals(classpath)) {
- scopes = Arrays.asList(Artifact.SCOPE_COMPILE, Artifact.SCOPE_SYSTEM, Artifact.SCOPE_PROVIDED,
- Artifact.SCOPE_RUNTIME, Artifact.SCOPE_TEST);
- }
- }
- return Collections.unmodifiableCollection(scopes);
- }
-
- public void execute(MavenSession session, List<MojoExecution> mojoExecutions, ProjectIndex projectIndex)
- throws LifecycleExecutionException
-
- {
- DependencyContext dependencyContext = newDependencyContext(session, mojoExecutions);
-
- PhaseRecorder phaseRecorder = new PhaseRecorder(session.getCurrentProject());
-
- for (MojoExecution mojoExecution : mojoExecutions) {
- execute(session, mojoExecution, projectIndex, dependencyContext, phaseRecorder);
- }
- }
-
- public void execute(MavenSession session, MojoExecution mojoExecution, ProjectIndex projectIndex,
- DependencyContext dependencyContext, PhaseRecorder phaseRecorder)
- throws LifecycleExecutionException {
- execute(session, mojoExecution, projectIndex, dependencyContext);
- phaseRecorder.observeExecution(mojoExecution);
- }
-
- private void execute(MavenSession session, MojoExecution mojoExecution, ProjectIndex projectIndex,
- DependencyContext dependencyContext)
- throws LifecycleExecutionException {
- MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
-
- try {
- mavenPluginManager.checkRequiredMavenVersion(mojoDescriptor.getPluginDescriptor());
- } catch (PluginIncompatibleException e) {
- throw new LifecycleExecutionException(mojoExecution, session.getCurrentProject(), e);
- }
-
- if (mojoDescriptor.isProjectRequired() && !session.getRequest().isProjectPresent()) {
- Throwable cause = new MissingProjectException(
- "Goal requires a project to execute" + " but there is no POM in this directory ("
- + session.getExecutionRootDirectory() + ")."
- + " Please verify you invoked Maven from the correct directory.");
- throw new LifecycleExecutionException(mojoExecution, null, cause);
- }
-
- if (mojoDescriptor.isOnlineRequired() && session.isOffline()) {
- if (MojoExecution.Source.CLI.equals(mojoExecution.getSource())) {
- Throwable cause = new IllegalStateException(
- "Goal requires online mode for execution" + " but Maven is currently offline.");
- throw new LifecycleExecutionException(mojoExecution, session.getCurrentProject(), cause);
- } else {
- eventCatapult.fire(ExecutionEvent.Type.MojoSkipped, session, mojoExecution);
-
- return;
- }
- }
-
- try (ProjectLock lock = new ProjectLock(session, mojoDescriptor, aggregatorLock)) {
- doExecute(session, mojoExecution, projectIndex, dependencyContext);
- }
- }
-
- /**
- * Aggregating mojo executions (possibly) modify all MavenProjects, including those that are currently in use
- * by concurrently running mojo executions. To prevent race conditions, an aggregating execution will block
- * all other executions until finished.
- * We also lock on a given project to forbid a forked lifecycle to be executed concurrently with the project.
- * TODO: ideally, the builder should take care of the ordering in a smarter way
- * TODO: and concurrency issues fixed with MNG-7157
- */
- private static class ProjectLock implements AutoCloseable {
- final Lock acquiredAggregatorLock;
- final Lock acquiredProjectLock;
-
- ProjectLock(MavenSession session, MojoDescriptor mojoDescriptor, ReadWriteLock aggregatorLock) {
- if (session.getRequest().getDegreeOfConcurrency() > 1) {
- boolean aggregator = mojoDescriptor.isAggregator();
- acquiredAggregatorLock = aggregator ? aggregatorLock.writeLock() : aggregatorLock.readLock();
- acquiredProjectLock = getProjectLock(session);
- acquiredAggregatorLock.lock();
- acquiredProjectLock.lock();
- } else {
- acquiredAggregatorLock = null;
- acquiredProjectLock = null;
- }
- }
-
- @Override
- public void close() {
- // release the lock in the reverse order of the acquisition
- if (acquiredProjectLock != null) {
- acquiredProjectLock.unlock();
- }
- if (acquiredAggregatorLock != null) {
- acquiredAggregatorLock.unlock();
- }
- }
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- private Lock getProjectLock(MavenSession session) {
- SessionData data = session.getRepositorySession().getData();
- ConcurrentMap<MavenProject, Lock> locks = (ConcurrentMap) data.get(ProjectLock.class);
- // initialize the value if not already done (in case of a concurrent access) to the method
- if (locks == null) {
- // the call to data.set(k, null, v) is effectively a call to data.putIfAbsent(k, v)
- data.set(ProjectLock.class, null, new ConcurrentHashMap<>());
- locks = (ConcurrentMap) data.get(ProjectLock.class);
- }
- Lock acquiredProjectLock = locks.get(session.getCurrentProject());
- if (acquiredProjectLock == null) {
- acquiredProjectLock = new ReentrantLock();
- Lock prev = locks.putIfAbsent(session.getCurrentProject(), acquiredProjectLock);
- if (prev != null) {
- acquiredProjectLock = prev;
- }
- }
- return acquiredProjectLock;
- }
- }
-
- private void doExecute(MavenSession session, MojoExecution mojoExecution, ProjectIndex projectIndex,
- DependencyContext dependencyContext)
- throws LifecycleExecutionException {
- MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
-
- List<MavenProject> forkedProjects = executeForkedExecutions(mojoExecution, session, projectIndex);
-
- ensureDependenciesAreResolved(mojoDescriptor, session, dependencyContext);
-
- eventCatapult.fire(ExecutionEvent.Type.MojoStarted, session, mojoExecution);
-
- try {
- try {
- pluginManager.executeMojo(session, mojoExecution);
- } catch (MojoFailureException | PluginManagerException | PluginConfigurationException
- | MojoExecutionException e) {
- throw new LifecycleExecutionException(mojoExecution, session.getCurrentProject(), e);
- }
-
- eventCatapult.fire(ExecutionEvent.Type.MojoSucceeded, session, mojoExecution);
- } catch (LifecycleExecutionException e) {
- eventCatapult.fire(ExecutionEvent.Type.MojoFailed, session, mojoExecution, e);
-
- throw e;
- } finally {
- for (MavenProject forkedProject : forkedProjects) {
- forkedProject.setExecutionProject(null);
- }
- }
- }
-
- public void ensureDependenciesAreResolved(MojoDescriptor mojoDescriptor, MavenSession session,
- DependencyContext dependencyContext)
- throws LifecycleExecutionException
-
- {
- MavenProject project = dependencyContext.getProject();
- boolean aggregating = mojoDescriptor.isAggregator();
-
- if (dependencyContext.isResolutionRequiredForCurrentProject()) {
- Collection<String> scopesToCollect = dependencyContext.getScopesToCollectForCurrentProject();
- Collection<String> scopesToResolve = dependencyContext.getScopesToResolveForCurrentProject();
-
- lifeCycleDependencyResolver.resolveProjectDependencies(project, scopesToCollect, scopesToResolve, session,
- aggregating, Collections.<Artifact> emptySet());
-
- dependencyContext.synchronizeWithProjectState();
- }
-
- if (aggregating) {
- Collection<String> scopesToCollect = toScopes(mojoDescriptor.getDependencyCollectionRequired());
- Collection<String> scopesToResolve = toScopes(mojoDescriptor.getDependencyResolutionRequired());
-
- if (dependencyContext.isResolutionRequiredForAggregatedProjects(scopesToCollect, scopesToResolve)) {
- for (MavenProject aggregatedProject : session.getProjects()) {
- if (aggregatedProject != project) {
- lifeCycleDependencyResolver.resolveProjectDependencies(aggregatedProject, scopesToCollect,
- scopesToResolve, session, aggregating,
- Collections.<Artifact> emptySet());
- }
- }
- }
- }
-
- ArtifactFilter artifactFilter = getArtifactFilter(mojoDescriptor);
- List<MavenProject> projectsToResolve = LifecycleDependencyResolver.getProjects(session.getCurrentProject(), session,
- mojoDescriptor.isAggregator());
- for (MavenProject projectToResolve : projectsToResolve) {
- projectToResolve.setArtifactFilter(artifactFilter);
- }
- }
-
- private ArtifactFilter getArtifactFilter(MojoDescriptor mojoDescriptor) {
- String scopeToResolve = mojoDescriptor.getDependencyResolutionRequired();
- String scopeToCollect = mojoDescriptor.getDependencyCollectionRequired();
-
- List<String> scopes = new ArrayList<>(2);
- if (StringUtils.isNotEmpty(scopeToCollect)) {
- scopes.add(scopeToCollect);
- }
- if (StringUtils.isNotEmpty(scopeToResolve)) {
- scopes.add(scopeToResolve);
- }
-
- if (scopes.isEmpty()) {
- return null;
- } else {
- return new CumulativeScopeArtifactFilter(scopes);
- }
- }
-
- public List<MavenProject> executeForkedExecutions(MojoExecution mojoExecution, MavenSession session,
- ProjectIndex projectIndex)
- throws LifecycleExecutionException {
- List<MavenProject> forkedProjects = Collections.emptyList();
-
- Map<String, List<MojoExecution>> forkedExecutions = mojoExecution.getForkedExecutions();
-
- if (!forkedExecutions.isEmpty()) {
- eventCatapult.fire(ExecutionEvent.Type.ForkStarted, session, mojoExecution);
-
- MavenProject project = session.getCurrentProject();
-
- forkedProjects = new ArrayList<>(forkedExecutions.size());
-
- try {
- for (Map.Entry<String, List<MojoExecution>> fork : forkedExecutions.entrySet()) {
- String projectId = fork.getKey();
-
- int index = projectIndex.getIndices().get(projectId);
-
- MavenProject forkedProject = projectIndex.getProjects().get(projectId);
-
- forkedProjects.add(forkedProject);
-
- MavenProject executedProject = forkedProject.clone();
-
- forkedProject.setExecutionProject(executedProject);
-
- List<MojoExecution> mojoExecutions = fork.getValue();
-
- if (mojoExecutions.isEmpty()) {
- continue;
- }
-
- try {
- session.setCurrentProject(executedProject);
- session.getProjects().set(index, executedProject);
- projectIndex.getProjects().put(projectId, executedProject);
-
- eventCatapult.fire(ExecutionEvent.Type.ForkedProjectStarted, session, mojoExecution);
-
- execute(session, mojoExecutions, projectIndex);
-
- eventCatapult.fire(ExecutionEvent.Type.ForkedProjectSucceeded, session, mojoExecution);
- } catch (LifecycleExecutionException e) {
- eventCatapult.fire(ExecutionEvent.Type.ForkedProjectFailed, session, mojoExecution, e);
-
- throw e;
- } finally {
- projectIndex.getProjects().put(projectId, forkedProject);
- session.getProjects().set(index, forkedProject);
- session.setCurrentProject(project);
- }
- }
-
- eventCatapult.fire(ExecutionEvent.Type.ForkSucceeded, session, mojoExecution);
- } catch (LifecycleExecutionException e) {
- eventCatapult.fire(ExecutionEvent.Type.ForkFailed, session, mojoExecution, e);
-
- throw e;
- }
- }
-
- return forkedProjects;
- }
-}
diff --git a/daemon/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/daemon/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
deleted file mode 100644
index de27330..0000000
--- a/daemon/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ /dev/null
@@ -1,1216 +0,0 @@
-/*
- * Copyright 2019 the original author or authors.
- *
- * 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.apache.maven.model.building;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Properties;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-/*
- * 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 org.apache.maven.artifact.versioning.DefaultArtifactVersion;
-import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
-import org.apache.maven.artifact.versioning.VersionRange;
-import org.apache.maven.model.Activation;
-import org.apache.maven.model.Build;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.DependencyManagement;
-import org.apache.maven.model.InputLocation;
-import org.apache.maven.model.InputSource;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Parent;
-import org.apache.maven.model.Plugin;
-import org.apache.maven.model.PluginManagement;
-import org.apache.maven.model.Profile;
-import org.apache.maven.model.Repository;
-import org.apache.maven.model.building.ModelProblem.Severity;
-import org.apache.maven.model.building.ModelProblem.Version;
-import org.apache.maven.model.composition.DependencyManagementImporter;
-import org.apache.maven.model.inheritance.InheritanceAssembler;
-import org.apache.maven.model.interpolation.ModelInterpolator;
-import org.apache.maven.model.io.ModelParseException;
-import org.apache.maven.model.management.DependencyManagementInjector;
-import org.apache.maven.model.management.PluginManagementInjector;
-import org.apache.maven.model.normalization.ModelNormalizer;
-import org.apache.maven.model.path.ModelPathTranslator;
-import org.apache.maven.model.path.ModelUrlNormalizer;
-import org.apache.maven.model.plugin.LifecycleBindingsInjector;
-import org.apache.maven.model.plugin.PluginConfigurationExpander;
-import org.apache.maven.model.plugin.ReportConfigurationExpander;
-import org.apache.maven.model.plugin.ReportingConverter;
-import org.apache.maven.model.profile.DefaultProfileActivationContext;
-import org.apache.maven.model.profile.ProfileInjector;
-import org.apache.maven.model.profile.ProfileSelector;
-import org.apache.maven.model.resolution.InvalidRepositoryException;
-import org.apache.maven.model.resolution.ModelResolver;
-import org.apache.maven.model.resolution.UnresolvableModelException;
-import org.apache.maven.model.resolution.WorkspaceModelResolver;
-import org.apache.maven.model.superpom.SuperPomProvider;
-import org.apache.maven.model.validation.ModelValidator;
-import org.codehaus.plexus.interpolation.MapBasedValueSource;
-import org.codehaus.plexus.interpolation.StringSearchInterpolator;
-import org.eclipse.sisu.Nullable;
-
-import static org.apache.maven.model.building.Result.error;
-import static org.apache.maven.model.building.Result.newResult;
-
-/**
- * @author Benjamin Bentmann
- */
-@Named
-@Singleton
-public class DefaultModelBuilder
- implements ModelBuilder {
- @Inject
- private ModelProcessor modelProcessor;
-
- @Inject
- private ModelValidator modelValidator;
-
- @Inject
- private ModelNormalizer modelNormalizer;
-
- @Inject
- private ModelInterpolator modelInterpolator;
-
- @Inject
- private ModelPathTranslator modelPathTranslator;
-
- @Inject
- private ModelUrlNormalizer modelUrlNormalizer;
-
- @Inject
- private SuperPomProvider superPomProvider;
-
- @Inject
- private InheritanceAssembler inheritanceAssembler;
-
- @Inject
- private ProfileSelector profileSelector;
-
- @Inject
- private ProfileInjector profileInjector;
-
- @Inject
- private PluginManagementInjector pluginManagementInjector;
-
- @Inject
- private DependencyManagementInjector dependencyManagementInjector;
-
- @Inject
- private DependencyManagementImporter dependencyManagementImporter;
-
- @Inject
- @Nullable
- private LifecycleBindingsInjector lifecycleBindingsInjector;
-
- @Inject
- private PluginConfigurationExpander pluginConfigurationExpander;
-
- @Inject
- private ReportConfigurationExpander reportConfigurationExpander;
-
- @Inject
- private ReportingConverter reportingConverter;
-
- public DefaultModelBuilder setModelProcessor(ModelProcessor modelProcessor) {
- this.modelProcessor = modelProcessor;
- return this;
- }
-
- public DefaultModelBuilder setModelValidator(ModelValidator modelValidator) {
- this.modelValidator = modelValidator;
- return this;
- }
-
- public DefaultModelBuilder setModelNormalizer(ModelNormalizer modelNormalizer) {
- this.modelNormalizer = modelNormalizer;
- return this;
- }
-
- public DefaultModelBuilder setModelInterpolator(ModelInterpolator modelInterpolator) {
- this.modelInterpolator = modelInterpolator;
- return this;
- }
-
- public DefaultModelBuilder setModelPathTranslator(ModelPathTranslator modelPathTranslator) {
- this.modelPathTranslator = modelPathTranslator;
- return this;
- }
-
- public DefaultModelBuilder setModelUrlNormalizer(ModelUrlNormalizer modelUrlNormalizer) {
- this.modelUrlNormalizer = modelUrlNormalizer;
- return this;
- }
-
- public DefaultModelBuilder setSuperPomProvider(SuperPomProvider superPomProvider) {
- this.superPomProvider = superPomProvider;
- return this;
- }
-
- public DefaultModelBuilder setProfileSelector(ProfileSelector profileSelector) {
- this.profileSelector = profileSelector;
- return this;
- }
-
- public DefaultModelBuilder setProfileInjector(ProfileInjector profileInjector) {
- this.profileInjector = profileInjector;
- return this;
- }
-
- public DefaultModelBuilder setInheritanceAssembler(InheritanceAssembler inheritanceAssembler) {
- this.inheritanceAssembler = inheritanceAssembler;
- return this;
- }
-
- public DefaultModelBuilder setDependencyManagementImporter(DependencyManagementImporter depMgmtImporter) {
- this.dependencyManagementImporter = depMgmtImporter;
- return this;
- }
-
- public DefaultModelBuilder setDependencyManagementInjector(DependencyManagementInjector depMgmtInjector) {
- this.dependencyManagementInjector = depMgmtInjector;
- return this;
- }
-
- public DefaultModelBuilder setLifecycleBindingsInjector(LifecycleBindingsInjector lifecycleBindingsInjector) {
- this.lifecycleBindingsInjector = lifecycleBindingsInjector;
- return this;
- }
-
- public DefaultModelBuilder setPluginConfigurationExpander(PluginConfigurationExpander pluginConfigurationExpander) {
- this.pluginConfigurationExpander = pluginConfigurationExpander;
- return this;
- }
-
- public DefaultModelBuilder setPluginManagementInjector(PluginManagementInjector pluginManagementInjector) {
- this.pluginManagementInjector = pluginManagementInjector;
- return this;
- }
-
- public DefaultModelBuilder setReportConfigurationExpander(ReportConfigurationExpander reportConfigurationExpander) {
- this.reportConfigurationExpander = reportConfigurationExpander;
- return this;
- }
-
- public DefaultModelBuilder setReportingConverter(ReportingConverter reportingConverter) {
- this.reportingConverter = reportingConverter;
- return this;
- }
-
- @SuppressWarnings("checkstyle:methodlength")
- @Override
- public ModelBuildingResult build(ModelBuildingRequest request)
- throws ModelBuildingException {
- return build(request, new LinkedHashSet<String>());
- }
-
- @SuppressWarnings("checkstyle:methodlength")
- protected ModelBuildingResult build(ModelBuildingRequest request, Collection<String> importIds)
- throws ModelBuildingException {
- // phase 1
- DefaultModelBuildingResult result = new DefaultModelBuildingResult();
-
- DefaultModelProblemCollector problems = new DefaultModelProblemCollector(result);
-
- // profile activation
- DefaultProfileActivationContext profileActivationContext = getProfileActivationContext(request);
-
- problems.setSource("(external profiles)");
- List<Profile> activeExternalProfiles = profileSelector.getActiveProfiles(request.getProfiles(),
- profileActivationContext, problems);
-
- result.setActiveExternalProfiles(activeExternalProfiles);
-
- if (!activeExternalProfiles.isEmpty()) {
- Properties profileProps = new Properties();
- for (Profile profile : activeExternalProfiles) {
- profileProps.putAll(profile.getProperties());
- }
- profileProps.putAll(profileActivationContext.getUserProperties());
- profileActivationContext.setUserProperties(profileProps);
- }
-
- // read and validate raw model
- Model inputModel = request.getRawModel();
- if (inputModel == null) {
- inputModel = readModel(request.getModelSource(), request.getPomFile(), request, problems);
- }
-
- problems.setRootModel(inputModel);
-
- ModelData resultData = new ModelData(request.getModelSource(), inputModel);
- ModelData superData = new ModelData(null, getSuperModel());
-
- Collection<String> parentIds = new LinkedHashSet<>();
- List<ModelData> lineage = new ArrayList<>();
-
- for (ModelData currentData = resultData; currentData != null;) {
- lineage.add(currentData);
-
- Model rawModel = currentData.getModel();
- currentData.setRawModel(rawModel);
-
- Model tmpModel = rawModel.clone();
- currentData.setModel(tmpModel);
-
- problems.setSource(tmpModel);
-
- // model normalization
- modelNormalizer.mergeDuplicates(tmpModel, request, problems);
-
- profileActivationContext.setProjectProperties(tmpModel.getProperties());
-
- List<Profile> activePomProfiles = profileSelector.getActiveProfiles(rawModel.getProfiles(),
- profileActivationContext, problems);
- currentData.setActiveProfiles(activePomProfiles);
-
- Map<String, Activation> interpolatedActivations = getProfileActivations(rawModel, false);
- injectProfileActivations(tmpModel, interpolatedActivations);
-
- // profile injection
- for (Profile activeProfile : activePomProfiles) {
- profileInjector.injectProfile(tmpModel, activeProfile, request, problems);
- }
-
- if (currentData == resultData) {
- for (Profile activeProfile : activeExternalProfiles) {
- profileInjector.injectProfile(tmpModel, activeProfile, request, problems);
- }
- }
-
- if (currentData == superData) {
- break;
- }
-
- configureResolver(request.getModelResolver(), tmpModel, problems);
-
- ModelData parentData = readParent(tmpModel, currentData.getSource(), request, problems);
-
- if (parentData == null) {
- currentData = superData;
- } else if (currentData == resultData) { // First iteration - add initial id after version resolution.
- currentData.setGroupId(currentData.getRawModel().getGroupId() == null ? parentData.getGroupId()
- : currentData.getRawModel()
- .getGroupId());
-
- currentData.setVersion(currentData.getRawModel().getVersion() == null ? parentData.getVersion()
- : currentData.getRawModel()
- .getVersion());
-
- currentData.setArtifactId(currentData.getRawModel().getArtifactId());
- parentIds.add(currentData.getId());
- // Reset - only needed for 'getId'.
- currentData.setGroupId(null);
- currentData.setArtifactId(null);
- currentData.setVersion(null);
- currentData = parentData;
- } else if (!parentIds.add(parentData.getId())) {
- String message = "The parents form a cycle: ";
- for (String modelId : parentIds) {
- message += modelId + " -> ";
- }
- message += parentData.getId();
-
- problems.add(new ModelProblemCollectorRequest(ModelProblem.Severity.FATAL, ModelProblem.Version.BASE)
- .setMessage(message));
-
- throw problems.newModelBuildingException();
- } else {
- currentData = parentData;
- }
- }
-
- problems.setSource(inputModel);
- checkPluginVersions(lineage, request, problems);
-
- // inheritance assembly
- assembleInheritance(lineage, request, problems);
-
- Model resultModel = resultData.getModel();
-
- problems.setSource(resultModel);
- problems.setRootModel(resultModel);
-
- // model interpolation
- resultModel = interpolateModel(resultModel, request, problems);
- resultData.setModel(resultModel);
-
- if (resultModel.getParent() != null) {
- final ModelData parentData = lineage.get(1);
- if (parentData.getVersion() == null || parentData.getVersion().contains("${")) {
- final Model interpolatedParent = interpolateModel(parentData.getModel(), request, problems);
- // parentData.setModel( interpolatedParent );
- parentData.setVersion(interpolatedParent.getVersion());
- }
- }
-
- // url normalization
- modelUrlNormalizer.normalize(resultModel, request);
-
- // Now the fully interpolated model is available: reconfigure the resolver
- configureResolver(request.getModelResolver(), resultModel, problems, true);
-
- resultData.setGroupId(resultModel.getGroupId());
- resultData.setArtifactId(resultModel.getArtifactId());
- resultData.setVersion(resultModel.getVersion());
-
- result.setEffectiveModel(resultModel);
-
- for (ModelData currentData : lineage) {
- String modelId = (currentData != superData) ? currentData.getId() : "";
-
- result.addModelId(modelId);
- result.setActivePomProfiles(modelId, currentData.getActiveProfiles());
- result.setRawModel(modelId, currentData.getRawModel());
- }
-
- if (!request.isTwoPhaseBuilding()) {
- build(request, result, importIds);
- }
-
- return result;
- }
-
- @Override
- public ModelBuildingResult build(ModelBuildingRequest request, ModelBuildingResult result)
- throws ModelBuildingException {
- return build(request, result, new LinkedHashSet<String>());
- }
-
- private ModelBuildingResult build(ModelBuildingRequest request, ModelBuildingResult result,
- Collection<String> imports)
- throws ModelBuildingException {
- // phase 2
- Model resultModel = result.getEffectiveModel();
-
- DefaultModelProblemCollector problems = new DefaultModelProblemCollector(result);
- problems.setSource(resultModel);
- problems.setRootModel(resultModel);
-
- // model path translation
- modelPathTranslator.alignToBaseDirectory(resultModel, resultModel.getProjectDirectory(), request);
-
- // plugin management injection
- pluginManagementInjector.injectManagement(resultModel, request, problems);
-
- fireEvent(resultModel, request, problems, ModelBuildingEventCatapult.BUILD_EXTENSIONS_ASSEMBLED);
-
- if (request.isProcessPlugins()) {
- if (lifecycleBindingsInjector == null) {
- throw new IllegalStateException("lifecycle bindings injector is missing");
- }
-
- // lifecycle bindings injection
- lifecycleBindingsInjector.injectLifecycleBindings(resultModel, request, problems);
- }
-
- // dependency management import
- importDependencyManagement(resultModel, request, problems, imports);
-
- // dependency management injection
- dependencyManagementInjector.injectManagement(resultModel, request, problems);
-
- modelNormalizer.injectDefaultValues(resultModel, request, problems);
-
- if (request.isProcessPlugins()) {
- // reports configuration
- reportConfigurationExpander.expandPluginConfiguration(resultModel, request, problems);
-
- // reports conversion to decoupled site plugin
- reportingConverter.convertReporting(resultModel, request, problems);
-
- // plugins configuration
- pluginConfigurationExpander.expandPluginConfiguration(resultModel, request, problems);
- }
-
- // effective model validation
- modelValidator.validateEffectiveModel(resultModel, request, problems);
-
- if (hasModelErrors(problems)) {
- throw problems.newModelBuildingException();
- }
-
- return result;
- }
-
- @Override
- public Result<? extends Model> buildRawModel(File pomFile, int validationLevel, boolean locationTracking) {
- final ModelBuildingRequest request = new DefaultModelBuildingRequest().setValidationLevel(validationLevel)
- .setLocationTracking(locationTracking);
- final DefaultModelProblemCollector collector = new DefaultModelProblemCollector(new DefaultModelBuildingResult());
- try {
- return newResult(readModel(null, pomFile, request, collector), collector.getProblems());
- } catch (ModelBuildingException e) {
- return error(collector.getProblems());
- }
- }
-
- private Model readModel(ModelSource modelSource, File pomFile, ModelBuildingRequest request,
- DefaultModelProblemCollector problems)
- throws ModelBuildingException {
- Model model;
-
- if (modelSource == null) {
- if (pomFile != null) {
- modelSource = new FileModelSource(pomFile);
- } else {
- throw new NullPointerException("neither pomFile nor modelSource can be null");
- }
- }
-
- problems.setSource(modelSource.getLocation());
- try {
- boolean strict = request.getValidationLevel() >= ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0;
- InputSource source = request.isLocationTracking() ? new InputSource() : null;
-
- Map<String, Object> options = new HashMap<>();
- options.put(ModelProcessor.IS_STRICT, strict);
- options.put(ModelProcessor.INPUT_SOURCE, source);
- options.put(ModelProcessor.SOURCE, modelSource);
-
- try {
- model = modelProcessor.read(modelSource.getInputStream(), options);
- } catch (ModelParseException e) {
- if (!strict) {
- throw e;
- }
-
- options.put(ModelProcessor.IS_STRICT, Boolean.FALSE);
-
- try {
- model = modelProcessor.read(modelSource.getInputStream(), options);
- } catch (ModelParseException ne) {
- // still unreadable even in non-strict mode, rethrow original error
- throw e;
- }
-
- if (pomFile != null) {
- problems.add(new ModelProblemCollectorRequest(Severity.ERROR, Version.V20)
- .setMessage("Malformed POM " + modelSource.getLocation() + ": " + e.getMessage())
- .setException(e));
- } else {
- problems.add(new ModelProblemCollectorRequest(Severity.WARNING, Version.V20)
- .setMessage("Malformed POM " + modelSource.getLocation() + ": " + e.getMessage())
- .setException(e));
- }
- }
-
- if (source != null) {
- source.setModelId(ModelProblemUtils.toId(model));
- source.setLocation(modelSource.getLocation());
- }
- } catch (ModelParseException e) {
- problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.BASE)
- .setMessage("Non-parseable POM " + modelSource.getLocation() + ": " + e.getMessage())
- .setException(e));
- throw problems.newModelBuildingException();
- } catch (IOException e) {
- String msg = e.getMessage();
- if (msg == null || msg.length() <= 0) {
- // NOTE: There's java.nio.charset.MalformedInputException and sun.io.MalformedInputException
- if (e.getClass().getName().endsWith("MalformedInputException")) {
- msg = "Some input bytes do not match the file encoding.";
- } else {
- msg = e.getClass().getSimpleName();
- }
- }
- problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.BASE)
- .setMessage("Non-readable POM " + modelSource.getLocation() + ": " + msg).setException(e));
- throw problems.newModelBuildingException();
- }
-
- if (pomFile != null) {
- model.setPomFile(pomFile);
- }
-
- problems.setSource(model);
- modelValidator.validateRawModel(model, request, problems);
-
- if (hasFatalErrors(problems)) {
- throw problems.newModelBuildingException();
- }
-
- return model;
- }
-
- private DefaultProfileActivationContext getProfileActivationContext(ModelBuildingRequest request) {
- DefaultProfileActivationContext context = new DefaultProfileActivationContext();
-
- context.setActiveProfileIds(request.getActiveProfileIds());
- context.setInactiveProfileIds(request.getInactiveProfileIds());
- context.setSystemProperties(request.getSystemProperties());
- context.setUserProperties(request.getUserProperties());
- context.setProjectDirectory((request.getPomFile() != null) ? request.getPomFile().getParentFile() : null);
-
- return context;
- }
-
- private void configureResolver(ModelResolver modelResolver, Model model, DefaultModelProblemCollector problems) {
- configureResolver(modelResolver, model, problems, false);
- }
-
- private void configureResolver(ModelResolver modelResolver, Model model, DefaultModelProblemCollector problems,
- boolean replaceRepositories) {
- if (modelResolver == null) {
- return;
- }
-
- problems.setSource(model);
-
- List<Repository> repositories = model.getRepositories();
-
- for (Repository repository : repositories) {
- try {
- modelResolver.addRepository(repository, replaceRepositories);
- } catch (InvalidRepositoryException e) {
- problems.add(new ModelProblemCollectorRequest(Severity.ERROR, Version.BASE)
- .setMessage("Invalid repository " + repository.getId() + ": " + e.getMessage())
- .setLocation(repository.getLocation("")).setException(e));
- }
- }
- }
-
- private void checkPluginVersions(List<ModelData> lineage, ModelBuildingRequest request,
- ModelProblemCollector problems) {
- if (request.getValidationLevel() < ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0) {
- return;
- }
-
- Map<String, Plugin> plugins = new HashMap<>();
- Map<String, String> versions = new HashMap<>();
- Map<String, String> managedVersions = new HashMap<>();
-
- for (int i = lineage.size() - 1; i >= 0; i--) {
- Model model = lineage.get(i).getModel();
- Build build = model.getBuild();
- if (build != null) {
- for (Plugin plugin : build.getPlugins()) {
- String key = plugin.getKey();
- if (versions.get(key) == null) {
- versions.put(key, plugin.getVersion());
- plugins.put(key, plugin);
- }
- }
- PluginManagement mgmt = build.getPluginManagement();
- if (mgmt != null) {
- for (Plugin plugin : mgmt.getPlugins()) {
- String key = plugin.getKey();
- if (managedVersions.get(key) == null) {
- managedVersions.put(key, plugin.getVersion());
- }
- }
- }
- }
- }
-
- for (String key : versions.keySet()) {
- if (versions.get(key) == null && managedVersions.get(key) == null) {
- InputLocation location = plugins.get(key).getLocation("");
- problems
- .add(new ModelProblemCollectorRequest(Severity.WARNING, Version.V20)
- .setMessage("'build.plugins.plugin.version' for " + key + " is missing.")
- .setLocation(location));
- }
- }
- }
-
- private void assembleInheritance(List<ModelData> lineage, ModelBuildingRequest request,
- ModelProblemCollector problems) {
- for (int i = lineage.size() - 2; i >= 0; i--) {
- Model parent = lineage.get(i + 1).getModel();
- Model child = lineage.get(i).getModel();
- inheritanceAssembler.assembleModelInheritance(child, parent, request, problems);
- }
- }
-
- private Map<String, Activation> getProfileActivations(Model model, boolean clone) {
- Map<String, Activation> activations = new HashMap<>();
- for (Profile profile : model.getProfiles()) {
- Activation activation = profile.getActivation();
-
- if (activation == null) {
- continue;
- }
-
- if (clone) {
- activation = activation.clone();
- }
-
- activations.put(profile.getId(), activation);
- }
-
- return activations;
- }
-
- private void injectProfileActivations(Model model, Map<String, Activation> activations) {
- for (Profile profile : model.getProfiles()) {
- Activation activation = profile.getActivation();
-
- if (activation == null) {
- continue;
- }
-
- // restore activation
- profile.setActivation(activations.get(profile.getId()));
- }
- }
-
- private Model interpolateModel(Model model, ModelBuildingRequest request, ModelProblemCollector problems) {
- // save profile activations before interpolation, since they are evaluated with limited scope
- Map<String, Activation> originalActivations = getProfileActivations(model, true);
-
- Model interpolatedModel = modelInterpolator.interpolateModel(model, model.getProjectDirectory(), request, problems);
- if (interpolatedModel.getParent() != null) {
- StringSearchInterpolator ssi = new StringSearchInterpolator();
- ssi.addValueSource(new MapBasedValueSource(request.getUserProperties()));
-
- ssi.addValueSource(new MapBasedValueSource(model.getProperties()));
-
- ssi.addValueSource(new MapBasedValueSource(request.getSystemProperties()));
-
- try {
- String interpolated = ssi.interpolate(interpolatedModel.getParent().getVersion());
- interpolatedModel.getParent().setVersion(interpolated);
- } catch (Exception e) {
- ModelProblemCollectorRequest mpcr = new ModelProblemCollectorRequest(Severity.ERROR,
- Version.BASE).setMessage(
- "Failed to interpolate field: "
- + interpolatedModel.getParent().getVersion()
- + " on class: ")
- .setException(e);
- problems.add(mpcr);
- }
-
- }
- interpolatedModel.setPomFile(model.getPomFile());
-
- // restore profiles with file activation to their value before full interpolation
- injectProfileActivations(model, originalActivations);
-
- return interpolatedModel;
- }
-
- private ModelData readParent(Model childModel, ModelSource childSource, ModelBuildingRequest request,
- DefaultModelProblemCollector problems)
- throws ModelBuildingException {
- ModelData parentData;
-
- Parent parent = childModel.getParent();
-
- if (parent != null) {
- String groupId = parent.getGroupId();
- String artifactId = parent.getArtifactId();
- String version = parent.getVersion();
-
- parentData = getCache(request.getModelCache(), groupId, artifactId, version, ModelCacheTag.RAW);
-
- if (parentData == null) {
- parentData = readParentLocally(childModel, childSource, request, problems);
-
- if (parentData == null) {
- parentData = readParentExternally(childModel, request, problems);
- }
-
- putCache(request.getModelCache(), groupId, artifactId, version, ModelCacheTag.RAW, parentData);
- } else {
- /*
- * NOTE: This is a sanity check of the cache hit. If the cached parent POM was locally resolved, the
- * child's <relativePath> should point at that parent, too. If it doesn't, we ignore the cache and
- * resolve externally, to mimic the behavior if the cache didn't exist in the first place. Otherwise,
- * the cache would obscure a bad POM.
- */
-
- File pomFile = parentData.getModel().getPomFile();
- if (pomFile != null) {
- FileModelSource pomSource = new FileModelSource(pomFile);
- ModelSource expectedParentSource = getParentPomFile(childModel, childSource);
-
- if (expectedParentSource == null || (expectedParentSource instanceof ModelSource2
- && !pomSource.equals(expectedParentSource))) {
- parentData = readParentExternally(childModel, request, problems);
- }
- }
- }
-
- Model parentModel = parentData.getModel();
-
- if (!"pom".equals(parentModel.getPackaging())) {
- problems.add(new ModelProblemCollectorRequest(Severity.ERROR, Version.BASE)
- .setMessage("Invalid packaging for parent POM " + ModelProblemUtils.toSourceHint(parentModel)
- + ", must be \"pom\" but is \"" + parentModel.getPackaging() + "\"")
- .setLocation(parentModel.getLocation("packaging")));
- }
- } else {
- parentData = null;
- }
-
- return parentData;
- }
-
- private ModelData readParentLocally(Model childModel, ModelSource childSource, ModelBuildingRequest request,
- DefaultModelProblemCollector problems)
- throws ModelBuildingException {
- final Parent parent = childModel.getParent();
- final ModelSource candidateSource;
- final Model candidateModel;
- final WorkspaceModelResolver resolver = request.getWorkspaceModelResolver();
- if (resolver == null) {
- candidateSource = getParentPomFile(childModel, childSource);
-
- if (candidateSource == null) {
- return null;
- }
-
- File pomFile = null;
- if (candidateSource instanceof FileModelSource) {
- pomFile = ((FileModelSource) candidateSource).getPomFile();
- }
-
- candidateModel = readModel(candidateSource, pomFile, request, problems);
- } else {
- try {
- candidateModel = resolver.resolveRawModel(parent.getGroupId(), parent.getArtifactId(), parent.getVersion());
- } catch (UnresolvableModelException e) {
- problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.BASE) //
- .setMessage(e.getMessage().toString()).setLocation(parent.getLocation("")).setException(e));
- throw problems.newModelBuildingException();
- }
- if (candidateModel == null) {
- return null;
- }
- candidateSource = new FileModelSource(candidateModel.getPomFile());
- }
-
- //
- // TODO jvz Why isn't all this checking the job of the duty of the workspace resolver, we know that we
- // have a model that is suitable, yet more checks are done here and the one for the version is problematic
- // before because with parents as ranges it will never work in this scenario.
- //
-
- String groupId = candidateModel.getGroupId();
- if (groupId == null && candidateModel.getParent() != null) {
- groupId = candidateModel.getParent().getGroupId();
- }
- String artifactId = candidateModel.getArtifactId();
- String version = candidateModel.getVersion();
- if (version == null && candidateModel.getParent() != null) {
- version = candidateModel.getParent().getVersion();
- }
-
- if (groupId == null || !groupId.equals(parent.getGroupId()) || artifactId == null
- || !artifactId.equals(parent.getArtifactId())) {
- StringBuilder buffer = new StringBuilder(256);
- buffer.append("'parent.relativePath'");
- if (childModel != problems.getRootModel()) {
- buffer.append(" of POM ").append(ModelProblemUtils.toSourceHint(childModel));
- }
- buffer.append(" points at ").append(groupId).append(':').append(artifactId);
- buffer.append(" instead of ").append(parent.getGroupId()).append(':');
- buffer.append(parent.getArtifactId()).append(", please verify your project structure");
-
- problems.setSource(childModel);
- problems.add(new ModelProblemCollectorRequest(Severity.WARNING, Version.BASE)
- .setMessage(buffer.toString()).setLocation(parent.getLocation("")));
- return null;
- }
- if (version != null && parent.getVersion() != null && !version.equals(parent.getVersion())) {
- try {
- VersionRange parentRange = VersionRange.createFromVersionSpec(parent.getVersion());
- if (!parentRange.hasRestrictions()) {
- // the parent version is not a range, we have version skew, drop back to resolution from repo
- return null;
- }
- if (!parentRange.containsVersion(new DefaultArtifactVersion(version))) {
- // version skew drop back to resolution from the repository
- return null;
- }
-
- // Validate versions aren't inherited when using parent ranges the same way as when read externally.
- if (childModel.getVersion() == null) {
- // Message below is checked for in the MNG-2199 core IT.
- problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.V31)
- .setMessage("Version must be a constant").setLocation(childModel.getLocation("")));
-
- } else {
- if (childModel.getVersion().contains("${")) {
- // Message below is checked for in the MNG-2199 core IT.
- problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.V31)
- .setMessage("Version must be a constant")
- .setLocation(childModel.getLocation("version")));
-
- }
- }
-
- // MNG-2199: What else to check here ?
- } catch (InvalidVersionSpecificationException e) {
- // invalid version range, so drop back to resolution from the repository
- return null;
- }
- }
-
- //
- // Here we just need to know that a version is fine to use but this validation we can do in our workspace
- // resolver.
- //
-
- /*
- * if ( version == null || !version.equals( parent.getVersion() ) ) { return null; }
- */
-
- ModelData parentData = new ModelData(candidateSource, candidateModel, groupId, artifactId, version);
-
- return parentData;
- }
-
- private ModelSource getParentPomFile(Model childModel, ModelSource source) {
- if (!(source instanceof ModelSource2)) {
- return null;
- }
-
- String parentPath = childModel.getParent().getRelativePath();
-
- if (parentPath == null || parentPath.length() <= 0) {
- return null;
- }
-
- return ((ModelSource2) source).getRelatedSource(parentPath);
- }
-
- private ModelData readParentExternally(Model childModel, ModelBuildingRequest request,
- DefaultModelProblemCollector problems)
- throws ModelBuildingException {
- problems.setSource(childModel);
-
- Parent parent = childModel.getParent().clone();
-
- String groupId = parent.getGroupId();
- String artifactId = parent.getArtifactId();
- String version = parent.getVersion();
-
- ModelResolver modelResolver = request.getModelResolver();
- Objects.requireNonNull(modelResolver,
- String.format("request.modelResolver cannot be null (parent POM %s and POM %s)",
- ModelProblemUtils.toId(groupId, artifactId, version),
- ModelProblemUtils.toSourceHint(childModel)));
-
- ModelSource modelSource;
- try {
- modelSource = modelResolver.resolveModel(parent);
- } catch (UnresolvableModelException e) {
- // Message below is checked for in the MNG-2199 core IT.
- StringBuilder buffer = new StringBuilder(256);
- buffer.append("Non-resolvable parent POM");
- if (!containsCoordinates(e.getMessage(), groupId, artifactId, version)) {
- buffer.append(' ').append(ModelProblemUtils.toId(groupId, artifactId, version));
- }
- if (childModel != problems.getRootModel()) {
- buffer.append(" for ").append(ModelProblemUtils.toId(childModel));
- }
- buffer.append(": ").append(e.getMessage());
- if (childModel.getProjectDirectory() != null) {
- if (parent.getRelativePath() == null || parent.getRelativePath().length() <= 0) {
- buffer.append(" and 'parent.relativePath' points at no local POM");
- } else {
- buffer.append(" and 'parent.relativePath' points at wrong local POM");
- }
- }
-
- problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.BASE)
- .setMessage(buffer.toString()).setLocation(parent.getLocation("")).setException(e));
- throw problems.newModelBuildingException();
- }
-
- ModelBuildingRequest lenientRequest = request;
- if (request.getValidationLevel() > ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0) {
- lenientRequest = new FilterModelBuildingRequest(request) {
- @Override
- public int getValidationLevel() {
- return ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0;
- }
- };
- }
-
- Model parentModel = readModel(modelSource, null, lenientRequest, problems);
-
- if (!parent.getVersion().equals(version)) {
- if (childModel.getVersion() == null) {
- // Message below is checked for in the MNG-2199 core IT.
- problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.V31)
- .setMessage("Version must be a constant").setLocation(childModel.getLocation("")));
-
- } else {
- if (childModel.getVersion().contains("${")) {
- // Message below is checked for in the MNG-2199 core IT.
- problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.V31)
- .setMessage("Version must be a constant")
- .setLocation(childModel.getLocation("version")));
-
- }
- }
-
- // MNG-2199: What else to check here ?
- }
-
- ModelData parentData = new ModelData(modelSource, parentModel, parent.getGroupId(), parent.getArtifactId(),
- parent.getVersion());
-
- return parentData;
- }
-
- private Model getSuperModel() {
- return superPomProvider.getSuperModel("4.0.0").clone();
- }
-
- @SuppressWarnings("checkstyle:methodlength")
- private void importDependencyManagement(Model model, ModelBuildingRequest request,
- DefaultModelProblemCollector problems, Collection<String> importIds) {
- DependencyManagement depMgmt = model.getDependencyManagement();
-
- if (depMgmt == null) {
- return;
- }
-
- String importing = model.getGroupId() + ':' + model.getArtifactId() + ':' + model.getVersion();
-
- importIds.add(importing);
-
- final WorkspaceModelResolver workspaceResolver = request.getWorkspaceModelResolver();
- final ModelResolver modelResolver = request.getModelResolver();
-
- ModelBuildingRequest importRequest = null;
-
- List<DependencyManagement> importMgmts = null;
-
- for (Iterator<Dependency> it = depMgmt.getDependencies().iterator(); it.hasNext();) {
- Dependency dependency = it.next();
-
- if (!"pom".equals(dependency.getType()) || !"import".equals(dependency.getScope())) {
- continue;
- }
-
- it.remove();
-
- String groupId = dependency.getGroupId();
- String artifactId = dependency.getArtifactId();
- String version = dependency.getVersion();
-
- if (groupId == null || groupId.length() <= 0) {
- problems.add(new ModelProblemCollectorRequest(Severity.ERROR, Version.BASE)
- .setMessage("'dependencyManagement.dependencies.dependency.groupId' for "
- + dependency.getManagementKey() + " is missing.")
- .setLocation(dependency.getLocation("")));
- continue;
- }
- if (artifactId == null || artifactId.length() <= 0) {
- problems.add(new ModelProblemCollectorRequest(Severity.ERROR, Version.BASE)
- .setMessage("'dependencyManagement.dependencies.dependency.artifactId' for "
- + dependency.getManagementKey() + " is missing.")
- .setLocation(dependency.getLocation("")));
- continue;
- }
- if (version == null || version.length() <= 0) {
- problems.add(new ModelProblemCollectorRequest(Severity.ERROR, Version.BASE)
- .setMessage("'dependencyManagement.dependencies.dependency.version' for "
- + dependency.getManagementKey() + " is missing.")
- .setLocation(dependency.getLocation("")));
- continue;
- }
-
- String imported = groupId + ':' + artifactId + ':' + version;
-
- if (importIds.contains(imported)) {
- String message = "The dependencies of type=pom and with scope=import form a cycle: ";
- for (String modelId : importIds) {
- message += modelId + " -> ";
- }
- message += imported;
- problems.add(new ModelProblemCollectorRequest(Severity.ERROR, Version.BASE).setMessage(message));
-
- continue;
- }
-
- DependencyManagement importMgmt = getCache(request.getModelCache(), groupId, artifactId, version,
- ModelCacheTag.IMPORT);
-
- if (importMgmt == null) {
- if (workspaceResolver == null && modelResolver == null) {
- throw new NullPointerException(String.format(
- "request.workspaceModelResolver and request.modelResolver cannot be null"
- + " (parent POM %s and POM %s)",
- ModelProblemUtils.toId(groupId, artifactId, version),
- ModelProblemUtils.toSourceHint(model)));
- }
-
- Model importModel = null;
- if (workspaceResolver != null) {
- try {
- importModel = workspaceResolver.resolveEffectiveModel(groupId, artifactId, version);
- } catch (UnresolvableModelException e) {
- problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.BASE)
- .setMessage(e.getMessage().toString()).setException(e));
- continue;
- }
- }
-
- // no workspace resolver or workspace resolver returned null (i.e. model not in workspace)
- if (importModel == null) {
- final ModelSource importSource;
- try {
- importSource = modelResolver.resolveModel(groupId, artifactId, version);
- } catch (UnresolvableModelException e) {
- StringBuilder buffer = new StringBuilder(256);
- buffer.append("Non-resolvable import POM");
- if (!containsCoordinates(e.getMessage(), groupId, artifactId, version)) {
- buffer.append(' ').append(ModelProblemUtils.toId(groupId, artifactId, version));
- }
- buffer.append(": ").append(e.getMessage());
-
- problems.add(new ModelProblemCollectorRequest(Severity.ERROR, Version.BASE)
- .setMessage(buffer.toString()).setLocation(dependency.getLocation(""))
- .setException(e));
- continue;
- }
-
- if (importRequest == null) {
- importRequest = new DefaultModelBuildingRequest();
- importRequest.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
- importRequest.setModelCache(request.getModelCache());
- importRequest.setSystemProperties(request.getSystemProperties());
- importRequest.setUserProperties(request.getUserProperties());
- importRequest.setLocationTracking(request.isLocationTracking());
- }
-
- importRequest.setModelSource(importSource);
- importRequest.setModelResolver(modelResolver.newCopy());
-
- final ModelBuildingResult importResult;
- try {
- importResult = build(importRequest, importIds);
- } catch (ModelBuildingException e) {
- problems.addAll(e.getProblems());
- continue;
- }
-
- problems.addAll(importResult.getProblems());
-
- importModel = importResult.getEffectiveModel();
- }
-
- importMgmt = importModel.getDependencyManagement();
-
- if (importMgmt == null) {
- importMgmt = new DependencyManagement();
- }
-
- putCache(request.getModelCache(), groupId, artifactId, version, ModelCacheTag.IMPORT, importMgmt);
- }
-
- if (importMgmts == null) {
- importMgmts = new ArrayList<>();
- }
-
- importMgmts.add(importMgmt);
- }
-
- importIds.remove(importing);
-
- dependencyManagementImporter.importManagement(model, importMgmts, request, problems);
- }
-
- private <T> void putCache(ModelCache modelCache, String groupId, String artifactId, String version,
- ModelCacheTag<T> tag, T data) {
- if (modelCache != null) {
- modelCache.put(groupId, artifactId, version, tag.getName(), tag.intoCache(data));
- }
- }
-
- private <T> T getCache(ModelCache modelCache, String groupId, String artifactId, String version,
- ModelCacheTag<T> tag) {
- if (modelCache != null) {
- Object data = modelCache.get(groupId, artifactId, version, tag.getName());
- if (data != null) {
- return tag.fromCache(tag.getType().cast(data));
- }
- }
- return null;
- }
-
- private void fireEvent(Model model, ModelBuildingRequest request, ModelProblemCollector problems,
- ModelBuildingEventCatapult catapult)
- throws ModelBuildingException {
- ModelBuildingListener listener = request.getModelBuildingListener();
-
- if (listener != null) {
- ModelBuildingEvent event = new DefaultModelBuildingEvent(model, request, problems);
-
- catapult.fire(listener, event);
- }
- }
-
- private boolean containsCoordinates(String message, String groupId, String artifactId, String version) {
- return message != null && (groupId == null || message.contains(groupId))
- && (artifactId == null || message.contains(artifactId))
- && (version == null || message.contains(version));
- }
-
- protected boolean hasModelErrors(ModelProblemCollectorExt problems) {
- if (problems instanceof DefaultModelProblemCollector) {
- return ((DefaultModelProblemCollector) problems).hasErrors();
- } else {
- // the default execution path only knows the DefaultModelProblemCollector,
- // only reason it's not in signature is because it's package private
- throw new IllegalStateException();
- }
- }
-
- protected boolean hasFatalErrors(ModelProblemCollectorExt problems) {
- if (problems instanceof DefaultModelProblemCollector) {
- return ((DefaultModelProblemCollector) problems).hasFatalErrors();
- } else {
- // the default execution path only knows the DefaultModelProblemCollector,
- // only reason it's not in signature is because it's package private
- throw new IllegalStateException();
- }
- }
-
-}