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 ) );
}
}