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

cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/master by this push:
     new da7c2110e4 [MNG-8180] Handle NPE due non-existent tags (#1639)
da7c2110e4 is described below

commit da7c2110e495ae32a8e7b431a410ccc188bf9609
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Sun Aug 11 18:56:11 2024 +0200

    [MNG-8180] Handle NPE due non-existent tags (#1639)
    
    There was an NPE possibility when plugin.xml had no expected tags present.
    
    Also: maven-compat has plugin.xml (!) w/o "name" tag, it NPEd and failed 
build. This was NOT picked up by CI as "rebuild itself" step does not install 
(just verify).
    
    ---
    
    https://issues.apache.org/jira/browse/MNG-8180
---
 .../internal/impl/resolver/PluginsMetadata.java    |  6 ++++++
 .../impl/resolver/PluginsMetadataGenerator.java    | 22 ++++++++++++++++------
 .../maven/repository/internal/PluginsMetadata.java |  6 ++++++
 .../internal/PluginsMetadataGenerator.java         | 22 ++++++++++++++++------
 4 files changed, 44 insertions(+), 12 deletions(-)

diff --git 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/PluginsMetadata.java
 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/PluginsMetadata.java
index 8c9665ba08..260c0c4db2 100644
--- 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/PluginsMetadata.java
+++ 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/PluginsMetadata.java
@@ -24,6 +24,8 @@ import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.List;
 
+import org.apache.maven.api.annotations.Nonnull;
+import org.apache.maven.api.annotations.Nullable;
 import org.apache.maven.api.metadata.Metadata;
 import org.apache.maven.api.metadata.Plugin;
 
@@ -32,12 +34,16 @@ import org.apache.maven.api.metadata.Plugin;
  */
 final class PluginsMetadata extends MavenMetadata {
     static final class PluginInfo {
+        @Nonnull
         final String groupId;
 
+        @Nonnull
         private final String artifactId;
 
+        @Nullable
         private final String goalPrefix;
 
+        @Nullable
         private final String name;
 
         PluginInfo(String groupId, String artifactId, String goalPrefix, 
String name) {
diff --git 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/PluginsMetadataGenerator.java
 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/PluginsMetadataGenerator.java
index 42404cf8f3..cc4ebf42e8 100644
--- 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/PluginsMetadataGenerator.java
+++ 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/PluginsMetadataGenerator.java
@@ -129,13 +129,14 @@ class PluginsMetadataGenerator implements 
MetadataGenerator {
                             // - maven-plugin-api (for model)
                             // - Plexus Container (for model supporting 
classes and exceptions)
                             XmlNode root = XmlNodeStaxBuilder.build(is, null);
-                            String groupId = 
root.getChild("groupId").getValue();
-                            String artifactId = 
root.getChild("artifactId").getValue();
-                            String goalPrefix = 
root.getChild("goalPrefix").getValue();
-                            String name = root.getChild("name").getValue();
+                            String groupId = mayGetChild(root, "groupId");
+                            String artifactId = mayGetChild(root, 
"artifactId");
+                            String goalPrefix = mayGetChild(root, 
"goalPrefix");
+                            String name = mayGetChild(root, "name");
                             // sanity check: plugin descriptor extracted from 
artifact must have same GA
                             if (Objects.equals(artifact.getGroupId(), groupId)
                                     && 
Objects.equals(artifact.getArtifactId(), artifactId)) {
+                                // here groupId and artifactId cannot be null
                                 return new PluginInfo(groupId, artifactId, 
goalPrefix, name);
                             } else {
                                 throw new 
InvalidArtifactPluginMetadataException(
@@ -148,9 +149,10 @@ class PluginsMetadataGenerator implements 
MetadataGenerator {
                             }
                         }
                     }
-                } catch (RuntimeException e) {
-                    throw e;
                 } catch (Exception e) {
+                    if (e instanceof InvalidArtifactPluginMetadataException 
iapme) {
+                        throw iapme;
+                    }
                     // here we can have: IO. ZIP or Plexus Conf Ex: but we 
should not interfere with user intent
                 }
             }
@@ -158,6 +160,14 @@ class PluginsMetadataGenerator implements 
MetadataGenerator {
         return null;
     }
 
+    private static String mayGetChild(XmlNode node, String child) {
+        XmlNode c = node.getChild(child);
+        if (c != null) {
+            return c.getValue();
+        }
+        return null;
+    }
+
     public static final class InvalidArtifactPluginMetadataException extends 
IllegalArgumentException {
         InvalidArtifactPluginMetadataException(String s) {
             super(s);
diff --git 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadata.java
 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadata.java
index 8326f7ae58..b55ca08600 100644
--- 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadata.java
+++ 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadata.java
@@ -25,6 +25,8 @@ import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.List;
 
+import org.apache.maven.api.annotations.Nonnull;
+import org.apache.maven.api.annotations.Nullable;
 import org.apache.maven.artifact.repository.metadata.Metadata;
 import org.apache.maven.artifact.repository.metadata.Plugin;
 
@@ -33,12 +35,16 @@ import org.apache.maven.artifact.repository.metadata.Plugin;
  */
 final class PluginsMetadata extends MavenMetadata {
     static final class PluginInfo {
+        @Nonnull
         final String groupId;
 
+        @Nonnull
         private final String artifactId;
 
+        @Nullable
         private final String goalPrefix;
 
+        @Nullable
         private final String name;
 
         PluginInfo(String groupId, String artifactId, String goalPrefix, 
String name) {
diff --git 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadataGenerator.java
 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadataGenerator.java
index af3d6541c5..940458add7 100644
--- 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadataGenerator.java
+++ 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadataGenerator.java
@@ -130,13 +130,14 @@ class PluginsMetadataGenerator implements 
MetadataGenerator {
                             // - maven-plugin-api (for model)
                             // - Plexus Container (for model supporting 
classes and exceptions)
                             XmlNode root = XmlNodeBuilder.build(is, null);
-                            String groupId = 
root.getChild("groupId").getValue();
-                            String artifactId = 
root.getChild("artifactId").getValue();
-                            String goalPrefix = 
root.getChild("goalPrefix").getValue();
-                            String name = root.getChild("name").getValue();
+                            String groupId = mayGetChild(root, "groupId");
+                            String artifactId = mayGetChild(root, 
"artifactId");
+                            String goalPrefix = mayGetChild(root, 
"goalPrefix");
+                            String name = mayGetChild(root, "name");
                             // sanity check: plugin descriptor extracted from 
artifact must have same GA
                             if (Objects.equals(artifact.getGroupId(), groupId)
                                     && 
Objects.equals(artifact.getArtifactId(), artifactId)) {
+                                // here groupId and artifactId cannot be null
                                 return new PluginInfo(groupId, artifactId, 
goalPrefix, name);
                             } else {
                                 throw new 
InvalidArtifactPluginMetadataException(
@@ -149,9 +150,10 @@ class PluginsMetadataGenerator implements 
MetadataGenerator {
                             }
                         }
                     }
-                } catch (RuntimeException e) {
-                    throw e;
                 } catch (Exception e) {
+                    if (e instanceof InvalidArtifactPluginMetadataException 
iapme) {
+                        throw iapme;
+                    }
                     // here we can have: IO. ZIP or Plexus Conf Ex: but we 
should not interfere with user intent
                 }
             }
@@ -159,6 +161,14 @@ class PluginsMetadataGenerator implements 
MetadataGenerator {
         return null;
     }
 
+    private static String mayGetChild(XmlNode node, String child) {
+        XmlNode c = node.getChild(child);
+        if (c != null) {
+            return c.getValue();
+        }
+        return null;
+    }
+
     public static final class InvalidArtifactPluginMetadataException extends 
IllegalArgumentException {
         InvalidArtifactPluginMetadataException(String s) {
             super(s);

Reply via email to