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


The following commit(s) were added to refs/heads/mvn4 by this push:
     new 25dd5d9  Add some missing bits
25dd5d9 is described below

commit 25dd5d90708ee4153ac0c74d175eea4b384dc1fd
Author: Guillaume Nodet <[email protected]>
AuthorDate: Tue Feb 15 02:47:38 2022 +0100

    Add some missing bits
---
 maven-core-api/pom.xml                             |  8 +++
 .../api/{ArtifactMetadata.java => Metadata.java}   | 16 ++++-
 .../main/java/org/apache/maven/api/Project.java    |  9 ++-
 .../org/apache/maven/api/RepositoryMetadata.java   |  2 +-
 .../main/java/org/apache/maven/api/Session.java    | 35 +++++++++
 .../java/org/apache/maven/api/SessionData.java     | 84 ++++++++++++++++++++++
 .../api/{ArtifactMetadata.java => Toolchain.java}  | 21 +++++-
 .../apache/maven/api/services/ArtifactFactory.java |  7 ++
 .../maven/api/services/ArtifactFactoryRequest.java | 13 ++++
 .../apache/maven/api/services/ArtifactManager.java |  7 +-
 ...actFactory.java => LocalRepositoryManager.java} | 25 ++++---
 .../apache/maven/api/services/ProjectDeployer.java |  5 +-
 .../maven/api/services/ProjectDeployerRequest.java | 12 +---
 .../apache/maven/api/services/ProjectManager.java  |  4 ++
 .../RepositoryFactory.java}                        | 14 +++-
 .../ToolchainManager.java}                         | 13 +++-
 maven-core-impl/pom.xml                            |  9 ++-
 .../maven/impl/DefaultLocalRepositoryManager.java  | 82 +++++++++++++++++++++
 .../maven/impl/DefaultRepositoryFactory.java       | 24 ++++++-
 .../java/org/apache/maven/impl/DefaultSession.java | 82 +++++++++++++++++++--
 .../test/java/org/apache/maven/impl/TestApi.java   |  3 +
 21 files changed, 431 insertions(+), 44 deletions(-)

diff --git a/maven-core-api/pom.xml b/maven-core-api/pom.xml
index 853b64a..e70bbca 100644
--- a/maven-core-api/pom.xml
+++ b/maven-core-api/pom.xml
@@ -31,6 +31,14 @@
 
   <dependencies>
     <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-model</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-settings</artifactId>
+    </dependency>
+    <dependency>
       <groupId>com.google.code.findbugs</groupId>
       <artifactId>jsr305</artifactId>
       <version>3.0.2</version>
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/Metadata.java
similarity index 80%
copy from 
maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
copy to maven-core-api/src/main/java/org/apache/maven/api/Metadata.java
index 6cee8b6..b3575d2 100644
--- a/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Metadata.java
@@ -19,6 +19,20 @@ package org.apache.maven.api;
  * under the License.
  */
 
-public interface ArtifactMetadata
+public interface Metadata
 {
+
+    String getGroupId();
+
+    String getArtifactId();
+
+    String getVersion();
+
+    enum Storage
+    {
+        Group, Artifact, Version
+    }
+
+    Storage getStorage();
+
 }
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
index 037f718..4d313e4 100644
--- 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
@@ -24,6 +24,8 @@ import javax.annotation.Nonnull;
 import java.nio.file.Path;
 import java.util.List;
 
+import org.apache.maven.model.Model;
+
 /**
  * Interface representing a Maven project.
  */
@@ -46,11 +48,16 @@ public interface Project
     Artifact getArtifact();
 
     @Nonnull
-    Object getModel();
+    Model getModel();
 
     @Nonnull
     Path getPomPath();
 
+    default Path getBasedir()
+    {
+        return getPomPath().getParent();
+    }
+
     @Nonnull
     List<Dependency> getDependencies();
 
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
index 2ff856d..e45a31e 100644
--- 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
@@ -19,6 +19,6 @@ package org.apache.maven.api;
  * under the License.
  */
 
-public interface RepositoryMetadata extends ArtifactMetadata
+public interface RepositoryMetadata extends Metadata
 {
 }
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
index 6fbc7cd..b4f9dc0 100644
--- 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
@@ -22,9 +22,11 @@ package org.apache.maven.api;
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.ThreadSafe;
 
+import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.List;
 import java.util.NoSuchElementException;
+import java.util.Properties;
 
 import org.apache.maven.api.services.ArtifactDeployer;
 import org.apache.maven.api.services.ArtifactDeployerException;
@@ -42,7 +44,9 @@ 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.RepositoryFactory;
 import org.apache.maven.api.services.Service;
+import org.apache.maven.settings.Settings;
 
 /**
  * The session to install / deploy / resolve artifacts and dependencies.
@@ -52,11 +56,23 @@ public interface Session
 {
 
     @Nonnull
+    Settings getSettings();
+
+    @Nonnull
     LocalRepository getLocalRepository();
 
     @Nonnull
     List<RemoteRepository> getRemoteRepositories();
 
+    @Nonnull
+    SessionData getData();
+
+    @Nonnull
+    Properties getUserProperties();
+
+    @Nonnull
+    Properties getSystemProperties();
+
     /**
      * Retrieves the service for the interface
      *
@@ -84,6 +100,15 @@ public interface Session
     Session withRemoteRepositories( @Nonnull List<RemoteRepository> 
repositories );
 
     /**
+     * Shortcut for 
<code>getService(RepositoryFactory.class).createLocal(...)</code>
+     */
+    default LocalRepository createLocalRepository( Path path )
+            throws ArtifactFactoryException, IllegalArgumentException
+    {
+        return getService( RepositoryFactory.class ).createLocal( path );
+    }
+
+    /**
      * Shortcut for <code>getService(ArtifactFactory.class).create(...)</code>
      */
     default Artifact createArtifact( String groupId, String artifactId, String 
version, String type )
@@ -94,6 +119,16 @@ public interface Session
     }
 
     /**
+     * Shortcut for <code>getService(ArtifactFactory.class).create(...)</code>
+     */
+    default Artifact createArtifact( String groupId, String artifactId, String 
classifier, String version, String type )
+            throws ArtifactFactoryException, IllegalArgumentException
+    {
+        return getService( ArtifactFactory.class )
+                .create( this, groupId, artifactId, classifier, version, type 
);
+    }
+
+    /**
      * Shortcut for 
<code>getService(ArtifactResolver.class).resolve(...)</code>
      */
     default ArtifactResolverResult resolveArtifact( Artifact artifact )
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/SessionData.java 
b/maven-core-api/src/main/java/org/apache/maven/api/SessionData.java
new file mode 100644
index 0000000..bc4d688
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/SessionData.java
@@ -0,0 +1,84 @@
+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.ThreadSafe;
+
+import java.util.function.Supplier;
+
+/**
+ * A container for data that is specific to a session.
+ * All components may use this storage to associate arbitrary data with a 
session.
+ * <p>
+ * Unlike a cache, this session data is not subject to purging. For this same 
reason, session data should also not be
+ * abused as a cache (i.e. for storing values that can be re-calculated) to 
avoid memory exhaustion.
+ * <p>
+ * <strong>Note:</strong> Actual implementations must be thread-safe.
+ * 
+ * @see Session#getData()
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+@ThreadSafe
+public interface SessionData
+{
+
+    /**
+     * Associates the specified session data with the given key.
+     * 
+     * @param key The key under which to store the session data, must not be 
{@code null}.
+     * @param value The data to associate with the key, may be {@code null} to 
remove the mapping.
+     */
+    void set( @Nonnull Object key, @Nullable Object value );
+
+    /**
+     * Associates the specified session data with the given key if the key is 
currently mapped to the given value. This
+     * method provides an atomic compare-and-update of some key's value.
+     * 
+     * @param key The key under which to store the session data, must not be 
{@code null}.
+     * @param oldValue The expected data currently associated with the key, 
may be {@code null}.
+     * @param newValue The data to associate with the key, may be {@code null} 
to remove the mapping.
+     * @return {@code true} if the key mapping was successfully updated from 
the old value to the new value,
+     *         {@code false} if the current key mapping didn't match the 
expected value and was not updated.
+     */
+    boolean set( @Nonnull Object key, @Nullable Object oldValue, @Nullable 
Object newValue );
+
+    /**
+     * Gets the session data associated with the specified key.
+     * 
+     * @param key The key for which to retrieve the session data, must not be 
{@code null}.
+     * @return The session data associated with the key or {@code null} if 
none.
+     */
+    @Nullable
+    Object get( @Nonnull Object key );
+
+    /**
+     * Retrieve of compute the data associated with the specified key.
+     *
+     * @param key The key for which to retrieve the session data, must not be 
{@code null}.
+     * @param supplier The supplier will compute the new value.
+     * @return The session data associated with the key.
+     */
+    @Nullable
+    Object computeIfAbsent( @Nonnull Object key, @Nonnull Supplier<Object> 
supplier );
+
+}
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/Toolchain.java
similarity index 65%
copy from 
maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
copy to maven-core-api/src/main/java/org/apache/maven/api/Toolchain.java
index 6cee8b6..a31e5bc 100644
--- a/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Toolchain.java
@@ -19,6 +19,23 @@ package org.apache.maven.api;
  * under the License.
  */
 
-public interface ArtifactMetadata
+/**
+ * Toolchain interface.
+ */
+public interface Toolchain
 {
-}
+    /**
+     * get the type of toolchain.
+     *
+     * @return the toolchain type
+     */
+    String getType();
+
+    /**
+     * Gets the platform tool executable.
+     *
+     * @param toolName the tool platform independent tool name.
+     * @return file representing the tool executable, or null if the tool can 
not be found
+     */
+    String findTool( String toolName );
+}
\ No newline at end of file
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
index 2459409..c1ab305 100644
--- 
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
@@ -33,4 +33,11 @@ public interface ArtifactFactory extends Service
     {
         return create( ArtifactFactoryRequest.build( session, groupId, 
artifactId, version, type ) );
     }
+
+    default Artifact create( Session session, String groupId, String 
artifactId,
+                             String classifier, String version, String type )
+            throws ArtifactFactoryException, IllegalArgumentException
+    {
+        return create( ArtifactFactoryRequest.build( session, groupId, 
artifactId, classifier, version, type ) );
+    }
 }
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
index 4bdf288..4032330 100644
--- 
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
@@ -53,6 +53,19 @@ public interface ArtifactFactoryRequest
                 .build();
     }
 
+    static ArtifactFactoryRequest build( Session session, String groupId, 
String artifactId,
+                                         String classifier, String version, 
String type )
+    {
+        return ArtifactFactoryRequest.builder()
+                .session( session )
+                .groupId( groupId )
+                .artifactId( artifactId )
+                .classifier( classifier )
+                .version( version )
+                .type( type )
+                .build();
+    }
+
     static ArtifactFactoryRequestBuilder builder()
     {
         return new ArtifactFactoryRequestBuilder();
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
index f96b014..609a9ac 100644
--- 
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
@@ -26,7 +26,7 @@ import java.util.Collection;
 import java.util.Optional;
 
 import org.apache.maven.api.Artifact;
-import org.apache.maven.api.ArtifactMetadata;
+import org.apache.maven.api.Metadata;
 
 public interface ArtifactManager extends Service
 {
@@ -41,6 +41,9 @@ public interface ArtifactManager extends Service
     Optional<Path> getPath( Artifact artifact );
 
     @Nonnull
-    Collection<ArtifactMetadata> getAttachedMetadatas( Artifact artifact );
+    Collection<Metadata> getAttachedMetadatas( Artifact artifact );
 
+    void attachMetadata( @Nonnull Artifact artifact, @Nonnull Metadata 
metadata );
+
+    void setPath( Artifact artifact, Path path );
 }
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/LocalRepositoryManager.java
similarity index 55%
copy from 
maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactory.java
copy to 
maven-core-api/src/main/java/org/apache/maven/api/services/LocalRepositoryManager.java
index 2459409..fc9d3b1 100644
--- 
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/LocalRepositoryManager.java
@@ -9,7 +9,7 @@ package org.apache.maven.api.services;
  * "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
+ *  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
@@ -19,18 +19,23 @@ package org.apache.maven.api.services;
  * under the License.
  */
 
-import org.apache.maven.api.Session;
+import java.nio.file.Path;
+
 import org.apache.maven.api.Artifact;
+import org.apache.maven.api.LocalRepository;
+import org.apache.maven.api.Metadata;
+import org.apache.maven.api.RemoteRepository;
+import org.apache.maven.api.Session;
 
-public interface ArtifactFactory extends Service
+public interface LocalRepositoryManager extends Service
 {
 
-    Artifact create( ArtifactFactoryRequest request )
-            throws ArtifactFactoryException, IllegalArgumentException;
+    Path getPathForLocalArtifact( Session session, LocalRepository local, 
Artifact artifact );
+
+    Path getPathForLocalMetadata( Session session, LocalRepository local, 
Metadata metadata );
+
+    Path getPathForRemoteArtifact( Session session, LocalRepository local, 
RemoteRepository remote, Artifact artifact );
+
+    Path getPathForRemoteMetadata( Session session, LocalRepository local, 
RemoteRepository remote, Metadata metadata );
 
-    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/ProjectDeployer.java
 
b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployer.java
index 8fc5281..5f21e4c 100644
--- 
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
@@ -19,6 +19,7 @@ package org.apache.maven.api.services;
  * under the License.
  */
 
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.Project;
 
@@ -60,9 +61,9 @@ public interface ProjectDeployer extends Service
     void deploy( ProjectDeployerRequest request )
         throws ProjectDeployerException, IllegalArgumentException;
 
-    default void deploy( Session session, Project project )
+    default void deploy( Session session, Project project, RemoteRepository 
repository )
             throws ProjectDeployerException, IllegalArgumentException
     {
-        deploy( ProjectDeployerRequest.build( session, project ) );
+        deploy( ProjectDeployerRequest.build( session, project, repository ) );
     }
 }
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
index 27eeffc..e343e86 100644
--- 
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
@@ -38,20 +38,12 @@ public interface ProjectDeployerRequest
 
     int getRetryFailedDeploymentCount();
 
-//    @Nonnull
-//    Optional<String> getAltDeploymentRepository();
-
-//    @Nonnull
-//    Optional<String> getAltSnapshotDeploymentRepository();
-
-//    @Nonnull
-//    Optional<String> getAltReleaseDeploymentRepository();
-
-    static ProjectDeployerRequest build( Session session, Project project )
+    static ProjectDeployerRequest build( Session session, Project project, 
RemoteRepository repository )
     {
         return builder()
                 .session( session )
                 .project( project )
+                .repository( repository )
                 .build();
     }
 
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
index 494882a..0651a26 100644
--- 
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
@@ -45,4 +45,8 @@ public interface ProjectManager extends Service
     @Nonnull
     Collection<Artifact> getAttachedArtifacts( Project project );
 
+    void attachArtifact( Project project, String type, Path path );
+
+    void attachArtifact( Project project, String trim, String trim1, Path path 
);
+
 }
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/services/RepositoryFactory.java
similarity index 71%
copy from 
maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
copy to 
maven-core-api/src/main/java/org/apache/maven/api/services/RepositoryFactory.java
index 6cee8b6..7318bd9 100644
--- a/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
+++ 
b/maven-core-api/src/main/java/org/apache/maven/api/services/RepositoryFactory.java
@@ -1,4 +1,4 @@
-package org.apache.maven.api;
+package org.apache.maven.api.services;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,6 +19,16 @@ package org.apache.maven.api;
  * under the License.
  */
 
-public interface ArtifactMetadata
+import java.nio.file.Path;
+
+import org.apache.maven.api.LocalRepository;
+import org.apache.maven.api.RemoteRepository;
+
+public interface RepositoryFactory extends Service
 {
+
+    LocalRepository createLocal( Path path );
+
+    RemoteRepository createRemote( String id, String url );
+
 }
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/services/ToolchainManager.java
similarity index 67%
copy from 
maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
copy to 
maven-core-api/src/main/java/org/apache/maven/api/services/ToolchainManager.java
index 6cee8b6..b92ef4f 100644
--- a/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
+++ 
b/maven-core-api/src/main/java/org/apache/maven/api/services/ToolchainManager.java
@@ -1,4 +1,4 @@
-package org.apache.maven.api;
+package org.apache.maven.api.services;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,6 +19,15 @@ package org.apache.maven.api;
  * under the License.
  */
 
-public interface ArtifactMetadata
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Toolchain;
+
+public interface ToolchainManager extends Service
 {
+    List<Toolchain> getToolchains( Session session, String jdk, Map<String, 
String> jdkToolchain );
+
+    Toolchain getToolchainFromBuildContext( Session session, String jdk );
 }
diff --git a/maven-core-impl/pom.xml b/maven-core-impl/pom.xml
index df573ad..8fc09bc 100644
--- a/maven-core-impl/pom.xml
+++ b/maven-core-impl/pom.xml
@@ -38,6 +38,10 @@
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-core</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-impl</artifactId>
+    </dependency>
 
     <!-- Testing -->
     <dependency>
@@ -47,11 +51,6 @@
     </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>
diff --git 
a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultLocalRepositoryManager.java
 
b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultLocalRepositoryManager.java
new file mode 100644
index 0000000..41bd191
--- /dev/null
+++ 
b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultLocalRepositoryManager.java
@@ -0,0 +1,82 @@
+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.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.LocalRepository;
+import org.apache.maven.api.Metadata;
+import org.apache.maven.api.RemoteRepository;
+import org.apache.maven.api.Session;
+import org.apache.maven.api.services.LocalRepositoryManager;
+import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
+
+public class DefaultLocalRepositoryManager implements LocalRepositoryManager
+{
+
+    @Override
+    public Path getPathForLocalArtifact( Session session, LocalRepository 
local, Artifact artifact )
+    {
+        DefaultSession s = (DefaultSession) session;
+        return Paths.get( getManager( s, local ).getPathForLocalArtifact( 
s.toArtifact( artifact ) ) );
+    }
+
+    @Override
+    public Path getPathForLocalMetadata( Session session, LocalRepository 
local, Metadata metadata )
+    {
+        DefaultSession s = (DefaultSession) session;
+        return Paths.get( getManager( s, local ).getPathForLocalMetadata( 
s.toMetadata( metadata ) ) );
+    }
+
+    @Override
+    public Path getPathForRemoteArtifact( Session session, LocalRepository 
local,
+                                          RemoteRepository remote, Artifact 
artifact )
+    {
+        DefaultSession s = (DefaultSession) session;
+        return Paths.get( getManager( s, local ).getPathForRemoteArtifact(
+                s.toArtifact( artifact ), s.toRepository( remote ), null ) );
+    }
+
+    @Override
+    public Path getPathForRemoteMetadata( Session session, LocalRepository 
local,
+                                          RemoteRepository remote, Metadata 
metadata )
+    {
+        DefaultSession s = (DefaultSession) session;
+        return Paths.get( getManager( s, local ).getPathForRemoteMetadata(
+                s.toMetadata( metadata ), s.toRepository( remote ), null ) );
+    }
+
+    private org.eclipse.aether.repository.LocalRepositoryManager getManager(
+            DefaultSession session, LocalRepository local )
+    {
+        try
+        {
+            return session.getLocalRepositoryProvider()
+                    .newLocalRepositoryManager( session.getSession(), 
session.toRepository( local ) );
+        }
+        catch ( NoLocalRepositoryManagerException e )
+        {
+            throw new IllegalStateException( e );
+        }
+    }
+
+}
diff --git 
a/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java 
b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java
similarity index 52%
rename from 
maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
rename to 
maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java
index 6cee8b6..5e8e045 100644
--- a/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
+++ 
b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java
@@ -1,4 +1,4 @@
-package org.apache.maven.api;
+package org.apache.maven.impl;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,6 +19,26 @@ package org.apache.maven.api;
  * under the License.
  */
 
-public interface ArtifactMetadata
+import java.nio.file.Path;
+
+import org.apache.maven.api.LocalRepository;
+import org.apache.maven.api.RemoteRepository;
+import org.apache.maven.api.services.RepositoryFactory;
+
+public class DefaultRepositoryFactory implements RepositoryFactory
 {
+
+    @Override
+    public LocalRepository createLocal( Path path )
+    {
+        return new DefaultLocalRepository( new 
org.eclipse.aether.repository.LocalRepository( "target/repo" ) );
+    }
+
+    @Override
+    public RemoteRepository createRemote( String id, String url )
+    {
+        return new DefaultRemoteRepository(
+                new org.eclipse.aether.repository.RemoteRepository.Builder( 
id, "", url )
+                        .build() );
+    }
 }
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
index 6b37f63..585987b 100644
--- 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
@@ -20,6 +20,7 @@ package org.apache.maven.impl;
  */
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import java.nio.file.Path;
 import java.util.Collection;
@@ -28,13 +29,18 @@ import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Objects;
+import java.util.Properties;
 import java.util.WeakHashMap;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import org.apache.maven.api.SessionData;
+import org.apache.maven.api.services.LocalRepositoryManager;
+import org.apache.maven.api.services.RepositoryFactory;
 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.Metadata;
 import org.apache.maven.api.Dependency;
 import org.apache.maven.api.Node;
 import org.apache.maven.api.Project;
@@ -53,12 +59,13 @@ 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.apache.maven.settings.Settings;
 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;
+import org.eclipse.aether.impl.LocalRepositoryProvider;
 
 public class DefaultSession implements Session
 {
@@ -69,6 +76,7 @@ public class DefaultSession implements Session
     private final List<RemoteRepository> repositories;
     private final org.apache.maven.project.ProjectBuilder projectBuilder;
     private final MavenRepositorySystem mavenRepositorySystem;
+    private LocalRepositoryProvider localRepositoryProvider;
 
     private final Map<org.eclipse.aether.graph.DependencyNode, Node> allNodes
             = Collections.synchronizedMap( new WeakHashMap<>() );
@@ -112,6 +120,59 @@ public class DefaultSession implements Session
 
     @Nonnull
     @Override
+    public Settings getSettings()
+    {
+        return null;
+    }
+
+    @Nonnull
+    @Override
+    public Properties getUserProperties()
+    {
+        return null;
+    }
+
+    @Nonnull
+    @Override
+    public Properties getSystemProperties()
+    {
+        return null;
+    }
+
+    @Nonnull
+    @Override
+    public SessionData getData()
+    {
+        org.eclipse.aether.SessionData data = session.getData();
+        return new SessionData()
+        {
+            @Override
+            public void set( @Nonnull Object key, @Nullable Object value )
+            {
+                data.set( key, value );
+            }
+            @Override
+            public boolean set( @Nonnull Object key, @Nullable Object 
oldValue, @Nullable Object newValue )
+            {
+                return data.set( key, oldValue, newValue );
+            }
+            @Nullable
+            @Override
+            public Object get( @Nonnull Object key )
+            {
+                return data.get( key );
+            }
+            @Nullable
+            @Override
+            public Object computeIfAbsent( @Nonnull Object key, @Nonnull 
Supplier<Object> supplier )
+            {
+                return data.computeIfAbsent( key, supplier );
+            }
+        };
+    }
+
+    @Nonnull
+    @Override
     public Session withLocalRepository( @Nonnull LocalRepository 
localRepository )
     {
         Objects.requireNonNull( localRepository, "localRepository" );
@@ -124,7 +185,7 @@ public class DefaultSession implements Session
         try
         {
             org.eclipse.aether.repository.LocalRepository repository = 
toRepository( localRepository );
-            LocalRepositoryManager localRepositoryManager
+            org.eclipse.aether.repository.LocalRepositoryManager 
localRepositoryManager
                     = localRepositoryManagerFactory.newInstance( session, 
repository );
 
             RepositorySystemSession newSession = new 
DefaultRepositorySystemSession( session )
@@ -193,6 +254,14 @@ public class DefaultSession implements Session
         {
             return (T) new DefaultProjectInstaller( repositorySystem );
         }
+        else if ( clazz == LocalRepositoryManager.class )
+        {
+            return (T) new DefaultLocalRepositoryManager();
+        }
+        else if ( clazz == RepositoryFactory.class )
+        {
+            return (T) new DefaultRepositoryFactory();
+        }
         throw new NoSuchElementException( clazz.getName() );
     }
 
@@ -201,6 +270,11 @@ public class DefaultSession implements Session
         return session;
     }
 
+    public LocalRepositoryProvider getLocalRepositoryProvider()
+    {
+        return localRepositoryProvider;
+    }
+
     public RemoteRepository getRemoteRepository( 
org.eclipse.aether.repository.RemoteRepository repository )
     {
         return allRepositories.computeIfAbsent( repository, 
DefaultRemoteRepository::new );
@@ -356,7 +430,7 @@ public class DefaultSession implements Session
         }
     }
 
-    public org.eclipse.aether.metadata.Metadata toMetadata( ArtifactMetadata 
metadata )
+    public org.eclipse.aether.metadata.Metadata toMetadata( Metadata metadata )
     {
         /*
         if ( metadata instanceof ProjectArtifactMetadata )
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
index 7736f81..b91dcf0 100644
--- 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
@@ -21,6 +21,7 @@ package org.apache.maven.impl;
 
 import javax.inject.Inject;
 
+import java.nio.file.Paths;
 import java.util.Collections;
 
 import org.apache.maven.api.Project;
@@ -29,6 +30,7 @@ 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.api.services.RepositoryFactory;
 import org.apache.maven.bridge.MavenRepositorySystem;
 import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
 import org.codehaus.plexus.testing.PlexusTest;
@@ -75,6 +77,7 @@ public class TestApi
                 new RemoteRepository.Builder( "mirror", "default",
                         "file:target/test-classes/repo" ).build() );
         this.session = session
+                .withLocalRepository( session.getService( 
RepositoryFactory.class ).createLocal( Paths.get( "target/repo" ) ) )
                 .withLocalRepository( localRepository )
                 .withRemoteRepositories( Collections.singletonList( 
remoteRepository ) );
     }

Reply via email to