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/03/10 07:13:10 UTC

[maven] 09/12: runtime support

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 dea91e2d7fb5bd7b41ac94f074e6bf5348bded98
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Tue Mar 8 11:48:02 2022 +0100

    runtime support
---
 .../main/java/org/apache/maven/api/Metadata.java   |  3 +
 .../apache/maven/api/services/ArtifactManager.java |  6 ++
 maven-core-impl/pom.xml                            | 71 ----------------------
 .../internal/impl/DefaultArtifactManager.java      |  3 +-
 .../impl/DefaultLocalRepositoryManager.java        |  8 ++-
 .../maven/internal/impl/DefaultProjectManager.java | 37 ++++++++---
 .../internal/impl/DefaultRepositoryFactory.java    | 10 +--
 .../apache/maven/internal/impl/DefaultSession.java | 31 +++++-----
 .../plugin/PluginParameterExpressionEvaluator.java | 10 ++-
 9 files changed, 79 insertions(+), 100 deletions(-)

diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Metadata.java b/maven-core-api/src/main/java/org/apache/maven/api/Metadata.java
index b3575d2..d0b83ef 100644
--- a/maven-core-api/src/main/java/org/apache/maven/api/Metadata.java
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Metadata.java
@@ -19,6 +19,9 @@ package org.apache.maven.api;
  * under the License.
  */
 
+/**
+ * TODO: investigate removing the Metadata api completely
+ */
 public interface Metadata
 {
 
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 949a50e..48488a5 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
@@ -43,9 +43,15 @@ public interface ArtifactManager extends Service
      */
     void setPath( @Nonnull Artifact artifact, Path path );
 
+    /**
+     * TODO: investigate removing the Metadata api completely
+     */
     @Nonnull
     Collection<Metadata> getAttachedMetadatas( @Nonnull Artifact artifact );
 
+    /**
+     * TODO: investigate removing the Metadata api completely
+     */
     void attachMetadata( @Nonnull Artifact artifact, @Nonnull Metadata metadata );
 
     /**
diff --git a/maven-core-impl/pom.xml b/maven-core-impl/pom.xml
deleted file mode 100644
index 65551b4..0000000
--- a/maven-core-impl/pom.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?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-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>
-    <dependency>
-      <groupId>org.apache.maven.resolver</groupId>
-      <artifactId>maven-resolver-impl</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-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/src/main/java/org/apache/maven/internal/impl/DefaultArtifactManager.java b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactManager.java
index 6d7706f..60b338b 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactManager.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactManager.java
@@ -51,7 +51,8 @@ public class DefaultArtifactManager implements ArtifactManager
     @Override
     public Optional<Path> getPath( @Nonnull Artifact artifact )
     {
-        return Optional.ofNullable( paths.get( artifact ) );
+        Path path = paths.get( artifact );
+        return path != null ? Optional.of( path ) : artifact.getPath();
     }
 
     @Override
diff --git a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLocalRepositoryManager.java b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLocalRepositoryManager.java
index 54d6c06..450791d 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLocalRepositoryManager.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLocalRepositoryManager.java
@@ -70,8 +70,12 @@ public class DefaultLocalRepositoryManager implements LocalRepositoryManager
     private org.eclipse.aether.repository.LocalRepositoryManager getManager(
             DefaultSession session, LocalRepository local )
     {
-        return session.getRepositorySystem()
-                .newLocalRepositoryManager( session.getSession(), session.toRepository( local ) );
+        org.eclipse.aether.repository.LocalRepository repository = session.toRepository( local );
+        if ( "enhanced".equals( repository.getContentType() ) )
+        {
+            repository = new org.eclipse.aether.repository.LocalRepository( repository.getBasedir(), "" );
+        }
+        return session.getRepositorySystem().newLocalRepositoryManager( session.getSession(), repository );
     }
 
 }
diff --git a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectManager.java b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectManager.java
index aeb0c9e..ba27d0b 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectManager.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectManager.java
@@ -23,60 +23,83 @@ 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.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.maven.api.Artifact;
 import org.apache.maven.api.Node;
 import org.apache.maven.api.Project;
 import org.apache.maven.api.RemoteRepository;
+import org.apache.maven.api.services.ArtifactManager;
 import org.apache.maven.api.services.ProjectManager;
 
 public class DefaultProjectManager implements ProjectManager
 {
 
+    private final Map<Project, Path> paths = new ConcurrentHashMap<>();
+    private final Map<Project, Collection<Artifact>> attachedArtifacts = new ConcurrentHashMap<>();
+    private final Map<Project, List<String>> compileSourceRoots = new ConcurrentHashMap<>();
+    private final Map<Project, List<String>> testCompileSourceRoots = new ConcurrentHashMap<>();
+    private final ArtifactManager artifactManager;
+
+    public DefaultProjectManager( ArtifactManager artifactManager )
+    {
+        this.artifactManager = artifactManager;
+    }
+
     @Nonnull
     @Override
     public Optional<Path> getPath( Project project )
     {
-        return Optional.empty();
+        return Optional.ofNullable( paths.get( project ) );
     }
 
     @Nonnull
     @Override
     public Collection<Artifact> getAttachedArtifacts( Project project )
     {
-        return null;
+        Collection<Artifact> attached = attachedArtifacts.get( project );
+        return attached != null ? Collections.unmodifiableCollection( attached ) : Collections.emptyList();
     }
 
     @Override
     public void attachArtifact( Project project, Artifact artifact, Path path )
     {
-
+        attachedArtifacts.computeIfAbsent( project, p -> new CopyOnWriteArrayList<>() )
+                .add( artifact );
+        artifactManager.setPath( artifact, path );
     }
 
     @Override
     public List<String> getCompileSourceRoots( Project project )
     {
-        return null;
+        List<String> roots = compileSourceRoots.get( project );
+        return roots != null ? Collections.unmodifiableList( roots ) : Collections.emptyList();
     }
 
     @Override
     public void addCompileSourceRoot( Project project, String sourceRoot )
     {
-
+        compileSourceRoots.computeIfAbsent( project, p -> new CopyOnWriteArrayList<>() )
+                .add( sourceRoot );
     }
 
     @Override
     public List<String> getTestCompileSourceRoots( Project project )
     {
-        return null;
+        List<String> roots = testCompileSourceRoots.get( project );
+        return roots != null ? Collections.unmodifiableList( roots ) : Collections.emptyList();
     }
 
     @Override
     public void addTestCompileSourceRoot( Project project, String sourceRoot )
     {
-
+        testCompileSourceRoots.computeIfAbsent( project, p -> new CopyOnWriteArrayList<>() )
+                .add( sourceRoot );
     }
 
     @Override
diff --git a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultRepositoryFactory.java b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultRepositoryFactory.java
index e6595f7..c7430b7 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultRepositoryFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultRepositoryFactory.java
@@ -26,6 +26,7 @@ import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.services.RepositoryFactory;
 import org.apache.maven.model.Repository;
 import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.repository.RepositoryPolicy;
 
 public class DefaultRepositoryFactory implements RepositoryFactory
 {
@@ -47,7 +48,7 @@ public class DefaultRepositoryFactory implements RepositoryFactory
     public RemoteRepository createRemote( String id, String url )
     {
         return new DefaultRemoteRepository(
-                new org.eclipse.aether.repository.RemoteRepository.Builder( id, "", url )
+                new org.eclipse.aether.repository.RemoteRepository.Builder( id, "default", url )
                         .build() );
     }
 
@@ -67,8 +68,8 @@ public class DefaultRepositoryFactory implements RepositoryFactory
             org.apache.maven.model.RepositoryPolicy policy )
     {
         boolean enabled = true;
-        String updatePolicy = null;
-        String checksumPolicy = null;
+        String updatePolicy = RepositoryPolicy.UPDATE_POLICY_DAILY;
+        String checksumPolicy = RepositoryPolicy.CHECKSUM_POLICY_FAIL;
         if ( policy != null )
         {
             enabled = policy.isEnabled();
@@ -81,6 +82,7 @@ public class DefaultRepositoryFactory implements RepositoryFactory
                 checksumPolicy = policy.getChecksumPolicy();
             }
         }
-        return new org.eclipse.aether.repository.RepositoryPolicy( enabled, updatePolicy, checksumPolicy );
+        return new org.eclipse.aether.repository.RepositoryPolicy(
+                enabled, updatePolicy, checksumPolicy );
     }
 }
diff --git a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java
index 72c6dba..2671c3c 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java
@@ -22,6 +22,7 @@ package org.apache.maven.internal.impl;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import java.io.File;
 import java.nio.file.Path;
 import java.util.Collection;
 import java.util.Collections;
@@ -82,7 +83,7 @@ public class DefaultSession implements Session
     private final DefaultToolchainManagerPrivate toolchainManagerPrivate;
     private final List<Listener> listeners = new CopyOnWriteArrayList<>();
     private final ArtifactManager artifactManager = new DefaultArtifactManager();
-    private final ProjectManager projectManager = new DefaultProjectManager();
+    private final ProjectManager projectManager = new DefaultProjectManager( artifactManager );
 
     private final Map<org.eclipse.aether.graph.DependencyNode, Node> allNodes
             = Collections.synchronizedMap( new WeakHashMap<>() );
@@ -424,22 +425,24 @@ public class DefaultSession implements Session
 
     public org.eclipse.aether.artifact.Artifact toArtifact( Artifact artifact )
     {
+        File file = getService( ArtifactManager.class ).getPath( artifact ).map( Path::toFile ).orElse( null );
         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,
-                    getService( ArtifactManager.class ).getPath( artifact ).map( Path::toFile ).orElse( null )
-            );
+            org.eclipse.aether.artifact.Artifact a = ( (DefaultArtifact) artifact ).getArtifact();
+            if ( Objects.equals( file, a.getFile() ) )
+            {
+                return a;
+            }
         }
+        return new org.eclipse.aether.artifact.DefaultArtifact(
+                artifact.getGroupId(),
+                artifact.getArtifactId(),
+                artifact.getClassifier(),
+                artifact.getExtension(),
+                artifact.getVersion(),
+                null,
+                file
+        );
     }
 
     public org.eclipse.aether.metadata.Metadata toMetadata( Metadata metadata )
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/PluginParameterExpressionEvaluator.java b/maven-core/src/main/java/org/apache/maven/plugin/PluginParameterExpressionEvaluator.java
index 6f00873..6ae8d7d 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/PluginParameterExpressionEvaluator.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/PluginParameterExpressionEvaluator.java
@@ -23,6 +23,7 @@ import java.io.File;
 import java.util.Properties;
 
 import org.apache.maven.execution.MavenSession;
+import org.apache.maven.internal.impl.DefaultSession;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
 import org.apache.maven.project.MavenProject;
@@ -243,7 +244,14 @@ public class PluginParameterExpressionEvaluator
         }
         else if ( "project".equals( expression ) )
         {
-            value = project;
+            if ( mojoDescriptor.isV4Api() )
+            {
+                value = ( (DefaultSession) session.getSession() ).getProject( project );
+            }
+            else
+            {
+                value = project;
+            }
         }
         else if ( "executedProject".equals( expression ) )
         {