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 <[email protected]> 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 ) ); } }
