From dfbe22679fe5dec08b5d71f048302f3083bc2b3b Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Fri, 15 Nov 2024 17:20:31 +1000 Subject: [PATCH] [MJAVADOC-822] skippedModules should be more scalable and support regex Signed-off-by: Olivier Lamy --- .../b/e1/pom.xml | 33 +++++++++++++++++++ .../b/e1/src/main/java/a/b/e/E1.java | 25 ++++++++++++++ .../b/pom.xml | 1 + .../pom.xml | 2 +- .../verify.groovy | 1 + .../plugins/javadoc/AbstractJavadocMojo.java | 26 ++++++++++++--- 6 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/e1/pom.xml create mode 100644 src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/e1/src/main/java/a/b/e/E1.java diff --git a/src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/e1/pom.xml b/src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/e1/pom.xml new file mode 100644 index 000000000..6c2f1a76a --- /dev/null +++ b/src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/e1/pom.xml @@ -0,0 +1,33 @@ + + + + + 4.0.0 + + + org.apache.maven.plugins.javadoc.it + mjavadoc636b + 1.0-SNAPSHOT + + mjavadoc636e1 + + diff --git a/src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/e1/src/main/java/a/b/e/E1.java b/src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/e1/src/main/java/a/b/e/E1.java new file mode 100644 index 000000000..5fbb7d5ea --- /dev/null +++ b/src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/e1/src/main/java/a/b/e/E1.java @@ -0,0 +1,25 @@ +package a.b.e; + +/* + * 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. + */ + +public interface E1 +{ + +} \ No newline at end of file diff --git a/src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/pom.xml b/src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/pom.xml index f463f5ab0..c84ce6591 100644 --- a/src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/pom.xml +++ b/src/it/projects/MJAVADOC-636-aggregate_module_skipped/b/pom.xml @@ -34,6 +34,7 @@ c e + e1 diff --git a/src/it/projects/MJAVADOC-636-aggregate_module_skipped/pom.xml b/src/it/projects/MJAVADOC-636-aggregate_module_skipped/pom.xml index d8a280ba9..69731b7a1 100644 --- a/src/it/projects/MJAVADOC-636-aggregate_module_skipped/pom.xml +++ b/src/it/projects/MJAVADOC-636-aggregate_module_skipped/pom.xml @@ -54,7 +54,7 @@ maven-javadoc-plugin @project.version@ - mjavadoc636e,mjavadoc636d1 + mjavadoc636e.*,mjavadoc636d1 diff --git a/src/it/projects/MJAVADOC-636-aggregate_module_skipped/verify.groovy b/src/it/projects/MJAVADOC-636-aggregate_module_skipped/verify.groovy index d7aaec711..702c13c7b 100644 --- a/src/it/projects/MJAVADOC-636-aggregate_module_skipped/verify.groovy +++ b/src/it/projects/MJAVADOC-636-aggregate_module_skipped/verify.groovy @@ -32,6 +32,7 @@ for (JarEntry file in jar.entries()){ } assert !files.contains("a/b/e/E.html") +assert !files.contains("a/b/e/E1.html") assert !files.contains("a/b/c/d/D1.html") assert files.contains("a/b/c/d/D2.html") assert files.contains("a/f/F.html") diff --git a/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java b/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java index 5c545aa32..9e63b7e81 100644 --- a/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java +++ b/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java @@ -52,6 +52,7 @@ import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; +import java.util.regex.Pattern; import java.util.stream.Collectors; import org.apache.commons.lang3.BooleanUtils; @@ -1210,7 +1211,7 @@ public abstract class AbstractJavadocMojo extends AbstractMojo { *
* Note: if {@link #detectOfflineLinks} is defined, the offline links between the project modules are * automatically added if the goal is calling in a non-aggregator way. - * @see OfflineLink. + * @see OfflineLink * @see Doclet option linkoffline */ @Parameter(property = "offlineLinks") @@ -1642,7 +1643,7 @@ public abstract class AbstractJavadocMojo extends AbstractMojo { /** *

- * Comma separated list of modules (artifactId) to not add in aggregated javadoc + * Comma separated list of modules (can be regular expression) in the format ([group:]artifactId) to not add in aggregated javadoc *

* * @since 3.2.0 @@ -1650,6 +1651,11 @@ public abstract class AbstractJavadocMojo extends AbstractMojo { @Parameter(property = "maven.javadoc.skippedModules") private String skippedModules; + /** + * List built once from the parameter {@link #skippedModules} + */ + private List patternsToSkip; + /** * Timestamp for reproducible output archive entries, either formatted as ISO 8601 * yyyy-MM-dd'T'HH:mm:ssXXX or as an int representing seconds since the epoch (like @@ -6043,8 +6049,20 @@ protected boolean isSkippedModule(MavenProject mavenProject) { if (this.skippedModules == null || this.skippedModules.isEmpty()) { return false; } - List modulesToSkip = Arrays.asList(StringUtils.split(this.skippedModules, ',')); - return modulesToSkip.contains(mavenProject.getArtifactId()); + if (this.patternsToSkip == null) { + this.patternsToSkip = Arrays.stream(StringUtils.split(this.skippedModules, ',')) + .map(String::trim) + // we are expecting something such [groupdId:]artifactId so if no groupId we want to match any + // groupId + .map(s -> !s.contains(":") ? ".*:" + s : s) + .map(Pattern::compile) + .collect(Collectors.toList()); + } + Optional found = this.patternsToSkip.stream() + .filter(pattern -> pattern.matcher(mavenProject.getGroupId() + ":" + mavenProject.getArtifactId()) + .matches()) + .findAny(); + return found.isPresent() || isSkippedJavadoc(mavenProject); } /**