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/15 12:23:33 UTC

[maven] 02/02: Add Listener / Event, JavaToolchain, ArtifactManager.isSnapshot(String) ...

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 e3144f337fb42d2261b47463fe3d4401c0b4b916
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Tue Feb 15 13:23:10 2022 +0100

    Add Listener / Event, JavaToolchain, ArtifactManager.isSnapshot(String) ...
---
 .../main/java/org/apache/maven/api/Dependency.java |  1 +
 .../src/main/java/org/apache/maven/api/Event.java  | 88 ++++++++++++++++++++++
 .../{RemoteRepository.java => JavaToolchain.java}  |  6 +-
 .../api/{RemoteRepository.java => Listener.java}   | 12 ++-
 .../org/apache/maven/api/RemoteRepository.java     |  8 ++
 .../main/java/org/apache/maven/api/Session.java    | 48 ++++++++++++
 .../apache/maven/api/services/ArtifactManager.java |  8 +-
 .../apache/maven/api/services/ProjectManager.java  | 25 ++++++
 .../maven/api/services/RepositoryFactory.java      |  3 +
 .../apache/maven/impl/DefaultRemoteRepository.java | 14 ++++
 .../maven/impl/DefaultRepositoryFactory.java       | 42 +++++++++++
 .../java/org/apache/maven/impl/DefaultSession.java | 23 +++++-
 .../maven/plugin/descriptor/PluginDescriptor.java  | 19 ++---
 13 files changed, 281 insertions(+), 16 deletions(-)

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
index b0e0fe3..0e672f6 100644
--- 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
@@ -31,6 +31,7 @@ public interface Dependency
     @Nonnull
     Artifact getArtifact();
 
+    // TODO: make that en enum ?
     String getScope();
 
     @Nullable
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Event.java b/maven-core-api/src/main/java/org/apache/maven/api/Event.java
new file mode 100644
index 0000000..9e2c1f6
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Event.java
@@ -0,0 +1,88 @@
+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.
+ */
+
+/**
+ * Event
+ */
+public interface Event
+{
+
+    /**
+     * The possible types of execution events.
+     */
+    enum Type
+    {
+        ProjectDiscoveryStarted,
+        SessionStarted,
+        SessionEnded,
+        ProjectSkipped,
+        ProjectStarted,
+        ProjectSucceeded,
+        ProjectFailed,
+        MojoSkipped,
+        MojoStarted,
+        MojoSucceeded,
+        MojoFailed,
+        ForkStarted,
+        ForkSucceeded,
+        ForkFailed,
+        ForkedProjectStarted,
+        ForkedProjectSucceeded,
+        ForkedProjectFailed,
+    }
+
+    /**
+     * Gets the type of the event.
+     *
+     * @return The type of the event, never {@code null}.
+     */
+    Type getType();
+
+    /**
+     * Gets the session from which this event originates.
+     *
+     * @return The current session, never {@code null}.
+     */
+    Session getSession();
+
+    /**
+     * Gets the current project (if any).
+     *
+     * @return The current project or {@code null} if not applicable.
+     */
+    Project getProject();
+
+    /**
+     * Gets the current mojo execution (if any).
+     *
+     * @return The current mojo execution or {@code null} if not applicable.
+     * TODO: return MojoExecution
+     */
+    Object getMojoExecution();
+
+    /**
+     * Gets the exception that caused the event (if any).
+     *
+     * @return The exception or {@code null} if none.
+     */
+    Exception getException();
+
+}
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/JavaToolchain.java
similarity index 86%
copy from maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java
copy to maven-core-api/src/main/java/org/apache/maven/api/JavaToolchain.java
index 6b8c3ea..d863e6f 100644
--- a/maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java
+++ b/maven-core-api/src/main/java/org/apache/maven/api/JavaToolchain.java
@@ -9,7 +9,7 @@ package org.apache.maven.api;
  * "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,7 +19,9 @@ package org.apache.maven.api;
  * under the License.
  */
 
-public interface RemoteRepository extends Repository
+public interface JavaToolchain extends Toolchain
 {
 
+    String getJavaHome();
+
 }
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/Listener.java
similarity index 79%
copy from maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java
copy to maven-core-api/src/main/java/org/apache/maven/api/Listener.java
index 6b8c3ea..3d83a88 100644
--- a/maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Listener.java
@@ -9,7 +9,7 @@ package org.apache.maven.api;
  * "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,7 +19,13 @@ package org.apache.maven.api;
  * under the License.
  */
 
-public interface RemoteRepository extends Repository
-{
+import javax.annotation.Nonnull;
 
+/**
+ * A listener for session events.
+ */
+@FunctionalInterface
+public interface Listener
+{
+    void onEvent( @Nonnull Event event );
 }
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
index 6b8c3ea..1790b98 100644
--- 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
@@ -19,7 +19,15 @@ package org.apache.maven.api;
  * under the License.
  */
 
+import javax.annotation.Nonnull;
+
 public interface RemoteRepository extends Repository
 {
 
+    @Nonnull
+    String getUrl();
+
+    @Nonnull
+    String getProtocol();
+
 }
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 b4f9dc0..4e50ec1 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
@@ -24,6 +24,7 @@ import javax.annotation.concurrent.ThreadSafe;
 
 import java.nio.file.Path;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Properties;
@@ -44,6 +45,7 @@ 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.LocalRepositoryManager;
 import org.apache.maven.api.services.RepositoryFactory;
 import org.apache.maven.api.services.Service;
 import org.apache.maven.settings.Settings;
@@ -100,6 +102,28 @@ public interface Session
     Session withRemoteRepositories( @Nonnull List<RemoteRepository> repositories );
 
     /**
+     * Register the given listener which will receive all events.
+     *
+     * @param listener the listener to register
+     */
+    void registerListener( @Nonnull Listener listener );
+
+    /**
+     * Unregisters a previously registered listener.
+     *
+     * @param listener the listener to unregister
+     */
+    void unregisterListener( @Nonnull Listener listener );
+
+    /**
+     * Returns the list of registered listeners.
+     *
+     * @return an immutable collection of listeners
+     */
+    @Nonnull
+    Collection<Listener> getListeners();
+
+    /**
      * Shortcut for <code>getService(RepositoryFactory.class).createLocal(...)</code>
      */
     default LocalRepository createLocalRepository( Path path )
@@ -207,4 +231,28 @@ public interface Session
                 .resolve( this, dependency, null );
     }
 
+    default Path getPathForLocalArtifact( Artifact artifact )
+    {
+        return getService( LocalRepositoryManager.class )
+                .getPathForLocalArtifact( this, getLocalRepository(), artifact );
+    }
+
+    default Path getPathForLocalMetadata( Metadata metadata )
+    {
+        return getService( LocalRepositoryManager.class )
+                .getPathForLocalMetadata( this, getLocalRepository(), metadata );
+    }
+
+    default Path getPathForRemoteArtifact( RemoteRepository remote, Artifact artifact )
+    {
+        return getService( LocalRepositoryManager.class )
+                .getPathForRemoteArtifact( this, getLocalRepository(), remote, artifact );
+    }
+
+    default Path getPathForRemoteMetadata( RemoteRepository remote, Metadata metadata )
+    {
+        return getService( LocalRepositoryManager.class )
+                .getPathForRemoteMetadata( this, getLocalRepository(), remote, 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 609a9ac..a354458 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
@@ -40,10 +40,16 @@ public interface ArtifactManager extends Service
     @Nonnull
     Optional<Path> getPath( Artifact artifact );
 
+    void setPath( Artifact artifact, Path path );
+
     @Nonnull
     Collection<Metadata> getAttachedMetadatas( Artifact artifact );
 
     void attachMetadata( @Nonnull Artifact artifact, @Nonnull Metadata metadata );
 
-    void setPath( Artifact artifact, Path path );
+    /**
+     * Checks whether a given artifact version is considered a <code>SNAPSHOT</code> or not.
+     */
+    boolean isSnapshot( String version );
+
 }
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 0651a26..a8456c6 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
@@ -23,10 +23,13 @@ import javax.annotation.Nonnull;
 
 import java.nio.file.Path;
 import java.util.Collection;
+import java.util.List;
 import java.util.Optional;
 
 import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Node;
 import org.apache.maven.api.Project;
+import org.apache.maven.api.RemoteRepository;
 
 /**
  * Interface to manage the project during its lifecycle
@@ -49,4 +52,26 @@ public interface ProjectManager extends Service
 
     void attachArtifact( Project project, String trim, String trim1, Path path );
 
+    List<String> getCompileSourceRoots( Project project );
+
+    void addCompileSourceRoot( Project project, String sourceRoot );
+
+    List<String> getTestCompileSourceRoots( Project project );
+
+    void addTestCompileSourceRoot( Project project, String sourceRoot );
+
+    List<RemoteRepository> getRepositories( Project project );
+
+    List<Artifact> getResolvedDependencies( Project project, ResolutionScope scope );
+
+    Node getCollectedDependencies( Project project, ResolutionScope scope );
+
+    enum ResolutionScope
+    {
+        Compile,
+        CompileRuntime,
+        Runtime,
+        RuntimeSystem,
+        Test
+    }
 }
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/RepositoryFactory.java b/maven-core-api/src/main/java/org/apache/maven/api/services/RepositoryFactory.java
index 7318bd9..b59cb1f 100644
--- a/maven-core-api/src/main/java/org/apache/maven/api/services/RepositoryFactory.java
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/RepositoryFactory.java
@@ -23,6 +23,7 @@ import java.nio.file.Path;
 
 import org.apache.maven.api.LocalRepository;
 import org.apache.maven.api.RemoteRepository;
+import org.apache.maven.model.Repository;
 
 public interface RepositoryFactory extends Service
 {
@@ -31,4 +32,6 @@ public interface RepositoryFactory extends Service
 
     RemoteRepository createRemote( String id, String url );
 
+    RemoteRepository createRemote( Repository repository );
+
 }
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
index 73d481f..713619e 100644
--- 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
@@ -50,4 +50,18 @@ public class DefaultRemoteRepository implements RemoteRepository
     {
         return repository.getContentType();
     }
+
+    @Nonnull
+    @Override
+    public String getUrl()
+    {
+        return repository.getUrl();
+    }
+
+    @Nonnull
+    @Override
+    public String getProtocol()
+    {
+        return repository.getProtocol();
+    }
 }
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java
index 5e8e045..6198946 100644
--- a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java
@@ -24,10 +24,19 @@ import java.nio.file.Path;
 import org.apache.maven.api.LocalRepository;
 import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.services.RepositoryFactory;
+import org.apache.maven.model.Repository;
+import org.eclipse.aether.RepositorySystem;
 
 public class DefaultRepositoryFactory implements RepositoryFactory
 {
 
+    private final RepositorySystem repositorySystem;
+
+    public DefaultRepositoryFactory( RepositorySystem repositorySystem )
+    {
+        this.repositorySystem = repositorySystem;
+    }
+
     @Override
     public LocalRepository createLocal( Path path )
     {
@@ -41,4 +50,37 @@ public class DefaultRepositoryFactory implements RepositoryFactory
                 new org.eclipse.aether.repository.RemoteRepository.Builder( id, "", url )
                         .build() );
     }
+
+    @Override
+    public RemoteRepository createRemote( Repository repository )
+            throws IllegalArgumentException
+    {
+        return new DefaultRemoteRepository(
+                new org.eclipse.aether.repository.RemoteRepository.Builder(
+                        repository.getId(), repository.getLayout(), repository.getUrl() )
+                        .setReleasePolicy( buildRepositoryPolicy( repository.getReleases() ) )
+                        .setSnapshotPolicy( buildRepositoryPolicy( repository.getSnapshots() ) )
+                        .build() );
+    }
+
+    public static org.eclipse.aether.repository.RepositoryPolicy buildRepositoryPolicy(
+            org.apache.maven.model.RepositoryPolicy policy )
+    {
+        boolean enabled = true;
+        String updatePolicy = null;
+        String checksumPolicy = null;
+        if ( policy != null )
+        {
+            enabled = policy.isEnabled();
+            if ( policy.getUpdatePolicy() != null )
+            {
+                updatePolicy = policy.getUpdatePolicy();
+            }
+            if ( policy.getChecksumPolicy() != null )
+            {
+                checksumPolicy = policy.getChecksumPolicy();
+            }
+        }
+        return new org.eclipse.aether.repository.RepositoryPolicy( enabled, updatePolicy, checksumPolicy );
+    }
 }
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 585987b..5edf26c 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
@@ -31,9 +31,11 @@ import java.util.NoSuchElementException;
 import java.util.Objects;
 import java.util.Properties;
 import java.util.WeakHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import org.apache.maven.api.Listener;
 import org.apache.maven.api.SessionData;
 import org.apache.maven.api.services.LocalRepositoryManager;
 import org.apache.maven.api.services.RepositoryFactory;
@@ -77,6 +79,7 @@ public class DefaultSession implements Session
     private final org.apache.maven.project.ProjectBuilder projectBuilder;
     private final MavenRepositorySystem mavenRepositorySystem;
     private LocalRepositoryProvider localRepositoryProvider;
+    private final List<Listener> listeners = new CopyOnWriteArrayList<>();
 
     private final Map<org.eclipse.aether.graph.DependencyNode, Node> allNodes
             = Collections.synchronizedMap( new WeakHashMap<>() );
@@ -260,7 +263,7 @@ public class DefaultSession implements Session
         }
         else if ( clazz == RepositoryFactory.class )
         {
-            return (T) new DefaultRepositoryFactory();
+            return (T) new DefaultRepositoryFactory( repositorySystem );
         }
         throw new NoSuchElementException( clazz.getName() );
     }
@@ -457,4 +460,22 @@ public class DefaultSession implements Session
         throw new UnsupportedOperationException( "Not implemented yet" );
     }
 
+    @Override
+    public void registerListener( @Nonnull Listener listener )
+    {
+        listeners.add( listener );
+    }
+
+    @Override
+    public void unregisterListener( @Nonnull Listener listener )
+    {
+        listeners.remove( listener );
+    }
+
+    @Nonnull
+    @Override
+    public Collection<Listener> getListeners()
+    {
+        return Collections.unmodifiableCollection( listeners );
+    }
 }
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
index 2d4e1ef..7edcb35 100644
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
+++ b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
@@ -19,8 +19,7 @@ package org.apache.maven.plugin.descriptor;
  * under the License.
  */
 
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.api.Artifact;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.lifecycle.Lifecycle;
 import org.apache.maven.plugin.lifecycle.LifecycleConfiguration;
@@ -30,18 +29,19 @@ import org.codehaus.plexus.component.repository.ComponentSetDescriptor;
 import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author Jason van Zyl
@@ -259,7 +259,8 @@ public class PluginDescriptor
     {
         if ( artifactMap == null )
         {
-            artifactMap = ArtifactUtils.artifactMapByVersionlessId( getArtifacts() );
+            artifactMap = getArtifacts().stream()
+                    .collect( Collectors.toMap(  a -> a.getGroupId() + ":" + a.getArtifactId(), a -> a ) );
         }
 
         return artifactMap;
@@ -397,17 +398,17 @@ public class PluginDescriptor
     private InputStream getDescriptorStream( String descriptor )
         throws IOException
     {
-        File pluginFile = ( pluginArtifact != null ) ? pluginArtifact.getFile() : null;
+        Path pluginFile = ( pluginArtifact != null ) ? pluginArtifact.getPath().orElse( null ) : null;
         if ( pluginFile == null )
         {
             throw new IllegalStateException( "plugin main artifact has not been resolved for " + getId() );
         }
 
-        if ( pluginFile.isFile() )
+        if ( Files.isRegularFile( pluginFile ) )
         {
             try
             {
-                return new URL( "jar:" + pluginFile.toURI() + "!/" + descriptor ).openStream();
+                return new URL( "jar:" + pluginFile.toUri() + "!/" + descriptor ).openStream();
             }
             catch ( MalformedURLException e )
             {
@@ -416,7 +417,7 @@ public class PluginDescriptor
         }
         else
         {
-            return new FileInputStream( new File( pluginFile, descriptor ) );
+            return Files.newInputStream( pluginFile.resolve( descriptor ) );
         }
     }