You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2022/02/13 08:57:25 UTC
[maven] 02/02: Maven API (draft)
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch mvn4
in repository https://gitbox.apache.org/repos/asf/maven.git
commit 5eea23c2b48fcc5fd5311f2bf2887143d5672a5b
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Sun Feb 13 09:57:04 2022 +0100
Maven API (draft)
---
maven-bom/pom.xml | 5 +
maven-core-api/pom.xml | 41 ++
.../main/java/org/apache/maven/api/Artifact.java | 97 ++++
.../org/apache/maven/api/ArtifactMetadata.java | 24 +
.../main/java/org/apache/maven/api/Dependency.java | 73 +++
.../main/java/org/apache/maven/api/Exclusion.java | 32 ++
.../java/org/apache/maven/api/LocalRepository.java | 29 +
.../src/main/java/org/apache/maven/api/Node.java | 97 ++++
.../java/org/apache/maven/api/NodeVisitor.java | 48 ++
.../main/java/org/apache/maven/api/Project.java | 60 +++
.../org/apache/maven/api/RemoteRepository.java | 25 +
.../main/java/org/apache/maven/api/Repository.java | 43 ++
.../org/apache/maven/api/RepositoryMetadata.java | 24 +
.../main/java/org/apache/maven/api/Session.java | 175 ++++++
.../maven/api/services/ArtifactDeployer.java | 61 +++
.../api/services/ArtifactDeployerException.java | 44 ++
.../api/services/ArtifactDeployerRequest.java | 125 +++++
.../apache/maven/api/services/ArtifactFactory.java | 36 ++
.../api/services/ArtifactFactoryException.java | 36 ++
.../maven/api/services/ArtifactFactoryRequest.java | 183 +++++++
.../maven/api/services/ArtifactInstaller.java | 71 +++
.../api/services/ArtifactInstallerException.java | 43 ++
.../api/services/ArtifactInstallerRequest.java | 103 ++++
.../apache/maven/api/services/ArtifactManager.java | 46 ++
.../maven/api/services/ArtifactResolver.java | 56 ++
.../api/services/ArtifactResolverException.java | 40 ++
.../api/services/ArtifactResolverRequest.java | 101 ++++
.../maven/api/services/ArtifactResolverResult.java | 37 ++
.../org/apache/maven/api/services/BaseRequest.java | 66 +++
.../maven/api/services/DependencyCollector.java | 115 ++++
.../api/services/DependencyCollectorException.java | 42 ++
.../api/services/DependencyCollectorRequest.java | 288 ++++++++++
.../api/services/DependencyCollectorResult.java | 47 ++
.../maven/api/services/DependencyFactory.java | 37 ++
.../api/services/DependencyFactoryException.java | 36 ++
.../api/services/DependencyFactoryRequest.java | 167 ++++++
.../maven/api/services/DependencyResolver.java | 90 ++++
.../api/services/DependencyResolverException.java | 54 ++
.../api/services/DependencyResolverRequest.java | 327 ++++++++++++
.../api/services/DependencyResolverResult.java | 44 ++
.../apache/maven/api/services/ProjectBuilder.java | 57 ++
.../api/services/ProjectBuilderException.java | 37 ++
.../maven/api/services/ProjectBuilderProblem.java | 101 ++++
.../maven/api/services/ProjectBuilderRequest.java | 218 ++++++++
.../maven/api/services/ProjectBuilderResult.java | 76 +++
.../maven/api/services/ProjectBuilderSource.java | 30 ++
.../apache/maven/api/services/ProjectDeployer.java | 68 +++
.../api/services/ProjectDeployerException.java | 37 ++
.../maven/api/services/ProjectDeployerRequest.java | 142 +++++
.../maven/api/services/ProjectInstaller.java | 79 +++
.../api/services/ProjectInstallerException.java | 37 ++
.../api/services/ProjectInstallerRequest.java | 101 ++++
.../apache/maven/api/services/ProjectManager.java | 48 ++
.../org/apache/maven/api/services/Service.java | 27 +
maven-core-impl/pom.xml | 72 +++
.../org/apache/maven/impl/DefaultArtifact.java | 101 ++++
.../apache/maven/impl/DefaultArtifactDeployer.java | 76 +++
.../apache/maven/impl/DefaultArtifactFactory.java | 54 ++
.../maven/impl/DefaultArtifactInstaller.java | 111 ++++
.../apache/maven/impl/DefaultArtifactResolver.java | 73 +++
.../org/apache/maven/impl/DefaultDependency.java | 95 ++++
.../maven/impl/DefaultDependencyCollector.java | 93 ++++
.../maven/impl/DefaultDependencyFactory.java | 56 ++
.../maven/impl/DefaultDependencyResolver.java | 106 ++++
.../apache/maven/impl/DefaultLocalRepository.java | 67 +++
.../java/org/apache/maven/impl/DefaultNode.java | 102 ++++
.../java/org/apache/maven/impl/DefaultProject.java | 172 ++++++
.../apache/maven/impl/DefaultProjectBuilder.java | 258 +++++++++
.../apache/maven/impl/DefaultProjectDeployer.java | 142 +++++
.../apache/maven/impl/DefaultProjectInstaller.java | 77 +++
.../apache/maven/impl/DefaultRemoteRepository.java | 53 ++
.../java/org/apache/maven/impl/DefaultSession.java | 386 ++++++++++++++
.../org/apache/maven/impl/MappedCollection.java | 63 +++
.../java/org/apache/maven/impl/MappedList.java | 48 ++
.../test/java/org/apache/maven/impl/TestApi.java | 105 ++++
.../org/apache/maven/impl/TestArtifactHandler.java | 83 +++
.../apache/maven/impl/TestRepositorySystem.java | 341 ++++++++++++
.../2.0.2/commons-httpclient-2.0.2.jar | Bin 0 -> 225375 bytes
.../2.0.2/commons-httpclient-2.0.2.jar.sha1 | 1 +
.../2.0.2/commons-httpclient-2.0.2.pom | 220 ++++++++
.../2.0.2/commons-httpclient-2.0.2.pom.sha1 | 1 +
.../1.0.3/commons-logging-1.0.3.jar | Bin 0 -> 31605 bytes
.../1.0.3/commons-logging-1.0.3.jar.sha1 | 1 +
.../1.0.3/commons-logging-1.0.3.pom | 31 ++
.../1.0.3/commons-logging-1.0.3.pom.sha1 | 1 +
...logging-1.0.4-javadoc-resources.jar.lastUpdated | 4 +
.../1.0.4/commons-logging-1.0.4.jar | Bin 0 -> 38015 bytes
.../1.0.4/commons-logging-1.0.4.jar.sha1 | 1 +
.../1.0.4/commons-logging-1.0.4.pom | 165 ++++++
.../1.0.4/commons-logging-1.0.4.pom.sha1 | 1 +
.../xml-im-exporter/1.1/xml-im-exporter-1.1.jar | Bin 0 -> 24168 bytes
.../1.1/xml-im-exporter-1.1.jar.sha1 | 1 +
.../xml-im-exporter/1.1/xml-im-exporter-1.1.pom | 8 +
.../1.1/xml-im-exporter-1.1.pom.sha1 | 1 +
.../test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar | Bin 0 -> 153253 bytes
.../resources/repo/jdom/jdom/1.0/jdom-1.0.jar.sha1 | 1 +
.../test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom | 40 ++
.../resources/repo/jdom/jdom/1.0/jdom-1.0.pom.sha1 | 1 +
.../junit-4.13.1-javadoc-resources.jar.lastUpdated | 4 +
.../junit/junit/4.13.1/junit-4.13.1-javadoc.jar | Bin 0 -> 1674093 bytes
.../junit/4.13.1/junit-4.13.1-javadoc.jar.sha1 | 1 +
.../junit/junit/4.13.1/junit-4.13.1-sources.jar | Bin 0 -> 232161 bytes
.../junit/4.13.1/junit-4.13.1-sources.jar.sha1 | 1 +
.../repo/junit/junit/4.13.1/junit-4.13.1.jar | Bin 0 -> 382708 bytes
.../repo/junit/junit/4.13.1/junit-4.13.1.jar.sha1 | 1 +
.../repo/junit/junit/4.13.1/junit-4.13.1.pom | 587 +++++++++++++++++++++
.../repo/junit/junit/4.13.1/junit-4.13.1.pom.sha1 | 1 +
.../repo/org/apache/apache/3/apache-3.pom | 82 +++
.../repo/org/apache/apache/3/apache-3.pom.md5 | 1 +
.../repo/org/apache/apache/3/apache-3.pom.sha1 | 1 +
.../3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar | Bin 0 -> 163984 bytes
.../maven-artifact-3.0-SNAPSHOT.jar.md5 | 1 +
.../maven-artifact-3.0-SNAPSHOT.jar.sha1 | 1 +
.../3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom | 112 ++++
.../maven-artifact-3.0-SNAPSHOT.pom.md5 | 1 +
.../maven-artifact-3.0-SNAPSHOT.pom.sha1 | 1 +
.../test/test-extension/1/test-extension-1.jar | Bin 0 -> 4208 bytes
.../test/test-extension/1/test-extension-1.pom | 73 +++
.../test/test-extension/1/test-extension-1.pom.md5 | 1 +
.../test-extension/1/test-extension-1.pom.sha1 | 1 +
.../1/test-lifecycle-and-artifactHandler-1.jar | Bin 0 -> 2582 bytes
.../1/test-lifecycle-and-artifactHandler-1.pom | 44 ++
.../1/test-lifecycle-and-artifactHandler-1.pom.md5 | 1 +
.../test-lifecycle-and-artifactHandler-1.pom.sha1 | 1 +
.../apache/maven/maven-parent/4/maven-parent-4.pom | 304 +++++++++++
.../maven/maven-parent/4/maven-parent-4.pom.md5 | 1 +
.../maven/maven-parent/4/maven-parent-4.pom.sha1 | 1 +
.../apache/maven/maven-parent/5/maven-parent-5.pom | 466 ++++++++++++++++
.../maven/maven-parent/5/maven-parent-5.pom.md5 | 1 +
.../maven/maven-parent/5/maven-parent-5.pom.sha1 | 1 +
.../1.0-beta-2/wagon-provider-api-1.0-beta-2.jar | Bin 0 -> 46326 bytes
.../wagon-provider-api-1.0-beta-2.jar.md5 | 1 +
.../wagon-provider-api-1.0-beta-2.jar.sha1 | 1 +
.../1.0-beta-2/wagon-provider-api-1.0-beta-2.pom | 21 +
.../wagon-provider-api-1.0-beta-2.pom.md5 | 1 +
.../wagon-provider-api-1.0-beta-2.pom.sha1 | 1 +
.../1.0-beta-2/wagon-providers-1.0-beta-2.pom | 51 ++
.../1.0-beta-2/wagon-providers-1.0-beta-2.pom.md5 | 1 +
.../1.0-beta-2/wagon-providers-1.0-beta-2.pom.sha1 | 1 +
.../1.0-beta-2/wagon-webdav-1.0-beta-2.jar | Bin 0 -> 17297 bytes
.../1.0-beta-2/wagon-webdav-1.0-beta-2.jar.md5 | 1 +
.../1.0-beta-2/wagon-webdav-1.0-beta-2.jar.sha1 | 1 +
.../1.0-beta-2/wagon-webdav-1.0-beta-2.pom | 50 ++
.../1.0-beta-2/wagon-webdav-1.0-beta-2.pom.md5 | 1 +
.../1.0-beta-2/wagon-webdav-1.0-beta-2.pom.sha1 | 1 +
.../wagon/wagon/1.0-beta-2/wagon-1.0-beta-2.pom | 170 ++++++
.../wagon/1.0-beta-2/wagon-1.0-beta-2.pom.md5 | 1 +
.../wagon/1.0-beta-2/wagon-1.0-beta-2.pom.sha1 | 1 +
.../plexus-active-collections-1.0-beta-1.jar | Bin 0 -> 15961 bytes
.../plexus-active-collections-1.0-beta-1.jar.md5 | 1 +
.../plexus-active-collections-1.0-beta-1.jar.sha1 | 1 +
.../plexus-active-collections-1.0-beta-1.pom | 51 ++
.../plexus-active-collections-1.0-beta-1.pom.md5 | 1 +
.../plexus-active-collections-1.0-beta-1.pom.sha1 | 1 +
.../plexus-classworlds-1.2-alpha-10.jar | Bin 0 -> 42472 bytes
.../plexus-classworlds-1.2-alpha-10.jar.md5 | 1 +
.../plexus-classworlds-1.2-alpha-10.jar.sha1 | 1 +
.../plexus-classworlds-1.2-alpha-10.pom | 94 ++++
.../plexus-classworlds-1.2-alpha-10.pom.md5 | 1 +
.../plexus-classworlds-1.2-alpha-10.pom.sha1 | 1 +
.../1.2-alpha-7/plexus-classworlds-1.2-alpha-7.jar | Bin 0 -> 42636 bytes
.../plexus-classworlds-1.2-alpha-7.jar.md5 | 1 +
.../plexus-classworlds-1.2-alpha-7.jar.sha1 | 1 +
.../1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom | 78 +++
.../plexus-classworlds-1.2-alpha-7.pom.md5 | 1 +
.../plexus-classworlds-1.2-alpha-7.pom.sha1 | 1 +
.../plexus-component-api-1.0-alpha-16.jar | Bin 0 -> 33149 bytes
.../plexus-component-api-1.0-alpha-16.jar.md5 | 1 +
.../plexus-component-api-1.0-alpha-16.jar.sha1 | 1 +
.../plexus-component-api-1.0-alpha-16.pom | 63 +++
.../plexus-component-api-1.0-alpha-16.pom.md5 | 1 +
.../plexus-component-api-1.0-alpha-16.pom.sha1 | 1 +
.../plexus-component-api-1.0-alpha-32.jar | Bin 0 -> 36108 bytes
.../plexus-component-api-1.0-alpha-32.jar.md5 | 1 +
.../plexus-component-api-1.0-alpha-32.jar.sha1 | 1 +
.../plexus-component-api-1.0-alpha-32.pom | 61 +++
.../plexus-component-api-1.0-alpha-32.pom.md5 | 1 +
.../plexus-component-api-1.0-alpha-32.pom.sha1 | 1 +
.../1.1.6/plexus-components-1.1.6.pom | 60 +++
.../1.1.6/plexus-components-1.1.6.pom.md5 | 1 +
.../1.1.6/plexus-components-1.1.6.pom.sha1 | 1 +
.../plexus-container-default-1.0-alpha-16.jar | Bin 0 -> 210679 bytes
.../plexus-container-default-1.0-alpha-16.jar.md5 | 1 +
.../plexus-container-default-1.0-alpha-16.jar.sha1 | 1 +
.../plexus-container-default-1.0-alpha-16.pom | 56 ++
.../plexus-container-default-1.0-alpha-16.pom.md5 | 1 +
.../plexus-container-default-1.0-alpha-16.pom.sha1 | 1 +
.../plexus-container-default-1.0-alpha-32.jar | Bin 0 -> 238880 bytes
.../plexus-container-default-1.0-alpha-32.jar.md5 | 1 +
.../plexus-container-default-1.0-alpha-32.jar.sha1 | 1 +
.../plexus-container-default-1.0-alpha-32.pom | 98 ++++
.../plexus-container-default-1.0-alpha-32.pom.md5 | 1 +
.../plexus-container-default-1.0-alpha-32.pom.sha1 | 1 +
.../plexus-containers-1.0-alpha-16.pom | 49 ++
.../plexus-containers-1.0-alpha-16.pom.md5 | 1 +
.../plexus-containers-1.0-alpha-16.pom.sha1 | 1 +
.../plexus-containers-1.0-alpha-32.pom | 49 ++
.../plexus-containers-1.0-alpha-32.pom.md5 | 1 +
.../plexus-containers-1.0-alpha-32.pom.sha1 | 1 +
.../plexus-utils/1.0.4/plexus-utils-1.0.4.jar | Bin 0 -> 163803 bytes
.../plexus-utils/1.0.4/plexus-utils-1.0.4.jar.sha1 | 1 +
.../plexus-utils/1.0.4/plexus-utils-1.0.4.pom | 235 +++++++++
.../plexus-utils/1.0.4/plexus-utils-1.0.4.pom.sha1 | 1 +
.../plexus/plexus-utils/1.1/plexus-utils-1.1.jar | Bin 0 -> 168568 bytes
.../plexus-utils/1.1/plexus-utils-1.1.jar.md5 | 1 +
.../plexus-utils/1.1/plexus-utils-1.1.jar.sha1 | 1 +
.../plexus/plexus-utils/1.1/plexus-utils-1.1.pom | 27 +
.../plexus-utils/1.1/plexus-utils-1.1.pom.md5 | 1 +
.../plexus-utils/1.1/plexus-utils-1.1.pom.sha1 | 1 +
.../plexus-utils/1.4.5/plexus-utils-1.4.5.jar | Bin 0 -> 205043 bytes
.../plexus-utils/1.4.5/plexus-utils-1.4.5.jar.md5 | 1 +
.../plexus-utils/1.4.5/plexus-utils-1.4.5.jar.sha1 | 1 +
.../plexus-utils/1.4.5/plexus-utils-1.4.5.pom | 61 +++
.../plexus-utils/1.4.5/plexus-utils-1.4.5.pom.md5 | 1 +
.../plexus-utils/1.4.5/plexus-utils-1.4.5.pom.sha1 | 1 +
.../plexus/plexus/1.0.10/plexus-1.0.10.pom | 273 ++++++++++
.../plexus/plexus/1.0.10/plexus-1.0.10.pom.md5 | 1 +
.../plexus/plexus/1.0.10/plexus-1.0.10.pom.sha1 | 1 +
.../plexus/plexus/1.0.11/plexus-1.0.11.pom | 308 +++++++++++
.../plexus/plexus/1.0.11/plexus-1.0.11.pom.md5 | 1 +
.../plexus/plexus/1.0.11/plexus-1.0.11.pom.sha1 | 1 +
.../codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom | 205 +++++++
.../plexus/plexus/1.0.4/plexus-1.0.4.pom.md5 | 1 +
.../plexus/plexus/1.0.4/plexus-1.0.4.pom.sha1 | 1 +
.../codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom | 259 +++++++++
.../plexus/plexus/1.0.8/plexus-1.0.8.pom.md5 | 1 +
.../plexus/plexus/1.0.8/plexus-1.0.8.pom.sha1 | 1 +
.../codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom | 257 +++++++++
.../plexus/plexus/1.0.9/plexus-1.0.9.pom.md5 | 1 +
.../plexus/plexus/1.0.9/plexus-1.0.9.pom.sha1 | 1 +
...rest-core-1.3-javadoc-resources.jar.lastUpdated | 4 +
.../1.3/hamcrest-core-1.3-javadoc.jar | Bin 0 -> 242519 bytes
.../1.3/hamcrest-core-1.3-javadoc.jar.sha1 | 1 +
.../1.3/hamcrest-core-1.3-sources.jar | Bin 0 -> 32624 bytes
.../1.3/hamcrest-core-1.3-sources.jar.sha1 | 1 +
.../hamcrest-core/1.3/hamcrest-core-1.3.jar | Bin 0 -> 45024 bytes
.../hamcrest-core/1.3/hamcrest-core-1.3.jar.sha1 | 1 +
.../hamcrest-core/1.3/hamcrest-core-1.3.pom | 18 +
.../hamcrest-core/1.3/hamcrest-core-1.3.pom.sha1 | 1 +
.../hamcrest-parent/1.3/hamcrest-parent-1.3.pom | 72 +++
.../1.3/hamcrest-parent-1.3.pom.sha1 | 1 +
.../slide-webdavlib/2.1/slide-webdavlib-2.1.jar | Bin 0 -> 172727 bytes
.../2.1/slide-webdavlib-2.1.jar.md5 | 1 +
.../2.1/slide-webdavlib-2.1.jar.sha1 | 1 +
.../slide-webdavlib/2.1/slide-webdavlib-2.1.pom | 23 +
.../2.1/slide-webdavlib-2.1.pom.md5 | 1 +
.../2.1/slide-webdavlib-2.1.pom.sha1 | 1 +
pom.xml | 2 +
248 files changed, 11798 insertions(+)
diff --git a/maven-bom/pom.xml b/maven-bom/pom.xml
index 814fbcb..c3401df 100644
--- a/maven-bom/pom.xml
+++ b/maven-bom/pom.xml
@@ -96,6 +96,11 @@ under the License.
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
+ <artifactId>maven-core-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
<artifactId>maven-model-builder</artifactId>
<version>${project.version}</version>
</dependency>
diff --git a/maven-core-api/pom.xml b/maven-core-api/pom.xml
new file mode 100644
index 0000000..853b64a
--- /dev/null
+++ b/maven-core-api/pom.xml
@@ -0,0 +1,41 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+ 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven</artifactId>
+ <version>4.0.0-alpha-1-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>maven-core-api</artifactId>
+ <name>Apache Maven Core API</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.google.code.findbugs</groupId>
+ <artifactId>jsr305</artifactId>
+ <version>3.0.2</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Artifact.java b/maven-core-api/src/main/java/org/apache/maven/api/Artifact.java
new file mode 100644
index 0000000..6ef6856
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Artifact.java
@@ -0,0 +1,97 @@
+package org.apache.maven.api;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.annotation.concurrent.Immutable;
+
+import java.nio.file.Path;
+import java.util.Optional;
+
+@Immutable
+public interface Artifact
+{
+
+ /**
+ * The groupId of the artifact.
+ *
+ * @return The groupId.
+ */
+ @Nonnull
+ String getGroupId();
+
+ /**
+ * The artifactId of the artifact.
+ *
+ * @return The artifactId.
+ */
+ @Nonnull
+ String getArtifactId();
+
+ /**
+ * The version of the artifact.
+ *
+ * @return The version.
+ */
+ @Nonnull
+ String getVersion();
+
+ /**
+ * The file-extension of the artifact.
+ *
+ * @return The extension.
+ */
+ @Nonnull
+ String getExtension();
+
+ /**
+ * The classifier of the artifact.
+ *
+ * @return The classifier.
+ */
+ @Nonnull
+ String getClassifier();
+
+ /**
+ * Gets the base version of this artifact, for example "1.0-SNAPSHOT". In contrast to the {@link #getVersion()}, the
+ * base version will always refer to the unresolved meta version.
+ *
+ * @return The base version, never {@code null}.
+ */
+ @Nonnull
+ String getBaseVersion();
+
+ /**
+ * Determines whether this artifact uses a snapshot version.
+ *
+ * @return {@code true} if the artifact is a snapshot, {@code false} otherwise.
+ */
+ boolean isSnapshot();
+
+ /**
+ * Gets the file of this artifact. Note that only resolved artifacts have a file associated with them. In general,
+ * callers must not assume any relationship between an artifact's filename and its coordinates.
+ *
+ * @return The file or {@link Optional#empty()} if the artifact isn't resolved.
+ */
+ @Nonnull
+ Optional<Path> getPath();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java b/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
new file mode 100644
index 0000000..6cee8b6
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
@@ -0,0 +1,24 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+public interface ArtifactMetadata
+{
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Dependency.java b/maven-core-api/src/main/java/org/apache/maven/api/Dependency.java
new file mode 100644
index 0000000..b0e0fe3
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Dependency.java
@@ -0,0 +1,73 @@
+package org.apache.maven.api;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+
+import java.util.Collection;
+
+@Immutable
+public interface Dependency
+{
+ @Nonnull
+ Artifact getArtifact();
+
+ String getScope();
+
+ @Nullable
+ Boolean getOptional();
+
+ @Nonnull
+ Collection<Exclusion> getExclusions();
+
+ @Nonnull
+ default String getGroupId()
+ {
+ return getArtifact().getGroupId();
+ }
+
+ @Nonnull
+ default String getArtifactId()
+ {
+ return getArtifact().getArtifactId();
+ }
+
+ @Nonnull
+ default String getVersion()
+ {
+ return getArtifact().getVersion();
+ }
+
+ @Nonnull
+ default String getType()
+ {
+ // TODO
+ throw new UnsupportedOperationException( "Not implemented yet" );
+ }
+
+ @Nonnull
+ default String getClassifier()
+ {
+ return getArtifact().getClassifier();
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Exclusion.java b/maven-core-api/src/main/java/org/apache/maven/api/Exclusion.java
new file mode 100644
index 0000000..c87b99b
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Exclusion.java
@@ -0,0 +1,32 @@
+package org.apache.maven.api;
+
+/*
+ * 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 javax.annotation.Nullable;
+
+public interface Exclusion
+{
+ @Nullable
+ String getGroupId();
+
+ @Nullable
+ String getArtifactId();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/LocalRepository.java b/maven-core-api/src/main/java/org/apache/maven/api/LocalRepository.java
new file mode 100644
index 0000000..d113567
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/LocalRepository.java
@@ -0,0 +1,29 @@
+package org.apache.maven.api;
+
+/*
+ * 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.nio.file.Path;
+
+public interface LocalRepository extends Repository
+{
+
+ Path getPath();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Node.java b/maven-core-api/src/main/java/org/apache/maven/api/Node.java
new file mode 100644
index 0000000..6b42a0a
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Node.java
@@ -0,0 +1,97 @@
+package org.apache.maven.api;
+
+/*
+ * 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 javax.annotation.concurrent.Immutable;
+
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+/**
+ * Represents a dependency node within a Maven project's dependency collector.
+ *
+ * @author Pim Moerenhout
+ * @since 0.12
+ */
+@Immutable
+public interface Node
+{
+ /**
+ * @return artifact for this node
+ */
+ Artifact getArtifact();
+
+ /**
+ * @return dependency for this node
+ */
+ Dependency getDependency();
+
+ /**
+ * Gets the child nodes of this node.
+ *
+ * @return the child nodes of this node, never {@code null}
+ */
+ List<Node> getChildren();
+
+ /**
+ * @return repositories of this node
+ */
+ List<Repository> getRemoteRepositories();
+
+ /**
+ * @return true for an optional dependency.
+ */
+ Boolean getOptional();
+
+ /**
+ * @return The scope on the dependency.
+ */
+ String getScope();
+
+ /**
+ * Traverses this node and potentially its children using the specified visitor.
+ *
+ * @param visitor The visitor to call back, must not be {@code null}.
+ * @return {@code true} to visit siblings nodes of this node as well, {@code false} to skip siblings.
+ */
+ boolean accept( NodeVisitor visitor );
+
+ /**
+ * Returns a new tree starting at this node, filtering the children.
+ * Note that this node will not be filtered and only the children
+ * and its descendant will be checked.
+ *
+ * @param filter the filter to apply
+ * @return a new filtered graph
+ */
+ Node filter( Predicate<Node> filter );
+
+ /**
+ * Obtain a Stream containing this node and all its descendant.
+ *
+ * @return a stream containing this node and its descendant
+ */
+ default Stream<Node> stream()
+ {
+ return Stream.concat( Stream.of( this ), getChildren().stream().flatMap( Node::stream ) );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/NodeVisitor.java b/maven-core-api/src/main/java/org/apache/maven/api/NodeVisitor.java
new file mode 100644
index 0000000..102c13c
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/NodeVisitor.java
@@ -0,0 +1,48 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+
+/**
+ * Defines a hierarchical visitor for collecting dependency node trees.
+ *
+ * @author Pim Moerenhout
+ * @since 0.12
+ */
+public interface NodeVisitor
+{
+ /**
+ * Starts the visit to the specified dependency node.
+ *
+ * @param node the dependency node to visit
+ * @return <code>true</code> to visit the specified dependency node's children, <code>false</code> to skip the
+ * specified dependency node's children and proceed to its next sibling
+ */
+ boolean enter( Node node );
+
+ /**
+ * Ends the visit to the specified dependency node.
+ *
+ * @param node the dependency node to visit
+ * @return <code>true</code> to visit the specified dependency node's next sibling, <code>false</code> to skip the
+ * specified dependency node's next siblings and proceed to its parent
+ */
+ boolean leave( Node node );
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Project.java b/maven-core-api/src/main/java/org/apache/maven/api/Project.java
new file mode 100644
index 0000000..037f718
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Project.java
@@ -0,0 +1,60 @@
+package org.apache.maven.api;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+import java.util.List;
+
+/**
+ * Interface representing a Maven project.
+ */
+public interface Project
+{
+
+ @Nonnull
+ String getGroupId();
+
+ @Nonnull
+ String getArtifactId();
+
+ @Nonnull
+ String getVersion();
+
+ @Nonnull
+ String getPackaging();
+
+ @Nonnull
+ Artifact getArtifact();
+
+ @Nonnull
+ Object getModel();
+
+ @Nonnull
+ Path getPomPath();
+
+ @Nonnull
+ List<Dependency> getDependencies();
+
+ @Nonnull
+ List<Dependency> getManagedDependencies();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java b/maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java
new file mode 100644
index 0000000..6b8c3ea
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java
@@ -0,0 +1,25 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+public interface RemoteRepository extends Repository
+{
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Repository.java b/maven-core-api/src/main/java/org/apache/maven/api/Repository.java
new file mode 100644
index 0000000..dd7ac92
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Repository.java
@@ -0,0 +1,43 @@
+package org.apache.maven.api;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+public interface Repository
+{
+
+ /**
+ * Gets the identifier of this repository.
+ *
+ * @return The (case-sensitive) identifier, never {@code null}.
+ */
+ @Nonnull
+ String getId();
+
+ /**
+ * Gets the type of the repository, for example "default".
+ *
+ * @return The (case-sensitive) type of the repository, never {@code null}.
+ */
+ @Nonnull
+ String getType();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/RepositoryMetadata.java b/maven-core-api/src/main/java/org/apache/maven/api/RepositoryMetadata.java
new file mode 100644
index 0000000..2ff856d
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/RepositoryMetadata.java
@@ -0,0 +1,24 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+public interface RepositoryMetadata extends ArtifactMetadata
+{
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Session.java b/maven-core-api/src/main/java/org/apache/maven/api/Session.java
new file mode 100644
index 0000000..6fbc7cd
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Session.java
@@ -0,0 +1,175 @@
+package org.apache.maven.api;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.annotation.concurrent.ThreadSafe;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.apache.maven.api.services.ArtifactDeployer;
+import org.apache.maven.api.services.ArtifactDeployerException;
+import org.apache.maven.api.services.ArtifactFactory;
+import org.apache.maven.api.services.ArtifactFactoryException;
+import org.apache.maven.api.services.ArtifactInstaller;
+import org.apache.maven.api.services.ArtifactInstallerException;
+import org.apache.maven.api.services.ArtifactResolver;
+import org.apache.maven.api.services.ArtifactResolverException;
+import org.apache.maven.api.services.ArtifactResolverResult;
+import org.apache.maven.api.services.DependencyCollector;
+import org.apache.maven.api.services.DependencyCollectorException;
+import org.apache.maven.api.services.DependencyCollectorResult;
+import org.apache.maven.api.services.DependencyFactory;
+import org.apache.maven.api.services.DependencyResolver;
+import org.apache.maven.api.services.DependencyResolverException;
+import org.apache.maven.api.services.DependencyResolverResult;
+import org.apache.maven.api.services.Service;
+
+/**
+ * The session to install / deploy / resolve artifacts and dependencies.
+ */
+@ThreadSafe
+public interface Session
+{
+
+ @Nonnull
+ LocalRepository getLocalRepository();
+
+ @Nonnull
+ List<RemoteRepository> getRemoteRepositories();
+
+ /**
+ * Retrieves the service for the interface
+ *
+ * @throws NoSuchElementException if the service could not be found
+ */
+ @Nonnull
+ <T extends Service> T getService( Class<T> clazz ) throws NoSuchElementException;
+
+ /**
+ * Creates a derived session using the given local repository.
+ *
+ * @param localRepository the new local repository
+ * @return the derived session
+ */
+ @Nonnull
+ Session withLocalRepository( @Nonnull LocalRepository localRepository );
+
+ /**
+ * Creates a derived session using the given remote repositories.
+ *
+ * @param repositories the new list of remote repositories
+ * @return the derived session
+ */
+ @Nonnull
+ Session withRemoteRepositories( @Nonnull List<RemoteRepository> repositories );
+
+ /**
+ * Shortcut for <code>getService(ArtifactFactory.class).create(...)</code>
+ */
+ default Artifact createArtifact( String groupId, String artifactId, String version, String type )
+ throws ArtifactFactoryException, IllegalArgumentException
+ {
+ return getService( ArtifactFactory.class )
+ .create( this, groupId, artifactId, version, type );
+ }
+
+ /**
+ * Shortcut for <code>getService(ArtifactResolver.class).resolve(...)</code>
+ */
+ default ArtifactResolverResult resolveArtifact( Artifact artifact )
+ throws ArtifactResolverException, IllegalArgumentException
+ {
+ return getService( ArtifactResolver.class )
+ .resolve( this, artifact );
+ }
+
+ /**
+ * Shortcut for <code>getService(ArtifactResolver.class).install(...)</code>
+ */
+ default void installArtifact( Artifact... artifacts )
+ throws ArtifactInstallerException, IllegalArgumentException
+ {
+ getService( ArtifactInstaller.class )
+ .install( this, Arrays.asList( artifacts ) );
+ }
+
+ /**
+ * Shortcut for <code>getService(ArtifactResolver.class).deploy(...)</code>
+ */
+ default void deployArtifact( RemoteRepository repository, Artifact... artifacts )
+ throws ArtifactDeployerException, IllegalArgumentException
+ {
+ getService( ArtifactDeployer.class )
+ .deploy( this, repository, Arrays.asList( artifacts ) );
+ }
+
+ /**
+ * Shortcut for <code>getService(DependencyFactory.class).create(...)</code>
+ */
+ default Dependency createDependency( Artifact artifact )
+ {
+ return getService( DependencyFactory.class )
+ .create( this, artifact );
+ }
+
+ /**
+ * Shortcut for <code>getService(DependencyCollector.class).collect(...)</code>
+ */
+ default DependencyCollectorResult collectDependencies( Artifact artifact )
+ throws DependencyCollectorException, IllegalArgumentException
+ {
+ return getService( DependencyCollector.class )
+ .collect( this, artifact );
+ }
+
+ /**
+ * Shortcut for <code>getService(DependencyCollector.class).collect(...)</code>
+ */
+ default DependencyCollectorResult collectDependencies( Project project )
+ throws DependencyCollectorException, IllegalArgumentException
+ {
+ return getService( DependencyCollector.class )
+ .collect( this, project );
+ }
+
+ /**
+ * Shortcut for <code>getService(DependencyCollector.class).collect(...)</code>
+ */
+ default DependencyCollectorResult collectDependencies( Dependency dependency )
+ throws DependencyCollectorException, IllegalArgumentException
+ {
+ return getService( DependencyCollector.class )
+ .collect( this, dependency );
+ }
+
+ /**
+ * Shortcut for <code>getService(DependencyResolver.class).resolve(...)</code>
+ */
+ default DependencyResolverResult resolveDependencies( Dependency dependency )
+ throws DependencyResolverException, IllegalArgumentException
+ {
+ return getService( DependencyResolver.class )
+ .resolve( this, dependency, null );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployer.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployer.java
new file mode 100644
index 0000000..c78f1ad
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployer.java
@@ -0,0 +1,61 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.Collection;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.RemoteRepository;
+
+/**
+ *
+ */
+public interface ArtifactDeployer extends Service
+{
+
+ /**
+ * @param request {@link ArtifactDeployerRequest}
+ * @throws ArtifactDeployerException in case of an error.
+ * @throws IllegalArgumentException in case of parameter <code>request</code> is <code>null</code> or parameter
+ * <code>mavenArtifacts</code> is <code>null</code> or <code>mavenArtifacts.isEmpty()</code> is
+ * <code>true</code>.
+ */
+ void deploy( ArtifactDeployerRequest request )
+ throws ArtifactDeployerException, IllegalArgumentException;
+
+ /**
+ * @param session the repository session
+ * @param repository the repository to deploy to
+ * @param artifacts the collection of artifacts to deploy
+ * @throws ArtifactDeployerException in case of an error.
+ * @throws IllegalArgumentException in case of parameter <code>request</code> is <code>null</code> or parameter
+ * <code>artifacts</code> is <code>null</code> or <code>artifacts.isEmpty()</code> is
+ * <code>true</code>.
+ */
+ default void deploy( Session session,
+ RemoteRepository repository,
+ Collection<Artifact> artifacts )
+ throws ArtifactDeployerException, IllegalArgumentException
+ {
+ deploy( ArtifactDeployerRequest.build( session, repository, artifacts ) );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerException.java
new file mode 100644
index 0000000..a5ac23a
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerException.java
@@ -0,0 +1,44 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * An artifact could not correctly being deployed.
+ *
+ */
+public class ArtifactDeployerException
+ extends Exception
+{
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 7421964724059077698L;
+
+ /**
+ * @param message The message of the error.
+ * @param e {@link Exception}
+ */
+ public ArtifactDeployerException( String message, Exception e )
+ {
+ super( message, e );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java
new file mode 100644
index 0000000..f3363eb
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java
@@ -0,0 +1,125 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.util.Collection;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.RemoteRepository;
+
+/**
+ * A request for deploying one or more artifacts to a remote repository.
+ */
+public interface ArtifactDeployerRequest
+{
+
+ @Nonnull
+ Session getSession();
+
+ @Nonnull
+ RemoteRepository getRepository();
+
+ @Nonnull
+ Collection<Artifact> getArtifacts();
+
+ @Nonnull
+ static ArtifactDeployerRequestBuilder builder()
+ {
+ return new ArtifactDeployerRequestBuilder();
+ }
+
+ @Nonnull
+ static ArtifactDeployerRequest build( Session session, RemoteRepository repository, Collection<Artifact> artifacts )
+ {
+ return builder()
+ .session( session )
+ .repository( repository )
+ .artifacts( artifacts )
+ .build();
+ }
+
+ class ArtifactDeployerRequestBuilder
+ {
+ Session session;
+ RemoteRepository repository;
+ Collection<Artifact> artifacts;
+
+ @Nonnull
+ public ArtifactDeployerRequestBuilder session( Session session )
+ {
+ this.session = session;
+ return this;
+ }
+
+ @Nonnull
+ public ArtifactDeployerRequestBuilder repository( RemoteRepository repository )
+ {
+ this.repository = repository;
+ return this;
+ }
+
+ public ArtifactDeployerRequestBuilder artifacts( Collection<Artifact> artifacts )
+ {
+ this.artifacts = artifacts;
+ return this;
+ }
+
+ @Nonnull
+ public ArtifactDeployerRequest build()
+ {
+ return new DefaultArtifactDeployerRequest( session, repository, artifacts );
+ }
+
+ private static class DefaultArtifactDeployerRequest extends BaseRequest
+ implements ArtifactDeployerRequest
+ {
+
+ private final RemoteRepository repository;
+ private final Collection<Artifact> artifacts;
+
+ DefaultArtifactDeployerRequest( @Nonnull Session session,
+ @Nonnull RemoteRepository repository,
+ @Nonnull Collection<Artifact> artifacts )
+ {
+ super( session );
+ this.repository = requireNonNull( repository, "repository" );
+ this.artifacts = unmodifiable( artifacts, "artifacts" );
+ }
+
+ @Nonnull
+ @Override
+ public RemoteRepository getRepository()
+ {
+ return repository;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<Artifact> getArtifacts()
+ {
+ return artifacts;
+ }
+ }
+
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactory.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactory.java
new file mode 100644
index 0000000..2459409
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactory.java
@@ -0,0 +1,36 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.api.Session;
+import org.apache.maven.api.Artifact;
+
+public interface ArtifactFactory extends Service
+{
+
+ Artifact create( ArtifactFactoryRequest request )
+ throws ArtifactFactoryException, IllegalArgumentException;
+
+ default Artifact create( Session session, String groupId, String artifactId, String version, String type )
+ throws ArtifactFactoryException, IllegalArgumentException
+ {
+ return create( ArtifactFactoryRequest.build( session, groupId, artifactId, version, type ) );
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryException.java
new file mode 100644
index 0000000..ee2f7a0
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryException.java
@@ -0,0 +1,36 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+public class ArtifactFactoryException
+ extends RuntimeException
+{
+
+ public ArtifactFactoryException( String message )
+ {
+ super( message );
+ }
+
+ public ArtifactFactoryException( String message, Throwable cause )
+ {
+ super( message, cause );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java
new file mode 100644
index 0000000..4bdf288
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java
@@ -0,0 +1,183 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.apache.maven.api.Session;
+
+public interface ArtifactFactoryRequest
+{
+
+ @Nonnull
+ Session getSession();
+
+ String getGroupId();
+
+ String getArtifactId();
+
+ String getVersion();
+
+ String getType();
+
+ String getExtension();
+
+ String getClassifier();
+
+ static ArtifactFactoryRequest build( Session session, String groupId, String artifactId,
+ String version, String type )
+ {
+ return ArtifactFactoryRequest.builder()
+ .session( session )
+ .groupId( groupId )
+ .artifactId( artifactId )
+ .version( version )
+ .type( type )
+ .build();
+ }
+
+ static ArtifactFactoryRequestBuilder builder()
+ {
+ return new ArtifactFactoryRequestBuilder();
+ }
+
+ class ArtifactFactoryRequestBuilder
+ {
+ private Session session;
+ private String groupId;
+ private String artifactId;
+ private String version;
+ private String type;
+ private String extension;
+ private String classifier;
+
+ public ArtifactFactoryRequestBuilder session( Session session )
+ {
+ this.session = session;
+ return this;
+ }
+
+ public ArtifactFactoryRequestBuilder groupId( String groupId )
+ {
+ this.groupId = groupId;
+ return this;
+ }
+
+ public ArtifactFactoryRequestBuilder artifactId( String artifactId )
+ {
+ this.artifactId = artifactId;
+ return this;
+ }
+
+ public ArtifactFactoryRequestBuilder version( String version )
+ {
+ this.version = version;
+ return this;
+ }
+
+ public ArtifactFactoryRequestBuilder type( String type )
+ {
+ this.type = type;
+ return this;
+ }
+
+ public ArtifactFactoryRequestBuilder extension( String extension )
+ {
+ this.extension = extension;
+ return this;
+ }
+
+ public ArtifactFactoryRequestBuilder classifier( String classifier )
+ {
+ this.classifier = classifier;
+ return this;
+ }
+
+ public ArtifactFactoryRequest build()
+ {
+ return new DefaultArtifactFactoryRequest( session, groupId, artifactId,
+ version, type, extension, classifier );
+ }
+
+ private static class DefaultArtifactFactoryRequest extends BaseRequest implements ArtifactFactoryRequest
+ {
+ private final String groupId;
+ private final String artifactId;
+ private final String version;
+ private final String type;
+ private final String extension;
+ private final String classifier;
+
+ DefaultArtifactFactoryRequest( @Nonnull Session session,
+ String groupId,
+ String artifactId,
+ String version,
+ String type,
+ String extension,
+ String classifier )
+ {
+ super( session );
+ this.groupId = groupId;
+ this.artifactId = artifactId;
+ this.version = version;
+ this.type = type;
+ this.extension = extension;
+ this.classifier = classifier;
+ }
+
+ @Override
+ public String getGroupId()
+ {
+ return groupId;
+ }
+
+ @Override
+ public String getArtifactId()
+ {
+ return artifactId;
+ }
+
+ @Override
+ public String getVersion()
+ {
+ return version;
+ }
+
+ @Override
+ public String getType()
+ {
+ return type;
+ }
+
+ @Override
+ public String getExtension()
+ {
+ return extension;
+ }
+
+ @Override
+ public String getClassifier()
+ {
+ return classifier;
+ }
+ }
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java
new file mode 100644
index 0000000..b440a28
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java
@@ -0,0 +1,71 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.Collection;
+import java.util.Collections;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+/**
+ * @author Robert Scholte
+ */
+public interface ArtifactInstaller extends Service
+{
+ /**
+ * @param request {@link ArtifactInstallerRequest}
+ * @throws ArtifactInstallerException in case of an error.
+ * @throws IllegalArgumentException in case <code>request</code> is <code>null</code>.
+ */
+ void install( ArtifactInstallerRequest request )
+ throws ArtifactInstallerException, IllegalArgumentException;
+
+ /**
+ * @param session the repository session
+ * @param artifact the {@link Artifact} to install
+ * @throws ArtifactInstallerException In case of an error which can be the a given artifact can not be found or the
+ * installation has failed.
+ * @throws IllegalArgumentException in case of parameter <code>session</code> is <code>null</code> or
+ * <code>artifact</code> is <code>null</code>.
+ */
+ default void install( Session session, Artifact artifact )
+ throws ArtifactInstallerException, IllegalArgumentException
+ {
+ install( session, Collections.singletonList( artifact ) );
+ }
+
+ /**
+ * @param session the repository session
+ * @param artifacts Collection of {@link Artifact MavenArtifacts}
+ * @throws ArtifactInstallerException In case of an error which can be the a given artifact can not be found or the
+ * installation has failed.
+ * @throws IllegalArgumentException in case of parameter <code>request</code> is <code>null</code> or parameter
+ * <code>localRepository</code> is <code>null</code> or <code>localRepository</code> is not a directory
+ * or parameter <code>mavenArtifacts</code> is <code>null</code> or
+ * <code>mavenArtifacts.isEmpty()</code> is <code>true</code>.
+ */
+ default void install( Session session, Collection<Artifact> artifacts )
+ throws ArtifactInstallerException
+ {
+ install( ArtifactInstallerRequest.build( session, artifacts ) );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerException.java
new file mode 100644
index 0000000..77c3f20
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerException.java
@@ -0,0 +1,43 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ *
+ */
+public class ArtifactInstallerException
+ extends Exception
+{
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 3652561971360586373L;
+
+ /**
+ * @param message The message of the error.
+ * @param e {@link Exception}
+ */
+ public ArtifactInstallerException( String message, Exception e )
+ {
+ super( message, e );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java
new file mode 100644
index 0000000..dd6874e
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java
@@ -0,0 +1,103 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+/**
+ * A request for installing one or more artifacts in the local repository.
+ */
+public interface ArtifactInstallerRequest
+{
+
+ @Nonnull
+ Session getSession();
+
+ @Nonnull
+ Collection<Artifact> getArtifacts();
+
+ static ArtifactInstallerRequestBuilder builder()
+ {
+ return new ArtifactInstallerRequestBuilder();
+ }
+
+ static ArtifactInstallerRequest build( Session session, Collection<Artifact> artifacts )
+ {
+ return builder()
+ .session( session )
+ .artifacts( artifacts )
+ .build();
+ }
+
+ class ArtifactInstallerRequestBuilder
+ {
+ Session session;
+ Collection<Artifact> artifacts = Collections.emptyList();
+
+ @Nonnull
+ public ArtifactInstallerRequestBuilder session( @Nonnull Session session )
+ {
+ this.session = session;
+ return this;
+ }
+
+ @Nonnull
+ public ArtifactInstallerRequestBuilder artifacts( @Nullable Collection<Artifact> artifacts )
+ {
+ this.artifacts = artifacts != null ? artifacts : Collections.emptyList();
+ return this;
+ }
+
+ @Nonnull
+ public ArtifactInstallerRequest build()
+ {
+ return new DefaultArtifactInstallerRequest( session, artifacts );
+ }
+
+ static class DefaultArtifactInstallerRequest extends BaseRequest
+ implements ArtifactInstallerRequest
+ {
+
+ private final Collection<Artifact> artifacts;
+
+ DefaultArtifactInstallerRequest( @Nonnull Session session,
+ @Nonnull Collection<Artifact> artifacts )
+ {
+ super( session );
+ this.artifacts = unmodifiable( artifacts, "artifacts" );
+ }
+
+ @Nonnull
+ @Override
+ public Collection<Artifact> getArtifacts()
+ {
+ return artifacts;
+ }
+ }
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactManager.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactManager.java
new file mode 100644
index 0000000..f96b014
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactManager.java
@@ -0,0 +1,46 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Optional;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.ArtifactMetadata;
+
+public interface ArtifactManager extends Service
+{
+
+ /**
+ * Returns the path to the resolved file in the local repository
+ * if the artifact has been resolved.
+ *
+ * @return the path of the resolved artifact
+ */
+ @Nonnull
+ Optional<Path> getPath( Artifact artifact );
+
+ @Nonnull
+ Collection<ArtifactMetadata> getAttachedMetadatas( Artifact artifact );
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolver.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolver.java
new file mode 100644
index 0000000..25b6d13
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolver.java
@@ -0,0 +1,56 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.api.Session;
+import org.apache.maven.api.Artifact;
+
+/**
+ * Resolves the artifact, i.e download the file when required and attach it to the artifact
+ */
+public interface ArtifactResolver extends Service
+{
+
+ /**
+ * @param request {@link ArtifactResolverRequest}
+ * @return {@link ArtifactResolverResult}
+ * @throws ArtifactResolverException in case of an error.
+ * @throws NullPointerException in case of parameter <code>buildingRequest</code> is <code>null</code> or
+ * parameter <code>mavenArtifact</code> is <code>null</code>.
+ */
+ ArtifactResolverResult resolve( ArtifactResolverRequest request )
+ throws ArtifactResolverException, IllegalArgumentException;
+
+ /**
+ * @param session {@link Session}
+ * @param artifact {@link Artifact}
+ * @return {@link ArtifactResolverResult}
+ * @throws ArtifactResolverException in case of an error.
+ * @throws NullPointerException in case of parameter <code>buildingRequest</code> is <code>null</code> or
+ * parameter <code>coordinate</code> is <code>null</code>.
+ */
+ default ArtifactResolverResult resolve( Session session,
+ Artifact artifact )
+ throws ArtifactResolverException, IllegalArgumentException
+ {
+ return resolve( ArtifactResolverRequest.build( session, artifact ) );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverException.java
new file mode 100644
index 0000000..d243fc9
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverException.java
@@ -0,0 +1,40 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ *
+ */
+public class ArtifactResolverException
+ extends Exception
+{
+
+ private static final long serialVersionUID = 7252294837746943917L;
+
+ /**
+ * @param message The message for the exception.
+ * @param e The exception itself.
+ */
+ public ArtifactResolverException( String message, Exception e )
+ {
+ super( message, e );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
new file mode 100644
index 0000000..b902d56
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
@@ -0,0 +1,101 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.util.Objects;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+/**
+ * A request for resolving an artifact.
+ */
+public interface ArtifactResolverRequest
+{
+ @Nonnull
+ Session getSession();
+
+ @Nonnull
+ Artifact getArtifact();
+
+ @Nonnull
+ static ArtifactResolverRequestBuilder builder()
+ {
+ return new ArtifactResolverRequestBuilder();
+ }
+
+ @Nonnull
+ static ArtifactResolverRequest build( Session session, Artifact artifact )
+ {
+ return builder()
+ .session( session )
+ .artifact( artifact )
+ .build();
+ }
+
+ class ArtifactResolverRequestBuilder
+ {
+ Session session;
+ Artifact artifact;
+
+ @Nonnull
+ public ArtifactResolverRequestBuilder session( Session session )
+ {
+ this.session = session;
+ return this;
+ }
+
+ @Nonnull
+ public ArtifactResolverRequestBuilder artifact( Artifact artifact )
+ {
+ this.artifact = artifact;
+ return this;
+ }
+
+ @Nonnull
+ public ArtifactResolverRequest build()
+ {
+ return new DefaultArtifactResolverRequest( session, artifact );
+ }
+
+ private static class DefaultArtifactResolverRequest extends BaseRequest implements ArtifactResolverRequest
+ {
+ @Nonnull
+ private final Artifact artifact;
+
+ DefaultArtifactResolverRequest( @Nonnull Session session,
+ @Nonnull Artifact artifact )
+ {
+ super( session );
+ this.artifact = Objects.requireNonNull( artifact );
+ }
+
+ @Nonnull
+ @Override
+ public Artifact getArtifact()
+ {
+ return artifact;
+ }
+ }
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverResult.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverResult.java
new file mode 100644
index 0000000..9011405
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverResult.java
@@ -0,0 +1,37 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.api.Artifact;
+
+/**
+ * The Artifact Result
+ *
+ * @author Robert Scholte
+ * @since 3.0
+ */
+public interface ArtifactResolverResult
+{
+ /**
+ * @return {@link Artifact}
+ */
+ Artifact getArtifact();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/BaseRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/BaseRequest.java
new file mode 100644
index 0000000..c5eb047
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/BaseRequest.java
@@ -0,0 +1,66 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.maven.api.Session;
+
+/**
+ * Base class for requests.
+ */
+abstract class BaseRequest
+{
+
+ private final Session session;
+
+ protected BaseRequest( @Nonnull Session session )
+ {
+ this.session = requireNonNull( session, "session" );
+ }
+
+ @Nonnull
+ public Session getSession()
+ {
+ return session;
+ }
+
+ public static <T> T requireNonNull( T obj, String message )
+ {
+ if ( obj == null )
+ {
+ throw new IllegalArgumentException( message + " must mot be null" );
+ }
+ return obj;
+ }
+
+ protected static <T> Collection<T> unmodifiable( Collection<T> obj, String message )
+ {
+ if ( requireNonNull( obj, message ).isEmpty() )
+ {
+ throw new IllegalArgumentException( message + " must not be empty" );
+ }
+ return Collections.unmodifiableCollection( new ArrayList<>( obj ) );
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollector.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollector.java
new file mode 100644
index 0000000..8c8cc53
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollector.java
@@ -0,0 +1,115 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Project;
+
+/**
+ * The DependencyCollector service can be used to collect dependencies
+ * for a given artifact and builds a graph of them.
+ * The dependencies collection mechanism will not download any artifacts,
+ * and only the pom files will be downloaded.
+ *
+ * @author Robert Scholte
+ * @author Guillaume Nodet
+ */
+public interface DependencyCollector extends Service
+{
+
+ /**
+ * Collects the transitive dependencies and builds a dependency graph.
+ * Note that this operation is only concerned about determining the coordinates of the
+ * transitive dependencies and does not actually resolve the artifact files.
+ *
+ * @param request The dependency collection request, must not be {@code null}.
+ * @return The collection result, never {@code null}.
+ * @throws DependencyCollectorException If the dependency tree could not be built.
+ *
+ * @see DependencyCollector#collect(Session, Project)
+ * @see DependencyCollector#collect(Session, Dependency)
+ * @see DependencyCollector#collect(Session, Artifact)
+ */
+ @Nonnull
+ DependencyCollectorResult collect( @Nonnull DependencyCollectorRequest request )
+ throws DependencyCollectorException, IllegalArgumentException;
+
+ /**
+ * Collects the transitive dependencies of some artifacts and builds a dependency graph. Note that this operation is
+ * only concerned about determining the coordinates of the transitive dependencies and does not actually resolve the
+ * artifact files.
+ *
+ * @param session The {@link Session}, must not be {@code null}.
+ * @param root The Maven Dependency, must not be {@code null}.
+ * @return The collection result, never {@code null}.
+ * @throws DependencyCollectorException If the dependency tree could not be built.
+ * @see #collect(DependencyCollectorRequest)
+ */
+ @Nonnull
+ default DependencyCollectorResult collect( @Nonnull Session session,
+ @Nonnull Dependency root )
+ throws DependencyCollectorException
+ {
+ return collect( DependencyCollectorRequest.build( session, root ) );
+ }
+
+ /**
+ * Collects the transitive dependencies of some artifacts and builds a dependency graph. Note that this operation is
+ * only concerned about determining the coordinates of the transitive dependencies and does not actually resolve the
+ * artifact files.
+ *
+ * @param session The {@link Session}, must not be {@code null}.
+ * @param project The {@link Project}, must not be {@code null}.
+ * @return The collection result, never {@code null}.
+ * @throws DependencyCollectorException If the dependency tree could not be built.
+ * @see #collect(DependencyCollectorRequest)
+ */
+ @Nonnull
+ default DependencyCollectorResult collect( @Nonnull Session session,
+ @Nonnull Project project )
+ throws DependencyCollectorException
+ {
+ return collect( DependencyCollectorRequest.build( session, project ) );
+ }
+
+ /**
+ * Collects the transitive dependencies of some artifacts and builds a dependency graph. Note that this operation is
+ * only concerned about determining the coordinates of the transitive dependencies and does not actually resolve the
+ * artifact files.
+ *
+ * @param session The {@link Session}, must not be {@code null}.
+ * @param artifact The {@link Artifact}, must not be {@code null}.
+ * @return The collection result, never {@code null}.
+ * @throws DependencyCollectorException If the dependency tree could not be built.
+ * @see #collect(DependencyCollectorRequest)
+ */
+ @Nonnull
+ default DependencyCollectorResult collect( @Nonnull Session session,
+ @Nonnull Artifact artifact )
+ throws DependencyCollectorException
+ {
+ return collect( DependencyCollectorRequest.build( session, artifact ) );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorException.java
new file mode 100644
index 0000000..733e2f9
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorException.java
@@ -0,0 +1,42 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * Thrown in case of bad artifact descriptors, version ranges or other issues encountered during calculation of the
+ * dependency graph.
+ */
+public class DependencyCollectorException
+ extends Exception
+{
+ /**
+ *
+ */
+ private static final long serialVersionUID = -3134726259840210686L;
+
+ /**
+ * @param message The message you would give for the exception.
+ * @param cause The cause which is related to the message.
+ */
+ public DependencyCollectorException( String message, Throwable cause )
+ {
+ super( message, cause );
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java
new file mode 100644
index 0000000..d3e2aaa
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java
@@ -0,0 +1,288 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Project;
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+/**
+ * A request to collect the transitive dependencies and to build a dependency graph from them. There are three ways to
+ * create a dependency graph. First, only the root dependency can be given. Second, a root dependency and direct
+ * dependencies can be specified in which case the specified direct dependencies are merged with the direct dependencies
+ * retrieved from the artifact descriptor of the root dependency. And last, only direct dependencies can be specified in
+ * which case the root node of the resulting graph has no associated dependency.
+ *
+ * @see DependencyCollector#collect(DependencyCollectorRequest)
+ */
+public interface DependencyCollectorRequest
+{
+
+ @Nonnull
+ Session getSession();
+
+ @Nonnull
+ Optional<Artifact> getRootArtifact();
+
+ @Nonnull
+ Optional<Dependency> getRoot();
+
+ @Nonnull
+ Collection<Dependency> getDependencies();
+
+ @Nonnull
+ Collection<Dependency> getManagedDependencies();
+
+ static DependencyCollectorRequest build( Session session, Artifact root )
+ {
+ BaseRequest.requireNonNull( session, "session" );
+ return builder()
+ .session( session )
+ .root( session.createDependency( root ) )
+ .build();
+ }
+
+ static DependencyCollectorRequest build( Session session, Dependency root )
+ {
+ return builder()
+ .session( session )
+ .root( root )
+ .build();
+ }
+
+ static DependencyCollectorRequest build( Session session, Project project )
+ {
+ BaseRequest.requireNonNull( session, "session" );
+ return builder()
+ .session( session )
+ .root( session.createDependency( project.getArtifact() ) )
+ .dependencies( project.getDependencies() )
+ .managedDependencies( project.getManagedDependencies() )
+ .build();
+ }
+
+ static DependencyCollectorRequestBuilder builder()
+ {
+ return new DependencyCollectorRequestBuilder();
+ }
+
+ class DependencyCollectorRequestBuilder
+ {
+
+ Session session;
+ Artifact rootArtifact;
+ Dependency root;
+ List<Dependency> dependencies = Collections.emptyList();
+ List<Dependency> managedDependencies = Collections.emptyList();
+
+ @Nonnull
+ public DependencyCollectorRequestBuilder session( @Nonnull Session session )
+ {
+ this.session = session;
+ return this;
+ }
+
+ /**
+ * Sets the root artifact for the dependency graph.
+ * This must not be confused with {@link #root(Dependency)}: The root <em>dependency</em>, like any
+ * other specified dependency, will be subject to dependency collection/resolution, i.e. should have an artifact
+ * descriptor and a corresponding artifact file. The root <em>artifact</em> on the other hand is only used
+ * as a label for the root node of the graph in case no root dependency was specified. As such, the configured
+ * root artifact is ignored if {@link #root(Dependency)} has been set.
+ *
+ * @param rootArtifact The root artifact for the dependency graph, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ @Nonnull
+ public DependencyCollectorRequestBuilder rootArtifact( Artifact rootArtifact )
+ {
+ this.rootArtifact = rootArtifact;
+ return this;
+ }
+
+ /**
+ * @param root The root dependency
+ * @return This request for chaining, never {@code null}.
+ */
+ @Nonnull
+ public DependencyCollectorRequestBuilder root( @Nonnull Dependency root )
+ {
+ this.root = root;
+ return this;
+ }
+
+ /**
+ * Sets the direct dependencies. If both a root dependency and direct dependencies are given in the request, the
+ * direct dependencies from the request will be merged with the direct dependencies from the root dependency's
+ * artifact descriptor, giving higher priority to the dependencies from the request.
+ *
+ * @param dependencies The direct dependencies, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ @Nonnull
+ public DependencyCollectorRequestBuilder dependencies( List<Dependency> dependencies )
+ {
+ this.dependencies = ( dependencies != null ) ? dependencies : Collections.emptyList();
+ return this;
+ }
+
+ /**
+ * Adds the specified direct dependency.
+ *
+ * @param dependency The dependency to add, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ public DependencyCollectorRequestBuilder dependency( Dependency dependency )
+ {
+ if ( dependency != null )
+ {
+ if ( this.dependencies.isEmpty() )
+ {
+ this.dependencies = new ArrayList<>();
+ }
+ this.dependencies.add( dependency );
+ }
+ return this;
+ }
+
+
+ /**
+ * Sets the dependency management to apply to transitive dependencies. To clarify, this management does not
+ * apply to
+ * the direct dependencies of the root node.
+ *
+ * @param managedDependencies The dependency management, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ public DependencyCollectorRequestBuilder managedDependencies( List<Dependency> managedDependencies )
+ {
+ this.managedDependencies = ( managedDependencies != null ) ? managedDependencies : Collections.emptyList();
+ return this;
+ }
+
+ /**
+ * Adds the specified managed dependency.
+ *
+ * @param managedDependency The managed dependency to add, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ public DependencyCollectorRequestBuilder managedDependency( Dependency managedDependency )
+ {
+ if ( managedDependency != null )
+ {
+ if ( this.managedDependencies.isEmpty() )
+ {
+ this.managedDependencies = new ArrayList<>();
+ }
+ this.managedDependencies.add( managedDependency );
+ }
+ return this;
+ }
+
+ public DependencyCollectorRequest build()
+ {
+ return new DefaultDependencyCollectorRequest(
+ session,
+ rootArtifact,
+ root,
+ dependencies,
+ managedDependencies );
+ }
+
+ static class DefaultDependencyCollectorRequest extends BaseRequest
+ implements DependencyCollectorRequest
+ {
+ private final Artifact rootArtifact;
+ private final Dependency root;
+ private final Collection<Dependency> dependencies;
+ private final Collection<Dependency> managedDependencies;
+
+
+ /**
+ * Creates a request with the specified properties.
+ *
+ * @param session {@link Session}
+ * @param rootArtifact The root dependency whose transitive dependencies should be collected, may be {@code
+ * null}.
+ */
+ DefaultDependencyCollectorRequest(
+ Session session,
+ Artifact rootArtifact,
+ Dependency root,
+ Collection<Dependency> dependencies,
+ Collection<Dependency> managedDependencies )
+ {
+ super( session );
+ this.rootArtifact = rootArtifact;
+ this.root = root;
+ this.dependencies = dependencies != null && !dependencies.isEmpty()
+ ? unmodifiable( dependencies, "dependencies" ) : Collections.emptyList();
+ this.managedDependencies = managedDependencies != null && !managedDependencies.isEmpty()
+ ? unmodifiable( managedDependencies, "managedDependencies" ) : Collections.emptyList();
+
+ }
+
+ @Nonnull
+ @Override
+ public Optional<Artifact> getRootArtifact()
+ {
+ return Optional.ofNullable( rootArtifact );
+ }
+
+ @Nonnull
+ @Override
+ public Optional<Dependency> getRoot()
+ {
+ return Optional.ofNullable( root );
+ }
+
+ @Nonnull
+ @Override
+ public Collection<Dependency> getDependencies()
+ {
+ return dependencies;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<Dependency> getManagedDependencies()
+ {
+ return managedDependencies;
+ }
+
+ @Override
+ public String toString()
+ {
+ return getRoot() + " -> " + getDependencies();
+ }
+
+ }
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorResult.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorResult.java
new file mode 100644
index 0000000..6020bff
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorResult.java
@@ -0,0 +1,47 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.List;
+
+import org.apache.maven.api.Node;
+
+/**
+ * The result of a dependency collection request.
+ *
+ * @see DependencyCollector#collect(DependencyCollectorRequest)
+ */
+public interface DependencyCollectorResult
+{
+ /**
+ * Gets the exceptions that occurred while building the dependency graph.
+ *
+ * @return The exceptions that occurred, never {@code null}.
+ */
+ List<Exception> getExceptions();
+
+ /**
+ * Gets the root node of the dependency graph.
+ *
+ * @return The root node of the dependency graph or {@code null} if none.
+ */
+ Node getRoot();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactory.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactory.java
new file mode 100644
index 0000000..50e5849
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactory.java
@@ -0,0 +1,37 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+
+public interface DependencyFactory extends Service
+{
+
+ Dependency create( DependencyFactoryRequest request )
+ throws DependencyFactoryException, IllegalArgumentException;
+
+ default Dependency create( Session session, Artifact artifact )
+ throws DependencyFactoryException, IllegalArgumentException
+ {
+ return create( DependencyFactoryRequest.build( session, artifact ) );
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryException.java
new file mode 100644
index 0000000..5ca1d43
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryException.java
@@ -0,0 +1,36 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+public class DependencyFactoryException
+ extends RuntimeException
+{
+
+ public DependencyFactoryException( String message )
+ {
+ super( message );
+ }
+
+ public DependencyFactoryException( String message, Throwable cause )
+ {
+ super( message, cause );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryRequest.java
new file mode 100644
index 0000000..85b079d
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryRequest.java
@@ -0,0 +1,167 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Exclusion;
+
+public interface DependencyFactoryRequest
+{
+
+ @Nonnull
+ Session getSession();
+
+ Artifact getArtifact();
+
+ String getScope();
+
+ boolean isOptional();
+
+ @Nonnull
+ Collection<Exclusion> getExclusions();
+
+ static DependencyFactoryRequest build( Session session, Artifact artifact )
+ {
+ return builder()
+ .session( session )
+ .artifact( artifact )
+ .build();
+ }
+
+ static DependencyFactoryRequestBuilder builder()
+ {
+ return new DependencyFactoryRequestBuilder();
+ }
+
+ class DependencyFactoryRequestBuilder
+ {
+ private Session session;
+ private Artifact artifact;
+ private String scope;
+ private boolean optional;
+ private Collection<Exclusion> exclusions = Collections.emptyList();
+
+ public DependencyFactoryRequestBuilder session( Session session )
+ {
+ this.session = session;
+ return this;
+ }
+
+ public DependencyFactoryRequestBuilder artifact( Artifact artifact )
+ {
+ this.artifact = artifact;
+ return this;
+ }
+
+ public DependencyFactoryRequestBuilder scope( String scope )
+ {
+ this.scope = scope;
+ return this;
+ }
+
+ public DependencyFactoryRequestBuilder optional( boolean optional )
+ {
+ this.optional = optional;
+ return this;
+ }
+
+ public DependencyFactoryRequestBuilder exclusions( Collection<Exclusion> exclusions )
+ {
+ if ( exclusions != null )
+ {
+ if ( this.exclusions.isEmpty() )
+ {
+ this.exclusions = new ArrayList<>();
+ }
+ this.exclusions.addAll( exclusions );
+ }
+ return this;
+ }
+
+ public DependencyFactoryRequestBuilder exclusion( Exclusion exclusion )
+ {
+ if ( exclusion != null )
+ {
+ if ( this.exclusions.isEmpty() )
+ {
+ this.exclusions = new ArrayList<>();
+ }
+ this.exclusions.add( exclusion );
+ }
+ return this;
+ }
+
+ public DependencyFactoryRequest build()
+ {
+ return new DefaultDependencyFactoryRequest( session, artifact, scope, optional, exclusions );
+ }
+
+ private static class DefaultDependencyFactoryRequest extends BaseRequest implements DependencyFactoryRequest
+ {
+ private final Artifact artifact;
+ private final String scope;
+ private final boolean optional;
+ private final Collection<Exclusion> exclusions;
+
+ private DefaultDependencyFactoryRequest( @Nonnull Session session, Artifact artifact, String scope,
+ boolean optional, Collection<Exclusion> exclusions )
+ {
+ super( session );
+ this.artifact = artifact;
+ this.scope = scope;
+ this.optional = optional;
+ this.exclusions = exclusions;
+ }
+
+ @Override
+ public Artifact getArtifact()
+ {
+ return artifact;
+ }
+
+ @Override
+ public String getScope()
+ {
+ return scope;
+ }
+
+ @Override
+ public boolean isOptional()
+ {
+ return optional;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<Exclusion> getExclusions()
+ {
+ return exclusions;
+ }
+ }
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolver.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolver.java
new file mode 100644
index 0000000..c4549d5
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolver.java
@@ -0,0 +1,90 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.List;
+import java.util.function.Predicate;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.Project;
+
+/**
+ * The DependencyResolver service can be used to collect the dependencies
+ * and download the artifacts.
+ *
+ * @author Robert Scholte
+ * @author Guillaume Nodet
+ */
+public interface DependencyResolver extends Service
+{
+ /**
+ * Collect dependencies and resolve the artifacts.
+ *
+ * @param request {@link DependencyResolverRequest}
+ * @return the resolved dependencies.
+ * @throws DependencyResolverException in case of an error.
+ */
+ DependencyResolverResult resolve( DependencyResolverRequest request )
+ throws DependencyResolverException;
+
+ /**
+ * This will resolve the dependencies of the coordinate, not resolving the artifact of the coordinate itself. If
+ * the coordinate needs to be resolved too, use
+ * {@link #resolveDependencies(Session, List, List, Predicate< Node >)} passing
+ * {@code Collections.singletonList(coordinate)}
+ *
+ * @param session The {@link Session}, must not be {@code null}.
+ * @param root {@link Dependency}
+ * @param filter {@link Predicate} used to eventually filter out some dependencies
+ * when downloading (can be {@code null}).
+ * @return the resolved dependencies.
+ * @throws DependencyResolverException in case of an error.
+ */
+ default DependencyResolverResult resolve( Session session,
+ Dependency root,
+ Predicate<Node> filter )
+ throws DependencyResolverException
+ {
+ return resolve( DependencyResolverRequest.build( session, root, filter ) );
+ }
+
+ /**
+ * This will resolve the dependencies of the coordinate, not resolving the artifact of the coordinate itself. If
+ * the coordinate needs to be resolved too, use
+ * {@link #resolveDependencies(Session, List, List, Predicate< Node >)} passing
+ * {@code Collections.singletonList(coordinate)}
+ *
+ * @param session The {@link Session}, must not be {@code null}.
+ * @param project {@link Project}
+ * @param filter {@link Predicate< Node >} (can be {@code null}).
+ * @return the resolved dependencies.
+ * @throws DependencyResolverException in case of an error.
+ */
+ default DependencyResolverResult resolve( Session session,
+ Project project,
+ Predicate<Node> filter )
+ throws DependencyResolverException
+ {
+ return resolve( DependencyResolverRequest.build( session, project, filter ) );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverException.java
new file mode 100644
index 0000000..77ee118
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverException.java
@@ -0,0 +1,54 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * The Exception class in case a resolving does not work.
+ */
+public class DependencyResolverException
+ extends Exception
+{
+ private static final long serialVersionUID = 5320065249974323888L;
+
+ /**
+ * @param cause The {@link Exception cause} of the problem.
+ */
+ protected DependencyResolverException( Exception cause )
+ {
+ super( cause );
+ }
+
+ /**
+ * @param message The message to give.
+ * @param e The {@link Exception}.
+ */
+ public DependencyResolverException( String message, Exception e )
+ {
+ super( message, e );
+ }
+
+ /**
+ * @return {@link DependencyResolverResult}
+ */
+ public DependencyResolverResult getResult()
+ {
+ return null;
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java
new file mode 100644
index 0000000..0f8c67c
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java
@@ -0,0 +1,327 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.Project;
+
+/**
+ * A request to collect and resolve a dependency graph.
+ */
+public interface DependencyResolverRequest extends DependencyCollectorRequest
+{
+
+ @Nonnull
+ Optional<Predicate<Node>> getFilter();
+
+ @Nonnull
+ static DependencyResolverRequest build( @Nonnull Session session,
+ @Nonnull Artifact root )
+ {
+ return build( session, root , null );
+ }
+
+ @Nonnull
+ static DependencyResolverRequest build( @Nonnull Session session,
+ @Nonnull Artifact root,
+ @Nullable Predicate<Node> filter )
+ {
+ return builder()
+ .session( session )
+ .rootArtifact( root )
+ .filter( filter )
+ .build();
+ }
+
+ @Nonnull
+ static DependencyResolverRequest build( @Nonnull Session session,
+ @Nonnull Dependency root )
+ {
+ return build( session, root, null );
+ }
+
+ @Nonnull
+ static DependencyResolverRequest build( @Nonnull Session session,
+ @Nonnull Dependency root,
+ @Nullable Predicate<Node> filter )
+ {
+ return builder()
+ .session( session )
+ .root( root )
+ .filter( filter )
+ .build();
+ }
+
+ @Nonnull
+ static DependencyResolverRequest build( @Nonnull Session session,
+ @Nonnull Project project )
+ {
+ return build( session, project, null );
+ }
+
+ @Nonnull
+ static DependencyResolverRequest build( @Nonnull Session session,
+ @Nonnull Project project,
+ @Nullable Predicate<Node> filter )
+ {
+ BaseRequest.requireNonNull( session, "session" );
+ return builder()
+ .session( session )
+ .root( session.createDependency( project.getArtifact() ) )
+ .dependencies( project.getDependencies() )
+ .managedDependencies( project.getManagedDependencies() )
+ .filter( filter )
+ .build();
+ }
+
+ @Nonnull
+ static DependencyResolverRequestBuilder builder()
+ {
+ return new DependencyResolverRequestBuilder();
+ }
+
+ class DependencyResolverRequestBuilder
+ {
+ Session session;
+ Artifact rootArtifact;
+ Dependency root;
+ List<Dependency> dependencies = Collections.emptyList();
+ List<Dependency> managedDependencies = Collections.emptyList();
+ Predicate<Node> filter;
+
+ @Nonnull
+ public DependencyResolverRequestBuilder session( @Nonnull Session session )
+ {
+ this.session = session;
+ return this;
+ }
+
+ /**
+ * Sets the root artifact for the dependency graph.
+ * This must not be confused with {@link #root(Dependency)}: The root <em>dependency</em>, like
+ * any other specified dependency, will be subject to dependency collection/resolution, i.e. should have an
+ * artifact descriptor and a corresponding artifact file. The root <em>artifact</em> on the other hand is only
+ * used as a label for the root node of the graph in case no root dependency was specified. As such, the
+ * configured root artifact is ignored if {@link #root(Dependency)} has not been called.
+ *
+ * @param rootArtifact The root artifact for the dependency graph, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ @Nonnull
+ public DependencyResolverRequestBuilder rootArtifact( Artifact rootArtifact )
+ {
+ this.rootArtifact = rootArtifact;
+ return this;
+ }
+
+ /**
+ *
+ * @param root The root dependency
+ * @return
+ */
+ @Nonnull
+ public DependencyResolverRequestBuilder root( @Nonnull Dependency root )
+ {
+ this.root = root;
+ return this;
+ }
+
+ /**
+ * Sets the direct dependencies. If both a root dependency and direct dependencies are given in the request, the
+ * direct dependencies from the request will be merged with the direct dependencies from the root dependency's
+ * artifact descriptor, giving higher priority to the dependencies from the request.
+ *
+ * @param dependencies The direct dependencies, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ @Nonnull
+ public DependencyResolverRequestBuilder dependencies( List<Dependency> dependencies )
+ {
+ this.dependencies = ( dependencies != null ) ? dependencies : Collections.emptyList();
+ return this;
+ }
+
+ /**
+ * Adds the specified direct dependency.
+ *
+ * @param dependency The dependency to add, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ @Nonnull
+ public DependencyResolverRequestBuilder dependency( Dependency dependency )
+ {
+ if ( dependency != null )
+ {
+ if ( this.dependencies.isEmpty() )
+ {
+ this.dependencies = new ArrayList<>();
+ }
+ this.dependencies.add( dependency );
+ }
+ return this;
+ }
+
+
+ /**
+ * Sets the dependency management to apply to transitive dependencies. To clarify, this management does not
+ * apply to
+ * the direct dependencies of the root node.
+ *
+ * @param managedDependencies The dependency management, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ @Nonnull
+ public DependencyResolverRequestBuilder managedDependencies( List<Dependency> managedDependencies )
+ {
+ this.managedDependencies = ( managedDependencies != null ) ? managedDependencies : Collections.emptyList();
+ return this;
+ }
+
+ /**
+ * Adds the specified managed dependency.
+ *
+ * @param managedDependency The managed dependency to add, may be {@code null}.
+ * @return This request for chaining, never {@code null}.
+ */
+ @Nonnull
+ public DependencyResolverRequestBuilder managedDependency( Dependency managedDependency )
+ {
+ if ( managedDependency != null )
+ {
+ if ( this.managedDependencies.isEmpty() )
+ {
+ this.managedDependencies = new ArrayList<>();
+ }
+ this.managedDependencies.add( managedDependency );
+ }
+ return this;
+ }
+
+ @Nonnull
+ public DependencyResolverRequestBuilder filter( Predicate<Node> filter )
+ {
+ this.filter = filter;
+ return this;
+ }
+
+ @Nonnull
+ public DependencyResolverRequest build()
+ {
+ return new DefaultDependencyResolverRequest(
+ session,
+ rootArtifact,
+ root,
+ dependencies,
+ managedDependencies,
+ filter );
+ }
+
+ private static class DefaultDependencyResolverRequest extends BaseRequest
+ implements DependencyResolverRequest
+ {
+ private final Artifact rootArtifact;
+ private final Dependency root;
+ private final Collection<Dependency> dependencies;
+ private final Collection<Dependency> managedDependencies;
+ private final Predicate<Node> filter;
+
+
+ /**
+ * Creates a request with the specified properties.
+ *
+ * @param session {@link Session}
+ * @param rootArtifact The root dependency whose transitive dependencies should be collected, may be {@code
+ * null}.
+ */
+ DefaultDependencyResolverRequest(
+ @Nonnull Session session,
+ @Nullable Artifact rootArtifact,
+ @Nullable Dependency root,
+ @Nullable Collection<Dependency> dependencies,
+ @Nullable Collection<Dependency> managedDependencies,
+ @Nullable Predicate<Node> filter )
+ {
+ super( session );
+ this.rootArtifact = rootArtifact;
+ this.root = root;
+ this.dependencies = dependencies != null && !dependencies.isEmpty()
+ ? unmodifiable( dependencies, "dependencies" ) : Collections.emptyList();
+ this.managedDependencies = managedDependencies != null && !managedDependencies.isEmpty()
+ ? unmodifiable( managedDependencies, "managedDependencies" ) : Collections.emptyList();
+ this.filter = filter;
+ }
+
+ @Nonnull
+ @Override
+ public Optional<Artifact> getRootArtifact()
+ {
+ return Optional.ofNullable( rootArtifact );
+ }
+
+ @Nonnull
+ @Override
+ public Optional<Dependency> getRoot()
+ {
+ return Optional.ofNullable( root );
+ }
+
+ @Nonnull
+ @Override
+ public Collection<Dependency> getDependencies()
+ {
+ return dependencies;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<Dependency> getManagedDependencies()
+ {
+ return managedDependencies;
+ }
+
+ @Nonnull
+ @Override
+ public Optional<Predicate<Node>> getFilter()
+ {
+ return Optional.ofNullable( filter );
+ }
+
+ @Override
+ public String toString()
+ {
+ return getRoot() + " -> " + getDependencies();
+ }
+
+ }
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverResult.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverResult.java
new file mode 100644
index 0000000..ff24cf6
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverResult.java
@@ -0,0 +1,44 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.List;
+
+import org.apache.maven.api.Node;
+
+/**
+ *
+ * @author Robert Scholte
+ *
+ */
+public interface DependencyResolverResult
+{
+ /**
+ * Gets the exceptions that occurred while building the dependency graph.
+ *
+ * @return The list of exceptions {@link Exception}.
+ */
+ List<Exception> getCollectorExceptions();
+
+ Node getRoot();
+
+ List<ArtifactResolverResult> getArtifactResults();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilder.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilder.java
new file mode 100644
index 0000000..58d479c
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilder.java
@@ -0,0 +1,57 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+public interface ProjectBuilder extends Service
+{
+
+ @Nonnull
+ ProjectBuilderResult build( ProjectBuilderRequest request )
+ throws ProjectBuilderException, IllegalArgumentException;
+
+ @Nonnull
+ default ProjectBuilderResult build( @Nonnull Session session, @Nonnull ProjectBuilderSource source )
+ throws ProjectBuilderException, IllegalArgumentException
+ {
+ return build( ProjectBuilderRequest.build( session, source ) );
+ }
+
+ @Nonnull
+ default ProjectBuilderResult build( @Nonnull Session session, @Nonnull Path path )
+ throws ProjectBuilderException, IllegalArgumentException
+ {
+ return build( ProjectBuilderRequest.build( session, path ) );
+ }
+
+ @Nonnull
+ default ProjectBuilderResult build( @Nonnull Session session, @Nonnull Artifact artifact )
+ throws ProjectBuilderException, IllegalArgumentException
+ {
+ return build( ProjectBuilderRequest.build( session, artifact ) );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderException.java
new file mode 100644
index 0000000..a71c5e7
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderException.java
@@ -0,0 +1,37 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * The Exception class in case a resolving does not work.
+ */
+public class ProjectBuilderException
+ extends Exception
+{
+ /**
+ * @param message The message to give.
+ * @param e The {@link Exception}.
+ */
+ public ProjectBuilderException( String message, Exception e )
+ {
+ super( message, e );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderProblem.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderProblem.java
new file mode 100644
index 0000000..af9dc47
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderProblem.java
@@ -0,0 +1,101 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * Describes a problem that was encountered during settings building. A problem can either be an exception that was
+ * thrown or a simple string message. In addition, a problem carries a hint about its source, e.g. the settings file
+ * that exhibits the problem.
+ *
+ * @author Benjamin Bentmann
+ * @author Robert Scholte
+ */
+public interface ProjectBuilderProblem
+{
+
+ /**
+ * The different severity levels for a problem, in decreasing order.
+ */
+ enum Severity
+ {
+
+ FATAL, //
+ ERROR, //
+ WARNING //
+
+ }
+
+ /**
+ * Gets the hint about the source of the problem. While the syntax of this hint is unspecified and depends on the
+ * creator of the problem, the general expectation is that the hint provides sufficient information to the user to
+ * track the problem back to its origin. A concrete example for such a source hint can be the file path or URL from
+ * which the settings were read.
+ *
+ * @return The hint about the source of the problem or an empty string if unknown, never {@code null}.
+ */
+ String getSource();
+
+ /**
+ * Gets the one-based index of the line containing the problem. The line number should refer to some text file that
+ * is given by {@link #getSource()}.
+ *
+ * @return The one-based index of the line containing the problem or a non-positive value if unknown.
+ */
+ int getLineNumber();
+
+ /**
+ * Gets the one-based index of the column containing the problem. The column number should refer to some text file
+ * that is given by {@link #getSource()}.
+ *
+ * @return The one-based index of the column containing the problem or non-positive value if unknown.
+ */
+ int getColumnNumber();
+
+ /**
+ * Gets the location of the problem. The location is a user-friendly combination of the values from
+ * {@link #getSource()}, {@link #getLineNumber()} and {@link #getColumnNumber()}. The exact syntax of the returned
+ * value is undefined.
+ *
+ * @return The location of the problem, never {@code null}.
+ */
+ String getLocation();
+
+ /**
+ * Gets the exception that caused this problem (if any).
+ *
+ * @return The exception that caused this problem or {@code null} if not applicable.
+ */
+ Exception getException();
+
+ /**
+ * Gets the message that describes this problem.
+ *
+ * @return The message describing this problem, never {@code null}.
+ */
+ String getMessage();
+
+ /**
+ * Gets the severity level of this problem.
+ *
+ * @return The severity level of this problem, never {@code null}.
+ */
+ Severity getSeverity();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
new file mode 100644
index 0000000..2c36c56
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
@@ -0,0 +1,218 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.nio.file.Path;
+import java.util.Optional;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+public interface ProjectBuilderRequest
+{
+
+ @Nonnull
+ Session getSession();
+
+ @Nonnull
+ Optional<Path> getPath();
+
+ @Nonnull
+ Optional<ProjectBuilderSource> getSource();
+
+ @Nonnull
+ Optional<Artifact> getArtifact();
+
+ boolean isAllowStubModel();
+
+ boolean isRecursive();
+
+ boolean isProcessPlugins();
+
+ boolean isResolveDependencies();
+
+ @Nonnull
+ static ProjectBuilderRequest build( @Nonnull Session session, @Nonnull ProjectBuilderSource source )
+ {
+ return builder()
+ .session( session )
+ .source( source )
+ .build();
+ }
+
+ @Nonnull
+ static ProjectBuilderRequest build( @Nonnull Session session, @Nonnull Path path )
+ {
+ return builder()
+ .session( session )
+ .path( path )
+ .build();
+ }
+
+ @Nonnull
+ static ProjectBuilderRequest build( @Nonnull Session session, @Nonnull Artifact artifact )
+ {
+ return builder()
+ .session( session )
+ .artifact( artifact )
+ .build();
+ }
+
+ @Nonnull
+ static ProjectBuilderRequestBuilder builder()
+ {
+ return new ProjectBuilderRequestBuilder();
+ }
+
+ class ProjectBuilderRequestBuilder
+ {
+ Session session;
+ Path path;
+ ProjectBuilderSource source;
+ Artifact artifact;
+ boolean allowStubModel;
+ boolean recursive;
+ boolean processPlugins = true;
+ boolean resolveDependencies = true;
+
+ public ProjectBuilderRequestBuilder session( Session session )
+ {
+ this.session = session;
+ return this;
+ }
+
+ public ProjectBuilderRequestBuilder path( Path path )
+ {
+ this.path = path;
+ return this;
+ }
+
+ public ProjectBuilderRequestBuilder source( ProjectBuilderSource source )
+ {
+ this.source = source;
+ return this;
+ }
+
+ public ProjectBuilderRequestBuilder artifact( Artifact artifact )
+ {
+ this.artifact = artifact;
+ return this;
+ }
+
+ public ProjectBuilderRequestBuilder processPlugins( boolean processPlugins )
+ {
+ this.processPlugins = processPlugins;
+ return this;
+ }
+
+ public ProjectBuilderRequestBuilder resolveDependencies( boolean resolveDependencies )
+ {
+ this.resolveDependencies = resolveDependencies;
+ return this;
+ }
+
+ public ProjectBuilderRequest build()
+ {
+ return new DefaultProjectBuilderRequest( session, path, source, artifact,
+ allowStubModel, recursive, processPlugins, resolveDependencies );
+ }
+
+ private static class DefaultProjectBuilderRequest extends BaseRequest
+ implements ProjectBuilderRequest
+ {
+ private final Path path;
+ private final ProjectBuilderSource source;
+ private final Artifact artifact;
+ private final boolean allowStubModel;
+ private final boolean recursive;
+ private final boolean processPlugins;
+ private final boolean resolveDependencies;
+
+ @SuppressWarnings( "checkstyle:ParameterNumber" )
+ DefaultProjectBuilderRequest( @Nonnull Session session,
+ @Nullable Path path,
+ @Nullable ProjectBuilderSource source,
+ @Nullable Artifact artifact,
+ boolean allowStubModel,
+ boolean recursive,
+ boolean processPlugins,
+ boolean resolveDependencies )
+ {
+ super( session );
+ this.path = path;
+ this.source = source;
+ this.artifact = artifact;
+ this.allowStubModel = allowStubModel;
+ this.recursive = recursive;
+ this.processPlugins = processPlugins;
+ this.resolveDependencies = resolveDependencies;
+ }
+
+ @Nonnull
+ @Override
+ public Optional<Path> getPath()
+ {
+ return Optional.ofNullable( path );
+ }
+
+ @Nonnull
+ @Override
+ public Optional<ProjectBuilderSource> getSource()
+ {
+ return Optional.ofNullable( source );
+ }
+
+ @Nonnull
+ @Override
+ public Optional<Artifact> getArtifact()
+ {
+ return Optional.ofNullable( artifact );
+ }
+
+ @Override
+ public boolean isAllowStubModel()
+ {
+ return allowStubModel;
+ }
+
+ @Override
+ public boolean isRecursive()
+ {
+ return recursive;
+ }
+
+ @Override
+ public boolean isProcessPlugins()
+ {
+ return processPlugins;
+ }
+
+ @Override
+ public boolean isResolveDependencies()
+ {
+ return resolveDependencies;
+ }
+ }
+
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderResult.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderResult.java
new file mode 100644
index 0000000..6476a85
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderResult.java
@@ -0,0 +1,76 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Optional;
+
+import org.apache.maven.api.Project;
+
+public interface ProjectBuilderResult
+{
+
+ /**
+ * Gets the identifier of the project that could not be built. The general format of the identifier is {@code
+ * <groupId>:<artifactId>:<version>} but some of these coordinates may still be unknown at the point the exception
+ * is thrown so this information is merely meant to assist the user.
+ *
+ * @return The identifier of the project or an empty string if not known, never {@code null}.
+ */
+ @Nonnull
+ String getProjectId();
+
+ /**
+ * Gets the POM file from which the project was built.
+ *
+ * @return The optional POM file.
+ */
+ @Nonnull
+ Optional<Path> getPomFile();
+
+ /**
+ * Gets the project that was built.
+ *
+ * @return The project that was built or {@code null} if an error occurred and this result accompanies a
+ * {@link ProjectBuilderException}.
+ */
+ @Nonnull
+ Optional<Project> getProject();
+
+ /**
+ * Gets the problems that were encountered during the project building.
+ *
+ * @return The problems that were encountered during the project building, can be empty but never {@code null}.
+ */
+ @Nonnull
+ Collection<ProjectBuilderProblem> getProblems();
+
+ /**
+ * Gets the result of the dependency resolution for the project.
+ *
+ * @return The result of the dependency resolution for the project.
+ */
+ @Nonnull
+ Optional<DependencyResolverResult> getDependencyResolverResult();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java
new file mode 100644
index 0000000..fd8c50d
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java
@@ -0,0 +1,30 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.io.IOException;
+import java.io.InputStream;
+
+public interface ProjectBuilderSource
+{
+ InputStream getInputStream() throws IOException;
+
+ String getLocation();
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployer.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployer.java
new file mode 100644
index 0000000..8fc5281
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployer.java
@@ -0,0 +1,68 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.api.Session;
+import org.apache.maven.api.Project;
+
+/**
+ * This defines the interface to deploy a single Maven Project.
+ *
+ * @author Karl Heinz Marbaise <a href="mailto:khmarbaise@apache.org">khmarbaise@apache.org</a>
+ */
+public interface ProjectDeployer extends Service
+{
+ /**
+ * This will deploy a single project which may contain several artifacts. Those artifacts will be deployed into the
+ * appropriate remote repository.
+ *
+ * <pre class="java">
+ * @Parameter( defaultValue = "${session}", required = true, readonly = true )
+ * MavenSession session;
+ * @Parameter( defaultValue = "${project}", required = true, readonly = true )
+ * MavenProject project;
+ * ..
+ * @Component
+ * ProjectDeployer deployer;
+ * ...
+ * public void execute()
+ * {
+ * ProjectDeployerRequest pdr =
+ * new ProjectDeployerRequest()
+ * .setProject( project );
+ *
+ * deployer.deploy( session.getProjectBuildingRequest(), pdr, artifactRepository );
+ * }
+ * </pre>
+ *
+ * @param request {@link ProjectDeployerRequest}
+ * @throws ProjectDeployerException in case of artifact could not correctly deployed.
+ * @throws IllegalArgumentException in case <code>buildingRequest</code> is <code>null</code>, <code>request</code>
+ * is <code>null</code> or <code>artifactRepository</code> is <code>null</code>.
+ */
+ void deploy( ProjectDeployerRequest request )
+ throws ProjectDeployerException, IllegalArgumentException;
+
+ default void deploy( Session session, Project project )
+ throws ProjectDeployerException, IllegalArgumentException
+ {
+ deploy( ProjectDeployerRequest.build( session, project ) );
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerException.java
new file mode 100644
index 0000000..0884364
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerException.java
@@ -0,0 +1,37 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * The Exception class in case a resolving does not work.
+ */
+public class ProjectDeployerException
+ extends Exception
+{
+ /**
+ * @param message The message to give.
+ * @param e The {@link Exception}.
+ */
+ public ProjectDeployerException( String message, Exception e )
+ {
+ super( message, e );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerRequest.java
new file mode 100644
index 0000000..27eeffc
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerRequest.java
@@ -0,0 +1,142 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Project;
+import org.apache.maven.api.RemoteRepository;
+
+public interface ProjectDeployerRequest
+{
+ @Nonnull
+ Session getSession();
+
+ @Nonnull
+ Project getProject();
+
+ @Nonnull
+ RemoteRepository getRepository();
+
+ int getRetryFailedDeploymentCount();
+
+// @Nonnull
+// Optional<String> getAltDeploymentRepository();
+
+// @Nonnull
+// Optional<String> getAltSnapshotDeploymentRepository();
+
+// @Nonnull
+// Optional<String> getAltReleaseDeploymentRepository();
+
+ static ProjectDeployerRequest build( Session session, Project project )
+ {
+ return builder()
+ .session( session )
+ .project( project )
+ .build();
+ }
+
+ static ProjectDeployerRequestBuilder builder()
+ {
+ return new ProjectDeployerRequestBuilder();
+ }
+
+ class ProjectDeployerRequestBuilder
+ {
+ Session session;
+ Project project;
+ RemoteRepository repository;
+ int retryFailedDeploymentCount;
+
+ @Nonnull
+ public ProjectDeployerRequestBuilder session( @Nonnull Session session )
+ {
+ this.session = session;
+ return this;
+ }
+
+ @Nonnull
+ public ProjectDeployerRequestBuilder project( @Nonnull Project project )
+ {
+ this.project = project;
+ return this;
+ }
+
+ @Nonnull
+ public ProjectDeployerRequestBuilder repository( @Nonnull RemoteRepository repository )
+ {
+ this.repository = repository;
+ return this;
+ }
+
+ @Nonnull
+ public ProjectDeployerRequestBuilder retryFailedDeploymentCount( int retryFailedDeploymentCount )
+ {
+ this.retryFailedDeploymentCount = retryFailedDeploymentCount;
+ return this;
+ }
+
+ public ProjectDeployerRequest build()
+ {
+ return new DefaultProjectDeployerRequest( session, project, repository, retryFailedDeploymentCount );
+ }
+
+ private static class DefaultProjectDeployerRequest extends BaseRequest
+ implements ProjectDeployerRequest
+ {
+ private final Project project;
+ private final RemoteRepository repository;
+ private final int retryFailedDeploymentCount;
+
+ DefaultProjectDeployerRequest( @Nonnull Session session,
+ @Nonnull Project project,
+ @Nonnull RemoteRepository repository,
+ int retryFailedDeploymentCount )
+ {
+ super( session );
+ this.project = requireNonNull( project, "project" );
+ this.repository = requireNonNull( repository, "repository" );
+ this.retryFailedDeploymentCount = retryFailedDeploymentCount;
+ }
+
+ @Nonnull
+ @Override
+ public Project getProject()
+ {
+ return project;
+ }
+
+ @Nonnull
+ @Override
+ public RemoteRepository getRepository()
+ {
+ return repository;
+ }
+
+ @Override
+ public int getRetryFailedDeploymentCount()
+ {
+ return retryFailedDeploymentCount;
+ }
+ }
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstaller.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstaller.java
new file mode 100644
index 0000000..0095bed
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstaller.java
@@ -0,0 +1,79 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.api.Session;
+import org.apache.maven.api.Project;
+
+/**
+ * This defines the interface to install a single Maven Project.
+ *
+ * @author Karl Heinz Marbaise <a href="mailto:khmarbaise@apache.org">khmarbaise@apache.org</a>
+ */
+public interface ProjectInstaller extends Service
+{
+ /**
+ * This will install a single project which may contain several artifacts. Those artifacts will be installed into
+ * the appropriate repository.
+ *
+ * <pre class="java">
+ * @Parameter( defaultValue = "${session}", required = true, readonly = true )
+ * private MavenSession session;
+ * @Parameter( defaultValue = "${project}", required = true, readonly = true )
+ * private MavenProject project;
+ * ..
+ * @Component
+ * private ProjectInstaller installer;
+ * ...
+ * public void execute()
+ * {
+ * ProjectInstallerRequest pir =
+ * new ProjectInstallerRequest()
+ * .setProject( mavenProject );
+ *
+ * installer.install( session.getProjectBuildingRequest(), pir );
+ * }
+ * </pre>
+ *
+ * To set a different local repository than the current one in the Maven session, you can inject an instance of the
+ * <code>RepositoryManager</code> and set the path to the local repository, called <code>localRepositoryPath</code>,
+ * as such:
+ *
+ * <pre class="java">
+ * @Component
+ * private RepositoryManager repositoryManager;
+ *
+ * buildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, localRepositoryPath );
+ * </pre>
+ *
+ * @param request {@link ProjectInstallerRequest}
+ * @throws ProjectInstallerException In case of problems to install artifacts.
+ * @throws IllegalArgumentException in case of parameter <code>projectBuildingRequest</code> is <code>null</code> or
+ * parameter <code>projectInstallerRequest</code> is <code>null</code>.
+ */
+ void install( ProjectInstallerRequest request )
+ throws ProjectInstallerException, IllegalArgumentException;
+
+ default void install( Session session, Project project )
+ throws ProjectInstallerException, IllegalArgumentException
+ {
+ install( ProjectInstallerRequest.build( session, project ) );
+ }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerException.java
new file mode 100644
index 0000000..1aaf536
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerException.java
@@ -0,0 +1,37 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * The Exception class in case a resolving does not work.
+ */
+public class ProjectInstallerException
+ extends Exception
+{
+ /**
+ * @param message The message to give.
+ * @param e The {@link Exception}.
+ */
+ public ProjectInstallerException( String message, Exception e )
+ {
+ super( message, e );
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerRequest.java
new file mode 100644
index 0000000..ca545b8
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerRequest.java
@@ -0,0 +1,101 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Project;
+
+/**
+ * @author Guillaume Nodet
+ */
+
+public interface ProjectInstallerRequest
+{
+
+ @Nonnull
+ Session getSession();
+
+ @Nonnull
+ Project getProject();
+
+ @Nonnull
+ static ProjectInstallerRequest build( @Nonnull Session session, @Nonnull Project project )
+ {
+ return builder()
+ .session( session )
+ .project( project )
+ .build();
+ }
+
+ @Nonnull
+ static ProjectInstallerRequestBuilder builder()
+ {
+ return new ProjectInstallerRequestBuilder();
+ }
+
+ class ProjectInstallerRequestBuilder
+ {
+ Session session;
+ Project project;
+
+ @Nonnull
+ public ProjectInstallerRequestBuilder session( Session session )
+ {
+ this.session = session;
+ return this;
+ }
+
+ @Nonnull
+ public ProjectInstallerRequestBuilder project( Project project )
+ {
+ this.project = project;
+ return this;
+ }
+
+ @Nonnull
+ public ProjectInstallerRequest build()
+ {
+ return new DefaultProjectInstallerRequest( session, project );
+ }
+
+ private static class DefaultProjectInstallerRequest extends BaseRequest
+ implements ProjectInstallerRequest
+ {
+
+ final Project project;
+
+ DefaultProjectInstallerRequest( @Nonnull Session session, @Nonnull Project project )
+ {
+ super( session );
+ this.project = requireNonNull( project, "project" );
+ }
+
+ @Nonnull
+ @Override
+ public Project getProject()
+ {
+ return project;
+ }
+ }
+ }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectManager.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectManager.java
new file mode 100644
index 0000000..494882a
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectManager.java
@@ -0,0 +1,48 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Optional;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Project;
+
+/**
+ * Interface to manage the project during its lifecycle
+ */
+public interface ProjectManager extends Service
+{
+ /**
+ * Returns the path to the resolved file in the local repository
+ * if the artifact has been resolved.
+ *
+ * @return the path of the resolved artifact
+ */
+ @Nonnull
+ Optional<Path> getPath( Project project );
+
+ @Nonnull
+ Collection<Artifact> getAttachedArtifacts( Project project );
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/Service.java b/maven-core-api/src/main/java/org/apache/maven/api/services/Service.java
new file mode 100644
index 0000000..d43da3a
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/Service.java
@@ -0,0 +1,27 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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 javax.annotation.concurrent.ThreadSafe;
+
+@ThreadSafe
+public interface Service
+{
+}
diff --git a/maven-core-impl/pom.xml b/maven-core-impl/pom.xml
new file mode 100644
index 0000000..df573ad
--- /dev/null
+++ b/maven-core-impl/pom.xml
@@ -0,0 +1,72 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+ 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven</artifactId>
+ <version>4.0.0-alpha-1-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>maven-core-api-impl</artifactId>
+ <name>Apache Maven Core API Implementation</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-core-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-core</artifactId>
+ </dependency>
+
+ <!-- Testing -->
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-testing</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.resolver</groupId>
+ <artifactId>maven-resolver-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.resolver</groupId>
+ <artifactId>maven-resolver-connector-basic</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.resolver</groupId>
+ <artifactId>maven-resolver-transport-http</artifactId>
+ <version>${resolverVersion}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.resolver</groupId>
+ <artifactId>maven-resolver-transport-file</artifactId>
+ <version>${resolverVersion}</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifact.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifact.java
new file mode 100644
index 0000000..5f5917c
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifact.java
@@ -0,0 +1,101 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.util.Objects;
+import java.util.Optional;
+
+import org.apache.maven.api.Artifact;
+
+public class DefaultArtifact implements Artifact
+{
+ private final DefaultSession session;
+ private final org.eclipse.aether.artifact.Artifact artifact;
+
+ public DefaultArtifact( @Nonnull DefaultSession session, @Nonnull org.eclipse.aether.artifact.Artifact artifact )
+ {
+ this.session = Objects.requireNonNull( session );
+ this.artifact = Objects.requireNonNull( artifact );
+ }
+
+ public org.eclipse.aether.artifact.Artifact getArtifact()
+ {
+ return artifact;
+ }
+
+ @Nonnull
+ @Override
+ public String getGroupId()
+ {
+ return artifact.getGroupId();
+ }
+
+ @Nonnull
+ @Override
+ public String getArtifactId()
+ {
+ return artifact.getArtifactId();
+ }
+
+ @Nonnull
+ @Override
+ public String getVersion()
+ {
+ return artifact.getVersion();
+ }
+
+ @Nonnull
+ @Override
+ public String getExtension()
+ {
+ return artifact.getExtension();
+ }
+
+ @Nonnull
+ @Override
+ public String getClassifier()
+ {
+ return artifact.getClassifier();
+ }
+
+ @Nonnull
+ @Override
+ public String getBaseVersion()
+ {
+ return artifact.getBaseVersion();
+ }
+
+ @Override
+ public boolean isSnapshot()
+ {
+ return artifact.isSnapshot();
+ }
+
+ @Nonnull
+ @Override
+ public Optional<Path> getPath()
+ {
+ return Optional.ofNullable( artifact.getFile() ).map( File::toPath );
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactDeployer.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactDeployer.java
new file mode 100644
index 0000000..bc4d9a2
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactDeployer.java
@@ -0,0 +1,76 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.services.ArtifactDeployer;
+import org.apache.maven.api.services.ArtifactDeployerException;
+import org.apache.maven.api.services.ArtifactDeployerRequest;
+import org.apache.maven.api.services.ArtifactManager;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.deployment.DeployResult;
+import org.eclipse.aether.deployment.DeploymentException;
+import org.eclipse.aether.metadata.Metadata;
+
+@Named
+public class DefaultArtifactDeployer implements ArtifactDeployer
+{
+ private final RepositorySystem repositorySystem;
+
+ @Inject
+ DefaultArtifactDeployer( @Nonnull RepositorySystem repositorySystem )
+ {
+ this.repositorySystem = Objects.requireNonNull( repositorySystem );
+ }
+
+ @Override
+ public void deploy( ArtifactDeployerRequest request ) throws ArtifactDeployerException, IllegalArgumentException
+ {
+ DefaultSession session = ( DefaultSession ) request.getSession();
+ try
+ {
+ ArtifactManager artifactManager = session.getService( ArtifactManager.class );
+ List<Metadata> metadatas = request.getArtifacts().stream()
+ .map( artifactManager::getAttachedMetadatas )
+ .flatMap( Collection::stream )
+ .map( session::toMetadata )
+ .collect( Collectors.toList() );
+ DeployRequest deployRequest = new DeployRequest()
+ .setRepository( session.toRepository( request.getRepository() ) )
+ .setArtifacts( session.toArtifacts( request.getArtifacts() ) )
+ .setMetadata( metadatas );
+
+ DeployResult result = repositorySystem.deploy( session.getSession(), deployRequest );
+ }
+ catch ( DeploymentException e )
+ {
+ throw new ArtifactDeployerException( "Unable to deploy artifacts", e );
+ }
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactFactory.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactFactory.java
new file mode 100644
index 0000000..c1fa7ca
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactFactory.java
@@ -0,0 +1,54 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.inject.Named;
+
+import java.security.InvalidParameterException;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.services.ArtifactFactory;
+import org.apache.maven.api.services.ArtifactFactoryException;
+import org.apache.maven.api.services.ArtifactFactoryRequest;
+import org.eclipse.aether.artifact.ArtifactType;
+
+@Named
+public class DefaultArtifactFactory implements ArtifactFactory
+{
+ @Override
+ public Artifact create( ArtifactFactoryRequest request ) throws ArtifactFactoryException, InvalidParameterException
+ {
+ DefaultSession session = (DefaultSession) request.getSession();
+ ArtifactType type = null;
+ if ( request.getType() != null )
+ {
+ type = session.getSession().getArtifactTypeRegistry().get( request.getType() );
+ }
+ return new DefaultArtifact(
+ session,
+ new org.eclipse.aether.artifact.DefaultArtifact(
+ request.getGroupId(),
+ request.getArtifactId(),
+ request.getClassifier(),
+ request.getExtension(),
+ request.getVersion(),
+ type ) );
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactInstaller.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactInstaller.java
new file mode 100644
index 0000000..2c45534
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactInstaller.java
@@ -0,0 +1,111 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.services.ArtifactInstaller;
+import org.apache.maven.api.services.ArtifactInstallerException;
+import org.apache.maven.api.services.ArtifactInstallerRequest;
+import org.apache.maven.api.services.ArtifactManager;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.installation.InstallRequest;
+import org.eclipse.aether.installation.InstallResult;
+import org.eclipse.aether.installation.InstallationException;
+import org.eclipse.aether.metadata.Metadata;
+
+@Named
+public class DefaultArtifactInstaller implements ArtifactInstaller
+{
+
+ private final RepositorySystem repositorySystem;
+
+ @Inject
+ DefaultArtifactInstaller( @Nonnull RepositorySystem repositorySystem )
+ {
+ this.repositorySystem = Objects.requireNonNull( repositorySystem );
+ }
+
+ @Override
+ public void install( ArtifactInstallerRequest request ) throws ArtifactInstallerException, IllegalArgumentException
+ {
+
+ /*
+ // prepare installRequest
+ InstallRequest request = new InstallRequest();
+
+ // transform artifacts
+ for ( org.apache.maven.artifact.Artifact mavenArtifact : mavenArtifacts )
+ {
+ Artifact mainArtifact = RepositoryUtils.toArtifact( mavenArtifact );
+ request.addArtifact( mainArtifact );
+
+ for ( ArtifactMetadata metadata : mavenArtifact.getMetadataList() )
+ {
+ if ( metadata instanceof ProjectArtifactMetadata )
+ {
+ Artifact pomArtifact = new SubArtifact( mainArtifact, "", "pom" );
+ pomArtifact = pomArtifact.setFile( ( (ProjectArtifactMetadata) metadata ).getFile() );
+ request.addArtifact( pomArtifact );
+ }
+ else if ( // metadata instanceof SnapshotArtifactRepositoryMetadata ||
+ metadata instanceof ArtifactRepositoryMetadata )
+ {
+ // eaten, handled by repo system
+ }
+ else if ( metadata instanceof org.apache.maven.shared.transfer.metadata.ArtifactMetadata )
+ {
+ org.apache.maven.shared.transfer.metadata.ArtifactMetadata transferMetadata =
+ (org.apache.maven.shared.transfer.metadata.ArtifactMetadata) metadata;
+
+ request.addMetadata( new Maven31MetadataBridge( metadata ).setFile( transferMetadata.getFile() ) );
+ }
+ }
+ }
+ */
+
+ DefaultSession session = ( DefaultSession ) request.getSession();
+ try
+ {
+ ArtifactManager artifactManager = session.getService( ArtifactManager.class );
+ List<Metadata> metadatas = request.getArtifacts().stream()
+ .map( artifactManager::getAttachedMetadatas )
+ .flatMap( Collection::stream )
+ .map( session::toMetadata )
+ .collect( Collectors.toList() );
+ InstallRequest installRequest = new InstallRequest()
+ .setArtifacts( session.toArtifacts( request.getArtifacts() ) )
+ .setMetadata( metadatas );
+
+ InstallResult result = repositorySystem.install( session.getSession(), installRequest );
+ }
+ catch ( InstallationException e )
+ {
+ throw new ArtifactInstallerException( e.getMessage(), e );
+ }
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactResolver.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactResolver.java
new file mode 100644
index 0000000..0f87137
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactResolver.java
@@ -0,0 +1,73 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.inject.Inject;
+
+import java.util.Objects;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.services.ArtifactResolver;
+import org.apache.maven.api.services.ArtifactResolverException;
+import org.apache.maven.api.services.ArtifactResolverRequest;
+import org.apache.maven.api.services.ArtifactResolverResult;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.resolution.ArtifactRequest;
+import org.eclipse.aether.resolution.ArtifactResolutionException;
+import org.eclipse.aether.resolution.ArtifactResult;
+
+public class DefaultArtifactResolver implements ArtifactResolver
+{
+ private final RepositorySystem repositorySystem;
+
+ @Inject
+ DefaultArtifactResolver( @Nonnull RepositorySystem repositorySystem )
+ {
+ this.repositorySystem = Objects.requireNonNull( repositorySystem );
+ }
+
+ @Override
+ public ArtifactResolverResult resolve( ArtifactResolverRequest request )
+ throws ArtifactResolverException, IllegalArgumentException
+ {
+ DefaultSession session = ( DefaultSession ) request.getSession();
+ try
+ {
+ ArtifactRequest req = new ArtifactRequest()
+ .setArtifact( session.toArtifact( request.getArtifact() ) )
+ .setRepositories( session.toRepositories( session.getRemoteRepositories() ) );
+ ArtifactResult res = repositorySystem.resolveArtifact( session.getSession(), req );
+ return new ArtifactResolverResult()
+ {
+ @Override
+ public Artifact getArtifact()
+ {
+ return session.getArtifact( res.getArtifact() );
+ }
+ };
+ }
+ catch ( ArtifactResolutionException e )
+ {
+ throw new ArtifactResolverException( "Unable to resolve artifact", e );
+ }
+ }
+
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependency.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependency.java
new file mode 100644
index 0000000..27c76c4
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependency.java
@@ -0,0 +1,95 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.util.Collection;
+import java.util.Objects;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Exclusion;
+
+public class DefaultDependency implements Dependency
+{
+ private final DefaultSession session;
+ private final org.eclipse.aether.graph.Dependency dependency;
+
+ public DefaultDependency( @Nonnull DefaultSession session, @Nonnull org.eclipse.aether.graph.Dependency dependency )
+ {
+ this.session = Objects.requireNonNull( session, "session" );
+ this.dependency = Objects.requireNonNull( dependency, "dependency" );
+ }
+
+ @Nonnull
+ public org.eclipse.aether.graph.Dependency getDependency()
+ {
+ return dependency;
+ }
+
+ @Nonnull
+ @Override
+ public Artifact getArtifact()
+ {
+ return session.getArtifact( dependency.getArtifact() );
+ }
+
+ @Override
+ public String getScope()
+ {
+ return dependency.getScope();
+ }
+
+ @Nullable
+ @Override
+ public Boolean getOptional()
+ {
+ return dependency.getOptional();
+ }
+
+ @Nonnull
+ @Override
+ public Collection<Exclusion> getExclusions()
+ {
+ return new MappedCollection<>( dependency.getExclusions(), this::toExclusion );
+ }
+
+ private Exclusion toExclusion( org.eclipse.aether.graph.Exclusion exclusion )
+ {
+ return new Exclusion()
+ {
+ @Nullable
+ @Override
+ public String getGroupId()
+ {
+ return exclusion.getGroupId();
+ }
+
+ @Nullable
+ @Override
+ public String getArtifactId()
+ {
+ return exclusion.getArtifactId();
+ }
+ };
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyCollector.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyCollector.java
new file mode 100644
index 0000000..469b541
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyCollector.java
@@ -0,0 +1,93 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.List;
+
+import org.apache.maven.api.Node;
+import org.apache.maven.api.services.DependencyCollector;
+import org.apache.maven.api.services.DependencyCollectorException;
+import org.apache.maven.api.services.DependencyCollectorRequest;
+import org.apache.maven.api.services.DependencyCollectorResult;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.collection.CollectResult;
+import org.eclipse.aether.collection.DependencyCollectionException;
+import org.eclipse.aether.graph.Dependency;
+
+@Named
+public class DefaultDependencyCollector implements DependencyCollector
+{
+
+ private final RepositorySystem repositorySystem;
+
+ @Inject
+ DefaultDependencyCollector( @Nonnull RepositorySystem repositorySystem )
+ {
+ this.repositorySystem = repositorySystem;
+ }
+
+ @Nonnull
+ @Override
+ public DependencyCollectorResult collect( @Nonnull DependencyCollectorRequest request )
+ throws DependencyCollectorException, IllegalArgumentException
+ {
+ DefaultSession session = ( DefaultSession ) request.getSession();
+
+ Artifact rootArtifact = request.getRootArtifact().map( session::toArtifact ).orElse( null );
+ Dependency root = request.getRoot().map( session::toDependency ).orElse( null );
+ CollectRequest collectRequest = new CollectRequest()
+ .setRootArtifact( rootArtifact )
+ .setRoot( root != null ? root : new Dependency( rootArtifact, null ) )
+ .setDependencies( session.toDependencies( request.getDependencies() ) )
+ .setManagedDependencies( session.toDependencies( request.getManagedDependencies() ) )
+ .setRepositories( session.toRepositories( session.getRemoteRepositories() ) );
+
+ try
+ {
+ final CollectResult
+ result = repositorySystem.collectDependencies( session.getSession(), collectRequest );
+ return new DependencyCollectorResult()
+ {
+ @Override
+ public List<Exception> getExceptions()
+ {
+ return result.getExceptions();
+ }
+
+ @Override
+ public Node getRoot()
+ {
+ return session.getNode( result.getRoot() );
+ }
+ };
+ }
+ catch ( DependencyCollectionException e )
+ {
+ throw new DependencyCollectorException( "Unable to collect dependencies", e );
+ }
+ }
+
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyFactory.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyFactory.java
new file mode 100644
index 0000000..7424b22
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyFactory.java
@@ -0,0 +1,56 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.inject.Named;
+
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Exclusion;
+import org.apache.maven.api.services.DependencyFactory;
+import org.apache.maven.api.services.DependencyFactoryException;
+import org.apache.maven.api.services.DependencyFactoryRequest;
+
+@Named
+public class DefaultDependencyFactory implements DependencyFactory
+{
+
+ @Override
+ public Dependency create( DependencyFactoryRequest request )
+ throws DependencyFactoryException, IllegalArgumentException
+ {
+ DefaultSession session = ( DefaultSession ) request.getSession();
+ return new DefaultDependency(
+ session,
+ new org.eclipse.aether.graph.Dependency(
+ session.toArtifact( request.getArtifact() ),
+ request.getScope(),
+ request.isOptional(),
+ request.getExclusions().stream().map( this::toExclusion ).collect( Collectors.toList() ) ) );
+ }
+
+ private org.eclipse.aether.graph.Exclusion toExclusion( Exclusion exclusion )
+ {
+ return new org.eclipse.aether.graph.Exclusion(
+ exclusion.getGroupId(), exclusion.getArtifactId(), "*", "*" );
+ }
+
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyResolver.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyResolver.java
new file mode 100644
index 0000000..ab7af8c
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyResolver.java
@@ -0,0 +1,106 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.List;
+import java.util.function.Predicate;
+
+import org.apache.maven.api.Node;
+import org.apache.maven.api.services.ArtifactResolverResult;
+import org.apache.maven.api.services.DependencyResolver;
+import org.apache.maven.api.services.DependencyResolverException;
+import org.apache.maven.api.services.DependencyResolverRequest;
+import org.apache.maven.api.services.DependencyResolverResult;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.graph.DependencyFilter;
+import org.eclipse.aether.resolution.DependencyRequest;
+import org.eclipse.aether.resolution.DependencyResolutionException;
+import org.eclipse.aether.resolution.DependencyResult;
+
+@Named
+public class DefaultDependencyResolver implements DependencyResolver
+{
+
+ private final RepositorySystem repositorySystem;
+
+ @Inject
+ DefaultDependencyResolver( RepositorySystem repositorySystem )
+ {
+ this.repositorySystem = repositorySystem;
+ }
+
+ @Override
+ public DependencyResolverResult resolve( DependencyResolverRequest request )
+ throws DependencyResolverException
+ {
+ DefaultSession session = ( DefaultSession ) request.getSession();
+
+ CollectRequest collectRequest = new CollectRequest()
+ .setRootArtifact( request.getRootArtifact().map( session::toArtifact ).orElse( null ) )
+ .setRoot( request.getRoot().map( session::toDependency ).orElse( null ) )
+ .setDependencies( session.toDependencies( request.getDependencies() ) )
+ .setManagedDependencies( session.toDependencies( request.getManagedDependencies() ) )
+ .setRepositories( session.toRepositories( request.getSession().getRemoteRepositories() ) );
+ DependencyFilter filter = request.getFilter()
+ .map( f -> toDependencyFilter( session, f ) )
+ .orElse( null );
+ DependencyRequest dependencyRequest = new DependencyRequest()
+ .setCollectRequest( collectRequest )
+ .setFilter( filter );
+
+ try
+ {
+ DependencyResult result = repositorySystem.resolveDependencies( session.getSession(), dependencyRequest );
+ return new DependencyResolverResult()
+ {
+ @Override
+ public List<Exception> getCollectorExceptions()
+ {
+ return result.getCollectExceptions();
+ }
+
+ @Override
+ public Node getRoot()
+ {
+ return session.getNode( result.getRoot() );
+ }
+
+ @Override
+ public List<ArtifactResolverResult> getArtifactResults()
+ {
+ return null;
+ }
+ };
+ }
+ catch ( DependencyResolutionException e )
+ {
+ throw new DependencyResolverException( "Unable to resolve dependencies", e );
+ }
+ }
+
+ private DependencyFilter toDependencyFilter( DefaultSession session, Predicate<Node> filter )
+ {
+ return ( node, parents ) -> filter.test( session.getNode( node ) );
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultLocalRepository.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultLocalRepository.java
new file mode 100644
index 0000000..5867af8
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultLocalRepository.java
@@ -0,0 +1,67 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.inject.Inject;
+
+import java.nio.file.Path;
+import java.util.Objects;
+
+import org.apache.maven.api.LocalRepository;
+
+public class DefaultLocalRepository implements LocalRepository
+{
+
+ private final org.eclipse.aether.repository.LocalRepository repository;
+
+ @Inject
+ DefaultLocalRepository( @Nonnull org.eclipse.aether.repository.LocalRepository repository )
+ {
+ this.repository = Objects.requireNonNull( repository, "repository" );
+ }
+
+ public org.eclipse.aether.repository.LocalRepository getRepository()
+ {
+ return repository;
+ }
+
+ @Nonnull
+ @Override
+ public String getId()
+ {
+ return repository.getId();
+ }
+
+ @Nonnull
+ @Override
+ public String getType()
+ {
+ return repository.getContentType();
+ }
+
+ @Nonnull
+ @Override
+ public Path getPath()
+ {
+ return repository.getBasedir().toPath();
+ }
+
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultNode.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultNode.java
new file mode 100644
index 0000000..6d97e94
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultNode.java
@@ -0,0 +1,102 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.List;
+import java.util.function.Predicate;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.NodeVisitor;
+import org.apache.maven.api.Repository;
+
+public class DefaultNode implements Node
+{
+
+ private final DefaultSession session;
+ private final org.eclipse.aether.graph.DependencyNode node;
+
+ public DefaultNode( DefaultSession session,
+ org.eclipse.aether.graph.DependencyNode node )
+ {
+ this.session = session;
+ this.node = node;
+ }
+
+ @Override
+ public Artifact getArtifact()
+ {
+ return session.getArtifact( node.getArtifact() );
+ }
+
+ @Override
+ public Dependency getDependency()
+ {
+ return session.getDependency( node.getDependency() );
+ }
+
+ @Override
+ public List<Node> getChildren()
+ {
+ return new MappedList<>( node.getChildren(), session::getNode );
+ }
+
+ @Override
+ public List<Repository> getRemoteRepositories()
+ {
+ return new MappedList<>( node.getRepositories(), session::getRemoteRepository );
+ }
+
+ @Override
+ public Boolean getOptional()
+ {
+ return node.getDependency().getOptional();
+ }
+
+ @Override
+ public String getScope()
+ {
+ return node.getDependency().getScope();
+ }
+
+ @Override
+ public boolean accept( NodeVisitor visitor )
+ {
+ if ( visitor.enter( this ) )
+ {
+ for ( Node child : getChildren() )
+ {
+ if ( !child.accept( visitor ) )
+ {
+ break;
+ }
+ }
+ }
+ return visitor.leave( this );
+ }
+
+ @Override
+ public Node filter( Predicate<Node> filter )
+ {
+ // TODO
+ throw new UnsupportedOperationException( "Not implemented yet" );
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProject.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProject.java
new file mode 100644
index 0000000..e9b90df
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProject.java
@@ -0,0 +1,172 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Exclusion;
+import org.apache.maven.api.Project;
+import org.apache.maven.model.DependencyManagement;
+import org.apache.maven.model.Model;
+import org.apache.maven.project.MavenProject;
+
+public class DefaultProject implements Project
+{
+
+ private final DefaultSession session;
+ private final MavenProject project;
+
+ public DefaultProject( DefaultSession session, MavenProject project )
+ {
+ this.session = session;
+ this.project = project;
+ }
+
+ @Nonnull
+ @Override
+ public String getGroupId()
+ {
+ return project.getGroupId();
+ }
+
+ @Nonnull
+ @Override
+ public String getArtifactId()
+ {
+ return project.getArtifactId();
+ }
+
+ @Nonnull
+ @Override
+ public String getVersion()
+ {
+ return project.getVersion();
+ }
+
+ @Nonnull
+ @Override
+ public Artifact getArtifact()
+ {
+ // TODO
+ throw new UnsupportedOperationException( "Not implemented yet" );
+ }
+
+ @Nonnull
+ @Override
+ public String getPackaging()
+ {
+ return project.getPackaging();
+ }
+
+ @Nonnull
+ @Override
+ public Model getModel()
+ {
+ return project.getModel();
+ }
+
+ @Nonnull
+ @Override
+ public Path getPomPath()
+ {
+ // TODO
+ throw new UnsupportedOperationException( "Not implemented yet" );
+ }
+
+ @Nonnull
+ @Override
+ public List<Dependency> getDependencies()
+ {
+ return new MappedList<>( project.getDependencies(), this::toDependency );
+ }
+
+ @Nonnull
+ @Override
+ public List<Dependency> getManagedDependencies()
+ {
+ DependencyManagement dependencyManagement = project.getModel().getDependencyManagement();
+ if ( dependencyManagement != null )
+ {
+ return new MappedList<>( dependencyManagement.getDependencies(), this::toDependency );
+ }
+ return Collections.emptyList();
+ }
+
+ private Dependency toDependency( org.apache.maven.model.Dependency dependency )
+ {
+ return new Dependency()
+ {
+ @Nonnull
+ @Override
+ public Artifact getArtifact()
+ {
+ return session.createArtifact( dependency.getGroupId(), dependency.getArtifactId(),
+ dependency.getVersion(), dependency.getType() );
+ }
+
+ @Override
+ public String getScope()
+ {
+ return dependency.getScope();
+ }
+
+ @Override
+ public Boolean getOptional()
+ {
+ return dependency.isOptional();
+ }
+
+ @Nonnull
+ @Override
+ public Collection<Exclusion> getExclusions()
+ {
+ return new MappedCollection<>( dependency.getExclusions(), this::toExclusion );
+ }
+
+ private Exclusion toExclusion( org.apache.maven.model.Exclusion exclusion )
+ {
+ return new Exclusion()
+ {
+ @Nullable
+ @Override
+ public String getGroupId()
+ {
+ return exclusion.getGroupId();
+ }
+
+ @Nullable
+ @Override
+ public String getArtifactId()
+ {
+ return exclusion.getArtifactId();
+ }
+ };
+ }
+ };
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectBuilder.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectBuilder.java
new file mode 100644
index 0000000..e287ccf
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectBuilder.java
@@ -0,0 +1,258 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.inject.Inject;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.Project;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.model.building.ModelProblem;
+import org.apache.maven.model.building.ModelSource;
+import org.apache.maven.project.DefaultProjectBuildingRequest;
+import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.project.ProjectBuildingResult;
+import org.apache.maven.api.services.ArtifactResolverResult;
+import org.apache.maven.api.services.DependencyResolverResult;
+import org.apache.maven.api.services.ProjectBuilder;
+import org.apache.maven.api.services.ProjectBuilderException;
+import org.apache.maven.api.services.ProjectBuilderProblem;
+import org.apache.maven.api.services.ProjectBuilderRequest;
+import org.apache.maven.api.services.ProjectBuilderResult;
+import org.apache.maven.api.services.ProjectBuilderSource;
+
+public class DefaultProjectBuilder implements ProjectBuilder
+{
+
+ private final org.apache.maven.project.ProjectBuilder builder;
+
+ @Inject
+ public DefaultProjectBuilder( org.apache.maven.project.ProjectBuilder builder )
+ {
+ this.builder = builder;
+ }
+
+ @SuppressWarnings( "MethodLength" )
+ @Nonnull
+ @Override
+ public ProjectBuilderResult build( ProjectBuilderRequest request )
+ throws ProjectBuilderException, IllegalArgumentException
+ {
+ DefaultSession session = ( DefaultSession ) request.getSession();
+ try
+ {
+ List<ArtifactRepository> repositories =
+ session.toArtifactRepositories( session.getRemoteRepositories() );
+ ProjectBuildingRequest req = new DefaultProjectBuildingRequest()
+ .setRepositorySession( session.getSession() )
+ .setRemoteRepositories( repositories )
+ .setPluginArtifactRepositories( repositories )
+ .setProcessPlugins( request.isProcessPlugins() );
+ ProjectBuildingResult res;
+ if ( request.getPath().isPresent() )
+ {
+ Path path = request.getPath().get();
+ res = builder.build( path.toFile(), req );
+ }
+ else if ( request.getSource().isPresent() )
+ {
+ ProjectBuilderSource source = request.getSource().get();
+ ModelSource modelSource = new ModelSource()
+ {
+ @Override
+ public InputStream getInputStream() throws IOException
+ {
+ return source.getInputStream();
+ }
+
+ @Override
+ public String getLocation()
+ {
+ return source.getLocation();
+ }
+ };
+ res = builder.build( modelSource, req );
+ }
+ else if ( request.getArtifact().isPresent() )
+ {
+ Artifact a = request.getArtifact().get();
+ org.eclipse.aether.artifact.Artifact aetherArtifact = session.toArtifact( a );
+ org.apache.maven.artifact.Artifact artifact = RepositoryUtils.toArtifact( aetherArtifact );
+ res = builder.build( artifact, request.isAllowStubModel(), req );
+ }
+ else
+ {
+ throw new IllegalArgumentException( "Invalid request" );
+ }
+ return new ProjectBuilderResult()
+ {
+ @Nonnull
+ @Override
+ public String getProjectId()
+ {
+ return res.getProjectId();
+ }
+
+ @Nonnull
+ @Override
+ public Optional<Path> getPomFile()
+ {
+ return Optional.ofNullable( res.getPomFile() ).map( File::toPath );
+ }
+
+ @Nonnull
+ @Override
+ public Optional<Project> getProject()
+ {
+ return Optional.ofNullable( res.getProject() )
+ .map( session::getProject );
+ }
+
+ @Nonnull
+ @Override
+ public Collection<ProjectBuilderProblem> getProblems()
+ {
+ return new MappedCollection<>( res.getProblems(), this::toProblem );
+ }
+
+ private ProjectBuilderProblem toProblem( ModelProblem problem )
+ {
+ return new ProjectBuilderProblem()
+ {
+ @Override
+ public String getSource()
+ {
+ return problem.getSource();
+ }
+
+ @Override
+ public int getLineNumber()
+ {
+ return problem.getLineNumber();
+ }
+
+ @Override
+ public int getColumnNumber()
+ {
+ return problem.getColumnNumber();
+ }
+
+ @Override
+ public String getLocation()
+ {
+ StringBuilder buffer = new StringBuilder( 256 );
+
+ if ( getSource().length() > 0 )
+ {
+ if ( buffer.length() > 0 )
+ {
+ buffer.append( ", " );
+ }
+ buffer.append( getSource() );
+ }
+
+ if ( getLineNumber() > 0 )
+ {
+ if ( buffer.length() > 0 )
+ {
+ buffer.append( ", " );
+ }
+ buffer.append( "line " ).append( getLineNumber() );
+ }
+
+ if ( getColumnNumber() > 0 )
+ {
+ if ( buffer.length() > 0 )
+ {
+ buffer.append( ", " );
+ }
+ buffer.append( "column " ).append( getColumnNumber() );
+ }
+
+ return buffer.toString();
+ }
+
+ @Override
+ public Exception getException()
+ {
+ return problem.getException();
+ }
+
+ @Override
+ public String getMessage()
+ {
+ return problem.getMessage();
+ }
+
+ @Override
+ public Severity getSeverity()
+ {
+ return Severity.valueOf( problem.getSeverity().name() );
+ }
+ };
+ }
+
+ @Nonnull
+ @Override
+ public Optional<DependencyResolverResult> getDependencyResolverResult()
+ {
+ return Optional.ofNullable( res.getDependencyResolutionResult() )
+ .map( r -> new DependencyResolverResult()
+ {
+ @Override
+ public List<Exception> getCollectorExceptions()
+ {
+ return r.getCollectionErrors();
+ }
+
+ @Override
+ public Node getRoot()
+ {
+ return session.getNode( r.getDependencyGraph() );
+ }
+
+ @Override
+ public List<ArtifactResolverResult> getArtifactResults()
+ {
+ return Collections.emptyList();
+ }
+ } );
+ }
+ };
+ }
+ catch ( ProjectBuildingException e )
+ {
+ throw new ProjectBuilderException( "Unable to build project", e );
+ }
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectDeployer.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectDeployer.java
new file mode 100644
index 0000000..b8aabd6
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectDeployer.java
@@ -0,0 +1,142 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.services.ArtifactManager;
+import org.apache.maven.api.services.ProjectDeployer;
+import org.apache.maven.api.services.ProjectDeployerException;
+import org.apache.maven.api.services.ProjectDeployerRequest;
+import org.apache.maven.api.services.ProjectManager;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.deployment.DeployResult;
+import org.eclipse.aether.deployment.DeploymentException;
+import org.eclipse.aether.metadata.Metadata;
+
+@Named
+public class DefaultProjectDeployer implements ProjectDeployer
+{
+
+ private final RepositorySystem repositorySystem;
+
+ @Inject
+ DefaultProjectDeployer( @Nonnull RepositorySystem repositorySystem )
+ {
+ this.repositorySystem = repositorySystem;
+ }
+
+ @Override
+ public void deploy( ProjectDeployerRequest request ) throws ProjectDeployerException, IllegalArgumentException
+ {
+ DefaultSession session = ( DefaultSession ) request.getSession();
+ try
+ {
+ ArtifactManager artifactManager = session.getService( ArtifactManager.class );
+ Collection<Artifact> artifacts = session.getService( ProjectManager.class )
+ .getAttachedArtifacts( request.getProject() );
+ List<Metadata> metadatas = artifacts.stream()
+ .map( artifactManager::getAttachedMetadatas )
+ .flatMap( Collection::stream )
+ .map( session::toMetadata )
+ .collect( Collectors.toList() );
+ DeployRequest deployRequest = new DeployRequest()
+ .setRepository( session.toRepository( request.getRepository() ) )
+ .setArtifacts( session.toArtifacts( artifacts ) )
+ .setMetadata( metadatas );
+
+ DeployResult result = repositorySystem.deploy( session.getSession(), deployRequest );
+ }
+ catch ( DeploymentException e )
+ {
+ throw new ProjectDeployerException( "Unable to deploy project", e );
+ }
+ }
+
+ void dumb()
+ {
+ /*
+ Artifact artifact = projectDeployerRequest.getProject().getArtifact();
+ String packaging = projectDeployerRequest.getProject().getPackaging();
+ File pomFile = projectDeployerRequest.getProject().getFile();
+
+ List<Artifact> attachedArtifacts = projectDeployerRequest.getProject().getAttachedArtifacts();
+
+ // Deploy the POM
+ boolean isPomArtifact = "pom".equals( packaging );
+ if ( isPomArtifact )
+ {
+ artifact.setFile( pomFile );
+ }
+ else
+ {
+ ProjectArtifactMetadata metadata = new ProjectArtifactMetadata( artifact, pomFile );
+ artifact.addMetadata( metadata );
+ }
+
+ // What consequence does this have?
+ // artifact.setRelease( true );
+
+ artifact.setRepository( artifactRepository );
+
+ int retryFailedDeploymentCount = projectDeployerRequest.getRetryFailedDeploymentCount();
+
+ List<Artifact> deployableArtifacts = new ArrayList<>();
+ if ( isPomArtifact )
+ {
+ deployableArtifacts.add( artifact );
+ }
+ else
+ {
+ File file = artifact.getFile();
+
+ if ( file != null && file.isFile() )
+ {
+ deployableArtifacts.add( artifact );
+ }
+ else if ( !attachedArtifacts.isEmpty() )
+ {
+ // TODO: Reconsider this exception? Better Exception type?
+ throw new NoFileAssignedException( "The packaging plugin for this project did not assign "
+ + "a main file to the project but it has attachments. Change packaging to 'pom'." );
+ }
+ else
+ {
+ // TODO: Reconsider this exception? Better Exception type?
+ throw new NoFileAssignedException( "The packaging for this project did not assign "
+ + "a file to the build artifact" );
+ }
+ }
+
+ deployableArtifacts.addAll( attachedArtifacts );
+
+ deploy( buildingRequest, deployableArtifacts, artifactRepository, retryFailedDeploymentCount );
+
+ */
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectInstaller.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectInstaller.java
new file mode 100644
index 0000000..ed87e56
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectInstaller.java
@@ -0,0 +1,77 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.services.ArtifactManager;
+import org.apache.maven.api.services.ProjectInstaller;
+import org.apache.maven.api.services.ProjectInstallerException;
+import org.apache.maven.api.services.ProjectInstallerRequest;
+import org.apache.maven.api.services.ProjectManager;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.installation.InstallRequest;
+import org.eclipse.aether.installation.InstallResult;
+import org.eclipse.aether.installation.InstallationException;
+import org.eclipse.aether.metadata.Metadata;
+
+@Named
+public class DefaultProjectInstaller implements ProjectInstaller
+{
+ private final RepositorySystem repositorySystem;
+
+ @Inject
+ DefaultProjectInstaller( RepositorySystem repositorySystem )
+ {
+ this.repositorySystem = repositorySystem;
+ }
+
+ @Override
+ public void install( ProjectInstallerRequest request ) throws ProjectInstallerException, IllegalArgumentException
+ {
+ DefaultSession session = ( DefaultSession ) request.getSession();
+ try
+ {
+ ArtifactManager artifactManager = session.getService( ArtifactManager.class );
+ Collection<Artifact> artifacts = session.getService( ProjectManager.class )
+ .getAttachedArtifacts( request.getProject() );
+ List<Metadata> metadatas = artifacts.stream()
+ .map( artifactManager::getAttachedMetadatas )
+ .flatMap( Collection::stream )
+ .map( session::toMetadata )
+ .collect( Collectors.toList() );
+ InstallRequest installRequest = new InstallRequest()
+ .setArtifacts( session.toArtifacts( artifacts ) )
+ .setMetadata( metadatas );
+
+ InstallResult result = repositorySystem.install( session.getSession(), installRequest );
+ }
+ catch ( InstallationException e )
+ {
+ throw new ProjectInstallerException( "Unable to install project", e );
+ }
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRemoteRepository.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRemoteRepository.java
new file mode 100644
index 0000000..73d481f
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRemoteRepository.java
@@ -0,0 +1,53 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.apache.maven.api.RemoteRepository;
+
+public class DefaultRemoteRepository implements RemoteRepository
+{
+ private final org.eclipse.aether.repository.RemoteRepository repository;
+
+ public DefaultRemoteRepository( org.eclipse.aether.repository.RemoteRepository repository )
+ {
+ this.repository = repository;
+ }
+
+ public org.eclipse.aether.repository.RemoteRepository getRepository()
+ {
+ return repository;
+ }
+
+ @Nonnull
+ @Override
+ public String getId()
+ {
+ return repository.getId();
+ }
+
+ @Nonnull
+ @Override
+ public String getType()
+ {
+ return repository.getContentType();
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultSession.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultSession.java
new file mode 100644
index 0000000..6b37f63
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultSession.java
@@ -0,0 +1,386 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Objects;
+import java.util.WeakHashMap;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.services.Service;
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.ArtifactMetadata;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.Project;
+import org.apache.maven.api.LocalRepository;
+import org.apache.maven.api.RemoteRepository;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.bridge.MavenRepositorySystem;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.api.services.ArtifactResolver;
+import org.apache.maven.api.services.ArtifactDeployer;
+import org.apache.maven.api.services.ArtifactFactory;
+import org.apache.maven.api.services.ArtifactInstaller;
+import org.apache.maven.api.services.DependencyCollector;
+import org.apache.maven.api.services.DependencyFactory;
+import org.apache.maven.api.services.DependencyResolver;
+import org.apache.maven.api.services.ProjectBuilder;
+import org.apache.maven.api.services.ProjectDeployer;
+import org.apache.maven.api.services.ProjectInstaller;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.repository.LocalRepositoryManager;
+import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
+import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
+
+public class DefaultSession implements Session
+{
+
+ private final RepositorySystemSession session;
+ private final RepositorySystem repositorySystem;
+ private final LocalRepositoryManagerFactory localRepositoryManagerFactory;
+ private final List<RemoteRepository> repositories;
+ private final org.apache.maven.project.ProjectBuilder projectBuilder;
+ private final MavenRepositorySystem mavenRepositorySystem;
+
+ private final Map<org.eclipse.aether.graph.DependencyNode, Node> allNodes
+ = Collections.synchronizedMap( new WeakHashMap<>() );
+ private final Map<org.eclipse.aether.artifact.Artifact, Artifact> allArtifacts
+ = Collections.synchronizedMap( new WeakHashMap<>() );
+ private final Map<org.eclipse.aether.repository.RemoteRepository, RemoteRepository> allRepositories
+ = Collections.synchronizedMap( new WeakHashMap<>() );
+ private final Map<MavenProject, Project> allProjects
+ = Collections.synchronizedMap( new WeakHashMap<>() );
+ private final Map<org.eclipse.aether.graph.Dependency, Dependency> allDependencies
+ = Collections.synchronizedMap( new WeakHashMap<>() );
+
+ public DefaultSession( @Nonnull RepositorySystemSession session,
+ @Nonnull RepositorySystem repositorySystem,
+ @Nonnull LocalRepositoryManagerFactory localRepositoryManagerFactory,
+ @Nonnull List<RemoteRepository> repositories,
+ @Nonnull org.apache.maven.project.ProjectBuilder projectBuilder,
+ @Nonnull MavenRepositorySystem mavenRepositorySystem )
+ {
+ this.session = Objects.requireNonNull( session );
+ this.repositorySystem = Objects.requireNonNull( repositorySystem );
+ this.localRepositoryManagerFactory = Objects.requireNonNull( localRepositoryManagerFactory );
+ this.repositories = Objects.requireNonNull( repositories );
+ this.projectBuilder = projectBuilder;
+ this.mavenRepositorySystem = mavenRepositorySystem;
+ }
+
+ @Nonnull
+ @Override
+ public LocalRepository getLocalRepository()
+ {
+ return new DefaultLocalRepository( session.getLocalRepository() );
+ }
+
+ @Nonnull
+ @Override
+ public List<RemoteRepository> getRemoteRepositories()
+ {
+ return Collections.unmodifiableList( repositories );
+ }
+
+ @Nonnull
+ @Override
+ public Session withLocalRepository( @Nonnull LocalRepository localRepository )
+ {
+ Objects.requireNonNull( localRepository, "localRepository" );
+ if ( session.getLocalRepository() != null
+ && Objects.equals( session.getLocalRepository().getBasedir().toPath(),
+ localRepository.getPath() ) )
+ {
+ return this;
+ }
+ try
+ {
+ org.eclipse.aether.repository.LocalRepository repository = toRepository( localRepository );
+ LocalRepositoryManager localRepositoryManager
+ = localRepositoryManagerFactory.newInstance( session, repository );
+
+ RepositorySystemSession newSession = new DefaultRepositorySystemSession( session )
+ .setLocalRepositoryManager( localRepositoryManager );
+
+ return new DefaultSession( newSession, repositorySystem, localRepositoryManagerFactory,
+ repositories, projectBuilder, mavenRepositorySystem );
+ }
+ catch ( NoLocalRepositoryManagerException e )
+ {
+ throw new IllegalArgumentException( "Unsupported repository layout", e );
+ }
+
+ }
+
+ @Nonnull
+ @Override
+ public Session withRemoteRepositories( @Nonnull List<RemoteRepository> repositories )
+ {
+ return new DefaultSession( session, repositorySystem, localRepositoryManagerFactory,
+ repositories, projectBuilder, mavenRepositorySystem );
+ }
+
+ @Nonnull
+ @Override
+ @SuppressWarnings( "unchecked" )
+ public <T extends Service> T getService( Class<T> clazz ) throws NoSuchElementException
+ {
+ if ( clazz == ArtifactFactory.class )
+ {
+ return (T) new DefaultArtifactFactory();
+ }
+ else if ( clazz == ArtifactResolver.class )
+ {
+ return (T) new DefaultArtifactResolver( repositorySystem );
+ }
+ else if ( clazz == ArtifactDeployer.class )
+ {
+ return (T) new DefaultArtifactDeployer( repositorySystem );
+ }
+ else if ( clazz == ArtifactInstaller.class )
+ {
+ return (T) new DefaultArtifactInstaller( repositorySystem );
+ }
+ else if ( clazz == DependencyFactory.class )
+ {
+ return (T) new DefaultDependencyFactory();
+ }
+ else if ( clazz == DependencyCollector.class )
+ {
+ return (T) new DefaultDependencyCollector( repositorySystem );
+ }
+ else if ( clazz == DependencyResolver.class )
+ {
+ return (T) new DefaultDependencyResolver( repositorySystem );
+ }
+ else if ( clazz == ProjectBuilder.class )
+ {
+ return (T) new DefaultProjectBuilder( projectBuilder );
+ }
+ else if ( clazz == ProjectDeployer.class )
+ {
+ return (T) new DefaultProjectDeployer( repositorySystem );
+ }
+ else if ( clazz == ProjectInstaller.class )
+ {
+ return (T) new DefaultProjectInstaller( repositorySystem );
+ }
+ throw new NoSuchElementException( clazz.getName() );
+ }
+
+ public RepositorySystemSession getSession()
+ {
+ return session;
+ }
+
+ public RemoteRepository getRemoteRepository( org.eclipse.aether.repository.RemoteRepository repository )
+ {
+ return allRepositories.computeIfAbsent( repository, DefaultRemoteRepository::new );
+ }
+
+ public Node getNode( org.eclipse.aether.graph.DependencyNode node )
+ {
+ return allNodes.computeIfAbsent( node, n -> new DefaultNode( this, n ) );
+ }
+
+ public Artifact getArtifact( org.eclipse.aether.artifact.Artifact artifact )
+ {
+ return allArtifacts.computeIfAbsent( artifact, a -> new DefaultArtifact( this, a ) );
+ }
+
+ public Dependency getDependency( org.eclipse.aether.graph.Dependency dependency )
+ {
+ return allDependencies.computeIfAbsent( dependency, d -> new DefaultDependency( this, d ) );
+ }
+
+ public Project getProject( MavenProject project )
+ {
+ return allProjects.computeIfAbsent( project, p -> new DefaultProject( this, p ) );
+ }
+
+ public List<org.eclipse.aether.repository.RemoteRepository> toRepositories( List<RemoteRepository> repositories )
+ {
+ return repositories == null ? null : repositories.stream()
+ .map( this::toRepository )
+ .collect( Collectors.toList() );
+ }
+
+ public org.eclipse.aether.repository.RemoteRepository toRepository( RemoteRepository repository )
+ {
+ if ( repository instanceof DefaultRemoteRepository )
+ {
+ return ( (DefaultRemoteRepository) repository ).getRepository();
+ }
+ else
+ {
+ // TODO
+ throw new UnsupportedOperationException( "Not implemented yet" );
+ }
+ }
+
+ public org.eclipse.aether.repository.LocalRepository toRepository( LocalRepository repository )
+ {
+ if ( repository instanceof DefaultLocalRepository )
+ {
+ return ( ( DefaultLocalRepository ) repository ).getRepository();
+ }
+ else
+ {
+ // TODO
+ throw new UnsupportedOperationException( "Not implemented yet" );
+ }
+ }
+
+ public List<ArtifactRepository> toArtifactRepositories( List<RemoteRepository> repositories )
+ {
+ return repositories == null ? null : repositories.stream()
+ .map( this::toArtifactRepository )
+ .collect( Collectors.toList() );
+ }
+
+ private ArtifactRepository toArtifactRepository( RemoteRepository repository )
+ {
+ if ( repository instanceof DefaultRemoteRepository )
+ {
+ org.eclipse.aether.repository.RemoteRepository rr
+ = ( (DefaultRemoteRepository) repository ).getRepository();
+
+ try
+ {
+ return mavenRepositorySystem.createRepository(
+ rr.getUrl(),
+ rr.getId(),
+ rr.getPolicy( false ).isEnabled(),
+ rr.getPolicy( false ).getUpdatePolicy(),
+ rr.getPolicy( true ).isEnabled(),
+ rr.getPolicy( true ).getUpdatePolicy(),
+ rr.getPolicy( false ).getChecksumPolicy()
+
+ );
+ }
+ catch ( Exception e )
+ {
+ throw new RuntimeException( "Unable to create repository", e );
+ }
+ }
+ else
+ {
+ // TODO
+ throw new UnsupportedOperationException( "Not yet implemented" );
+ }
+ }
+
+ public List<org.eclipse.aether.graph.Dependency> toDependencies( Collection<Dependency> dependencies )
+ {
+ return dependencies == null ? null : dependencies.stream()
+ .map( this::toDependency )
+ .collect( Collectors.toList() );
+ }
+
+ public org.eclipse.aether.graph.Dependency toDependency( Dependency dependency )
+ {
+ if ( dependency instanceof DefaultDependency )
+ {
+ return ( ( DefaultDependency ) dependency ).getDependency();
+ }
+ else
+ {
+ String typeId = dependency.getType();
+ org.eclipse.aether.artifact.ArtifactType type = typeId != null
+ ? session.getArtifactTypeRegistry().get( typeId ) : null;
+ String extension = type != null ? type.getExtension() : null;
+ return new org.eclipse.aether.graph.Dependency(
+ new org.eclipse.aether.artifact.DefaultArtifact(
+ dependency.getGroupId(),
+ dependency.getArtifactId(),
+ dependency.getClassifier(),
+ extension,
+ dependency.getVersion(),
+ type
+ ), null );
+ }
+ }
+
+ public List<org.eclipse.aether.artifact.Artifact> toArtifacts( Collection<Artifact> artifacts )
+ {
+ return artifacts == null ? null : artifacts.stream()
+ .map( this::toArtifact )
+ .collect( Collectors.toList() );
+ }
+
+ public org.eclipse.aether.artifact.Artifact toArtifact( Artifact artifact )
+ {
+ if ( artifact instanceof DefaultArtifact )
+ {
+ return ( ( DefaultArtifact ) artifact ).getArtifact();
+ }
+ else
+ {
+ return new org.eclipse.aether.artifact.DefaultArtifact(
+ artifact.getGroupId(),
+ artifact.getArtifactId(),
+ artifact.getClassifier(),
+ artifact.getExtension(),
+ artifact.getVersion(),
+ null,
+ ( (Artifact) artifact ).getPath().map( Path::toFile ).orElse( null )
+ );
+ }
+ }
+
+ public org.eclipse.aether.metadata.Metadata toMetadata( ArtifactMetadata metadata )
+ {
+ /*
+ if ( metadata instanceof ProjectArtifactMetadata )
+ {
+ Artifact pomArtifact = new SubArtifact( mainArtifact, "", "pom" );
+ pomArtifact = pomArtifact.setFile( ( (ProjectArtifactMetadata) metadata ).getFile() );
+ request.addArtifact( pomArtifact );
+ }
+ else if ( // metadata instanceof SnapshotArtifactRepositoryMetadata ||
+ metadata instanceof ArtifactRepositoryMetadata )
+ {
+ // eaten, handled by repo system
+ }
+ else if ( metadata instanceof org.apache.maven.shared.transfer.metadata.ArtifactMetadata )
+ {
+ org.apache.maven.shared.transfer.metadata.ArtifactMetadata transferMetadata =
+ (org.apache.maven.shared.transfer.metadata.ArtifactMetadata) metadata;
+
+ request.addMetadata( new Maven31MetadataBridge( metadata ).setFile( transferMetadata.getFile() ) );
+ }
+
+ */
+ // TODO
+ throw new UnsupportedOperationException( "Not implemented yet" );
+ }
+
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/MappedCollection.java b/maven-core-impl/src/main/java/org/apache/maven/impl/MappedCollection.java
new file mode 100644
index 0000000..1fd3248
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/MappedCollection.java
@@ -0,0 +1,63 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.AbstractCollection;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.function.Function;
+
+public class MappedCollection<U, V> extends AbstractCollection<U>
+{
+ private final Collection<V> list;
+ private final Function<V, U> mapper;
+
+ public MappedCollection( Collection<V> list, Function<V, U> mapper )
+ {
+ this.list = list;
+ this.mapper = mapper;
+ }
+
+ @Override
+ public Iterator<U> iterator()
+ {
+ Iterator<V> it = list.iterator();
+ return new Iterator<U>()
+ {
+ @Override
+ public boolean hasNext()
+ {
+ return it.hasNext();
+ }
+
+ @Override
+ public U next()
+ {
+ return mapper.apply( it.next() );
+ }
+ };
+ }
+
+ @Override
+ public int size()
+ {
+ return list.size();
+ }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/MappedList.java b/maven-core-impl/src/main/java/org/apache/maven/impl/MappedList.java
new file mode 100644
index 0000000..a5e8e71
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/MappedList.java
@@ -0,0 +1,48 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.AbstractList;
+import java.util.List;
+import java.util.function.Function;
+
+public class MappedList<U, V> extends AbstractList<U>
+{
+ private final List<V> list;
+ private final Function<V, U> mapper;
+
+ public MappedList( List<V> list, Function<V, U> mapper )
+ {
+ this.list = list;
+ this.mapper = mapper;
+ }
+
+ @Override
+ public U get( int index )
+ {
+ return mapper.apply( list.get( index ) );
+ }
+
+ @Override
+ public int size()
+ {
+ return list.size();
+ }
+}
diff --git a/maven-core-impl/src/test/java/org/apache/maven/impl/TestApi.java b/maven-core-impl/src/test/java/org/apache/maven/impl/TestApi.java
new file mode 100644
index 0000000..7736f81
--- /dev/null
+++ b/maven-core-impl/src/test/java/org/apache/maven/impl/TestApi.java
@@ -0,0 +1,105 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.inject.Inject;
+
+import java.util.Collections;
+
+import org.apache.maven.api.Project;
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.services.ProjectBuilder;
+import org.apache.maven.api.services.ProjectBuilderRequest;
+import org.apache.maven.bridge.MavenRepositorySystem;
+import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.codehaus.plexus.testing.PlexusTest;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@PlexusTest
+public class TestApi
+{
+
+ Session session;
+
+ @Inject
+ RepositorySystem repositorySystem;
+
+ @Inject
+ LocalRepositoryManagerFactory localRepositoryManagerFactory;
+
+ @Inject
+ org.apache.maven.project.ProjectBuilder projectBuilder;
+
+ @Inject
+ MavenRepositorySystem mavenRepositorySystem;
+
+ @BeforeEach
+ void setup()
+ {
+ RepositorySystemSession rss = MavenRepositorySystemUtils.newSession();
+ DefaultSession session = new DefaultSession( rss, repositorySystem, localRepositoryManagerFactory,
+ Collections.emptyList(), projectBuilder, mavenRepositorySystem );
+ DefaultLocalRepository localRepository = new DefaultLocalRepository(
+ new LocalRepository( "target/repo" ) );
+ org.apache.maven.api.RemoteRepository remoteRepository = session.getRemoteRepository(
+ new RemoteRepository.Builder( "mirror", "default",
+ "file:target/test-classes/repo" ).build() );
+ this.session = session
+ .withLocalRepository( localRepository )
+ .withRemoteRepositories( Collections.singletonList( remoteRepository ) );
+ }
+
+ @Test
+ void testCreateAndResolveArtifact() throws Exception
+ {
+ Artifact artifact = session.createArtifact( "org.codehaus.plexus", "plexus-utils", "1.4.5", "pom" );
+ assertFalse( artifact.getPath().isPresent() );
+
+ Artifact resolved = session.resolveArtifact( artifact ).getArtifact();
+ assertNotSame( resolved, artifact );
+ assertTrue( resolved.getPath().isPresent() );
+ assertNotNull( resolved.getPath().get() );
+
+ Project project = session.getService( ProjectBuilder.class ).build(
+ ProjectBuilderRequest.builder().session( session ).path( resolved.getPath().get() )
+ .processPlugins( false ).resolveDependencies( false ).build() )
+ .getProject().get();
+ assertNotNull( project );
+
+ artifact = session.createArtifact( "org.codehaus.plexus", "plexus-container-default", "1.0-alpha-32", "jar" );
+ Node root = session.collectDependencies( artifact ).getRoot();
+ assertNotNull( root );
+ }
+
+
+}
diff --git a/maven-core-impl/src/test/java/org/apache/maven/impl/TestArtifactHandler.java b/maven-core-impl/src/test/java/org/apache/maven/impl/TestArtifactHandler.java
new file mode 100644
index 0000000..1411364
--- /dev/null
+++ b/maven-core-impl/src/test/java/org/apache/maven/impl/TestArtifactHandler.java
@@ -0,0 +1,83 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.handler.ArtifactHandler;
+
+/**
+ * Assists unit testing.
+ *
+ * @author Benjamin Bentmann
+ */
+class TestArtifactHandler
+ implements ArtifactHandler
+{
+
+ private String type;
+
+ private String extension;
+
+ public TestArtifactHandler( String type )
+ {
+ this( type, type );
+ }
+
+ public TestArtifactHandler( String type, String extension )
+ {
+ this.type = type;
+ this.extension = extension;
+ }
+
+ public String getClassifier()
+ {
+ return null;
+ }
+
+ public String getDirectory()
+ {
+ return getPackaging() + "s";
+ }
+
+ public String getExtension()
+ {
+ return extension;
+ }
+
+ public String getLanguage()
+ {
+ return "java";
+ }
+
+ public String getPackaging()
+ {
+ return type;
+ }
+
+ public boolean isAddedToClasspath()
+ {
+ return true;
+ }
+
+ public boolean isIncludesDependencies()
+ {
+ return false;
+ }
+
+}
diff --git a/maven-core-impl/src/test/java/org/apache/maven/impl/TestRepositorySystem.java b/maven-core-impl/src/test/java/org/apache/maven/impl/TestRepositorySystem.java
new file mode 100644
index 0000000..824ac27
--- /dev/null
+++ b/maven-core-impl/src/test/java/org/apache/maven/impl/TestRepositorySystem.java
@@ -0,0 +1,341 @@
+package org.apache.maven.impl;
+
+/*
+ * 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 javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.InvalidRepositoryException;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.repository.MavenArtifactRepository;
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
+import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.Repository;
+import org.apache.maven.model.io.ModelReader;
+import org.apache.maven.project.artifact.ArtifactWithDependencies;
+import org.apache.maven.repository.ArtifactDoesNotExistException;
+import org.apache.maven.repository.ArtifactTransferFailedException;
+import org.apache.maven.repository.ArtifactTransferListener;
+import org.apache.maven.repository.RepositorySystem;
+import org.apache.maven.settings.Mirror;
+import org.apache.maven.settings.Proxy;
+import org.apache.maven.settings.Server;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.StringUtils;
+import org.eclipse.aether.RepositorySystemSession;
+
+/**
+ * @author Benjamin Bentmann
+ */
+@Named
+@Singleton
+public class TestRepositorySystem
+ implements RepositorySystem
+{
+
+ private final ModelReader modelReader;
+
+ private final ArtifactFactory artifactFactory;
+
+ @Inject
+ public TestRepositorySystem( ModelReader modelReader, ArtifactFactory artifactFactory )
+ {
+ this.modelReader = modelReader;
+ this.artifactFactory = artifactFactory;
+ }
+
+ public ArtifactRepository buildArtifactRepository( Repository repository )
+ throws InvalidRepositoryException
+ {
+ return new MavenArtifactRepository( repository.getId(), repository.getUrl(), new DefaultRepositoryLayout(),
+ new ArtifactRepositoryPolicy(), new ArtifactRepositoryPolicy() );
+ }
+
+ public Artifact createArtifact( String groupId, String artifactId, String version, String packaging )
+ {
+ return createArtifact( groupId, artifactId, version, null, packaging );
+ }
+
+ public Artifact createArtifact( String groupId, String artifactId, String version, String scope, String type )
+ {
+ return new DefaultArtifact( groupId, artifactId, version, scope, type, null, new TestArtifactHandler( type ) );
+ }
+
+ public ArtifactRepository createArtifactRepository( String id, String url,
+ ArtifactRepositoryLayout repositoryLayout,
+ ArtifactRepositoryPolicy snapshots,
+ ArtifactRepositoryPolicy releases )
+ {
+ return new MavenArtifactRepository( id, url, repositoryLayout, snapshots, releases );
+ }
+
+ public Artifact createArtifactWithClassifier( String groupId, String artifactId, String version, String type,
+ String classifier )
+ {
+ return new DefaultArtifact( groupId, artifactId, version, null, type, classifier,
+ new TestArtifactHandler( type ) );
+ }
+
+ public ArtifactRepository createDefaultLocalRepository()
+ throws InvalidRepositoryException
+ {
+ return createLocalRepository( new File( System.getProperty( "basedir", "." ), "target/local-repo" ).getAbsoluteFile() );
+ }
+
+ public ArtifactRepository createDefaultRemoteRepository()
+ throws InvalidRepositoryException
+ {
+ return new MavenArtifactRepository( DEFAULT_REMOTE_REPO_ID, "file://"
+ + new File( System.getProperty( "basedir", "." ), "src/test/remote-repo" ).getAbsoluteFile().toURI().getPath(),
+ new DefaultRepositoryLayout(), new ArtifactRepositoryPolicy(),
+ new ArtifactRepositoryPolicy() );
+ }
+
+ public Artifact createDependencyArtifact( Dependency dependency )
+ {
+ Artifact artifact =
+ new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion(),
+ dependency.getScope(), dependency.getType(), dependency.getClassifier(),
+ new TestArtifactHandler( dependency.getType() ) );
+
+ if ( Artifact.SCOPE_SYSTEM.equals( dependency.getScope() ) )
+ {
+ artifact.setFile( new File( dependency.getSystemPath() ) );
+ artifact.setResolved( true );
+ }
+
+ return artifact;
+ }
+
+ public ArtifactRepository createLocalRepository( File localRepository )
+ throws InvalidRepositoryException
+ {
+ return new MavenArtifactRepository( DEFAULT_LOCAL_REPO_ID, "file://" + localRepository.toURI().getPath(),
+ new DefaultRepositoryLayout(), new ArtifactRepositoryPolicy(),
+ new ArtifactRepositoryPolicy() );
+ }
+
+ public Artifact createPluginArtifact( Plugin plugin )
+ {
+ VersionRange versionRange;
+ try
+ {
+ String version = plugin.getVersion();
+ if ( StringUtils.isEmpty( version ) )
+ {
+ version = "RELEASE";
+ }
+ versionRange = VersionRange.createFromVersionSpec( version );
+ }
+ catch ( InvalidVersionSpecificationException e )
+ {
+ return null;
+ }
+
+ return artifactFactory.createPluginArtifact( plugin.getGroupId(), plugin.getArtifactId(), versionRange );
+ }
+
+ public Artifact createProjectArtifact( String groupId, String artifactId, String version )
+ {
+ return createArtifact( groupId, artifactId, version, "pom" );
+ }
+
+ public List<ArtifactRepository> getEffectiveRepositories( List<ArtifactRepository> repositories )
+ {
+ return repositories;
+ }
+
+ public Mirror getMirror( ArtifactRepository repository, List<Mirror> mirrors )
+ {
+ return null;
+ }
+
+ public void injectAuthentication( List<ArtifactRepository> repositories, List<Server> servers )
+ {
+ }
+
+ public void injectMirror( List<ArtifactRepository> repositories, List<Mirror> mirrors )
+ {
+ }
+
+ public void injectProxy( List<ArtifactRepository> repositories, List<Proxy> proxies )
+ {
+ }
+
+ public void publish( ArtifactRepository repository, File source, String remotePath,
+ ArtifactTransferListener transferListener )
+ throws ArtifactTransferFailedException
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ public ArtifactResolutionResult resolve( ArtifactResolutionRequest request )
+ {
+ ArtifactResolutionResult result = new ArtifactResolutionResult();
+
+ if ( request.isResolveRoot() )
+ {
+ try
+ {
+ resolve( request.getArtifact(), request );
+ result.addArtifact( request.getArtifact() );
+ }
+ catch ( IOException e )
+ {
+ result.addMissingArtifact( request.getArtifact() );
+ }
+ }
+
+ if ( request.isResolveTransitively() )
+ {
+ Map<String, Artifact> artifacts = new LinkedHashMap<>();
+
+ if ( request.getArtifactDependencies() != null )
+ {
+ for ( Artifact artifact : request.getArtifactDependencies() )
+ {
+ artifacts.put( artifact.getDependencyConflictId(), artifact );
+ }
+ }
+
+ List<Dependency> dependencies = new ArrayList<>();
+ if ( request.getArtifact() instanceof ArtifactWithDependencies )
+ {
+ dependencies = ( (ArtifactWithDependencies) request.getArtifact() ).getDependencies();
+ }
+ else
+ {
+ Artifact pomArtifact =
+ createProjectArtifact( request.getArtifact().getGroupId(), request.getArtifact().getArtifactId(),
+ request.getArtifact().getVersion() );
+ File pomFile =
+ new File( request.getLocalRepository().getBasedir(),
+ request.getLocalRepository().pathOf( pomArtifact ) );
+
+ try
+ {
+ Model model = modelReader.read( pomFile, null );
+
+ dependencies = model.getDependencies();
+ }
+ catch ( IOException e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ for ( Dependency dependency : dependencies )
+ {
+ Artifact artifact = createDependencyArtifact( dependency );
+ if ( !artifacts.containsKey( artifact.getDependencyConflictId() ) )
+ {
+ artifacts.put( artifact.getDependencyConflictId(), artifact );
+ }
+ }
+
+ for ( Artifact artifact : artifacts.values() )
+ {
+ try
+ {
+ resolve( artifact, request );
+ result.addArtifact( artifact );
+ }
+ catch ( IOException e )
+ {
+ result.addMissingArtifact( artifact );
+ }
+ }
+ }
+
+ return result;
+ }
+
+ private void resolve( Artifact artifact, ArtifactResolutionRequest request )
+ throws IOException
+ {
+ if ( Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) )
+ {
+ return;
+ }
+
+ ArtifactRepository localRepo = request.getLocalRepository();
+
+ File localFile = new File( localRepo.getBasedir(), localRepo.pathOf( artifact ) );
+
+ artifact.setFile( localFile );
+
+ if ( !localFile.exists() )
+ {
+ if ( request.getRemoteRepositories().isEmpty() )
+ {
+ throw new IOException( localFile + " does not exist and no remote repositories are configured" );
+ }
+
+ ArtifactRepository remoteRepo = request.getRemoteRepositories().get( 0 );
+
+ File remoteFile = new File( remoteRepo.getBasedir(), remoteRepo.pathOf( artifact ) );
+
+ FileUtils.copyFile( remoteFile, localFile );
+ }
+
+ artifact.setResolved( true );
+ }
+
+ public void retrieve( ArtifactRepository repository, File destination, String remotePath,
+ ArtifactTransferListener transferListener )
+ throws ArtifactTransferFailedException, ArtifactDoesNotExistException
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void injectMirror( RepositorySystemSession session, List<ArtifactRepository> repositories )
+ {
+ }
+
+ public void injectProxy( RepositorySystemSession session, List<ArtifactRepository> repositories )
+ {
+ }
+
+ public void injectAuthentication( RepositorySystemSession session, List<ArtifactRepository> repositories )
+ {
+ }
+
+}
diff --git a/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar
new file mode 100644
index 0000000..c5c52ad
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar.sha1 b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar.sha1
new file mode 100644
index 0000000..a52569f
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar.sha1
@@ -0,0 +1 @@
+48856bef6c64eb9689eab125197fdefc399c7858
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom
new file mode 100644
index 0000000..ecf6fcf
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom
@@ -0,0 +1,220 @@
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-httpclient</groupId>
+ <artifactId>commons-httpclient</artifactId>
+ <name>HttpClient</name>
+ <version>2.0.2</version>
+ <description>The HttpClient component supports the client-side of RFC 1945 (HTTP/1.0) and RFC 2616 (HTTP/1.1) , several related specifications (RFC 2109 (Cookies) , RFC 2617 (HTTP Authentication) , etc.), and provides a framework by which new request types (methods) or HTTP extensions can be created easily.</description>
+ <url>http://jakarta.apache.org/commons/httpclient/</url>
+ <issueManagement>
+ <url>http://nagoya.apache.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&component=HttpClient</url>
+ </issueManagement>
+ <ciManagement>
+ <notifiers>
+ <notifier>
+ <configuration>
+ <address>commons-httpclient-dev@jakarta.apache.org</address>
+ </configuration>
+ </notifier>
+ </notifiers>
+ </ciManagement>
+ <inceptionYear>2001</inceptionYear>
+ <mailingLists>
+ <mailingList>
+ <name>HttpClient Mailing List</name>
+ <subscribe>commons-httpclient-dev-subscribe@jakarta.apache.org</subscribe>
+ <unsubscribe>commons-httpclient-dev-unsubscribe@jakarta.apache.org</unsubscribe>
+ <archive>http://nagoya.apache.org/eyebrowse/SummarizeList?listId=128</archive>
+ </mailingList>
+ <mailingList>
+ <name>Commons Developer List</name>
+ <subscribe>commons-dev-subscribe@jakarta.apache.org</subscribe>
+ <unsubscribe>commons-dev-unsubscribe@jakarta.apache.org</unsubscribe>
+ <archive>http://nagoya.apache.org/eyebrowse/SummarizeList?listId=15</archive>
+ </mailingList>
+ <mailingList>
+ <name>Commons User List</name>
+ <subscribe>commons-user-subscribe@jakarta.apache.org</subscribe>
+ <unsubscribe>commons-user-unsubscribe@jakarta.apache.org</unsubscribe>
+ <archive>http://nagoya.apache.org/eyebrowse/SummarizeList?listId=105</archive>
+ </mailingList>
+ </mailingLists>
+ <developers>
+ <developer>
+ <id>mbecke</id>
+ <name>Michael Becke</name>
+ <email>mbecke -at- apache.org</email>
+ <organization></organization>
+ <roles>
+ <role>Release Prime</role>
+ <role>Java Developer</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>jsdever</id>
+ <name>Jeff Dever</name>
+ <email>jsdever -at- apache.org</email>
+ <organization>Vault Technologies</organization>
+ <roles>
+ <role>List Moderator</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>dion</id>
+ <name>dIon Gillard</name>
+ <email>dion -at- apache.org</email>
+ <organization>Multitask Consulting</organization>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>oglueck</id>
+ <name>Ortwin Glueck</name>
+ <email>oglueck -at -apache.org</email>
+ <organization>Nose Applied Intelligence AG</organization>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>jericho</id>
+ <name>Sung-Gu</name>
+ <email>jericho -at- apache.org</email>
+ <organization></organization>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>olegk</id>
+ <name>Oleg Kalnichevski</name>
+ <email>olegk -at- apache.org</email>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>sullis</id>
+ <name>Sean C. Sullivan</name>
+ <email>sullis -at- apache.org</email>
+ <organization>Independent consultant</organization>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>adrian</id>
+ <name>Adrian Sutton</name>
+ <email>adrian.sutton -at- ephox.com</email>
+ <organization>Intencha</organization>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>rwaldhoff</id>
+ <name>Rodney Waldhoff</name>
+ <email>rwaldhoff -at- apache</email>
+ <organization>Britannica</organization>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ </developer>
+ </developers>
+ <contributors>
+ <contributor>
+ <name>Armando Anton</name>
+ <email>armando.anton -at- newknow.com</email>
+ </contributor>
+ <contributor>
+ <name>Ola Berg</name>
+ <email></email>
+ </contributor>
+ <contributor>
+ <name>Sam Berlin</name>
+ <email>sberlin -at- limepeer.com</email>
+ </contributor>
+ <contributor>
+ <name>Mike Bowler</name>
+ <email></email>
+ </contributor>
+ <contributor>
+ <name>Eric Johnson</name>
+ <email>eric -at- tibco.com</email>
+ </contributor>
+ <contributor>
+ <name>Christian Kohlschuetter</name>
+ <email>ck -at- newsclub.de</email>
+ </contributor>
+ <contributor>
+ <name>Ryan Lubke</name>
+ <email>Ryan.Lubke -at- Sun.COM</email>
+ </contributor>
+ <contributor>
+ <name>Sam Maloney</name>
+ <email>sam.maloney -at- filogix.com</email>
+ </contributor>
+ <contributor>
+ <name>Rob Di Marco</name>
+ <email>rdimarco -at- hmsonline.com</email>
+ </contributor>
+ <contributor>
+ <name>Juergen Pill</name>
+ <email>Juergen.Pill -at- softwareag.com</email>
+ </contributor>
+ <contributor>
+ <name>Mohammad Rezaei</name>
+ <email>mohammad.rezaei -at- gs.com</email>
+ </contributor>
+ <contributor>
+ <name>Roland Weber</name>
+ <email>ROLWEBER -at- de.ibm.com</email>
+ </contributor>
+ <contributor>
+ <name>Laura Werner</name>
+ <email>laura -at- lwerner.org</email>
+ </contributor>
+ </contributors>
+ <scm>
+ <connection>scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-commons/httpclient/</connection>
+ <url>http://cvs.apache.org/viewcvs.cgi/jakarta-commons/httpclient/</url>
+ </scm>
+ <organization>
+ <name>Apache Software Foundation</name>
+ <url>http://jakarta.apache.org/</url>
+ </organization>
+ <build>
+ <sourceDirectory>src/java</sourceDirectory>
+ <testSourceDirectory>src/test</testSourceDirectory>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>**/TestNoHost.java</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.0.3</version>
+ </dependency>
+ </dependencies>
+ <distributionManagement>
+ <repository>
+ <id>default</id>
+ <name>Default Repository</name>
+ <url>file:///www/jakarta.apache.org/builds/jakarta-commons/httpclient</url>
+ </repository>
+ <site>
+ <id>default</id>
+ <name>Default Site</name>
+ <url>scp://jakarta.apache.org//www/jakarta.apache.org/commons/httpclient/</url>
+ </site>
+ </distributionManagement>
+</project>
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom.sha1 b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom.sha1
new file mode 100644
index 0000000..df64d3d
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom.sha1
@@ -0,0 +1 @@
+550c92401ae1458d4a4a1be4b8ab8ec19ce34e07 /home/projects/maven/repository-staging/to-ibiblio/maven2/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar
new file mode 100644
index 0000000..b99c937
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar.sha1 b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar.sha1
new file mode 100644
index 0000000..9e50b25
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar.sha1
@@ -0,0 +1 @@
+760c711c71588bc273d3e56d196d720a7678cd93
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom
new file mode 100644
index 0000000..c46b27f
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom
@@ -0,0 +1,31 @@
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <name>Logging</name>
+ <version>1.0.3</version>
+ <description>Commons Logging</description>
+ <url>http://jakarta.apache.org/commons/logging/</url>
+ <inceptionYear>2001</inceptionYear>
+ <build />
+ <dependencies>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.6</version>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>logkit</groupId>
+ <artifactId>logkit</artifactId>
+ <version>1.0.1</version>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.7</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom.sha1 b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom.sha1
new file mode 100644
index 0000000..d135fea
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom.sha1
@@ -0,0 +1 @@
+b7de43bb310eb1dbfd00a34cec30500fa13cb577 /home/projects/maven/repository-staging/to-ibiblio/maven2/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-javadoc-resources.jar.lastUpdated b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-javadoc-resources.jar.lastUpdated
new file mode 100644
index 0000000..6dcdbc7
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-javadoc-resources.jar.lastUpdated
@@ -0,0 +1,4 @@
+#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
+#Thu Sep 24 16:40:08 CEST 2020
+https\://repo.maven.apache.org/maven2/.lastUpdated=1600958408640
+https\://repo.maven.apache.org/maven2/.error=
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar
new file mode 100644
index 0000000..b73a80f
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar.sha1 b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar.sha1
new file mode 100644
index 0000000..7e0a60e
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar.sha1
@@ -0,0 +1 @@
+f029a2aefe2b3e1517573c580f948caac31b1056
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom
new file mode 100644
index 0000000..7c1017d
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom
@@ -0,0 +1,165 @@
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <name>Logging</name>
+ <version>1.0.4</version>
+ <description>Commons Logging is a thin adapter allowing configurable bridging to other,
+ well known logging systems.</description>
+ <url>http://jakarta.apache.org/commons/logging/</url>
+ <issueManagement>
+ <url>http://issues.apache.org/bugzilla/</url>
+ </issueManagement>
+ <ciManagement>
+ <notifiers>
+ <notifier>
+ <configuration>
+ <address>commons-dev@jakarta.apache.org</address>
+ </configuration>
+ </notifier>
+ </notifiers>
+ </ciManagement>
+ <inceptionYear>2001</inceptionYear>
+ <mailingLists>
+ <mailingList>
+ <name>Commons Dev List</name>
+ <subscribe>commons-dev-subscribe@jakarta.apache.org</subscribe>
+ <unsubscribe>commons-dev-unsubscribe@jakarta.apache.org</unsubscribe>
+ <archive>http://nagoya.apache.org/eyebrowse/SummarizeList?listName=commons-dev@jakarta.apache.org</archive>
+ </mailingList>
+ <mailingList>
+ <name>Commons User List</name>
+ <subscribe>commons-user-subscribe@jakarta.apache.org</subscribe>
+ <unsubscribe>commons-user-unsubscribe@jakarta.apache.org</unsubscribe>
+ <archive>http://nagoya.apache.org/eyebrowse/SummarizeList?listName=commons-user@jakarta.apache.org</archive>
+ </mailingList>
+ </mailingLists>
+ <developers>
+ <developer>
+ <id>morgand</id>
+ <name>Morgan Delagrange</name>
+ <email>morgand at apache dot org</email>
+ <organization>Apache</organization>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>rwaldhoff</id>
+ <name>Rodney Waldhoff</name>
+ <email>rwaldhoff at apache org</email>
+ <organization>Apache Software Foundation</organization>
+ </developer>
+ <developer>
+ <id>craigmcc</id>
+ <name>Craig McClanahan</name>
+ <email>craigmcc at apache org</email>
+ <organization>Apache Software Foundation</organization>
+ </developer>
+ <developer>
+ <id>sanders</id>
+ <name>Scott Sanders</name>
+ <email>sanders at apache dot org</email>
+ <organization>Apache Software Foundation</organization>
+ </developer>
+ <developer>
+ <id>rdonkin</id>
+ <name>Robert Burrell Donkin</name>
+ <email>rdonkin at apache dot org</email>
+ <organization>Apache Software Foundation</organization>
+ </developer>
+ <developer>
+ <id>donaldp</id>
+ <name>Peter Donald</name>
+ <email>donaldp at apache dot org</email>
+ <organization></organization>
+ </developer>
+ <developer>
+ <id>costin</id>
+ <name>Costin Manolache</name>
+ <email>costin at apache dot org</email>
+ <organization>Apache Software Foundation</organization>
+ </developer>
+ <developer>
+ <id>rsitze</id>
+ <name>Richard Sitze</name>
+ <email>rsitze at apache dot org</email>
+ <organization>Apache Software Foundation</organization>
+ </developer>
+ <developer>
+ <id>baliuka</id>
+ <name>Juozas Baliuka</name>
+ <email>baliuka@apache.org</email>
+ <organization></organization>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ </developer>
+ </developers>
+ <licenses>
+ <license>
+ <name>The Apache Software License, Version 2.0</name>
+ <url>/LICENSE.txt</url>
+ </license>
+ </licenses>
+ <scm>
+ <connection>scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-commons/logging</connection>
+ <url>http://cvs.apache.org/viewcvs/jakarta-commons/logging/</url>
+ </scm>
+ <organization>
+ <name>The Apache Software Foundation</name>
+ <url>http://jakarta.apache.org</url>
+ </organization>
+ <build>
+ <sourceDirectory>src/java</sourceDirectory>
+ <testSourceDirectory>src/test</testSourceDirectory>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>**/AvalonLoggerTest.java</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.6</version>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>logkit</groupId>
+ <artifactId>logkit</artifactId>
+ <version>1.0.1</version>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.7</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>avalon-framework</groupId>
+ <artifactId>avalon-framework</artifactId>
+ <version>4.1.3</version>
+ <optional>true</optional>
+ </dependency>
+ </dependencies>
+ <distributionManagement>
+ <repository>
+ <id>default</id>
+ <name>Default Repository</name>
+ <url>file:///www/jakarta.apache.org/builds/jakarta-commons/logging/</url>
+ </repository>
+ <site>
+ <id>default</id>
+ <name>Default Site</name>
+ <url>scp://jakarta.apache.org//www/jakarta.apache.org/commons/logging/</url>
+ </site>
+ </distributionManagement>
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom.sha1 b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom.sha1
new file mode 100644
index 0000000..92265fb
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom.sha1
@@ -0,0 +1 @@
+7d32e7520b801cabc3dc704d2afe59d020d00c45 /home/projects/maven/repository-staging/to-ibiblio/maven2/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom
diff --git a/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar
new file mode 100644
index 0000000..66bf3d8
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar.sha1 b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar.sha1
new file mode 100644
index 0000000..0e206f2
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar.sha1
@@ -0,0 +1 @@
+c27b09f985eef162b5d335f0460a130cc117596a
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom
new file mode 100644
index 0000000..293102d
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom
@@ -0,0 +1,8 @@
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>de.zeigermann.xml</groupId>
+ <artifactId>xml-im-exporter</artifactId>
+ <name>XML Im-/Exporter</name>
+ <version>1.1</version>
+ <url>http://xml-im-exporter.sourceforge.net</url>
+</project>
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom.sha1 b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom.sha1
new file mode 100644
index 0000000..5745f44
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom.sha1
@@ -0,0 +1 @@
+9bb0e7f3066fdfe0978de52b2082211a65b9c70f /home/projects/maven/repository-staging/to-ibiblio/maven2/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom
diff --git a/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar
new file mode 100644
index 0000000..288e64c
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar.sha1 b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar.sha1
new file mode 100644
index 0000000..da5395e
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar.sha1
@@ -0,0 +1 @@
+a2ac1cd690ab4c80defe7f9bce14d35934c35cec
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom
new file mode 100644
index 0000000..48bfb49
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom
@@ -0,0 +1,40 @@
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>jdom</groupId>
+ <artifactId>jdom</artifactId>
+ <version>1.0</version>
+ <dependencies>
+ <dependency>
+ <groupId>xerces</groupId>
+ <artifactId>xercesImpl</artifactId>
+ <version>2.6.0</version>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>xml-apis</groupId>
+ <artifactId>xml-apis</artifactId>
+ <version>1.0.b2</version>
+ <optional>true</optional>
+ </dependency>
+ <!-- should be replaced jaxen-jdom provided with jdom -->
+ <dependency>
+ <groupId>jaxen</groupId>
+ <artifactId>jaxen</artifactId>
+ <version>1.0-FCS</version>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>saxpath</groupId>
+ <artifactId>saxpath</artifactId>
+ <version>1.0-FCS</version>
+ <optional>true</optional>
+ </dependency>
+ <!-- should be replaced by xalan.jar from jdom, their version was 2.5.D1 -->
+ <dependency>
+ <groupId>xalan</groupId>
+ <artifactId>xalan</artifactId>
+ <version>2.5.0</version>
+ <optional>true</optional>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom.sha1 b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom.sha1
new file mode 100644
index 0000000..5da1a33
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom.sha1
@@ -0,0 +1 @@
+7d57cf1fa9e1cd07ac40d86b9ce4e4de1b753aa2 /home/projects/maven/repository-staging/to-ibiblio/maven2/jdom/jdom/1.0/jdom-1.0.pom
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc-resources.jar.lastUpdated b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc-resources.jar.lastUpdated
new file mode 100644
index 0000000..d1d0e80
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc-resources.jar.lastUpdated
@@ -0,0 +1,4 @@
+#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
+#Wed Jan 05 14:06:51 CET 2022
+https\://repo.maven.apache.org/maven2/.lastUpdated=1641388011966
+https\://repo.maven.apache.org/maven2/.error=
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar
new file mode 100644
index 0000000..d284bd0
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar.sha1 b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar.sha1
new file mode 100644
index 0000000..730c504
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar.sha1
@@ -0,0 +1 @@
+9d466b5eabb0cb144c8c9ef8b4ee6db15d46d6e6
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar
new file mode 100644
index 0000000..b68ac35
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar.sha1 b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar.sha1
new file mode 100644
index 0000000..323daab
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar.sha1
@@ -0,0 +1 @@
+523bdce923a13622132b263550d06519fc591ec4
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar
new file mode 100644
index 0000000..b376ffc
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar.sha1 b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar.sha1
new file mode 100644
index 0000000..a0369ca
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar.sha1
@@ -0,0 +1 @@
+cdd00374f1fee76b11e2a9d127405aa3f6be5b6a
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom
new file mode 100644
index 0000000..4287158
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom
@@ -0,0 +1,587 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.13.1</version>
+
+ <name>JUnit</name>
+ <description>JUnit is a unit testing framework for Java, created by Erich Gamma and Kent Beck.</description>
+ <url>http://junit.org</url>
+ <inceptionYear>2002</inceptionYear>
+ <organization>
+ <name>JUnit</name>
+ <url>http://www.junit.org</url>
+ </organization>
+ <licenses>
+ <license>
+ <name>Eclipse Public License 1.0</name>
+ <url>http://www.eclipse.org/legal/epl-v10.html</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+
+ <developers>
+ <developer>
+ <id>dsaff</id>
+ <name>David Saff</name>
+ <email>david@saff.net</email>
+ </developer>
+ <developer>
+ <id>kcooney</id>
+ <name>Kevin Cooney</name>
+ <email>kcooney@google.com</email>
+ </developer>
+ <developer>
+ <id>stefanbirkner</id>
+ <name>Stefan Birkner</name>
+ <email>mail@stefan-birkner.de</email>
+ </developer>
+ <developer>
+ <id>marcphilipp</id>
+ <name>Marc Philipp</name>
+ <email>mail@marcphilipp.de</email>
+ </developer>
+ </developers>
+ <contributors>
+ <contributor>
+ <name>JUnit contributors</name>
+ <organization>JUnit</organization>
+ <email>team@junit.org</email>
+ <url>https://github.com/junit-team/junit4/graphs/contributors</url>
+ <roles>
+ <role>developers</role>
+ </roles>
+ </contributor>
+ </contributors>
+
+ <prerequisites>
+ <maven>3.0.4</maven>
+ </prerequisites>
+
+ <scm>
+ <connection>scm:git:git://github.com/junit-team/junit4.git</connection>
+ <developerConnection>scm:git:git@github.com:junit-team/junit4.git</developerConnection>
+ <url>https://github.com/junit-team/junit4</url>
+ <tag>r4.13.1</tag>
+ </scm>
+ <issueManagement>
+ <system>github</system>
+ <url>https://github.com/junit-team/junit4/issues</url>
+ </issueManagement>
+ <ciManagement>
+ <system>travis</system>
+ <url>https://travis-ci.org/junit-team/junit4</url>
+ </ciManagement>
+ <distributionManagement>
+ <downloadUrl>https://github.com/junit-team/junit4/wiki/Download-and-Install</downloadUrl>
+ <snapshotRepository>
+ <id>junit-snapshot-repo</id>
+ <name>Nexus Snapshot Repository</name>
+ <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+ </snapshotRepository>
+ <repository>
+ <id>junit-releases-repo</id>
+ <name>Nexus Release Repository</name>
+ <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+ </repository>
+ <site>
+ <id>junit.github.io</id>
+ <url>gitsite:git@github.com/junit-team/junit4.git</url>
+ </site>
+ </distributionManagement>
+
+ <properties>
+ <jdkVersion>1.5</jdkVersion>
+ <surefireVersion>2.19.1</surefireVersion>
+ <hamcrestVersion>1.3</hamcrestVersion>
+ <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
+ <arguments />
+ <gpg.keyname>67893CC4</gpg.keyname>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-core</artifactId>
+ <version>${hamcrestVersion}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-library</artifactId>
+ <version>${hamcrestVersion}</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <resources>
+ <resource>
+ <directory>${project.basedir}/src/main/resources</directory>
+ </resource>
+ <resource>
+ <directory>${project.basedir}</directory>
+ <includes>
+ <include>LICENSE-junit.txt</include>
+ </includes>
+ </resource>
+ </resources>
+ <plugins>
+ <!--
+ Both "org.apache" and "org.codehaus" are default providers of MOJO plugins
+ which are especially dedicated to Maven projects.
+ The MOJO stands for "Maven plain Old Java Object".
+ Each mojo is an executable goal in Maven, and a plugin is a distribution of
+ one or more related mojos.
+ For more information see http://maven.apache.org/plugin-developers/index.html
+
+ The following plugins are ordered according the Maven build lifecycle.
+ http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
+ -->
+ <plugin>
+ <!--
+ Checks that the version of user's maven installation is 3.0.4,
+ the JDK is 1.5+, no non-standard repositories are specified in
+ the project, requires only release versions of dependencies of other artifacts.
+ -->
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <version>1.4</version>
+ <executions>
+ <execution>
+ <id>enforce-versions</id>
+ <phase>initialize</phase>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ <configuration>
+ <fail>true</fail>
+ <rules>
+ <requireMavenVersion>
+ <!-- Some plugin features require a recent Maven runtime to work properly -->
+ <message>Current version of Maven ${maven.version} required to build the project
+ should be ${project.prerequisites.maven}, or higher!
+ </message>
+ <version>[${project.prerequisites.maven},)</version>
+ </requireMavenVersion>
+ <requireJavaVersion>
+ <message>Current JDK version ${java.version} should be ${jdkVersion}, or higher!
+ </message>
+ <version>${jdkVersion}</version>
+ </requireJavaVersion>
+ <requireNoRepositories>
+ <message>Best Practice is to never define repositories in pom.xml (use a repository
+ manager instead).
+ </message>
+ </requireNoRepositories>
+ <requireReleaseDeps>
+ <message>No Snapshots Dependencies Allowed!</message>
+ </requireReleaseDeps>
+ </rules>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <!--
+ Updates Version#id().
+ -->
+ <groupId>com.google.code.maven-replacer-plugin</groupId>
+ <artifactId>replacer</artifactId>
+ <version>1.5.3</version>
+ <executions>
+ <execution>
+ <phase>process-sources</phase>
+ <goals>
+ <goal>replace</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <ignoreMissingFile>false</ignoreMissingFile>
+ <file>${project.build.sourceDirectory}/junit/runner/Version.java.template</file>
+ <outputFile>${project.build.sourceDirectory}/junit/runner/Version.java</outputFile>
+ <regex>false</regex>
+ <token>@version@</token>
+ <value>${project.version}</value>
+ </configuration>
+ </plugin>
+ <plugin><!-- Using jdk 1.5.0_22, package-info.java files are compiled correctly. -->
+ <!--
+ java compiler plugin forked in extra process
+ -->
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.3</version>
+ <configuration>
+ <encoding>${project.build.sourceEncoding}</encoding>
+ <source>${jdkVersion}</source>
+ <target>${jdkVersion}</target>
+ <testSource>${jdkVersion}</testSource>
+ <testTarget>${jdkVersion}</testTarget>
+ <compilerVersion>1.5</compilerVersion>
+ <showDeprecation>true</showDeprecation>
+ <showWarnings>true</showWarnings>
+ <debug>true</debug>
+ <fork>true</fork>
+ <compilerArgs>
+ <arg>-Xlint:unchecked</arg>
+ </compilerArgs>
+ <maxmem>128m</maxmem>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>animal-sniffer-maven-plugin</artifactId>
+ <version>1.14</version>
+ <executions>
+ <execution>
+ <id>signature-check</id>
+ <phase>test</phase>
+ <goals>
+ <goal>check</goal>
+ </goals>
+ <configuration>
+ <signature>
+ <groupId>org.codehaus.mojo.signature</groupId>
+ <artifactId>java15</artifactId>
+ <version>1.0</version>
+ </signature>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <!--
+ A plugin which uses the JUnit framework in order to start
+ our junit suite "AllTests" after the sources are compiled.
+ -->
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>${surefireVersion}</version>
+ <configuration>
+ <test>org/junit/tests/AllTests.java</test>
+ <useSystemClassLoader>true</useSystemClassLoader>
+ <enableAssertions>false</enableAssertions>
+ </configuration>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven.surefire</groupId>
+ <artifactId>surefire-junit47</artifactId>
+ <version>${surefireVersion}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ <plugin>
+ <!--
+ This plugin can package the main artifact's sources (src/main/java)
+ in to jar archive. See target/junit-*-sources.jar.
+ -->
+ <artifactId>maven-source-plugin</artifactId>
+ <version>2.4</version>
+ </plugin>
+ <plugin>
+ <!--
+ This plugin can generate Javadoc by a forked
+ process and then package the Javadoc
+ in jar archive target/junit-*-javadoc.jar.
+ -->
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>2.10.3</version>
+ <configuration>
+ <stylesheetfile>${basedir}/src/main/javadoc/stylesheet.css</stylesheetfile>
+ <show>protected</show>
+ <author>false</author>
+ <version>false</version>
+ <detectLinks>false</detectLinks>
+ <linksource>true</linksource>
+ <keywords>true</keywords>
+ <use>true</use>
+ <windowtitle>JUnit API</windowtitle>
+ <encoding>UTF-8</encoding>
+ <locale>en</locale>
+ <javadocVersion>${jdkVersion}</javadocVersion>
+ <javaApiLinks>
+ <property>
+ <name>api_${jdkVersion}</name>
+ <value>http://docs.oracle.com/javase/${jdkVersion}.0/docs/api/</value>
+ </property>
+ </javaApiLinks>
+ <excludePackageNames>*.internal.*</excludePackageNames>
+ <verbose>true</verbose>
+ <minmemory>32m</minmemory>
+ <maxmemory>128m</maxmemory>
+ <failOnError>true</failOnError>
+ <includeDependencySources>true</includeDependencySources>
+ <dependencySourceIncludes>
+ <dependencySourceInclude>org.hamcrest:hamcrest-core:*</dependencySourceInclude>
+ </dependencySourceIncludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-release-plugin</artifactId>
+ <version>2.5.2</version>
+ <configuration>
+ <mavenExecutorId>forked-path</mavenExecutorId>
+ <useReleaseProfile>false</useReleaseProfile>
+ <arguments>-Pgenerate-docs,junit-release ${arguments}</arguments>
+ <tagNameFormat>r@{project.version}</tagNameFormat>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-site-plugin</artifactId>
+ <version>3.4</version>
+ <dependencies>
+ <dependency>
+ <groupId>com.github.stephenc.wagon</groupId>
+ <artifactId>wagon-gitsite</artifactId>
+ <version>0.4.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.doxia</groupId>
+ <artifactId>doxia-module-markdown</artifactId>
+ <version>1.5</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.6</version>
+ <configuration>
+ <archive>
+ <addMavenDescriptor>false</addMavenDescriptor>
+ <manifest>
+ <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+ </manifest>
+ <manifestEntries>
+ <Automatic-Module-Name>junit</Automatic-Module-Name>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-clean-plugin</artifactId>
+ <version>2.6.1</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>2.8.2</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-install-plugin</artifactId>
+ <version>2.5.2</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.7</version>
+ </plugin>
+ </plugins>
+ </build>
+
+ <reporting>
+ <plugins>
+ <plugin>
+ <artifactId>maven-project-info-reports-plugin</artifactId>
+ <version>2.8</version>
+ <configuration>
+ <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
+ <!-- waiting for MPIR-267 -->
+ </configuration>
+ <reportSets>
+ <reportSet>
+ <reports>
+ <report>index</report>
+ <report>dependency-info</report>
+ <report>modules</report>
+ <report>license</report>
+ <report>project-team</report>
+ <report>scm</report>
+ <report>issue-tracking</report>
+ <report>mailing-list</report>
+ <report>dependency-management</report>
+ <report>dependencies</report>
+ <report>dependency-convergence</report>
+ <report>cim</report>
+ <report>distribution-management</report>
+ </reports>
+ </reportSet>
+ </reportSets>
+ </plugin>
+ <plugin>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>2.10.3</version>
+ <configuration>
+ <destDir>javadoc/latest</destDir>
+ <stylesheetfile>${basedir}/src/main/javadoc/stylesheet.css</stylesheetfile>
+ <show>protected</show>
+ <author>false</author>
+ <version>false</version>
+ <detectLinks>false</detectLinks>
+ <linksource>true</linksource>
+ <keywords>true</keywords>
+ <use>true</use>
+ <windowtitle>JUnit API</windowtitle>
+ <encoding>UTF-8</encoding>
+ <locale>en</locale>
+ <javadocVersion>${jdkVersion}</javadocVersion>
+ <javaApiLinks>
+ <property>
+ <name>api_${jdkVersion}</name>
+ <value>http://docs.oracle.com/javase/${jdkVersion}.0/docs/api/</value>
+ </property>
+ </javaApiLinks>
+ <excludePackageNames>junit.*,*.internal.*</excludePackageNames>
+ <verbose>true</verbose>
+ <minmemory>32m</minmemory>
+ <maxmemory>128m</maxmemory>
+ <failOnError>true</failOnError>
+ <includeDependencySources>true</includeDependencySources>
+ <dependencySourceIncludes>
+ <dependencySourceInclude>org.hamcrest:hamcrest-core:*</dependencySourceInclude>
+ </dependencySourceIncludes>
+ </configuration>
+ <reportSets>
+ <reportSet>
+ <reports>
+ <report>javadoc</report>
+ </reports>
+ </reportSet>
+ </reportSets>
+ </plugin>
+ </plugins>
+ </reporting>
+
+ <profiles>
+ <profile>
+ <id>junit-release</id>
+ <!--
+ Signs all artifacts before deploying to Maven Central.
+ -->
+ <build>
+ <plugins>
+ <plugin>
+ <!--
+ The goal is to sign all artifacts so that the user may verify them before downloading.
+ The automatic build system may reuire your key ID, and passphrase specified using system properties:
+ -Dgpg.passphrase="<passphrase>" -Dgpg.keyname="<your key ID>"
+ In order to create the key pair, use the command "gpg ––gen-key".
+ (–– stands for double dash)
+ -->
+ <artifactId>maven-gpg-plugin</artifactId>
+ <version>1.6</version>
+ <executions>
+ <execution>
+ <id>gpg-sign</id>
+ <phase>verify</phase>
+ <goals>
+ <goal>sign</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>generate-docs</id>
+ <!--
+ Generate the documentation artifacts.
+ Note: this profile is also required to be active for release
+ builds due to the packaging requirements of the Central repo
+ -->
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-source-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <phase>prepare-package</phase>
+ <goals>
+ <goal>jar-no-fork</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-javadoc</id>
+ <phase>package</phase>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>restrict-doclint</id>
+ <!-- doclint is only supported by JDK 8 -->
+ <activation>
+ <jdk>[1.8,)</jdk>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <compilerArgs>
+ <arg>-Xlint:unchecked</arg>
+ <arg>-Xdoclint:accessibility,reference,syntax</arg>
+ </compilerArgs>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <additionalparam>-Xdoclint:accessibility -Xdoclint:reference</additionalparam>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <reporting>
+ <plugins>
+ <plugin>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <additionalparam>-Xdoclint:accessibility -Xdoclint:reference</additionalparam>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
+ </profile>
+ <profile>
+ <id>java9</id>
+ <activation>
+ <jdk>[1.9,)</jdk>
+ </activation>
+ <properties>
+ <!-- JDK 9 minimal source and target versions are 1.6 -->
+ <jdkVersion>1.6</jdkVersion>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <source>1.6</source>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <reporting>
+ <plugins>
+ <plugin>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <source>1.6</source>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
+ </profile>
+ </profiles>
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom.sha1 b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom.sha1
new file mode 100644
index 0000000..d843b12
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom.sha1
@@ -0,0 +1 @@
+643e8b4c40dca9f0b0abd8125d378d9f47d7d69e
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom
new file mode 100644
index 0000000..9593e9e
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ ~ Copyright 2005-2006 The Apache Software Foundation.
+ ~
+ ~ 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.
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <!-- Shared parent. Doesn't define a lot of things about Apache like general mailing lists, but does
+ define the settings common to all projects at Apache -->
+ <groupId>org.apache</groupId>
+ <artifactId>apache</artifactId>
+ <version>3</version>
+ <packaging>pom</packaging>
+ <name>The Apache Software Foundation</name>
+ <description>
+ The Apache Software Foundation provides support for the Apache community of open-source software projects.
+ The Apache projects are characterized by a collaborative, consensus based development process, an open and
+ pragmatic software license, and a desire to create high quality software that leads the way in its field.
+ We consider ourselves not simply a group of projects sharing a server, but rather a community of developers
+ and users.
+ </description>
+ <licenses>
+ <license>
+ <name>The Apache Software License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+ <organization>
+ <name>Apache Software Foundation</name>
+ <url>http://www.apache.org/</url>
+ </organization>
+ <url>http://www.apache.org/</url>
+ <repositories>
+ <repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://people.apache.org/repo/m2-snapshot-repository</url>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ </repository>
+ </repositories>
+ <distributionManagement>
+ <!-- Site omitted - each project must provide their own -->
+ <repository>
+ <id>apache.releases</id>
+ <name>Apache Release Distribution Repository</name>
+ <url>scp://people.apache.org/www/people.apache.org/repo/m2-ibiblio-rsync-repository</url>
+ </repository>
+ <snapshotRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Development Snapshot Repository</name>
+ <url>scp://people.apache.org/www/people.apache.org/repo/m2-snapshot-repository</url>
+ </snapshotRepository>
+ </distributionManagement>
+ <mailingLists>
+ <mailingList>
+ <name>Apache Announce List</name>
+ <subscribe>announce-subscribe@apache.org</subscribe>
+ <unsubscribe>announce-unsubscribe@apache.org</unsubscribe>
+ <post>announce@apache.org</post>
+ <archive>http://mail-archives.apache.org/mod_mbox/www-announce/</archive>
+ </mailingList>
+ </mailingLists>
+</project>
+
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.md5 b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.md5
new file mode 100644
index 0000000..b9d0ea1
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.md5
@@ -0,0 +1 @@
+c857ebbb5f303f435495e40e6c9e45a2
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.sha1
new file mode 100644
index 0000000..ffb57bb
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.sha1
@@ -0,0 +1 @@
+1bc0010136a890e2fd38d901a0b7ecdf0e3f9871
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar
new file mode 100644
index 0000000..5bc9c06
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.md5 b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.md5
new file mode 100644
index 0000000..5ff89e8
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.md5
@@ -0,0 +1 @@
+430da483dcfb2964a9dcd619c29a6c78
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.sha1
new file mode 100644
index 0000000..a341880
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.sha1
@@ -0,0 +1 @@
+ea9e3f3fdc25f386d5f9ac861a55b6c3bb773d91
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom
new file mode 100644
index 0000000..4c344c8
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>maven-parent</artifactId>
+ <groupId>org.apache.maven</groupId>
+ <version>5</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.maven.artifact</groupId>
+ <artifactId>maven-artifact</artifactId>
+ <version>3.0-SNAPSHOT</version>
+ <name>Maven Artifact</name>
+ <scm>
+ <connection>scm:svn:http://svn.apache.org/repos/asf/maven/artifact/trunk</connection>
+ <developerConnection>scm:svn:https://svn.apache.org/repos/asf/maven/artifact/trunk</developerConnection>
+ <url>http://svn.apache.org/viewcvs.cgi/maven/artifact/trunk</url>
+ </scm>
+ <dependencies>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-utils</artifactId>
+ <version>1.4.5</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-container-default</artifactId>
+ <version>1.0-alpha-32</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-active-collections</artifactId>
+ <version>1.0-beta-1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.wagon</groupId>
+ <artifactId>wagon-provider-api</artifactId>
+ <version>1.0-beta-2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.wagon</groupId>
+ <artifactId>wagon-file</artifactId>
+ <version>1.0-beta-2</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>easymock</groupId>
+ <artifactId>easymock</artifactId>
+ <version>1.2_Java1.3</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.modello</groupId>
+ <artifactId>modello-maven-plugin</artifactId>
+ <version>1.0-alpha-17</version>
+ <configuration>
+ <version>1.0.0</version>
+ <model>src/main/mdo/metadata.mdo</model>
+ </configuration>
+ <executions>
+ <execution>
+ <id>site-docs</id>
+ <phase>pre-site</phase>
+ <goals>
+ <goal>xdoc</goal>
+ <goal>xsd</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>standard</id>
+ <goals>
+ <goal>java</goal>
+ <goal>xpp3-reader</goal>
+ <goal>xpp3-writer</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>**/testutils/**</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.md5 b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.md5
new file mode 100644
index 0000000..11e3536
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.md5
@@ -0,0 +1 @@
+794377b5385c68c660ee9ca26e6b5cf1
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.sha1
new file mode 100644
index 0000000..4beb688
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.sha1
@@ -0,0 +1 @@
+358254e73f075bcfb9d587d0da553083abd0cc45
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.jar b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.jar
new file mode 100644
index 0000000..0272ee3
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom
new file mode 100644
index 0000000..fee83c9
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom
@@ -0,0 +1,73 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.maven.core.test</groupId>
+ <artifactId>test-extension</artifactId>
+ <packaging>jar</packaging>
+ <version>1</version>
+ <name>test-extension</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven.artifact</groupId>
+ <artifactId>maven-artifact</artifactId>
+ <version>3.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-utils</artifactId>
+ <version>1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus</artifactId>
+ <version>1.0.11</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-component-api</artifactId>
+ <version>1.0-alpha-16</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-container-default</artifactId>
+ <version>1.0-alpha-16</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.2-beta-2-SNAPSHOT</version>
+ <executions>
+ <execution>
+ <id>repo-assembly</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <descriptors>
+ <descriptor>repo.xml</descriptor>
+ </descriptors>
+ <finalName>test-extension</finalName>
+ <appendAssemblyId>true</appendAssemblyId>
+ <outputDirectory>${pom.basedir}/../../resources/org/apache/maven/extension</outputDirectory>
+ <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <distributionManagement>
+ <repository>
+ <id>dummy</id>
+ <url>file:///tmp/dummy-repo</url>
+ </repository>
+ </distributionManagement>
+
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.md5 b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.md5
new file mode 100644
index 0000000..ad06718
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.md5
@@ -0,0 +1 @@
+e8f6e0f4ef9c2ed3fb185ef44165fb40
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.sha1
new file mode 100644
index 0000000..6065ee0
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.sha1
@@ -0,0 +1 @@
+88ace5d78ee32fa0ce59714a4a42a73af3b52bd3
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar
new file mode 100644
index 0000000..04fe384
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom
new file mode 100644
index 0000000..01aaa42
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom
@@ -0,0 +1,44 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.maven.core.test</groupId>
+ <artifactId>test-lifecycle-and-artifactHandler</artifactId>
+ <packaging>jar</packaging>
+ <version>1</version>
+ <name>test-lifecycle-and-artifactHandler</name>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.2-beta-2-SNAPSHOT</version>
+ <executions>
+ <execution>
+ <id>repo-assembly</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <descriptors>
+ <descriptor>repo.xml</descriptor>
+ </descriptors>
+ <finalName>test-extension</finalName>
+ <appendAssemblyId>true</appendAssemblyId>
+ <outputDirectory>${pom.basedir}/../../resources/org/apache/maven/extension</outputDirectory>
+ <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <distributionManagement>
+ <repository>
+ <id>dummy</id>
+ <url>file:///tmp/dummy-repo</url>
+ </repository>
+ </distributionManagement>
+
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5 b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5
new file mode 100644
index 0000000..01d5194
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5
@@ -0,0 +1 @@
+7f10427af029d20cbea57c21d1aec65e
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1
new file mode 100644
index 0000000..dac1e45
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1
@@ -0,0 +1 @@
+ed98c808239aefb0ec51a8b9e96f191da7fd92e6
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom
new file mode 100644
index 0000000..b41037f
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom
@@ -0,0 +1,304 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ ~ Copyright 2005-2006 The Apache Software Foundation.
+ ~
+ ~ 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.
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache</groupId>
+ <artifactId>apache</artifactId>
+ <version>3</version>
+ <relativePath>../asf/pom.xml</relativePath>
+ </parent>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-parent</artifactId>
+ <version>4</version>
+ <packaging>pom</packaging>
+ <name>Apache Maven</name>
+ <description>
+ Maven is a software project management and comprehension tool. Based on the concept of a project object model
+ (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
+ </description>
+ <url>http://maven.apache.org/</url>
+ <issueManagement>
+ <system>jira</system>
+ <url>http://jira.codehaus.org/browse/MPA</url>
+ </issueManagement>
+ <ciManagement>
+ <system>continuum</system>
+ <url>http://maven.zones.apache.org:8080/continuum</url>
+ <notifiers>
+ <notifier>
+ <type>mail</type>
+ <configuration>
+ <address>notifications@maven.apache.org</address>
+ </configuration>
+ </notifier>
+ </notifiers>
+ </ciManagement>
+ <inceptionYear>2002</inceptionYear>
+ <mailingLists>
+ <mailingList>
+ <name>Maven Announcements List</name>
+ <post>announce@maven.apache.org</post>
+ <subscribe>announce-subscribe@maven.apache.org</subscribe>
+ <unsubscribe>announce-unsubscribe@maven.apache.org</unsubscribe>
+ <archive>http://mail-archives.apache.org/mod_mbox/maven-announce/</archive>
+ </mailingList>
+ <mailingList>
+ <name>Maven Issues List</name>
+ <post>issues@maven.apache.org</post>
+ <subscribe>issues-subscribe@maven.apache.org</subscribe>
+ <unsubscribe>issues-unsubscribe@maven.apache.org</unsubscribe>
+ <archive>http://mail-archives.apache.org/mod_mbox/maven-issues/</archive>
+ </mailingList>
+ <mailingList>
+ <name>Maven Notifications List</name>
+ <post>notifications@maven.apache.org</post>
+ <subscribe>notifications-subscribe@maven.apache.org</subscribe>
+ <unsubscribe>notifications-unsubscribe@maven.apache.org</unsubscribe>
+ <archive>http://mail-archives.apache.org/mod_mbox/maven-notifications/</archive>
+ </mailingList>
+ </mailingLists>
+
+ <developers>
+ <developer>
+ <id>jvanzyl</id>
+ <name>Jason van Zyl</name>
+ <email>jason@maven.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Chair</role>
+ </roles>
+ <timezone>-5</timezone>
+ </developer>
+ <developer>
+ <id>brett</id>
+ <name>Brett Porter</name>
+ <email>brett@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+10</timezone>
+ </developer>
+ <developer>
+ <id>evenisse</id>
+ <name>Emmanuel Venisse</name>
+ <email>evenisse@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>kenney</id>
+ <name>Kenney Westerhof</name>
+ <email>kenney@apache.org</email>
+ <organization>Neonics</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>snicoll</id>
+ <name>Stephane Nicoll</name>
+ <email>snicoll@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>vmassol</id>
+ <name>Vincent Massol</name>
+ <email>vmassol@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>fgiust</id>
+ <name>Fabrizio Giustina</name>
+ <email>fgiust@apache.org</email>
+ <organization>openmind</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>epunzalan</id>
+ <name>Edwin Punzalan</name>
+ <email>epunzalan@mergere.com</email>
+ <organization>Mergere</organization>
+ <roles>
+ <role>Committer</role>
+ </roles>
+ <timezone>+8</timezone>
+ </developer>
+ <developer>
+ <id>mperham</id>
+ <name>Mike Perham</name>
+ <email>mperham@gmail.com</email>
+ <organization>IBM</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>-6</timezone>
+ </developer>
+ <developer>
+ <id>jdcasey</id>
+ <name>John Casey</name>
+ <email>jdcasey@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>-5</timezone>
+ </developer>
+ <developer>
+ <id>trygvis</id>
+ <name>Trygve Laugstol</name>
+ <email>trygvis@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>vsiveton</id>
+ <name>Vincent Siveton</name>
+ <email>vsiveton@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>-5</timezone>
+ </developer>
+ <developer>
+ <id>carlos</id>
+ <name>Carlos Sanchez</name>
+ <email>carlos@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>dennisl</id>
+ <name>Dennis Lundberg</name>
+ <email>dennisl@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ </developers>
+
+ <distributionManagement>
+ <site>
+ <id>apache.website</id>
+ <url>scp://people.apache.org/www/maven.apache.org</url>
+ </site>
+ </distributionManagement>
+
+<!-- Disabled until projects have been made to comply
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-pmd-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>cpd-check</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+-->
+
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-report-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ <configuration>
+ <configLocation>http://svn.apache.org/repos/asf/maven/plugins/trunk/maven-checkstyle-plugin/src/main/resources/config/maven_checks.xml</configLocation>
+ <headerLocation>http://svn.apache.org/repos/asf/maven/plugins/trunk/maven-checkstyle-plugin/src/main/resources/config/maven-header.txt</headerLocation>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-pmd-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>cobertura-maven-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>taglist-maven-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jxr-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <links>
+ <link>http://java.sun.com/j2ee/1.4/docs/api</link>
+ <link>http://java.sun.com/j2se/1.5.0/docs/api</link>
+ <link>http://jakarta.apache.org/commons/collections/apidocs-COLLECTIONS_3_0/</link>
+ <link>http://jakarta.apache.org/commons/dbcp/apidocs/</link>
+ <link>http://jakarta.apache.org/commons/fileupload/apidocs/</link>
+ <link>http://jakarta.apache.org/commons/httpclient/apidocs/</link>
+ <link>http://jakarta.apache.org/commons/logging/apidocs/</link>
+ <link>http://jakarta.apache.org/commons/pool/apidocs/</link>
+ <link>http://www.junit.org/junit/javadoc/</link>
+ <link>http://logging.apache.org/log4j/docs/api/</link>
+ <link>http://jakarta.apache.org/regexp/apidocs/</link>
+ <link>http://jakarta.apache.org/velocity/api/</link>
+ </links>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
+
+ <scm>
+ <connection>scm:svn:http://svn.apache.org/repos/asf/maven/pom/maven/tags/maven-parent-4</connection>
+ <developerConnection>scm:svn:https://svn.apache.org/repos/asf/maven/pom/maven/tags/maven-parent-4</developerConnection>
+ <url>http://svn.apache.org/viewvc/maven/pom/maven/tags/maven-parent-4</url>
+ </scm>
+</project>
+
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.md5 b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.md5
new file mode 100644
index 0000000..9c41764
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.md5
@@ -0,0 +1 @@
+2a4e926f3a76c6e74b0b126f513ad4e7
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.sha1
new file mode 100644
index 0000000..b6caacf
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.sha1
@@ -0,0 +1 @@
+0fc039b0bd4d17d7c147a30e1d83994629c5297c
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/5/maven-parent-5.pom b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/5/maven-parent-5.pom
new file mode 100644
index 0000000..a512366
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/5/maven-parent-5.pom
@@ -0,0 +1,466 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache</groupId>
+ <artifactId>apache</artifactId>
+ <version>3</version>
+ <relativePath>../asf/pom.xml</relativePath>
+ </parent>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-parent</artifactId>
+ <version>5</version>
+ <packaging>pom</packaging>
+ <name>Apache Maven</name>
+ <description>
+ Maven is a software project management and comprehension tool. Based on the concept of a project object model
+ (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
+ </description>
+ <url>http://maven.apache.org/</url>
+ <issueManagement>
+ <system>jira</system>
+ <url>http://jira.codehaus.org/browse/MPA</url>
+ </issueManagement>
+ <ciManagement>
+ <system>continuum</system>
+ <url>http://maven.zones.apache.org/continuum</url>
+ <notifiers>
+ <notifier>
+ <type>mail</type>
+ <configuration>
+ <address>notifications@maven.apache.org</address>
+ </configuration>
+ </notifier>
+ </notifiers>
+ </ciManagement>
+ <inceptionYear>2002</inceptionYear>
+ <mailingLists>
+ <mailingList>
+ <name>Maven Announcements List</name>
+ <post>announce@maven.apache.org</post>
+ <subscribe>announce-subscribe@maven.apache.org</subscribe>
+ <unsubscribe>announce-unsubscribe@maven.apache.org</unsubscribe>
+ <archive>http://mail-archives.apache.org/mod_mbox/maven-announce/</archive>
+ </mailingList>
+ <mailingList>
+ <name>Maven Issues List</name>
+ <post>issues@maven.apache.org</post>
+ <subscribe>issues-subscribe@maven.apache.org</subscribe>
+ <unsubscribe>issues-unsubscribe@maven.apache.org</unsubscribe>
+ <archive>http://mail-archives.apache.org/mod_mbox/maven-issues/</archive>
+ </mailingList>
+ <mailingList>
+ <name>Maven Notifications List</name>
+ <post>notifications@maven.apache.org</post>
+ <subscribe>notifications-subscribe@maven.apache.org</subscribe>
+ <unsubscribe>notifications-unsubscribe@maven.apache.org</unsubscribe>
+ <archive>http://mail-archives.apache.org/mod_mbox/maven-notifications/</archive>
+ </mailingList>
+ </mailingLists>
+
+ <developers>
+ <developer>
+ <id>jvanzyl</id>
+ <name>Jason van Zyl</name>
+ <email>jason@maven.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Chair</role>
+ </roles>
+ <timezone>-5</timezone>
+ </developer>
+ <developer>
+ <id>brett</id>
+ <name>Brett Porter</name>
+ <email>brett@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+10</timezone>
+ </developer>
+ <developer>
+ <id>evenisse</id>
+ <name>Emmanuel Venisse</name>
+ <email>evenisse@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>kenney</id>
+ <name>Kenney Westerhof</name>
+ <email>kenney@apache.org</email>
+ <organization>Neonics</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>snicoll</id>
+ <name>Stephane Nicoll</name>
+ <email>snicoll@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>vmassol</id>
+ <name>Vincent Massol</name>
+ <email>vmassol@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>fgiust</id>
+ <name>Fabrizio Giustina</name>
+ <email>fgiust@apache.org</email>
+ <organization>openmind</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>epunzalan</id>
+ <name>Edwin Punzalan</name>
+ <email>epunzalan@mergere.com</email>
+ <organization>Mergere</organization>
+ <roles>
+ <role>Committer</role>
+ </roles>
+ <timezone>+8</timezone>
+ </developer>
+ <developer>
+ <id>mperham</id>
+ <name>Mike Perham</name>
+ <email>mperham@gmail.com</email>
+ <organization>IBM</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>-6</timezone>
+ </developer>
+ <developer>
+ <id>jdcasey</id>
+ <name>John Casey</name>
+ <email>jdcasey@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>-5</timezone>
+ </developer>
+ <developer>
+ <id>trygvis</id>
+ <name>Trygve Laugstol</name>
+ <email>trygvis@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>vsiveton</id>
+ <name>Vincent Siveton</name>
+ <email>vsiveton@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>-5</timezone>
+ </developer>
+ <developer>
+ <id>carlos</id>
+ <name>Carlos Sanchez</name>
+ <email>carlos@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>dennisl</id>
+ <name>Dennis Lundberg</name>
+ <email>dennisl@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>aheritier</id>
+ <name>Arnaud Heritier</name>
+ <email>aheritier@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
+ <developer>
+ <id>handyande</id>
+ <name>Andrew Williams</name>
+ <email>handyande@apache.org</email>
+ <roles>
+ <role>Committer</role>
+ </roles>
+ <timezone>0</timezone>
+ </developer>
+ <developer>
+ <id>jtolentino</id>
+ <name>Ernesto Tolentino Jr.</name>
+ <email>jtolentino@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>+8</timezone>
+ </developer>
+ <developer>
+ <id>joakime</id>
+ <name>Joakim Erdfelt</name>
+ <email>joakime@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>-5</timezone>
+ </developer>
+ <developer>
+ <id>jmcconnell</id>
+ <name>Jesse McConnell</name>
+ <email>jmcconnell@apache.org</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>PMC Member</role>
+ </roles>
+ <timezone>-6</timezone>
+ </developer>
+ <developer>
+ <id>wsmoak</id>
+ <name>Wendy Smoak</name>
+ <email>wsmoak@apache.org</email>
+ <roles>
+ <role>Committer</role>
+ </roles>
+ <timezone>-7</timezone>
+ </developer>
+
+ </developers>
+
+ <distributionManagement>
+ <site>
+ <id>apache.website</id>
+ <url>scp://people.apache.org/www/maven.apache.org</url>
+ </site>
+ </distributionManagement>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-release-plugin</artifactId>
+ <version>2.0-beta-4</version>
+ <configuration>
+ <!-- This element will be overridden by children -->
+ <tagBase>https://svn.apache.org/repos/asf/maven/pom/tags</tagBase>
+ <useReleaseProfile>false</useReleaseProfile>
+ <goals>deploy</goals>
+ <arguments>-Prelease</arguments>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>ci</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-pmd-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>cpd-check</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>reporting</id>
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-report-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ <configuration>
+ <configLocation>http://svn.apache.org/repos/asf/maven/plugins/trunk/maven-checkstyle-plugin/src/main/resources/config/maven_checks.xml</configLocation>
+ <headerLocation>http://svn.apache.org/repos/asf/maven/plugins/trunk/maven-checkstyle-plugin/src/main/resources/config/maven-header.txt</headerLocation>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-pmd-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>cobertura-maven-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>taglist-maven-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jxr-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <links>
+ <link>http://java.sun.com/j2ee/1.4/docs/api</link>
+ <link>http://java.sun.com/j2se/1.5.0/docs/api</link>
+ <link>http://jakarta.apache.org/commons/collections/apidocs-COLLECTIONS_3_0/</link>
+ <link>http://jakarta.apache.org/commons/dbcp/apidocs/</link>
+ <link>http://jakarta.apache.org/commons/fileupload/apidocs/</link>
+ <link>http://jakarta.apache.org/commons/httpclient/apidocs/</link>
+ <link>http://jakarta.apache.org/commons/logging/apidocs/</link>
+ <link>http://jakarta.apache.org/commons/pool/apidocs/</link>
+ <link>http://www.junit.org/junit/javadoc/</link>
+ <link>http://logging.apache.org/log4j/docs/api/</link>
+ <link>http://jakarta.apache.org/regexp/apidocs/</link>
+ <link>http://jakarta.apache.org/velocity/api/</link>
+ </links>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
+ </profile>
+ <profile>
+ <id>release</id>
+ <build>
+ <plugins>
+ <!-- We want to sign the artifact, the POM, and all attached artifacts -->
+ <plugin>
+ <artifactId>maven-gpg-plugin</artifactId>
+ <version>1.0-alpha-1</version>
+ <configuration>
+ <passphrase>${gpg.passphrase}</passphrase>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>sign</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <!-- We want to deploy the artifact to a staging location for perusal -->
+ <plugin>
+ <inherited>true</inherited>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>2.3</version>
+ <configuration>
+ <altDeploymentRepository>${deploy.altRepository}</altDeploymentRepository>
+ <updateReleaseInfo>true</updateReleaseInfo>
+ </configuration>
... 3606 lines suppressed ...