Convert dependency checking to aether 56/105956/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 15 May 2023 16:44:12 +0000 (18:44 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 15 May 2023 17:44:00 +0000 (19:44 +0200)
maven-3.9.1 warns when we are using the RepositorySystem. Convert type
checks and remove the mocked test. This allows us to hide the
checkClasspath() method and use injected values. Also inline
getPluginTransitiveDependencies(), as it is now a single-caller thing.

JIRA: YANGTOOLS-1505
Change-Id: I9585774047b99fac557b6b92f5d51eaacfdd0af3
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
plugin/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesMojo.java
plugin/yang-maven-plugin/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesMojoTest.java [deleted file]

index 719413f7ceac631b2844b15c316943b2a092fca9..c1738ce6736a1b21a3bc663b0947b89d5ae9e468 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.yangtools.yang2sources.plugin;
 
 import static org.opendaylight.yangtools.yang2sources.plugin.YangToSourcesProcessor.LOG_PREFIX;
 
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
@@ -18,12 +17,9 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
-import org.apache.maven.model.Plugin;
+import java.util.stream.Collectors;
+import org.apache.maven.RepositoryUtils;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -33,7 +29,14 @@ import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.repository.RepositorySystem;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.resolution.ArtifactResult;
+import org.eclipse.aether.resolution.DependencyRequest;
+import org.eclipse.aether.resolution.DependencyResolutionException;
+import org.eclipse.aether.resolution.DependencyResult;
 import org.opendaylight.yangtools.plugin.generator.api.FileGenerator;
 import org.opendaylight.yangtools.plugin.generator.api.ModuleResourceResolver;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
@@ -96,8 +99,8 @@ public final class YangToSourcesMojo extends AbstractMojo {
     @Component
     private RepositorySystem repoSystem;
 
-    @Parameter(readonly = true, defaultValue = "${localRepository}")
-    private ArtifactRepository localRepository;
+    @Parameter(readonly = true, defaultValue = "${repositorySystemSession}")
+    private RepositorySystemSession repoSession;
 
     public YangToSourcesMojo() {
 
@@ -112,7 +115,8 @@ public final class YangToSourcesMojo extends AbstractMojo {
             return;
         }
 
-        checkClasspath(project, repoSystem, localRepository, project.getRemoteArtifactRepositories());
+        checkClasspath();
+
         // defaults to ${basedir}/src/main/yang
         File yangFilesRootFile = processYangFilesRootDir(yangFilesRootDir, project.getBasedir());
         Collection<File> excludedFiles = processExcludeFiles(excludeFiles, yangFilesRootFile);
@@ -122,25 +126,38 @@ public final class YangToSourcesMojo extends AbstractMojo {
     }
 
     /**
-     * Read current project dependencies and check if it don't grab incorrect
-     * artifacts versions which could be in conflict with plugin dependencies.
-     *
-     * @param project current project
-     * @param repoSystem repository system
-     * @param localRepo local repository
-     * @param remoteRepos remote repositories
+     * Read current project dependencies and check if it don't grab incorrect artifacts versions which could be in
+     * conflict with plugin dependencies.
      */
-    @VisibleForTesting
-    static void checkClasspath(final MavenProject project, final RepositorySystem repoSystem,
-            final ArtifactRepository localRepo, final List<ArtifactRepository> remoteRepos) {
+    private void checkClasspath() {
         final var plugin = project.getPlugin(YangToSourcesMojo.PLUGIN_NAME);
         if (plugin == null) {
             LOG.warn("{} {} not found, dependencies version check skipped", LOG_PREFIX, YangToSourcesMojo.PLUGIN_NAME);
             return;
         }
 
-        final var projectDependencies = project.getDependencyArtifacts();
-        for (var entry : getPluginTransitiveDependencies(plugin, repoSystem, localRepo, remoteRepos).entrySet()) {
+        final var remoteRepos = RepositoryUtils.toRepos(project.getRemoteArtifactRepositories());
+        final var pluginDeps = new HashMap<Artifact, Set<Artifact>>();
+        for (var mavenDep : plugin.getDependencies()) {
+            final var aetherDep = RepositoryUtils.toDependency(mavenDep, repoSession.getArtifactTypeRegistry());
+            final var collectRequest = new CollectRequest();
+            collectRequest.setRoot(aetherDep);
+            collectRequest.setRepositories(remoteRepos);
+
+            final var request = new DependencyRequest(collectRequest, null);
+            final DependencyResult result;
+            try {
+                result = repoSystem.resolveDependencies(repoSession, request);
+            } catch (DependencyResolutionException e) {
+                throw new IllegalStateException(e);
+            }
+
+            pluginDeps.put(aetherDep.getArtifact(),
+                result.getArtifactResults().stream().map(ArtifactResult::getArtifact).collect(Collectors.toSet()));
+        }
+
+        final var projectDependencies = RepositoryUtils.toArtifacts(project.getDependencyArtifacts());
+        for (var entry : pluginDeps.entrySet()) {
             checkArtifact(entry.getKey(), projectDependencies);
             for (var dependency : entry.getValue()) {
                 checkArtifact(dependency, projectDependencies);
@@ -148,33 +165,6 @@ public final class YangToSourcesMojo extends AbstractMojo {
         }
     }
 
-    /**
-     * Read transitive dependencies of given plugin and store them in map.
-     *
-     * @param plugin plugin to read
-     * @param repoSystem repository system
-     * @param localRepository local repository
-     * @param remoteRepos list of remote repositories
-     * @return a Map of transitive dependencies
-     */
-    private static Map<Artifact, Set<Artifact>> getPluginTransitiveDependencies(final Plugin plugin,
-            final RepositorySystem repoSystem, final ArtifactRepository localRepository,
-            final List<ArtifactRepository> remoteRepos) {
-        final var ret = new HashMap<Artifact, Set<Artifact>>();
-        for (var dep : plugin.getDependencies()) {
-            final var artifact = repoSystem.createDependencyArtifact(dep);
-
-            final var request = new ArtifactResolutionRequest();
-            request.setArtifact(artifact);
-            request.setResolveTransitively(true);
-            request.setLocalRepository(localRepository);
-            request.setRemoteRepositories(remoteRepos);
-
-            ret.put(artifact, repoSystem.resolve(request).getArtifacts());
-        }
-        return ret;
-    }
-
     /**
      * Check artifact against collection of dependencies. If collection contains artifact with same groupId and
      * artifactId, but different version, logs a warning.
@@ -182,7 +172,7 @@ public final class YangToSourcesMojo extends AbstractMojo {
      * @param artifact artifact to check
      * @param dependencies collection of dependencies
      */
-    private static void checkArtifact(final Artifact artifact, final Set<Artifact> dependencies) {
+    private static void checkArtifact(final Artifact artifact, final Collection<Artifact> dependencies) {
         for (var dep : dependencies) {
             if (artifact.getGroupId().equals(dep.getGroupId()) && artifact.getArtifactId().equals(dep.getArtifactId())
                 && !artifact.getVersion().equals(dep.getVersion())) {
diff --git a/plugin/yang-maven-plugin/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesMojoTest.java b/plugin/yang-maven-plugin/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesMojoTest.java
deleted file mode 100644 (file)
index ce1d1fc..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang2sources.plugin;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-
-import java.util.List;
-import java.util.Set;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
-import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.Plugin;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.repository.RepositorySystem;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-@ExtendWith(MockitoExtension.class)
-class YangToSourcesMojoTest {
-    @Mock
-    private MavenProject project;
-    @Mock
-    private Plugin plugin;
-    @Mock
-    private RepositorySystem repoSystem;
-    @Mock
-    private ArtifactRepository localRepo;
-    @Mock
-    private ArtifactResolutionResult artifactResolResult;
-    @Mock
-    private Artifact artifact;
-    @Mock
-    private Dependency dep;
-
-    @Test
-    void checkClasspathTest() {
-        final var artifacts = Set.of(artifact);
-
-        doReturn(plugin).when(project).getPlugin(anyString());
-        doReturn(List.of(dep)).when(plugin).getDependencies();
-        doReturn("artifactId").when(artifact).getArtifactId();
-        doReturn("groupId").when(artifact).getGroupId();
-        doReturn("SNAPSHOT").when(artifact).getVersion();
-        doReturn(artifact).when(repoSystem).createDependencyArtifact(dep);
-        doReturn(artifactResolResult).when(repoSystem).resolve(any(ArtifactResolutionRequest.class));
-        doReturn(artifacts).when(artifactResolResult).getArtifacts();
-        doReturn(artifacts).when(project).getDependencyArtifacts();
-
-        YangToSourcesMojo.checkClasspath(project, repoSystem, localRepo, List.of(localRepo));
-    }
-}