diff --git a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/RequirePluginVersions.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/RequirePluginVersions.java index ad7baf57..1c9db6e5 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/RequirePluginVersions.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/RequirePluginVersions.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -39,6 +40,7 @@ import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; +import org.apache.maven.enforcer.rule.api.EnforcerRuleError; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rules.utils.EnforcerRuleUtils; import org.apache.maven.enforcer.rules.utils.ExpressionEvaluator; @@ -50,11 +52,14 @@ import org.apache.maven.lifecycle.mapping.LifecycleMapping; import org.apache.maven.model.BuildBase; import org.apache.maven.model.Model; +import org.apache.maven.model.ModelBase; import org.apache.maven.model.Plugin; +import org.apache.maven.model.PluginConfiguration; +import org.apache.maven.model.PluginContainer; import org.apache.maven.model.Profile; import org.apache.maven.model.ReportPlugin; +import org.apache.maven.model.Reporting; import org.apache.maven.plugin.InvalidPluginException; -import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.PluginManager; import org.apache.maven.plugin.PluginManagerException; import org.apache.maven.plugin.PluginNotFoundException; @@ -72,6 +77,8 @@ import org.eclipse.aether.resolution.ArtifactRequest; import org.eclipse.aether.resolution.ArtifactResolutionException; +import static java.util.Optional.ofNullable; + /** * This rule will enforce that all plugins specified in the poms have a version declared. * @@ -127,6 +134,7 @@ public final class RequirePluginVersions extends AbstractStandardEnforcerRule { /** * Same as unCheckedPlugins but as a comma list to better support properties. Sample form: * group:artifactId,group2:artifactId2 + * * @since 1.0-beta-1 */ private String unCheckedPluginList; @@ -145,9 +153,6 @@ public final class RequirePluginVersions extends AbstractStandardEnforcerRule { private final RepositorySystem repositorySystem; - /** The local. */ - private ArtifactRepository local; - /** The session. */ private final MavenSession session; @@ -195,7 +200,6 @@ public void execute() throws EnforcerRuleException { // get the various expressions out of the helper. lifecycles = defaultLifeCycles.getLifeCycles(); - local = session.getLocalRepository(); // get all the plugins that are bound to the specified lifecycles Set allPlugins = getBoundPlugins(project, phases); @@ -236,18 +240,20 @@ public void execute() throws EnforcerRuleException { if (!failures.isEmpty()) { handleMessagesToTheUser(project, failures); } - } catch (Exception e) { + } catch (PluginNotFoundException | LifecycleExecutionException e) { throw new EnforcerRuleException(e.getLocalizedMessage(), e); } } private void handleMessagesToTheUser(MavenProject project, List failures) throws EnforcerRuleException { StringBuilder newMsg = new StringBuilder(); - newMsg.append("Some plugins are missing valid versions or depend on Maven " - + runtimeInformation.getMavenVersion() + " defaults:"); + newMsg.append("Some plugins are missing valid versions or depend on Maven "); + newMsg.append(runtimeInformation.getMavenVersion()); + newMsg.append(" defaults"); handleBanMessages(newMsg); - newMsg.append("\n"); + newMsg.append(System.lineSeparator()); for (Plugin plugin : failures) { + newMsg.append(" "); newMsg.append(plugin.getGroupId()); newMsg.append(":"); newMsg.append(plugin.getArtifactId()); @@ -280,7 +286,7 @@ private void handleMessagesToTheUser(MavenProject project, List failures getLog().debug("Exception while determining plugin Version " + e.getMessage()); newMsg.append(". Unable to determine the plugin version."); } - newMsg.append("\n"); + newMsg.append(System.lineSeparator()); } String message = getMessage(); if (StringUtils.isNotEmpty(message)) { @@ -292,17 +298,24 @@ private void handleMessagesToTheUser(MavenProject project, List failures private void handleBanMessages(StringBuilder newMsg) { if (banLatest || banRelease || banSnapshots || banTimestamps) { - newMsg.append(" ("); + List banList = new ArrayList<>(); if (banLatest) { - newMsg.append("LATEST "); + banList.add("LATEST"); } if (banRelease) { - newMsg.append("RELEASE "); + banList.add("RELEASE"); + } + if (banSnapshots) { + banList.add("SNAPSHOT"); + if (banTimestamps) { + banList.add("TIMESTAMP SNAPSHOT"); + } } - if (banSnapshots || banTimestamps) { - newMsg.append("SNAPSHOT "); + if (!banList.isEmpty()) { + newMsg.append(" ("); + newMsg.append(String.join(", ", banList)); + newMsg.append(" as plugin version are not allowed)"); } - newMsg.append("are not allowed)"); } } @@ -312,10 +325,9 @@ private void handleBanMessages(StringBuilder newMsg) { * @param uncheckedPlugins * @param plugins * @return The plugins which have been removed. - * @throws MojoExecutionException */ Set removeUncheckedPlugins(Collection uncheckedPlugins, Set plugins) - throws MojoExecutionException { + throws EnforcerRuleError { if (uncheckedPlugins != null && !uncheckedPlugins.isEmpty()) { for (String pluginKey : uncheckedPlugins) { Plugin plugin = parsePluginString(pluginKey, "UncheckedPlugins"); @@ -328,7 +340,7 @@ Set removeUncheckedPlugins(Collection uncheckedPlugins, Set combineUncheckedPlugins( * @param existing the existing * @param additional the additional * @return the sets the - * @throws MojoExecutionException the mojo execution exception + * @throws EnforcerRuleError the enforcer error */ - public Set addAdditionalPlugins(Set existing, List additional) - throws MojoExecutionException { + public Set addAdditionalPlugins(Set existing, List additional) throws EnforcerRuleError { if (additional != null) { for (String pluginString : additional) { Plugin plugin = parsePluginString(pluginString, "AdditionalPlugins"); @@ -377,11 +388,10 @@ public Set addAdditionalPlugins(Set existing, List addit * Helper method to parse and inject a Plugin. * * @param pluginString a plugin description to parse - * @param field a source of pluginString + * @param field a source of pluginString * @return the prepared plugin - * @throws MojoExecutionException in case of problems */ - private Plugin parsePluginString(String pluginString, String field) throws MojoExecutionException { + private Plugin parsePluginString(String pluginString, String field) throws EnforcerRuleError { if (pluginString != null) { String[] pluginStrings = pluginString.split(":"); if (pluginStrings.length == 2) { @@ -391,10 +401,10 @@ private Plugin parsePluginString(String pluginString, String field) throws MojoE return plugin; } else { - throw new MojoExecutionException("Invalid " + field + " string: " + pluginString); + throw new EnforcerRuleError("Invalid " + field + " string: " + pluginString); } } else { - throw new MojoExecutionException("Invalid " + field + " string: " + pluginString); + throw new EnforcerRuleError("Invalid " + field + " string: " + pluginString); } } @@ -813,42 +823,62 @@ private List getAllPluginEntries(MavenProject project) { } private void addPluginsInProfiles(List plugins, Model model) { - List profiles = model.getProfiles(); + List profiles = ofNullable(model).map(Model::getProfiles).orElseGet(Collections::emptyList); for (Profile profile : profiles) { - getProfilePlugins(plugins, model, profile); - getProfileReportingPlugins(plugins, model, profile); - getProfilePluginManagementPlugins(plugins, model, profile); + getProfilePlugins(plugins, profile); + getProfileReportingPlugins(plugins, profile); + getProfilePluginManagementPlugins(plugins, profile); } } - private void getProfilePluginManagementPlugins(List plugins, Model model, Profile profile) { - List modelPlugins = profile.getBuild().getPluginManagement().getPlugins(); + private void getProfilePluginManagementPlugins(List plugins, Profile profile) { + List modelPlugins = ofNullable(profile) + .map(Profile::getBuild) + .map(PluginConfiguration::getPluginManagement) + .map(PluginContainer::getPlugins) + .orElseGet(Collections::emptyList); plugins.addAll(PluginWrapper.addAll(utils.resolvePlugins(modelPlugins), banMavenDefaults)); } - private void getProfileReportingPlugins(List plugins, Model model, Profile profile) { - List modelReportPlugins = profile.getReporting().getPlugins(); + private void getProfileReportingPlugins(List plugins, Profile profile) { + List modelReportPlugins = ofNullable(profile) + .map(ModelBase::getReporting) + .map(Reporting::getPlugins) + .orElseGet(Collections::emptyList); // add the reporting plugins plugins.addAll(PluginWrapper.addAll(utils.resolveReportPlugins(modelReportPlugins), banMavenDefaults)); } - private void getProfilePlugins(List plugins, Model model, Profile profile) { - List modelPlugins = profile.getBuild().getPlugins(); + private void getProfilePlugins(List plugins, Profile profile) { + List modelPlugins = ofNullable(profile) + .map(Profile::getBuild) + .map(PluginContainer::getPlugins) + .orElseGet(Collections::emptyList); plugins.addAll(PluginWrapper.addAll(utils.resolvePlugins(modelPlugins), banMavenDefaults)); } private void getPlugins(List plugins, Model model) { - List modelPlugins = model.getBuild().getPlugins(); + List modelPlugins = ofNullable(model) + .map(Model::getBuild) + .map(PluginContainer::getPlugins) + .orElseGet(Collections::emptyList); plugins.addAll(PluginWrapper.addAll(utils.resolvePlugins(modelPlugins), banMavenDefaults)); } private void getPluginManagementPlugins(List plugins, Model model) { - List modelPlugins = model.getBuild().getPluginManagement().getPlugins(); + List modelPlugins = ofNullable(model) + .map(Model::getBuild) + .map(PluginConfiguration::getPluginManagement) + .map(PluginContainer::getPlugins) + .orElseGet(Collections::emptyList); plugins.addAll(PluginWrapper.addAll(utils.resolvePlugins(modelPlugins), banMavenDefaults)); } private void getReportingPlugins(List plugins, Model model) { - List modelReportPlugins = model.getReporting().getPlugins(); + List modelReportPlugins = ofNullable(model) + .map(ModelBase::getReporting) + .map(Reporting::getPlugins) + .orElseGet(Collections::emptyList); // add the reporting plugins plugins.addAll(PluginWrapper.addAll(utils.resolveReportPlugins(modelReportPlugins), banMavenDefaults)); } diff --git a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestRequirePluginVersions.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestRequirePluginVersions.java index 49f63206..155c65b8 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestRequirePluginVersions.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestRequirePluginVersions.java @@ -26,6 +26,7 @@ import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.enforcer.rule.api.EnforcerLogger; +import org.apache.maven.enforcer.rule.api.EnforcerRuleError; import org.apache.maven.enforcer.rules.utils.EnforcerRuleUtils; import org.apache.maven.enforcer.rules.utils.ExpressionEvaluator; import org.apache.maven.enforcer.rules.utils.PluginWrapper; @@ -249,7 +250,7 @@ void testHasVersionSpecifiedWithProperties() throws Exception { * @throws MojoExecutionException the mojo execution exception */ @Test - void testGetAdditionalPluginsNull() throws MojoExecutionException { + void testGetAdditionalPluginsNull() throws Exception { rule.addAdditionalPlugins(null, null); } @@ -268,7 +269,7 @@ void testGetAdditionalPluginsInvalidFormat() { try { rule.addAdditionalPlugins(plugins, additional); fail("Expected Exception because the format is invalid"); - } catch (MojoExecutionException e) { + } catch (EnforcerRuleError e) { } // invalid format (too many sections) @@ -277,7 +278,7 @@ void testGetAdditionalPluginsInvalidFormat() { try { rule.addAdditionalPlugins(plugins, additional); fail("Expected Exception because the format is invalid"); - } catch (MojoExecutionException e) { + } catch (EnforcerRuleError e) { } } @@ -287,7 +288,7 @@ void testGetAdditionalPluginsInvalidFormat() { * @throws MojoExecutionException the mojo execution exception */ @Test - void testGetAdditionalPluginsEmptySet() throws MojoExecutionException { + void testGetAdditionalPluginsEmptySet() throws Exception { Set plugins = new HashSet<>(); plugins.add(EnforcerTestUtils.newPlugin("group", "a-artifact", "1.0")); @@ -312,7 +313,7 @@ void testGetAdditionalPluginsEmptySet() throws MojoExecutionException { * @throws MojoExecutionException the mojo execution exception */ @Test - void testGetAdditionalPlugins() throws MojoExecutionException { + void testGetAdditionalPlugins() throws Exception { Set plugins = new HashSet<>(); plugins.add(EnforcerTestUtils.newPlugin("group", "a-artifact", "1.0")); @@ -338,7 +339,7 @@ void testGetAdditionalPlugins() throws MojoExecutionException { * @throws MojoExecutionException the mojo execution exception */ @Test - void testGetUncheckedPlugins() throws MojoExecutionException { + void testGetUncheckedPlugins() throws Exception { Set plugins = new HashSet<>(); plugins.add(EnforcerTestUtils.newPlugin("group", "a-artifact", "1.0")); diff --git a/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginVersionProfile/pom.xml b/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginVersionProfile/pom.xml index 48a688a4..7b310fac 100644 --- a/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginVersionProfile/pom.xml +++ b/enforcer-rules/src/test/resources/requirePluginVersions/checkPluginVersionProfile/pom.xml @@ -64,12 +64,12 @@ site + validate - validate - + \ No newline at end of file diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-ci/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-ci/verify.groovy index f2d52886..d7501f81 100644 --- a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-ci/verify.groovy +++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-ci/verify.groovy @@ -18,4 +18,4 @@ */ File buildLog = new File( basedir, 'build.log' ) assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.enforcer.rules.RequirePluginVersions failed with message:' ) -assert buildLog.text.contains( "Some plugins are missing valid versions or depend on Maven ${mavenVersion} defaults: (LATEST RELEASE SNAPSHOT are not allowed)" ) +assert buildLog.text.contains( "Some plugins are missing valid versions or depend on Maven ${mavenVersion} defaults (LATEST, RELEASE, SNAPSHOT, TIMESTAMP SNAPSHOT as plugin version are not allowed)" ) diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions/pom.xml index beb7c2c1..ed52b00a 100644 --- a/maven-enforcer-plugin/src/it/projects/require-plugin-versions/pom.xml +++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions/pom.xml @@ -30,6 +30,12 @@ under the License. + + + test + + + diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions_failure/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-plugin-versions_failure/verify.groovy index f2d52886..f4e8074a 100644 --- a/maven-enforcer-plugin/src/it/projects/require-plugin-versions_failure/verify.groovy +++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions_failure/verify.groovy @@ -18,4 +18,4 @@ */ File buildLog = new File( basedir, 'build.log' ) assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.enforcer.rules.RequirePluginVersions failed with message:' ) -assert buildLog.text.contains( "Some plugins are missing valid versions or depend on Maven ${mavenVersion} defaults: (LATEST RELEASE SNAPSHOT are not allowed)" ) +assert buildLog.text.contains( "Some plugins are missing valid versions or depend on Maven ${mavenVersion} defaults (LATEST, RELEASE as plugin version are not allowed)" ) \ No newline at end of file