You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by da...@apache.org on 2020/11/23 13:35:31 UTC

[sling-feature-converter-maven-plugin] 21/37: SLING-9794 Content package artifacts found by maven plugin don't always have their 'file' attribute set

This is an automated email from the ASF dual-hosted git repository.

davidb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-feature-converter-maven-plugin.git

commit 8e70884a60216b284cb87351fbd48e82c1a5acf6
Author: David Bosschaert <bo...@adobe.com>
AuthorDate: Tue Oct 6 15:28:20 2020 +0100

    SLING-9794 Content package artifacts found by maven plugin don't always have their 'file' attribute set
    
    This fixes the NPE that can happen in this case
---
 .../cpconverter/maven/mojos/ContentPackage.java    | 67 +++++++++++++++++++---
 .../cpconverter/maven/mojos/ConvertCPMojo.java     | 14 ++++-
 2 files changed, 71 insertions(+), 10 deletions(-)

diff --git a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java
index 295f270..0956a5f 100644
--- a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java
+++ b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java
@@ -17,17 +17,25 @@
 package org.apache.sling.cpconverter.maven.mojos;
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
 import org.apache.maven.project.MavenProject;
+import org.eclipse.aether.RepositoryException;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.resolution.ArtifactRequest;
+import org.eclipse.aether.resolution.ArtifactResult;
 
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 public class ContentPackage {
 
     /**
@@ -48,7 +56,7 @@ public class ContentPackage {
     private boolean excludeTransitive;
 
     private boolean moduleIsContentPackage;
-    
+
     public void setGroupId(String groupId) {
         this.groupId = groupId == null ? "" : groupId;
     }
@@ -78,7 +86,8 @@ public class ContentPackage {
         return moduleIsContentPackage;
     }
 
-    public Collection<Artifact> getMatchingArtifacts(final MavenProject project) {
+    Collection<Artifact> getMatchingArtifacts(final MavenProject project,
+            RepositorySystem repoSystem, RepositorySystemSession repoSession) {
         // get artifacts depending on whether we exclude transitives or not
         final Set<Artifact> artifacts;
         // TODO: when I ran the tests the artifacts where only available in the Dependency Artifacts and
@@ -90,13 +99,57 @@ public class ContentPackage {
             // all dependencies, transitives included
             artifacts = project.getArtifacts();
         }
+
+        // Sometimes artifacts don't have their 'file' attribute set, which we need. For those that don't, resolve them
+        final Set<Artifact> fileArtifacts = new HashSet<>();
+        for (Artifact a : artifacts) {
+            if (a.getFile() != null) {
+                fileArtifacts.add(a);
+            } else {
+                if (repoSystem != null && repoSession != null) {
+                    // Resolving the artifact via Aether will fill in the file attribute
+                    Artifact fileArt = resolveArtifact(repoSystem, repoSession, a);
+                    if (fileArt != null) {
+                        fileArtifacts.add(fileArt);
+                    }
+                }
+            }
+        }
+
         // Add the project artifact itself to convert after building a content package
         if(moduleIsContentPackage) {
             Artifact projectArtifact = project.getArtifact();
             System.out.println("Project Artifact: " + projectArtifact);
-            artifacts.add(projectArtifact);
+            fileArtifacts.add(projectArtifact);
+        }
+        return getMatchingArtifacts(fileArtifacts);
+    }
+
+    private Artifact resolveArtifact(final RepositorySystem repoSystem, final RepositorySystemSession repoSession,
+            final Artifact artifact) {
+        try {
+            // Get an Aether Artifact
+            org.eclipse.aether.artifact.Artifact a = new org.eclipse.aether.artifact.DefaultArtifact(
+                    artifact.getGroupId(), artifact.getArtifactId(),
+                    artifact.getClassifier(), artifact.getType(),
+                    artifact.getVersion());
+
+            ArtifactRequest req = new ArtifactRequest(a, null, null);
+            ArtifactResult res = repoSystem.resolveArtifact(repoSession, req);
+
+            if (res.isResolved()) {
+                org.eclipse.aether.artifact.Artifact aetherArt = res.getArtifact();
+                Artifact mavenArt = new DefaultArtifact(
+                        aetherArt.getGroupId(), aetherArt.getArtifactId(), aetherArt.getVersion(), null, aetherArt.getExtension(),
+                        aetherArt.getClassifier(), new DefaultArtifactHandler());
+                mavenArt.setFile(aetherArt.getFile());
+                return mavenArt;
+            } else {
+                return null;
+            }
+        } catch (RepositoryException e) {
+            throw new RuntimeException(e);
         }
-        return getMatchingArtifacts(artifacts);
     }
 
     public Collection<Artifact> getMatchingArtifacts(final Collection<Artifact> artifacts) {
diff --git a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java
index a7921c5..2c0fddd 100644
--- a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java
+++ b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java
@@ -17,11 +17,11 @@
 package org.apache.sling.cpconverter.maven.mojos;
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.artifact.handler.DefaultArtifactHandler;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.ProjectBuildingRequest;
@@ -32,6 +32,8 @@ import org.apache.sling.feature.cpconverter.artifacts.DefaultArtifactsDeployer;
 import org.apache.sling.feature.cpconverter.features.DefaultFeaturesManager;
 import org.apache.sling.feature.cpconverter.handlers.DefaultEntryHandlersManager;
 import org.apache.sling.feature.cpconverter.vltpkg.DefaultPackagesEventsEmitter;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
 
 import java.io.File;
 import java.io.IOException;
@@ -57,7 +59,7 @@ import static org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelCo
     requiresProject = true,
     threadSafe = true
 )
-public final class ConvertCPMojo
+public class ConvertCPMojo
     extends AbstractBaseMojo
 {
     public static final String CFG_STRICT_VALIDATION = "strictValidation";
@@ -163,6 +165,12 @@ public final class ConvertCPMojo
     @Parameter(property = CFG_IS_CONTENT_PACKAGE, defaultValue = DEFAULT_IS_CONTENT_PACKAGE + "")
     private boolean isContentPackage;
 
+    @Parameter(defaultValue="${repositorySystemSession}")
+    private RepositorySystemSession repoSession;
+
+    @Component
+    private RepositorySystem repoSystem;
+
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
         // Un-encode a given Artifact Override Id
@@ -227,7 +235,7 @@ public final class ConvertCPMojo
                     getLog().info("Content Package Artifact File: " + contentPackage.toString() + ", is module CP: " + isContentPackage);
                     contentPackage.setExcludeTransitive(true);
                     contentPackage.setModuleIsContentPackage(isContentPackage);
-                    final Collection<Artifact> artifacts = contentPackage.getMatchingArtifacts(project);
+                    final Collection<Artifact> artifacts = contentPackage.getMatchingArtifacts(project, repoSystem, repoSession);
                     if (artifacts.isEmpty()) {
                         getLog().warn("No matching artifacts for " + contentPackage);
                         continue;