From bf5824ba46ecb9567f5dec6384a81ecfe60c8ac3 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Sun, 1 Jan 2023 16:30:15 +0100 Subject: [PATCH] [MENFORCER-455] New Enforcer API - New API based on JSR 330 components --- enforcer-api/pom.xml | 23 ++ enforcer-api/src/custom-rule-sample/pom.xml | 51 ++-- .../maven/enforcer/rule/MyCustomRule.java | 130 --------- .../org/example/custom/rule/MyCustomRule.java | 103 +++++++ .../src/custom-rule-sample/usage-pom.xml | 85 +++--- .../src/main/assembly/custom-rule-sample.xml | 19 +- .../rule/api/AbstractEnforcerRule.java | 92 ++++++ .../enforcer/rule/api/EnforcerLogger.java | 110 +++++++ .../maven/enforcer/rule/api/EnforcerRule.java | 16 +- .../enforcer/rule/api/EnforcerRule2.java | 3 + .../enforcer/rule/api/EnforcerRuleBase.java | 29 ++ .../enforcer/rule/api/EnforcerRuleError.java | 39 +++ .../rule/api/EnforcerRuleException.java | 19 +- .../enforcer/rule/api/EnforcerRuleHelper.java | 21 +- .../src/site/apt/writing-a-custom-rule.apt.vm | 271 ++---------------- enforcer-rules/pom.xml | 11 - .../rules}/AlwaysFail.java | 19 +- .../rules}/RequireJavaVendor.java | 50 +++- .../rules}/RequireNoRepositories.java | 137 ++++----- .../rules}/utils/ArtifactMatcher.java | 2 +- .../rules}/utils/ArtifactUtils.java | 5 +- .../rules}/utils/DependencyVersionMap.java | 2 +- .../utils/DistributionManagementCheck.java | 2 +- .../rules}/utils/EnforcerRuleUtils.java | 2 +- .../utils/NormalizeLineSeparatorReader.java | 2 +- .../rules}/utils/ParentNodeProvider.java | 2 +- .../rules}/utils/ParentsVisitor.java | 2 +- .../rules}/utils/PluginWrapper.java | 2 +- .../enforcer/AbstractBanDependencies.java | 2 +- .../BanDependencyManagementScope.java | 2 +- .../enforcer/BanDistributionManagement.java | 2 +- .../plugins/enforcer/BanDynamicVersions.java | 4 +- .../enforcer/BanTransitiveDependencies.java | 4 +- .../plugins/enforcer/BannedDependencies.java | 2 +- .../enforcer/BannedDependenciesBase.java | 2 +- .../maven/plugins/enforcer/BannedPlugins.java | 2 +- .../enforcer/DependencyConvergence.java | 4 +- .../enforcer/RequirePluginVersions.java | 4 +- .../plugins/enforcer/RequireReleaseDeps.java | 4 +- .../enforcer/RequireTextFileChecksum.java | 4 +- .../enforcer/RequireUpperBoundDeps.java | 6 +- .../rules}/TestAlwaysFail.java | 4 +- .../rules}/TestRequireJavaVendor.java | 36 +-- .../rules}/TestRequireNoRepositories.java | 45 ++- .../rules}/utils/DependencyNodeBuilder.java | 2 +- .../rules}/utils/EnforcerRuleUtilsHelper.java | 2 +- .../MockEnforcerExpressionEvaluator.java | 2 +- .../rules}/utils/TestArtifactMatcher.java | 4 +- .../TestMockEnforcerExpressionEvaluator.java | 2 +- .../TestNormalizeLineSeparatorReader.java | 4 +- .../plugins/enforcer/EnforcerTestUtils.java | 5 +- .../enforcer/RequireUpperBoundDepsTest.java | 2 +- .../enforcer/TestBannedDependencies.java | 2 +- .../enforcer/TestRequirePluginVersions.java | 2 +- .../enforcer/TestRequireReleaseDeps.java | 2 +- .../enforcer/TestRequireReleaseVersion.java | 2 +- .../enforcer/TestRequireSnapshotVersion.java | 2 +- .../enforcer/TestRequireTextFileChecksum.java | 2 +- maven-enforcer-plugin/pom.xml | 11 +- .../projects/always-fail-warn/verify.groovy | 2 +- .../src/it/projects/always-fail/pom.xml | 4 +- .../src/it/projects/always-fail/verify.groovy | 24 ++ .../src/it/projects/always-pass/verify.groovy | 23 ++ .../invoker.properties | 18 ++ .../mod1/pom.xml | 33 +++ .../mod2/pom.xml | 33 +++ .../require-java-vendor-multi-module/pom.xml | 64 +++++ .../verify.groovy | 25 ++ .../verify.groovy | 2 +- .../verify.groovy | 2 +- .../verify.groovy | 2 +- .../verify.groovy | 2 +- .../verify.groovy | 2 +- .../verify.groovy | 2 +- .../maven/plugins/enforcer/EnforceMojo.java | 166 ++++++++--- .../internal/AbstractEnforcerLogger.java | 88 ++++++ .../internal/EnforcerLoggerError.java | 48 ++++ .../enforcer/internal/EnforcerLoggerWarn.java | 48 ++++ .../enforcer/internal/EnforcerRuleCache.java | 70 +++++ .../enforcer/internal}/EnforcerRuleDesc.java | 22 +- .../internal}/EnforcerRuleManager.java | 52 +++- .../plugins/enforcer/TestEnforceMojo.java | 121 +++++--- ...orcementRuleHelper.java => TestRule1.java} | 20 +- .../maven/plugins/enforcer/TestRule2.java | 28 ++ .../internal}/EnforcerRuleManagerTest.java | 84 ++++-- 85 files changed, 1602 insertions(+), 805 deletions(-) delete mode 100644 enforcer-api/src/custom-rule-sample/src/main/java/org/apache/maven/enforcer/rule/MyCustomRule.java create mode 100644 enforcer-api/src/custom-rule-sample/src/main/java/org/example/custom/rule/MyCustomRule.java create mode 100644 enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/AbstractEnforcerRule.java create mode 100644 enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerLogger.java create mode 100644 enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleBase.java create mode 100644 enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleError.java rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/AlwaysFail.java (75%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/RequireJavaVendor.java (74%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/RequireNoRepositories.java (52%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/ArtifactMatcher.java (99%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/ArtifactUtils.java (98%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/DependencyVersionMap.java (99%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/DistributionManagementCheck.java (98%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/EnforcerRuleUtils.java (98%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/NormalizeLineSeparatorReader.java (99%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/ParentNodeProvider.java (96%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/ParentsVisitor.java (97%) rename enforcer-rules/src/main/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/PluginWrapper.java (99%) rename enforcer-rules/src/test/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/TestAlwaysFail.java (93%) rename enforcer-rules/src/test/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/TestRequireJavaVendor.java (73%) rename enforcer-rules/src/test/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/TestRequireNoRepositories.java (93%) rename enforcer-rules/src/test/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/DependencyNodeBuilder.java (98%) rename enforcer-rules/src/test/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/EnforcerRuleUtilsHelper.java (97%) rename enforcer-rules/src/test/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/MockEnforcerExpressionEvaluator.java (97%) rename enforcer-rules/src/test/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/TestArtifactMatcher.java (98%) rename enforcer-rules/src/test/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/TestMockEnforcerExpressionEvaluator.java (97%) rename enforcer-rules/src/test/java/org/apache/maven/{plugins/enforcer => enforcer/rules}/utils/TestNormalizeLineSeparatorReader.java (94%) create mode 100644 maven-enforcer-plugin/src/it/projects/always-fail/verify.groovy create mode 100644 maven-enforcer-plugin/src/it/projects/always-pass/verify.groovy create mode 100644 maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/invoker.properties create mode 100644 maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/mod1/pom.xml create mode 100644 maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/mod2/pom.xml create mode 100644 maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/pom.xml create mode 100644 maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/verify.groovy create mode 100644 maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/AbstractEnforcerLogger.java create mode 100644 maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerLoggerError.java create mode 100644 maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerLoggerWarn.java create mode 100644 maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleCache.java rename {enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer => maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal}/EnforcerRuleDesc.java (70%) rename {enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer => maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal}/EnforcerRuleManager.java (62%) rename maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/{TestDefaultEnforcementRuleHelper.java => TestRule1.java} (57%) create mode 100644 maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestRule2.java rename {enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer => maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/internal}/EnforcerRuleManagerTest.java (66%) diff --git a/enforcer-api/pom.xml b/enforcer-api/pom.xml index 670716da..ff3c41b8 100644 --- a/enforcer-api/pom.xml +++ b/enforcer-api/pom.xml @@ -48,6 +48,29 @@ + + org.apache.maven.plugins + maven-resources-plugin + + + custom-rule + + copy-resources + + pre-site + + ${project.build.directory}/custom-rule-sample + \ + + + src/custom-rule-sample + true + + + + + + org.apache.maven.plugins maven-assembly-plugin diff --git a/enforcer-api/src/custom-rule-sample/pom.xml b/enforcer-api/src/custom-rule-sample/pom.xml index 5b109d3b..7ebd3a88 100644 --- a/enforcer-api/src/custom-rule-sample/pom.xml +++ b/enforcer-api/src/custom-rule-sample/pom.xml @@ -18,46 +18,65 @@ * under the License. * --> + + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + custom-rule custom-rule-sample - jar 1.0 + My Custom Rule This is my custom rule. + ${project.version} - 3.0 + ${maven.version} + + 1.8 + 1.8 + org.apache.maven.enforcer enforcer-api - ${api.version} + \${api.version} provided org.apache.maven maven-core - ${maven.version} + \${maven.version} provided - org.apache.maven - maven-plugin-api - ${maven.version} + javax.inject + javax.inject + 1 provided - - junit - junit - 4.13.2 - test - + + + + + org.eclipse.sisu + sisu-maven-plugin + 0.9.0.M1 + + + + main-index + + + + + - \ No newline at end of file + + + diff --git a/enforcer-api/src/custom-rule-sample/src/main/java/org/apache/maven/enforcer/rule/MyCustomRule.java b/enforcer-api/src/custom-rule-sample/src/main/java/org/apache/maven/enforcer/rule/MyCustomRule.java deleted file mode 100644 index ad2e4168..00000000 --- a/enforcer-api/src/custom-rule-sample/src/main/java/org/apache/maven/enforcer/rule/MyCustomRule.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * 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. - */ -package org.apache.maven.enforcer.rule; - -import org.apache.maven.ProjectDependenciesResolver; -import org.apache.maven.enforcer.rule.api.EnforcerRule; -import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; -import org.apache.maven.execution.MavenSession; -import org.apache.maven.plugin.logging.Log; -import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; -import org.codehaus.plexus.component.repository.exception.ComponentLookupException; - -/** - * @author Brian Fox - * @author Gabriel Belingueres - */ -public class MyCustomRule - implements EnforcerRule -{ - /** - * Simple param. This rule fails if the value is true. - */ - private boolean shouldIfail = false; - - public void execute( EnforcerRuleHelper helper ) - throws EnforcerRuleException - { - Log log = helper.getLog(); - - try - { - // get the various expressions out of the helper. - MavenProject project = (MavenProject) helper.evaluate( "${project}" ); - MavenSession session = (MavenSession) helper.evaluate( "${session}" ); - String target = (String) helper.evaluate( "${project.build.directory}" ); - String artifactId = (String) helper.evaluate( "${project.artifactId}" ); - String mavenVersion = (String) helper.evaluate( "${maven.version}" ); - - // retrieve any component out of the session directly - ProjectDependenciesResolver resolver = helper.getComponent( ProjectDependenciesResolver.class ); - - log.info( "Retrieved Target Folder: " + target ); - log.info( "Retrieved ArtifactId: " +artifactId ); - log.info( "Retrieved Project: " + project ); - log.info( "Retrieved Maven version: " + mavenVersion ); - log.info( "Retrieved Session: " + session ); - log.info( "Retrieved Resolver: " + resolver ); - - if ( this.shouldIfail ) - { - throw new EnforcerRuleException( "Failing because my param said so." ); - } - } - catch ( ComponentLookupException e ) - { - throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e ); - } - catch ( ExpressionEvaluationException e ) - { - throw new EnforcerRuleException( "Unable to lookup an expression " + e.getLocalizedMessage(), e ); - } - } - - /** - * If your rule is cacheable, you must return a unique id when parameters or conditions - * change that would cause the result to be different. Multiple cached results are stored - * based on their id. - * - * The easiest way to do this is to return a hash computed from the values of your parameters. - * - * If your rule is not cacheable, then the result here is not important, you may return anything. - */ - public String getCacheId() - { - //no hash on boolean...only parameter so no hash is needed. - return Boolean.toString( this.shouldIfail ); - } - - /** - * This tells the system if the results are cacheable at all. Keep in mind that during - * forked builds and other things, a given rule may be executed more than once for the same - * project. This means that even things that change from project to project may still - * be cacheable in certain instances. - */ - public boolean isCacheable() - { - return false; - } - - /** - * If the rule is cacheable and the same id is found in the cache, the stored results - * are passed to this method to allow double checking of the results. Most of the time - * this can be done by generating unique ids, but sometimes the results of objects returned - * by the helper need to be queried. You may for example, store certain objects in your rule - * and then query them later. - */ - public boolean isResultValid( EnforcerRule rule ) - { - return false; - } - - /** - * Injects the value of the shouldIfail parameter into the custom rule. - * - * @param shouldIfail set to true if you want the rule to fail. false to succeed. - */ - public void setShouldIfail( boolean shouldIfail ) - { - this.shouldIfail = shouldIfail; - } - -} diff --git a/enforcer-api/src/custom-rule-sample/src/main/java/org/example/custom/rule/MyCustomRule.java b/enforcer-api/src/custom-rule-sample/src/main/java/org/example/custom/rule/MyCustomRule.java new file mode 100644 index 00000000..d7a36ea0 --- /dev/null +++ b/enforcer-api/src/custom-rule-sample/src/main/java/org/example/custom/rule/MyCustomRule.java @@ -0,0 +1,103 @@ +/* + * 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. + */ + +// START SNIPPET: rule-implementation +package org.example.custom.rule; + +import javax.inject.Inject; +import javax.inject.Named; + +import java.util.List; + +import org.apache.maven.enforcer.rule.api.AbstractEnforcerRule; +import org.apache.maven.enforcer.rule.api.EnforcerRuleException; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.project.MavenProject; +import org.apache.maven.rtinfo.RuntimeInformation; + +/** + * Custom Enforcer Rule - example + */ +@Named("myCustomRule") // rule name - must start from lowercase character +public class MyCustomRule extends AbstractEnforcerRule { + + /** + * Simple param. This rule fails if the value is true. + */ + private boolean shouldIfail = false; + + /** + * Rule parameter as list of items. + */ + private List listParameters; + + // Inject needed Maven components + + @Inject + private MavenProject project; + + @Inject + private MavenSession session; + + @Inject + private RuntimeInformation runtimeInformation; + + public void execute() throws EnforcerRuleException { + + getLog().info("Retrieved Target Folder: " + project.getBuild().getDirectory()); + getLog().info("Retrieved ArtifactId: " + project.getArtifactId()); + getLog().info("Retrieved Project: " + project); + getLog().info("Retrieved Maven version: " + runtimeInformation.getMavenVersion()); + getLog().info("Retrieved Session: " + session); + getLog().warnOrError("Parameter shouldIfail: " + shouldIfail); + getLog().info(() -> "Parameter listParameters: " + listParameters); + + if (this.shouldIfail) { + throw new EnforcerRuleException("Failing because my param said so."); + } + } + + /** + * If your rule is cacheable, you must return a unique id when parameters or conditions + * change that would cause the result to be different. Multiple cached results are stored + * based on their id. + *

+ * The easiest way to do this is to return a hash computed from the values of your parameters. + *

+ * If your rule is not cacheable, then you don't need to override this method or return null + */ + @Override + public String getCacheId() { + //no hash on boolean...only parameter so no hash is needed. + return Boolean.toString(shouldIfail); + } + + /** + * A good practice is provided toString method for Enforcer Rule. + *

+ * Output is used in verbose Maven logs, can help during investigate problems. + * + * @return rule description + */ + @Override + public String toString() { + return String.format("MyCustomRule[level=%s, shouldIfail=%b]", getLevel(), shouldIfail); + } +} +// END SNIPPET: rule-implementation diff --git a/enforcer-api/src/custom-rule-sample/usage-pom.xml b/enforcer-api/src/custom-rule-sample/usage-pom.xml index 7af9b803..d02adf03 100644 --- a/enforcer-api/src/custom-rule-sample/usage-pom.xml +++ b/enforcer-api/src/custom-rule-sample/usage-pom.xml @@ -18,42 +18,53 @@ * under the License. * --> - - 4.0.0 - org.apache.maven.plugins - maven-enforcer-plugin-sample-usage - 1 - jar - - - - org.apache.maven.plugins - maven-enforcer-plugin - ${project.version} - - - custom-rule - custom-rule-sample - 1.0 - - - - - enforce - - - - false - - - - - enforce - + + + 4.0.0 - - - - - + custom-rule + maven-enforcer-plugin-sample-usage + 1 + + + + + org.apache.maven.plugins + maven-enforcer-plugin + ${project.version} + + + + custom-rule + custom-rule-sample + 1.0 + + + + + enforce + + + + + + true + + item 1 + item 2 + + + + + + enforce + + + + + + + diff --git a/enforcer-api/src/main/assembly/custom-rule-sample.xml b/enforcer-api/src/main/assembly/custom-rule-sample.xml index 63eb1c1f..864e2dc0 100644 --- a/enforcer-api/src/main/assembly/custom-rule-sample.xml +++ b/enforcer-api/src/main/assembly/custom-rule-sample.xml @@ -18,9 +18,9 @@ * under the License. * --> - + xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.1 https://maven.apache.org/xsd/assembly-2.1.1.xsd"> sample false @@ -28,21 +28,8 @@ - src/custom-rule-sample + target/custom-rule-sample /custom-rule-sample - - - - src/custom-rule-sample/pom.xml - /custom-rule-sample - true - - - src/custom-rule-sample/usage-pom.xml - /custom-rule-sample - true - - \ No newline at end of file diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/AbstractEnforcerRule.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/AbstractEnforcerRule.java new file mode 100644 index 00000000..34c1c28a --- /dev/null +++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/AbstractEnforcerRule.java @@ -0,0 +1,92 @@ +/* + * 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. + */ +package org.apache.maven.enforcer.rule.api; + +/** + * Entry point for custom {@code Enforcer Rule}. + *

+ * Please see + * Writing a custom rule + * + * @author Slawomir Jaranowski + * @since 3.2.0 + */ +public abstract class AbstractEnforcerRule implements EnforcerRuleBase { + + /** + * EnforcerLogger instance + */ + private EnforcerLogger log; + + /** + * Enforcer Rule execution level + */ + private EnforcerLevel level = EnforcerLevel.ERROR; + + /** + * Used by {@code EnforcerMojo} to inject logger instance + * + * @param log an {@link EnforcerLogger} instance + */ + public void setLog(EnforcerLogger log) { + this.log = log; + } + + /** + * Provide an {@link EnforcerLogger} instance for Rule + * + * @return an {@link EnforcerLogger} instance + */ + public EnforcerLogger getLog() { + return log; + } + + /** + * Current Enforcer execution level + * + * @return an Enforcer execution level + */ + public EnforcerLevel getLevel() { + return level; + } + + /** + * If the rule is to be cached during session scope, whole executing of Maven build, + * this id is used as part of the key. + *

+ * Rule of the same class and the same cache id will be executed once. + * + * @return id to be used by the Enforcer to determine uniqueness of cache results. + * Return {@code null} disable cache of rule executing. + */ + public String getCacheId() { + return null; + } + + /** + * This is the interface into the rule. This method should throw an exception + * containing a reason message if the rule fails the check. The plugin will + * then decide based on the fail flag and rule level if it should stop or just log the + * message as a warning. + * + * @throws EnforcerRuleException the enforcer rule exception + * @throws EnforcerRuleError in order to brake a build immediately + */ + public abstract void execute() throws EnforcerRuleException; +} diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerLogger.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerLogger.java new file mode 100644 index 00000000..64c5d0b2 --- /dev/null +++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerLogger.java @@ -0,0 +1,110 @@ +/* + * 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. + */ +package org.apache.maven.enforcer.rule.api; + +import java.util.function.Supplier; + +/** + * Logger used by enforcer rule. + * + * @author Slawomir Jaranowski + * @since 3.2.0 + */ +public interface EnforcerLogger { + + /** + * Log message in {@code warn} or {@code error} level according to current rule {@link EnforcerLevel}. + * + * @param message a massage to log + */ + void warnOrError(CharSequence message); + + /** + * Log message in {@code warn} or {@code error} level according to current rule {@link EnforcerLevel}. + *

+ * {@code messageSupplier} will be evaluate only when corresponding log level is enabled. + * + * @param messageSupplier a supplier for message to log + */ + void warnOrError(Supplier messageSupplier); + + /** + * Log message in {@code debug} level. + * + * @param message a massage to log + */ + void debug(CharSequence message); + + /** + * Log message in {@code debug} level. + *

+ * {@code messageSupplier} will be evaluate only when corresponding log level is enabled. + * + * @param messageSupplier a supplier for message to log + */ + void debug(Supplier messageSupplier); + + /** + * Log message in {@code info} level. + * + * @param message a massage to log + */ + void info(CharSequence message); + + /** + * Log message in {@code info} level. + *

+ * {@code messageSupplier} will be evaluate only when corresponding log level is enabled. + * + * @param messageSupplier a supplier for message to log + */ + void info(Supplier messageSupplier); + + /** + * Log message in {@code warn} level. + * + * @param message a massage to log + */ + void warn(CharSequence message); + + /** + * Log message in {@code warn} level. + *

+ * {@code messageSupplier} will be evaluate only when corresponding log level is enabled. + * + * @param messageSupplier a supplier for message to log + */ + void warn(Supplier messageSupplier); + + /** + * Log message in {@code error} level. + * + * @param message a massage to log + */ + void error(CharSequence message); + + /** + * Log message in {@code error} level. + *

+ * {@code messageSupplier} will be evaluate only when corresponding log level is enabled. + * + * @param messageSupplier a supplier for message to log + */ + void error(Supplier messageSupplier); +} diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java index 45441b5a..8999726b 100644 --- a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java +++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java @@ -25,8 +25,11 @@ * Interface to be implemented by any rules executed by the enforcer. * * @author Brian Fox + * @deprecated Please see + * Writing a custom rule */ -public interface EnforcerRule { +@Deprecated +public interface EnforcerRule extends EnforcerRuleBase { /** * This is the interface into the rule. This method should throw an exception @@ -35,9 +38,8 @@ public interface EnforcerRule { * message as a warning. * * @param helper The helper provides access to the log, MavenSession and has - * helpers to get common components. It is also able to lookup components - * by class name. - * + * helpers to get common components. It is also able to lookup components + * by class name. * @throws EnforcerRuleException the enforcer rule exception */ void execute(@Nonnull EnforcerRuleHelper helper) throws EnforcerRuleException; @@ -59,8 +61,8 @@ public interface EnforcerRule { * your rule and then query them later. * * @param cachedRule the last cached instance of the rule. This is to be used by the rule to - * potentially determine if the results are still valid (ie if the configuration has been overridden) - * + * potentially determine if the results are still valid (ie if the configuration has been + * overridden) * @return true if the stored results are valid for the same id. */ boolean isResultValid(@Nonnull EnforcerRule cachedRule); @@ -70,7 +72,7 @@ public interface EnforcerRule { * that allow multiple results of the same rule to be cached. * * @return id to be used by the enforcer to determine uniqueness of cache results. The ids only need to be unique - * within a given rule implementation as the full key will be [classname]-[id] + * within a given rule implementation as the full key will be [classname]-[id] */ @Nullable String getCacheId(); diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule2.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule2.java index e19585ca..335c4204 100644 --- a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule2.java +++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule2.java @@ -25,7 +25,10 @@ * * @author Mirko Friedenhagen * @since 1.4 + * @deprecated Please see + * Writing a custom rule */ +@Deprecated public interface EnforcerRule2 extends EnforcerRule { /** * Returns the level of enforcement. diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleBase.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleBase.java new file mode 100644 index 00000000..328c307e --- /dev/null +++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleBase.java @@ -0,0 +1,29 @@ +/* + * 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. + */ +package org.apache.maven.enforcer.rule.api; + +/** + * Base interface for old and new API. + *

+ * Used for internal purpose. + * + * @author Slawomir Jaranowski + * @since 3.2.0 + */ +public interface EnforcerRuleBase {} diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleError.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleError.java new file mode 100644 index 00000000..b7d7efc4 --- /dev/null +++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleError.java @@ -0,0 +1,39 @@ +/* + * 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. + */ +package org.apache.maven.enforcer.rule.api; + +/** + * An error occurring during the execution of a rule. + * Rule can inform Enforcer plugin about critical state. + *

+ * This exception break a build immediate. + * + * @author Slawomir Jaranowski + * @since 3.2.0 + */ +public class EnforcerRuleError extends EnforcerRuleException { + + public EnforcerRuleError(String message, Throwable cause) { + super(message, cause); + } + + public EnforcerRuleError(String message) { + super(message); + } +} diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleException.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleException.java index fc3d78d0..a8285a51 100644 --- a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleException.java +++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleException.java @@ -19,9 +19,10 @@ package org.apache.maven.enforcer.rule.api; /** - * An exception occurring during the execution of a rule. Based off of - * EnforcerRuleException, but separated to keep the rule dependencies to a - * minimum. + * An exception occurring during the execution of a rule. + *

+ * Enforcer plugin takes decision based on configuration and {@code Enforcer Rule} level + * whether build should pass or fail. * * @author Brian Fox */ @@ -40,7 +41,9 @@ public class EnforcerRuleException extends Exception { * Gets the long message. * * @return the long message + * @deprecated not used */ + @Deprecated public String getLongMessage() { return longMessage; } @@ -49,7 +52,9 @@ public String getLongMessage() { * Gets the source. * * @return the source + * @deprecated not used */ + @Deprecated public Object getSource() { return source; } @@ -58,10 +63,12 @@ public Object getSource() { * Construct a new EnforcerRuleException exception providing * the source and a short and long message. * - * @param source the source + * @param source the source * @param shortMessage the short message - * @param longMessage the long message + * @param longMessage the long message + * @deprecated {@code source} and {@code longMessage} are not used */ + @Deprecated public EnforcerRuleException(Object source, String shortMessage, String longMessage) { super(shortMessage); this.source = source; @@ -86,7 +93,7 @@ public EnforcerRuleException(String message, Exception cause) { * message. * * @param message the message - * @param cause the cause + * @param cause the cause */ public EnforcerRuleException(String message, Throwable cause) { super(message, cause); diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java index e931c73b..2c572632 100644 --- a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java +++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java @@ -35,7 +35,10 @@ * rules. * * @author Brian Fox + * @deprecated Please see + * Writing a custom rule */ +@Deprecated public interface EnforcerRuleHelper extends ExpressionEvaluator { /** @@ -50,9 +53,7 @@ public interface EnforcerRuleHelper extends ExpressionEvaluator { * Gets the component. * * @param clazz the clazz - * * @return the component - * * @throws ComponentLookupException the component lookup exception */ @Nonnull @@ -62,9 +63,7 @@ public interface EnforcerRuleHelper extends ExpressionEvaluator { * Gets the component. * * @param componentKey the component key - * * @return the component - * * @throws ComponentLookupException the component lookup exception */ @Nonnull @@ -73,11 +72,9 @@ public interface EnforcerRuleHelper extends ExpressionEvaluator { /** * Gets the component. * - * @param role the role + * @param role the role * @param roleHint the role hint - * * @return the component - * * @throws ComponentLookupException the component lookup exception */ Object getComponent(String role, String roleHint) throws ComponentLookupException; @@ -85,11 +82,9 @@ public interface EnforcerRuleHelper extends ExpressionEvaluator { /** * Gets the component. * - * @param clazz the clazz + * @param clazz the clazz * @param roleHint the role hint - * * @return the component - * * @throws ComponentLookupException the component lookup exception */ T getComponent(Class clazz, String roleHint) throws ComponentLookupException; @@ -98,9 +93,7 @@ public interface EnforcerRuleHelper extends ExpressionEvaluator { * Gets the component map. * * @param role the role - * * @return the component map - * * @throws ComponentLookupException the component lookup exception */ Map getComponentMap(String role) throws ComponentLookupException; @@ -109,9 +102,7 @@ public interface EnforcerRuleHelper extends ExpressionEvaluator { * Gets the component list. * * @param role the role - * * @return the component list - * * @throws ComponentLookupException the component lookup exception */ List getComponentList(String role) throws ComponentLookupException; @@ -126,7 +117,7 @@ public interface EnforcerRuleHelper extends ExpressionEvaluator { /** * Gets a cached value, or uses the provided producer to compute it. * - * @param key a key to identify the value stored + * @param key a key to identify the value stored * @param producer a supplier for the value if it's not already present * @return a previously-cached or freshly-computed value */ diff --git a/enforcer-api/src/site/apt/writing-a-custom-rule.apt.vm b/enforcer-api/src/site/apt/writing-a-custom-rule.apt.vm index b0472dd4..1216f4ed 100644 --- a/enforcer-api/src/site/apt/writing-a-custom-rule.apt.vm +++ b/enforcer-api/src/site/apt/writing-a-custom-rule.apt.vm @@ -29,261 +29,52 @@ Writing a custom rule {{{http://maven.apache.org/plugins/maven-enforcer-plugin/}maven-enforcer-plugin}}. Note: The files shown below may be downloaded here: {{{./custom-rule.zip}custom-rule.zip}} + +* Project with custom Enforcer Rule + + First make a new jar project starting with the sample pom below: - [[1]] First make a new jar project starting with the sample pom below: - -+---+ - - 4.0.0 - custom-rule - custom-rule-sample - jar - 1.0 - My Custom Rule - This is my custom rule. - - ${project.version} - ${mavenPrerequisite} - - - - org.apache.maven.enforcer - enforcer-api - ${api.version} - provided - - - org.apache.maven - maven-core - ${maven.version} - provided - - - org.apache.maven - maven-plugin-api - ${maven.version} - provided - - - junit - junit - 3.8.1 - test - - - - - -+---+ - Note that the classloader is shared with the embedding <<>> (a regular {{{https://maven.apache.org/guides/mini/guide-maven-classloading.html#Plugin_Classloaders}plugin classloader}}) - and therefore the artifacts <<>> and <<>> are always loaded in the same version as the embedding <<>>. - Custom rule artifacts should therefore only depend on `enforcer-api` and core Maven artifacts with <<>> scope (for details refer to {{{https://issues.apache.org/jira/browse/MNG-7097}MNG-7097}}). - The classes available from `enforcer-rules` must not be used from custom rules, as those are not considered API and may change in backwards-incompatible ways with every `maven-enforcer` version (even minor ones). - - [[2]] Create your rule class. The rule must implement the {{{./apidocs/index.html}EnforcerRule}} interface. - The rule can get access to components and the log via the {{{./apidocs/index.html}EnforcerRuleHelper}} interface. - In addition, the rule must provide a setter method for each parameter allowed to be configured in the pom.xml file (like the parameter <<>> shown in point 5). - - If the rule succeeds, it should just simply return. If the rule fails, it should throw an {{{./apidocs/index.html}EnforcerRuleException}} with a descriptive message telling the user why the rule failed. - - There are several methods that must be implemented related to caching. - - Here's a sample class that shows how to access the helper methods and retrieve components by class name from the helper: - -+---+ -package org.apache.maven.enforcer.rule; +%{snippet|id=project-pom|file=enforcer-api/target/custom-rule-sample/pom.xml} -import org.apache.maven.ProjectDependenciesResolver; -import org.apache.maven.enforcer.rule.api.EnforcerRule; -import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; -import org.apache.maven.execution.MavenSession; -import org.apache.maven.plugin.logging.Log; -import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; -import org.codehaus.plexus.component.repository.exception.ComponentLookupException; + Note that the classloader is shared with the embedding <<>> (a regular {{{https://maven.apache.org/guides/mini/guide-maven-classloading.html#Plugin_Classloaders}plugin classloader}}) + and therefore the artifacts <<>> are always loaded in the same version as the embedding <<>>. -/** - * @author Brian Fox - * @author Gabriel Belingueres - */ -public class MyCustomRule - implements EnforcerRule -{ - /** - * Simple param. This rule fails if the value is true. - */ - private boolean shouldIfail = false; + Custom rule artifacts should therefore only depend on <<>> and core Maven artifacts with <<>> scope (for details refer to {{{https://issues.apache.org/jira/browse/MNG-7097}MNG-7097}}). - public void execute( EnforcerRuleHelper helper ) - throws EnforcerRuleException - { - Log log = helper.getLog(); + The classes available from <<>> must not be used from custom rules, as those are not considered API and may change in backwards-incompatible ways with every <<>> version (even minor ones). - try - { - // get the various expressions out of the helper. - MavenProject project = (MavenProject) helper.evaluate( "\${project}" ); - MavenSession session = (MavenSession) helper.evaluate( "${session}" ); - String target = (String) helper.evaluate( "\${project.build.directory}" ); - String artifactId = (String) helper.evaluate( "\${project.artifactId}" ); - String mavenVersion = (String) helper.evaluate( "${maven.version}" ); + Other dependencies used by custom rule at run time should have <<>> scope. - // retrieve any component out of the session directly - ProjectDependenciesResolver resolver = helper.getComponent( ProjectDependenciesResolver.class ); +* Implementation of custom Enforcer Rule - log.info( "Retrieved Target Folder: " + target ); - log.info( "Retrieved ArtifactId: " +artifactId ); - log.info( "Retrieved Project: " + project ); - log.info( "Retrieved Maven version: " + mavenVersion ); - log.info( "Retrieved Session: " + session ); - log.info( "Retrieved Resolver: " + resolver ); + The rule must extends the {{{./apidocs/index.html}AbstractEnforcerRule}} and implements <<>> method. - if ( this.shouldIfail ) - { - throw new EnforcerRuleException( "Failing because my param said so." ); - } - } - catch ( ComponentLookupException e ) - { - throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e ); - } - catch ( ExpressionEvaluationException e ) - { - throw new EnforcerRuleException( "Unable to lookup an expression " + e.getLocalizedMessage(), e ); - } - } + Add annotation <<<@Named("yourRuleName")>>> to your Rule class. Your Rule name must start with lowercase character. - /** - * If your rule is cacheable, you must return a unique id when parameters or conditions - * change that would cause the result to be different. Multiple cached results are stored - * based on their id. - * - * The easiest way to do this is to return a hash computed from the values of your parameters. - * - * If your rule is not cacheable, then the result here is not important, you may return anything. - */ - public String getCacheId() - { - //no hash on boolean...only parameter so no hash is needed. - return Boolean.toString( this.shouldIfail ); - } + In addition, the rule can provide a setter method or simply field for each parameter allowed to be configured in the pom.xml file (like the parameter <<>> shown example). - /** - * This tells the system if the results are cacheable at all. Keep in mind that during - * forked builds and other things, a given rule may be executed more than once for the same - * project. This means that even things that change from project to project may still - * be cacheable in certain instances. - */ - public boolean isCacheable() - { - return false; - } + Maven component can be injected into Rule by annotation <<<@Inject>>> on field or constructor. - /** - * If the rule is cacheable and the same id is found in the cache, the stored results - * are passed to this method to allow double checking of the results. Most of the time - * this can be done by generating unique ids, but sometimes the results of objects returned - * by the helper need to be queried. You may for example, store certain objects in your rule - * and then query them later. - */ - public boolean isResultValid( EnforcerRule rule ) - { - return false; - } + Entry point for Rule executing is <<>> method, tf the rule succeeds, it should just simply return. + If the rule fails, it should throw an {{{./apidocs/index.html}EnforcerRuleException}} with a descriptive message telling the user why the rule failed. + Enforcer plugin takes decision based on configuration and Enforcer Rule level whether build should pass or fail. + In case when you want to brake build immediately, <<>> method can throw an {{{./apidocs/index.html}EnforcerRuleError}}. - /** - * Injects the value of the shouldIfail parameter into the custom rule. - * - * @param shouldIfail set to true if you want the rule to fail. false to succeed. - */ - public void setShouldIfail( boolean shouldIfail ) - { - this.shouldIfail = shouldIfail; - } + Here's a sample class: -} -+---+ +%{snippet|id=rule-implementation|file=enforcer-api/target/custom-rule-sample/src/main/java/org/example/custom/rule/MyCustomRule.java} - [[3]] Build and Install or Deploy your custom rule. - - [[4]] Add your custom-rule artifact as a dependency of the <<>> in your build: - -+---+ - - ... - - - - org.apache.maven.plugins - maven-enforcer-plugin - ${project.version} - - - custom-rule - custom-rule-sample - 1.0 - - - ... - - - - ... - -+---+ - [[5]] Add your rule to the configuration section of the <<>>. The name of your class will be the name of the rule, and - you must add an <<>> hint that contains the fully qualified class name: +* Using custom Rule + + * Build and Install or Deploy your custom rule. -+---+ - ... - - - - true - - - - ... -+---+ + * Add your custom-rule artifact as a dependency of the <<>> in your build. + + * Add your rule to the configuration section of the <<>>, the name used in <<<@Named>>> annotation of your Rule will be the name of the rule. + + [] - [[6]] That's it. The full plugin config may look like this: + That's it. The full plugin config may look like this: -+---+ - - ... - - - - org.apache.maven.plugins - maven-enforcer-plugin - ${project.version} - - - custom-rule - custom-rule-sample - 1.0 - - - - - enforce - - - - false - - - - - enforce - - - - - - - ... - -+---+ +%{snippet|id=usage-pom|file=enforcer-api/target/custom-rule-sample/usage-pom.xml} diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml index efa660b5..50dcac3a 100644 --- a/enforcer-rules/pom.xml +++ b/enforcer-rules/pom.xml @@ -127,17 +127,6 @@ org.eclipse.sisu sisu-maven-plugin - - org.apache.maven.plugins - maven-jar-plugin - - - - test-jar - - - - diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysFail.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/AlwaysFail.java similarity index 75% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysFail.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/AlwaysFail.java index 586b8ef6..9ddbe414 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AlwaysFail.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/AlwaysFail.java @@ -16,21 +16,25 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer; +package org.apache.maven.enforcer.rules; +import javax.inject.Named; + +import org.apache.maven.enforcer.rule.api.AbstractEnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; /** * Always fail. This rule is useful for testing the Enforcer configuration, or to always fail the build if a particular * profile is enabled. * @author Ben Lidgey */ -public class AlwaysFail extends AbstractNonCacheableEnforcerRule { +@Named("alwaysFail") +public final class AlwaysFail extends AbstractEnforcerRule { + + private String message; @Override - public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException { - String message = getMessage(); + public void execute() throws EnforcerRuleException { StringBuilder buf = new StringBuilder(); if (message != null) { @@ -39,4 +43,9 @@ public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException { buf.append("Always fails!"); throw new EnforcerRuleException(buf.toString()); } + + @Override + public String toString() { + return String.format("AlwaysFail[level=%s, message=%s]", getLevel(), message); + } } diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVendor.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/RequireJavaVendor.java similarity index 74% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVendor.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/RequireJavaVendor.java index 5d2d62bd..805a48e3 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVendor.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/RequireJavaVendor.java @@ -16,13 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer; +package org.apache.maven.enforcer.rules; + +import javax.inject.Named; import java.util.List; import org.apache.commons.lang3.SystemUtils; +import org.apache.maven.enforcer.rule.api.AbstractEnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; /** * This rule checks that the Java vendor is allowed. @@ -31,7 +33,8 @@ * @author Tim Sijstermans * @since 3.0.0 */ -public class RequireJavaVendor extends AbstractNonCacheableEnforcerRule { +@Named("requireJavaVendor") +public final class RequireJavaVendor extends AbstractEnforcerRule { /** * Java vendors to include. If none is defined, all are included. * @@ -43,10 +46,39 @@ public class RequireJavaVendor extends AbstractNonCacheableEnforcerRule { */ private List excludes; + /** + * A message used if the rule fails. + */ + private String message; + + /** + * The Java Vendor not changed during one Maven session, + * so can be cached. + * + * @return a cache id + */ + @Override + public String getCacheId() { + String result = ""; + + if (includes != null) { + result += "" + includes.hashCode(); + } + + if (excludes != null) { + result += "" + excludes.hashCode(); + } + + if (message != null) { + result += "" + message.hashCode(); + } + + return result; + } + @Override - public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException { + public void execute() throws EnforcerRuleException { if (excludes != null && excludes.contains(SystemUtils.JAVA_VENDOR)) { - String message = getMessage(); if (message == null) { message = String.format( "%s is an excluded Required Java Vendor (JAVA_HOME=%s)", @@ -54,7 +86,6 @@ public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException { } throw new EnforcerRuleException(message); } else if (includes != null && !includes.contains(SystemUtils.JAVA_VENDOR)) { - String message = getMessage(); if (message == null) { message = String.format( "%s is not an included Required Java Vendor (JAVA_HOME=%s)", @@ -94,4 +125,11 @@ public void setExcludes(List theExcludes) { public void setIncludes(List theIncludes) { this.includes = theIncludes; } + + @Override + public String toString() { + return String.format( + "RequireJavaVendor[level=%s, message=%s, includes=%s, excludes=%s]", + getLevel(), message, includes, excludes); + } } diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/RequireNoRepositories.java similarity index 52% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/RequireNoRepositories.java index 8e58777e..4c63af57 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/RequireNoRepositories.java @@ -16,20 +16,22 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer; +package org.apache.maven.enforcer.rules; + +import javax.inject.Inject; +import javax.inject.Named; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; +import org.apache.maven.enforcer.rule.api.AbstractEnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Model; import org.apache.maven.model.Repository; -import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; import org.codehaus.plexus.util.StringUtils; /** @@ -37,7 +39,9 @@ * * @author Brian Fox */ -public class RequireNoRepositories extends AbstractNonCacheableEnforcerRule { +@Named("requireNoRepositories") +public final class RequireNoRepositories extends AbstractEnforcerRule { + private static final String VERSION = " version:"; /** @@ -78,104 +82,105 @@ public class RequireNoRepositories extends AbstractNonCacheableEnforcerRule { /** * Whether to allow plugin repositories which only resolve snapshots. By default they are banned. * - * @see {@link #setAllowSnapshotPluginRepositories(boolean)} + * @see #setAllowSnapshotPluginRepositories(boolean) */ private boolean allowSnapshotPluginRepositories = false; - public final void setBanRepositories(boolean banRepositories) { + private String message; + + private final MavenSession session; + + @Inject + public RequireNoRepositories(MavenSession session) { + this.session = Objects.requireNonNull(session); + } + + public void setMessage(String message) { + this.message = message; + } + + public void setBanRepositories(boolean banRepositories) { this.banRepositories = banRepositories; } - public final void setBanPluginRepositories(boolean banPluginRepositories) { + public void setBanPluginRepositories(boolean banPluginRepositories) { this.banPluginRepositories = banPluginRepositories; } - public final void setAllowedRepositories(List allowedRepositories) { + public void setAllowedRepositories(List allowedRepositories) { this.allowedRepositories = allowedRepositories; } - public final void setAllowedPluginRepositories(List allowedPluginRepositories) { + public void setAllowedPluginRepositories(List allowedPluginRepositories) { this.allowedPluginRepositories = allowedPluginRepositories; } - public final void setAllowSnapshotRepositories(boolean allowSnapshotRepositories) { + public void setAllowSnapshotRepositories(boolean allowSnapshotRepositories) { this.allowSnapshotRepositories = allowSnapshotRepositories; } - public final void setAllowSnapshotPluginRepositories(boolean allowSnapshotPluginRepositories) { + public void setAllowSnapshotPluginRepositories(boolean allowSnapshotPluginRepositories) { this.allowSnapshotPluginRepositories = allowSnapshotPluginRepositories; } @Override - public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException { - Log logger = helper.getLog(); + public void execute() throws EnforcerRuleException { - MavenSession session; - try { - session = (MavenSession) helper.evaluate("${session}"); + List sortedProjects = session.getProjectDependencyGraph().getSortedProjects(); - List sortedProjects = - session.getProjectDependencyGraph().getSortedProjects(); - - List models = new ArrayList<>(); - for (MavenProject mavenProject : sortedProjects) { - logger.debug("Scanning project: " + mavenProject.getGroupId() + ":" + mavenProject.getArtifactId() - + VERSION + mavenProject.getVersion()); - models.add(mavenProject.getOriginalModel()); - } + List models = new ArrayList<>(); + for (MavenProject mavenProject : sortedProjects) { + getLog().debug("Scanning project: " + mavenProject.getGroupId() + ":" + mavenProject.getArtifactId() + + VERSION + mavenProject.getVersion()); + models.add(mavenProject.getOriginalModel()); + } - List badModels = new ArrayList<>(); - - StringBuilder newMsg = new StringBuilder(); - newMsg.append("Some poms have repositories defined:" + System.lineSeparator()); - - for (Model model : models) { - if (banRepositories) { - List repos = model.getRepositories(); - if (repos != null && !repos.isEmpty()) { - List bannedRepos = - findBannedRepositories(repos, allowedRepositories, allowSnapshotRepositories); - if (!bannedRepos.isEmpty()) { - badModels.add(model); - newMsg.append(model.getGroupId() + ":" + model.getArtifactId() + VERSION - + model.getVersion() + " has repositories " + bannedRepos); - } + List badModels = new ArrayList<>(); + + StringBuilder newMsg = new StringBuilder(); + newMsg.append("Some poms have repositories defined:" + System.lineSeparator()); + + for (Model model : models) { + if (banRepositories) { + List repos = model.getRepositories(); + if (repos != null && !repos.isEmpty()) { + List bannedRepos = + findBannedRepositories(repos, allowedRepositories, allowSnapshotRepositories); + if (!bannedRepos.isEmpty()) { + badModels.add(model); + newMsg.append(model.getGroupId() + ":" + model.getArtifactId() + VERSION + model.getVersion() + + " has repositories " + bannedRepos); } } - if (banPluginRepositories) { - List repos = model.getPluginRepositories(); - if (repos != null && !repos.isEmpty()) { - List bannedRepos = findBannedRepositories( - repos, allowedPluginRepositories, allowSnapshotPluginRepositories); - if (!bannedRepos.isEmpty()) { - badModels.add(model); - newMsg.append(model.getGroupId() + ":" + model.getArtifactId() + VERSION - + model.getVersion() + " has plugin repositories " + bannedRepos); - } + } + if (banPluginRepositories) { + List repos = model.getPluginRepositories(); + if (repos != null && !repos.isEmpty()) { + List bannedRepos = + findBannedRepositories(repos, allowedPluginRepositories, allowSnapshotPluginRepositories); + if (!bannedRepos.isEmpty()) { + badModels.add(model); + newMsg.append(model.getGroupId() + ":" + model.getArtifactId() + VERSION + model.getVersion() + + " has plugin repositories " + bannedRepos); } } } + } - // if anything was found, log it then append the - // optional message. - if (!badModels.isEmpty()) { - String message = getMessage(); - if (StringUtils.isNotEmpty(message)) { - newMsg.append(message); - } - - throw new EnforcerRuleException(newMsg.toString()); + // if anything was found, log it then append the + // optional message. + if (!badModels.isEmpty()) { + if (StringUtils.isNotEmpty(message)) { + newMsg.append(message); } - } catch (ExpressionEvaluationException e) { - throw new EnforcerRuleException(e.getLocalizedMessage()); + throw new EnforcerRuleException(newMsg.toString()); } } /** - * - * @param repos all repositories, never {@code null} - * @param allowedRepos allowed repositories, never {@code null} + * @param repos all repositories, never {@code null} + * @param allowedRepos allowed repositories, never {@code null} * @param allowSnapshots * @return List of banned repositoreis. */ diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactMatcher.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ArtifactMatcher.java similarity index 99% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactMatcher.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ArtifactMatcher.java index c3e8653a..8e20d1bc 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactMatcher.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ArtifactMatcher.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import java.util.Collection; import java.util.HashSet; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactUtils.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ArtifactUtils.java similarity index 98% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactUtils.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ArtifactUtils.java index c5c09bd6..68164d3b 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactUtils.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ArtifactUtils.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import java.util.Collection; import java.util.HashSet; @@ -31,7 +31,6 @@ import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.apache.maven.execution.MavenSession; import org.apache.maven.model.DependencyManagement; -import org.apache.maven.plugins.enforcer.utils.ArtifactMatcher.Pattern; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; @@ -203,6 +202,6 @@ public static boolean matchDependencyArtifact(Artifact artifact, Collectiontrue if the artifact matches one of the patterns */ static boolean compareDependency(String pattern, Artifact artifact) { - return new Pattern(pattern).match(artifact); + return new ArtifactMatcher.Pattern(pattern).match(artifact); } } diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/DependencyVersionMap.java similarity index 99% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/DependencyVersionMap.java index 5f3ce3b9..01567fc4 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/DependencyVersionMap.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import java.util.ArrayList; import java.util.HashMap; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DistributionManagementCheck.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/DistributionManagementCheck.java similarity index 98% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DistributionManagementCheck.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/DistributionManagementCheck.java index abaf5834..e294215b 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DistributionManagementCheck.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/DistributionManagementCheck.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.model.DistributionManagement; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/EnforcerRuleUtils.java similarity index 98% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/EnforcerRuleUtils.java index 22839245..add55e17 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/EnforcerRuleUtils.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import java.util.List; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/NormalizeLineSeparatorReader.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/NormalizeLineSeparatorReader.java similarity index 99% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/NormalizeLineSeparatorReader.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/NormalizeLineSeparatorReader.java index 50fbe021..ef7ef253 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/NormalizeLineSeparatorReader.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/NormalizeLineSeparatorReader.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import java.io.FilterReader; import java.io.IOException; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentNodeProvider.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ParentNodeProvider.java similarity index 96% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentNodeProvider.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ParentNodeProvider.java index 0edecfaf..e99c0513 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentNodeProvider.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ParentNodeProvider.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import org.eclipse.aether.graph.DependencyNode; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentsVisitor.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ParentsVisitor.java similarity index 97% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentsVisitor.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ParentsVisitor.java index 0e9bd9ea..f2a39bbb 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentsVisitor.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/ParentsVisitor.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import java.util.HashMap; import java.util.Map; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/PluginWrapper.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/PluginWrapper.java similarity index 99% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/PluginWrapper.java rename to enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/PluginWrapper.java index e1d8e51a..18103fdb 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/PluginWrapper.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/utils/PluginWrapper.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import java.util.ArrayList; import java.util.List; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java index 5e5461f6..3910f6a0 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java @@ -23,9 +23,9 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.ArtifactUtils; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.logging.Log; -import org.apache.maven.plugins.enforcer.utils.ArtifactUtils; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; /** diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDependencyManagementScope.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDependencyManagementScope.java index 7507f24d..2b3dd87e 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDependencyManagementScope.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDependencyManagementScope.java @@ -25,10 +25,10 @@ import org.apache.maven.enforcer.rule.api.EnforcerRule2; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.ArtifactMatcher; import org.apache.maven.model.Dependency; import org.apache.maven.model.DependencyManagement; import org.apache.maven.plugin.logging.Log; -import org.apache.maven.plugins.enforcer.utils.ArtifactMatcher; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDistributionManagement.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDistributionManagement.java index ee6027a0..96df784a 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDistributionManagement.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDistributionManagement.java @@ -20,8 +20,8 @@ import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.DistributionManagementCheck; import org.apache.maven.plugin.logging.Log; -import org.apache.maven.plugins.enforcer.utils.DistributionManagementCheck; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDynamicVersions.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDynamicVersions.java index 8dadd4c6..aa684c07 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDynamicVersions.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanDynamicVersions.java @@ -32,9 +32,9 @@ import org.apache.maven.RepositoryUtils; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.ArtifactMatcher; +import org.apache.maven.enforcer.rules.utils.ArtifactUtils; import org.apache.maven.plugin.logging.Log; -import org.apache.maven.plugins.enforcer.utils.ArtifactMatcher; -import org.apache.maven.plugins.enforcer.utils.ArtifactUtils; import org.apache.maven.project.MavenProject; import org.apache.maven.shared.utils.logging.MessageBuilder; import org.apache.maven.shared.utils.logging.MessageUtils; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanTransitiveDependencies.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanTransitiveDependencies.java index 50beb204..7d96582a 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanTransitiveDependencies.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BanTransitiveDependencies.java @@ -27,9 +27,9 @@ import org.apache.maven.enforcer.rule.api.EnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.ArtifactMatcher; +import org.apache.maven.enforcer.rules.utils.ArtifactUtils; import org.apache.maven.execution.MavenSession; -import org.apache.maven.plugins.enforcer.utils.ArtifactMatcher; -import org.apache.maven.plugins.enforcer.utils.ArtifactUtils; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; import org.eclipse.aether.artifact.ArtifactTypeRegistry; import org.eclipse.aether.graph.Dependency; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependencies.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependencies.java index e65464ec..6d6596d0 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependencies.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependencies.java @@ -19,7 +19,7 @@ package org.apache.maven.plugins.enforcer; import org.apache.maven.artifact.Artifact; -import org.apache.maven.plugins.enforcer.utils.ArtifactUtils; +import org.apache.maven.enforcer.rules.utils.ArtifactUtils; /** * This rule checks that lists of dependencies are not included. diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependenciesBase.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependenciesBase.java index db16b617..e7776aca 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependenciesBase.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedDependenciesBase.java @@ -24,8 +24,8 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.ArtifactUtils; import org.apache.maven.execution.MavenSession; -import org.apache.maven.plugins.enforcer.utils.ArtifactUtils; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; import org.eclipse.aether.graph.DependencyNode; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedPlugins.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedPlugins.java index 03deb7c3..73db1749 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedPlugins.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedPlugins.java @@ -21,8 +21,8 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.ArtifactUtils; import org.apache.maven.execution.MavenSession; -import org.apache.maven.plugins.enforcer.utils.ArtifactUtils; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; /** diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java index 12149302..7d8503b6 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java @@ -25,9 +25,9 @@ import org.apache.maven.enforcer.rule.api.EnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.ArtifactUtils; +import org.apache.maven.enforcer.rules.utils.DependencyVersionMap; import org.apache.maven.plugin.logging.Log; -import org.apache.maven.plugins.enforcer.utils.ArtifactUtils; -import org.apache.maven.plugins.enforcer.utils.DependencyVersionMap; import org.eclipse.aether.collection.DependencyCollectionContext; import org.eclipse.aether.collection.DependencySelector; import org.eclipse.aether.graph.Dependency; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java index 429adce5..eb751614 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java @@ -37,6 +37,8 @@ import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.EnforcerRuleUtils; +import org.apache.maven.enforcer.rules.utils.PluginWrapper; import org.apache.maven.execution.MavenSession; import org.apache.maven.lifecycle.DefaultLifecycles; import org.apache.maven.lifecycle.Lifecycle; @@ -56,8 +58,6 @@ import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugin.version.PluginVersionNotFoundException; import org.apache.maven.plugin.version.PluginVersionResolutionException; -import org.apache.maven.plugins.enforcer.utils.EnforcerRuleUtils; -import org.apache.maven.plugins.enforcer.utils.PluginWrapper; import org.apache.maven.project.MavenProject; import org.apache.maven.rtinfo.RuntimeInformation; import org.apache.maven.settings.Settings; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseDeps.java index f78ff3a2..3875a7d4 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseDeps.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireReleaseDeps.java @@ -24,12 +24,12 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; -import org.apache.maven.plugins.enforcer.utils.ArtifactUtils; +import org.apache.maven.enforcer.rules.utils.ArtifactUtils; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; import static java.util.Optional.ofNullable; -import static org.apache.maven.plugins.enforcer.utils.ArtifactUtils.matchDependencyArtifact; +import static org.apache.maven.enforcer.rules.utils.ArtifactUtils.matchDependencyArtifact; /** * This rule checks that no snapshots are included. diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireTextFileChecksum.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireTextFileChecksum.java index 7d3a31ee..17dfcd27 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireTextFileChecksum.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireTextFileChecksum.java @@ -28,8 +28,8 @@ import org.apache.commons.lang3.StringUtils; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; -import org.apache.maven.plugins.enforcer.utils.NormalizeLineSeparatorReader; -import org.apache.maven.plugins.enforcer.utils.NormalizeLineSeparatorReader.LineSeparator; +import org.apache.maven.enforcer.rules.utils.NormalizeLineSeparatorReader; +import org.apache.maven.enforcer.rules.utils.NormalizeLineSeparatorReader.LineSeparator; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; /** diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java index 9369743a..acbcec6d 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java @@ -30,10 +30,10 @@ import org.apache.maven.artifact.versioning.OverConstrainedVersionException; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.ArtifactUtils; +import org.apache.maven.enforcer.rules.utils.ParentNodeProvider; +import org.apache.maven.enforcer.rules.utils.ParentsVisitor; import org.apache.maven.plugin.logging.Log; -import org.apache.maven.plugins.enforcer.utils.ArtifactUtils; -import org.apache.maven.plugins.enforcer.utils.ParentNodeProvider; -import org.apache.maven.plugins.enforcer.utils.ParentsVisitor; import org.apache.maven.shared.utils.logging.MessageUtils; import org.eclipse.aether.graph.DependencyNode; import org.eclipse.aether.graph.DependencyVisitor; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestAlwaysFail.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestAlwaysFail.java similarity index 93% rename from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestAlwaysFail.java rename to enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestAlwaysFail.java index f458dc32..6f2d2456 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestAlwaysFail.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestAlwaysFail.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer; +package org.apache.maven.enforcer.rules; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.junit.jupiter.api.Test; @@ -36,7 +36,7 @@ public void testExecute() { final AlwaysFail rule = new AlwaysFail(); try { // execute rule -- should throw EnforcerRuleException - rule.execute(EnforcerTestUtils.getHelper()); + rule.execute(); fail("Should throw EnforcerRuleException"); } catch (EnforcerRuleException e) { assertNotNull(e.getMessage()); diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVendor.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestRequireJavaVendor.java similarity index 73% rename from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVendor.java rename to enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestRequireJavaVendor.java index c4153dd3..4c2f7336 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVendor.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestRequireJavaVendor.java @@ -16,17 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer; +package org.apache.maven.enforcer.rules; import java.util.Arrays; import java.util.Collections; import org.apache.commons.lang3.SystemUtils; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; /** @@ -48,18 +48,16 @@ public void prepareTest() { void matchingInclude() throws EnforcerRuleException { // Set the required vendor to the current system vendor underTest.setIncludes(Collections.singletonList(SystemUtils.JAVA_VENDOR)); - final EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(); - underTest.execute(helper); - // No assert and no expected exception because this test should not fail + + assertThatCode(() -> underTest.execute()).doesNotThrowAnyException(); } @Test void nonMatchingInclude() { // Set the included vendor to something irrelevant underTest.setIncludes(Collections.singletonList(NON_MATCHING_VENDOR)); - final EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(); - assertThatThrownBy(() -> underTest.execute(helper)) + assertThatThrownBy(() -> underTest.execute()) .isInstanceOf(EnforcerRuleException.class) .hasMessage( "%s is not an included Required Java Vendor (JAVA_HOME=%s)", @@ -70,9 +68,8 @@ void nonMatchingInclude() { void matchingExclude() { // Set the excluded vendor to current vendor name underTest.setExcludes(Collections.singletonList(SystemUtils.JAVA_VENDOR)); - final EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(); - assertThatThrownBy(() -> underTest.execute(helper)) + assertThatThrownBy(() -> underTest.execute()) .isInstanceOf(EnforcerRuleException.class) .hasMessage( "%s is an excluded Required Java Vendor (JAVA_HOME=%s)", @@ -83,18 +80,16 @@ void matchingExclude() { void nonMatchingExclude() throws EnforcerRuleException { // Set the excluded vendor to something nonsensical underTest.setExcludes(Collections.singletonList(NON_MATCHING_VENDOR)); - final EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(); - underTest.execute(helper); - // No assert and no expected exception because this test should not fail + + assertThatCode(() -> underTest.execute()).doesNotThrowAnyException(); } @Test void matchingIncludeAndMatchingExclude() { underTest.setExcludes(Collections.singletonList(SystemUtils.JAVA_VENDOR)); underTest.setIncludes(Collections.singletonList(SystemUtils.JAVA_VENDOR)); - final EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(); - assertThatThrownBy(() -> underTest.execute(helper)) + assertThatThrownBy(() -> underTest.execute()) .isInstanceOf(EnforcerRuleException.class) .hasMessage( "%s is an excluded Required Java Vendor (JAVA_HOME=%s)", @@ -105,9 +100,8 @@ void matchingIncludeAndMatchingExclude() { void matchAnyExclude() { // Set a bunch of excluded vendors underTest.setExcludes(Arrays.asList(SystemUtils.JAVA_VENDOR, SystemUtils.JAVA_VENDOR + "modified")); - final EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(); - assertThatThrownBy(() -> underTest.execute(helper)) + assertThatThrownBy(() -> underTest.execute()) .isInstanceOf(EnforcerRuleException.class) .hasMessage( "%s is an excluded Required Java Vendor (JAVA_HOME=%s)", @@ -118,15 +112,13 @@ void matchAnyExclude() { void matchAnyInclude() throws EnforcerRuleException { // Set a bunch of included vendors underTest.setIncludes(Arrays.asList(SystemUtils.JAVA_VENDOR, SystemUtils.JAVA_VENDOR + "modified")); - final EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(); - underTest.execute(helper); - // No assert and no expected exception because this test should not fail + + assertThatCode(() -> underTest.execute()).doesNotThrowAnyException(); } @Test void defaultRule() throws EnforcerRuleException { - final EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(); - underTest.execute(helper); - // No assert and no expected exception because this test should not fail + + assertThatCode(() -> underTest.execute()).doesNotThrowAnyException(); } } diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireNoRepositories.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestRequireNoRepositories.java similarity index 93% rename from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireNoRepositories.java rename to enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestRequireNoRepositories.java index 260e6918..ca8cc70e 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireNoRepositories.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/TestRequireNoRepositories.java @@ -16,20 +16,19 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer; +package org.apache.maven.enforcer.rules; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.apache.maven.enforcer.rule.api.EnforcerLogger; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.apache.maven.execution.MavenSession; import org.apache.maven.execution.ProjectDependencyGraph; import org.apache.maven.model.Model; import org.apache.maven.model.Repository; import org.apache.maven.model.RepositoryPolicy; -import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; import org.junit.jupiter.api.BeforeEach; @@ -46,7 +45,6 @@ * @author Karl Heinz Marbaise */ public class TestRequireNoRepositories { - private EnforcerRuleHelper helper; private RequireNoRepositories rule; @@ -55,15 +53,10 @@ public class TestRequireNoRepositories { @BeforeEach public void before() throws ExpressionEvaluationException { session = mock(MavenSession.class); - helper = mock(EnforcerRuleHelper.class); - when(helper.evaluate("${session}")).thenReturn(session); - - Log log = mock(Log.class); - when(helper.getLog()).thenReturn(log); - - rule = new RequireNoRepositories(); + rule = new RequireNoRepositories(session); rule.setMessage("my message"); + rule.setLog(mock(EnforcerLogger.class)); } private MavenProject createMavenProject() { @@ -171,7 +164,7 @@ public void testAllBannedNoRepositories() throws EnforcerRuleException { MavenProject baseProject = createStandAloneProject(); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } /** @@ -184,7 +177,7 @@ public void testAllBannedWithRepository() { addRepository(baseProject, createRepository("repo", "http://example.com/repo")); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); }); } @@ -198,7 +191,7 @@ public void testAllBannedWithPluginRepository() { addPluginRepository(baseProject, createRepository("repo", "http://example.com/repo")); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); }); } @@ -214,7 +207,7 @@ public void testAllBannedWithAllowedRepositories() throws EnforcerRuleException addRepository(baseProject, createRepository(repositoryId, "http://example.com/repo")); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } /** @@ -230,7 +223,7 @@ public void testRepositoriesNotBannedWithSingleRepository() throws EnforcerRuleE addRepository(baseProject, createRepository(repositoryId, "http://example.com/repo")); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } /** @@ -243,7 +236,7 @@ public void testRepositoriesNotBannedWithOutAnyRepository() throws EnforcerRuleE MavenProject baseProject = createStandAloneProject(); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } /** @@ -259,7 +252,7 @@ public void testAllBannedWithAllowedPluginRepositories() throws EnforcerRuleExce addPluginRepository(baseProject, createRepository(repositoryId, "http://example.com/repo")); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } /** @@ -275,7 +268,7 @@ public void testPluginRepositoriesNotBannedWithSinglePluginRepository() throws E addPluginRepository(baseProject, createRepository(repositoryId, "http://example.com/repo")); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } /** @@ -288,7 +281,7 @@ public void testPluginRepositoriesNotBannedWithOutAnyRepository() throws Enforce MavenProject baseProject = createStandAloneProject(); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } @Test @@ -298,7 +291,7 @@ public void testAllBannedWithSnapshotRepository() { addRepository(baseProject, createSnapshotRepository("repo", "http://example.com/repo")); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); }); } @@ -311,7 +304,7 @@ public void testAllBannedWithSnapshotRepositoryAllowedRepositories() throws Enfo addRepository(baseProject, createSnapshotRepository(repositoryId, "http://example.com/repo")); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } @Test @@ -323,7 +316,7 @@ public void testAllBannedWithSnapshotRepositoryAndSetAllowSnapshotRepositories() addRepository(baseProject, createSnapshotRepository(repositoryId, "http://example.com/repo")); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } @Test @@ -336,7 +329,7 @@ public void testAllBannedWithSnapshotPluginRepositoryAndSetAllowSnapshotPluginRe addPluginRepository(baseProject, createSnapshotRepository(repositoryId, "http://example.com/repo")); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } @Test @@ -345,7 +338,7 @@ public void testAllBannedWithEmptyRepository() throws EnforcerRuleException { addEmptyRepository(baseProject); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } @Test @@ -354,6 +347,6 @@ public void testAllBannedWithEmptyPluginRepository() throws EnforcerRuleExceptio addEmptyPluginRepository(baseProject); setupSortedProjects(Collections.singletonList(baseProject)); - rule.execute(helper); + rule.execute(); } } diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/DependencyNodeBuilder.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/DependencyNodeBuilder.java similarity index 98% rename from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/DependencyNodeBuilder.java rename to enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/DependencyNodeBuilder.java index 40795234..fb3940a8 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/DependencyNodeBuilder.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/DependencyNodeBuilder.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import java.util.ArrayList; import java.util.List; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtilsHelper.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/EnforcerRuleUtilsHelper.java similarity index 97% rename from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtilsHelper.java rename to enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/EnforcerRuleUtilsHelper.java index 207e4a72..e03ce1a9 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtilsHelper.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/EnforcerRuleUtilsHelper.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import org.apache.maven.enforcer.rule.api.EnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/MockEnforcerExpressionEvaluator.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/MockEnforcerExpressionEvaluator.java similarity index 97% rename from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/MockEnforcerExpressionEvaluator.java rename to enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/MockEnforcerExpressionEvaluator.java index 893ca70b..80f47bfe 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/MockEnforcerExpressionEvaluator.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/MockEnforcerExpressionEvaluator.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.MojoExecution; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestArtifactMatcher.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/TestArtifactMatcher.java similarity index 98% rename from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestArtifactMatcher.java rename to enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/TestArtifactMatcher.java index ffdc9df6..4f67e433 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestArtifactMatcher.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/TestArtifactMatcher.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import java.util.ArrayList; import java.util.Collection; @@ -27,7 +27,7 @@ import org.apache.maven.artifact.handler.DefaultArtifactHandler; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; -import org.apache.maven.plugins.enforcer.utils.ArtifactMatcher.Pattern; +import org.apache.maven.enforcer.rules.utils.ArtifactMatcher.Pattern; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestMockEnforcerExpressionEvaluator.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/TestMockEnforcerExpressionEvaluator.java similarity index 97% rename from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestMockEnforcerExpressionEvaluator.java rename to enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/TestMockEnforcerExpressionEvaluator.java index 4a9feffd..7894b25b 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestMockEnforcerExpressionEvaluator.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/TestMockEnforcerExpressionEvaluator.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.PluginParameterExpressionEvaluator; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestNormalizeLineSeparatorReader.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/TestNormalizeLineSeparatorReader.java similarity index 94% rename from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestNormalizeLineSeparatorReader.java rename to enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/TestNormalizeLineSeparatorReader.java index 30e462ce..1ebfd0a9 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/utils/TestNormalizeLineSeparatorReader.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/utils/TestNormalizeLineSeparatorReader.java @@ -16,14 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer.utils; +package org.apache.maven.enforcer.rules.utils; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import org.apache.commons.io.IOUtils; -import org.apache.maven.plugins.enforcer.utils.NormalizeLineSeparatorReader.LineSeparator; +import org.apache.maven.enforcer.rules.utils.NormalizeLineSeparatorReader.LineSeparator; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java index c1ef1e21..aa3d26d8 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java +++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java @@ -21,6 +21,8 @@ import java.util.Properties; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.DependencyNodeBuilder; +import org.apache.maven.enforcer.rules.utils.MockEnforcerExpressionEvaluator; import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenExecutionResult; import org.apache.maven.execution.MavenSession; @@ -31,8 +33,6 @@ import org.apache.maven.plugin.PluginParameterExpressionEvaluator; import org.apache.maven.plugin.descriptor.MojoDescriptor; import org.apache.maven.plugin.logging.SystemStreamLog; -import org.apache.maven.plugins.enforcer.utils.DependencyNodeBuilder; -import org.apache.maven.plugins.enforcer.utils.MockEnforcerExpressionEvaluator; import org.apache.maven.project.MavenProject; import org.apache.maven.project.ProjectBuildingRequest; import org.codehaus.plexus.PlexusContainer; @@ -58,7 +58,6 @@ public final class EnforcerTestUtils { private static RepositorySystem REPOSITORY_SYSTEM = mock(RepositorySystem.class); - ; /** * Gets the maven session. diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDepsTest.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDepsTest.java index ef2a11db..59be79b9 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDepsTest.java +++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDepsTest.java @@ -20,7 +20,7 @@ import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; -import org.apache.maven.plugins.enforcer.utils.DependencyNodeBuilder; +import org.apache.maven.enforcer.rules.utils.DependencyNodeBuilder; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedDependencies.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedDependencies.java index c7663347..069fb32d 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedDependencies.java +++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedDependencies.java @@ -21,7 +21,7 @@ import java.io.IOException; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.plugins.enforcer.utils.DependencyNodeBuilder; +import org.apache.maven.enforcer.rules.utils.DependencyNodeBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java index 4fa906f9..c1bd3f10 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java +++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java @@ -25,9 +25,9 @@ import java.util.Set; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.PluginWrapper; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugins.enforcer.utils.PluginWrapper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java index 3be6b31f..41569e17 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java +++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java @@ -22,8 +22,8 @@ import java.util.Collections; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.EnforcerRuleUtilsHelper; import org.apache.maven.plugin.testing.ArtifactStubFactory; -import org.apache.maven.plugins.enforcer.utils.EnforcerRuleUtilsHelper; import org.apache.maven.project.MavenProject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseVersion.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseVersion.java index e6e31177..bf8da0bf 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseVersion.java +++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseVersion.java @@ -22,8 +22,8 @@ import org.apache.maven.enforcer.rule.api.EnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.EnforcerRuleUtilsHelper; import org.apache.maven.plugin.testing.ArtifactStubFactory; -import org.apache.maven.plugins.enforcer.utils.EnforcerRuleUtilsHelper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireSnapshotVersion.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireSnapshotVersion.java index f780a5f3..1da0d7b4 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireSnapshotVersion.java +++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireSnapshotVersion.java @@ -21,8 +21,8 @@ import java.io.IOException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.EnforcerRuleUtilsHelper; import org.apache.maven.plugin.testing.ArtifactStubFactory; -import org.apache.maven.plugins.enforcer.utils.EnforcerRuleUtilsHelper; import org.apache.maven.project.MavenProject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireTextFileChecksum.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireTextFileChecksum.java index b1031bdd..4d7fb162 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireTextFileChecksum.java +++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireTextFileChecksum.java @@ -24,7 +24,7 @@ import java.nio.charset.StandardCharsets; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.plugins.enforcer.utils.NormalizeLineSeparatorReader.LineSeparator; +import org.apache.maven.enforcer.rules.utils.NormalizeLineSeparatorReader.LineSeparator; import org.codehaus.plexus.util.FileUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/maven-enforcer-plugin/pom.xml b/maven-enforcer-plugin/pom.xml index dffedf4f..8feed4ec 100644 --- a/maven-enforcer-plugin/pom.xml +++ b/maven-enforcer-plugin/pom.xml @@ -52,6 +52,12 @@ maven-plugin-annotations provided + + org.slf4j + slf4j-api + 1.7.36 + provided + org.apache.maven.enforcer @@ -62,11 +68,6 @@ enforcer-rules - - org.apache.maven.enforcer - enforcer-rules - test-jar - org.mockito mockito-junit-jupiter diff --git a/maven-enforcer-plugin/src/it/projects/always-fail-warn/verify.groovy b/maven-enforcer-plugin/src/it/projects/always-fail-warn/verify.groovy index c05c6772..4b5d6c4a 100644 --- a/maven-enforcer-plugin/src/it/projects/always-fail-warn/verify.groovy +++ b/maven-enforcer-plugin/src/it/projects/always-fail-warn/verify.groovy @@ -17,7 +17,7 @@ * under the License. */ File buildLog = new File( basedir, 'build.log' ) -assert buildLog.text.contains( '[WARNING] Rule 0: org.apache.maven.plugins.enforcer.AlwaysFail warned with message:' ) +assert buildLog.text.contains( '[WARNING] Rule 0: org.apache.maven.enforcer.rules.AlwaysFail warned with message:' ) \ No newline at end of file diff --git a/maven-enforcer-plugin/src/it/projects/always-fail/pom.xml b/maven-enforcer-plugin/src/it/projects/always-fail/pom.xml index 53c77c89..89127c3c 100644 --- a/maven-enforcer-plugin/src/it/projects/always-fail/pom.xml +++ b/maven-enforcer-plugin/src/it/projects/always-fail/pom.xml @@ -43,7 +43,9 @@ under the License. - + + alwaysFail test message + diff --git a/maven-enforcer-plugin/src/it/projects/always-fail/verify.groovy b/maven-enforcer-plugin/src/it/projects/always-fail/verify.groovy new file mode 100644 index 00000000..36567374 --- /dev/null +++ b/maven-enforcer-plugin/src/it/projects/always-fail/verify.groovy @@ -0,0 +1,24 @@ +/* + * 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. + */ +File buildLog = new File( basedir, 'build.log' ) +assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.enforcer.rules.AlwaysFail failed with message:' ) +assert buildLog.text.contains( 'alwaysFail test message' ) + + + \ No newline at end of file diff --git a/maven-enforcer-plugin/src/it/projects/always-pass/verify.groovy b/maven-enforcer-plugin/src/it/projects/always-pass/verify.groovy new file mode 100644 index 00000000..4079a1c1 --- /dev/null +++ b/maven-enforcer-plugin/src/it/projects/always-pass/verify.groovy @@ -0,0 +1,23 @@ +/* + * 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. + */ +File buildLog = new File( basedir, 'build.log' ) +assert buildLog.text.contains( '[INFO] Rule 0: org.apache.maven.plugins.enforcer.AlwaysPass executed' ) + + + \ No newline at end of file diff --git a/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/invoker.properties new file mode 100644 index 00000000..2dca44cd --- /dev/null +++ b/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/invoker.properties @@ -0,0 +1,18 @@ +# 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. + +invoker.goals = -T3 verify \ No newline at end of file diff --git a/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/mod1/pom.xml b/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/mod1/pom.xml new file mode 100644 index 00000000..08882984 --- /dev/null +++ b/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/mod1/pom.xml @@ -0,0 +1,33 @@ + + + + + + 4.0.0 + + + org.apache.maven.its.enforcer + test-multimodule-project + 1.0 + + + test-multimodule-mod1 + + diff --git a/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/mod2/pom.xml b/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/mod2/pom.xml new file mode 100644 index 00000000..64dbbc9c --- /dev/null +++ b/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/mod2/pom.xml @@ -0,0 +1,33 @@ + + + + + + 4.0.0 + + + org.apache.maven.its.enforcer + test-multimodule-project + 1.0 + + + test-multimodule-mod2 + + diff --git a/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/pom.xml new file mode 100644 index 00000000..10061ce3 --- /dev/null +++ b/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/pom.xml @@ -0,0 +1,64 @@ + + + + + + 4.0.0 + + org.apache.maven.its.enforcer + test-multimodule-project + 1.0 + pom + + + + + + mod1 + mod2 + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + @project.version@ + + + test + + enforce + + + + + + NOT-EXISTING-VENDOR + + + + + + + + + + diff --git a/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/verify.groovy new file mode 100644 index 00000000..7fdcfe38 --- /dev/null +++ b/maven-enforcer-plugin/src/it/projects/require-java-vendor-multi-module/verify.groovy @@ -0,0 +1,25 @@ +/* + * 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. + */ + +File buildLog = new File(basedir, 'build.log') + +rulesExecuted = buildLog.readLines() + .findAll {it == '[INFO] Rule 0: org.apache.maven.enforcer.rules.RequireJavaVendor executed'} + +assert rulesExecuted.size() == 1 \ No newline at end of file diff --git a/maven-enforcer-plugin/src/it/projects/require-no-repositories-allow-plugin-repo/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-no-repositories-allow-plugin-repo/verify.groovy index 01f63fb9..cc7a56ed 100644 --- a/maven-enforcer-plugin/src/it/projects/require-no-repositories-allow-plugin-repo/verify.groovy +++ b/maven-enforcer-plugin/src/it/projects/require-no-repositories-allow-plugin-repo/verify.groovy @@ -17,6 +17,6 @@ * under the License. */ File buildLog = new File( basedir, 'build.log' ) -assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.plugins.enforcer.RequireNoRepositories failed with message:' ) +assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.enforcer.rules.RequireNoRepositories failed with message:' ) assert buildLog.text.contains( 'Some poms have repositories defined:' ) assert buildLog.text.contains( 'org.apache.maven.its.enforcer:test version:1.0 has repositories [com.asual.maven.public]' ) diff --git a/maven-enforcer-plugin/src/it/projects/require-no-repositories-allow-repo/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-no-repositories-allow-repo/verify.groovy index 639dd56b..a6a99791 100644 --- a/maven-enforcer-plugin/src/it/projects/require-no-repositories-allow-repo/verify.groovy +++ b/maven-enforcer-plugin/src/it/projects/require-no-repositories-allow-repo/verify.groovy @@ -17,6 +17,6 @@ * under the License. */ File buildLog = new File( basedir, 'build.log' ) -assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.plugins.enforcer.RequireNoRepositories failed with message:' ) +assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.enforcer.rules.RequireNoRepositories failed with message:' ) assert buildLog.text.contains( 'Some poms have repositories defined:' ) assert buildLog.text.contains( 'org.apache.maven.its.enforcer:test version:1.0 has plugin repositories [plugin-repo]' ) diff --git a/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/verify.groovy index 01f63fb9..cc7a56ed 100644 --- a/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/verify.groovy +++ b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure/verify.groovy @@ -17,6 +17,6 @@ * under the License. */ File buildLog = new File( basedir, 'build.log' ) -assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.plugins.enforcer.RequireNoRepositories failed with message:' ) +assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.enforcer.rules.RequireNoRepositories failed with message:' ) assert buildLog.text.contains( 'Some poms have repositories defined:' ) assert buildLog.text.contains( 'org.apache.maven.its.enforcer:test version:1.0 has repositories [com.asual.maven.public]' ) diff --git a/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_allowed-plugin-repo/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_allowed-plugin-repo/verify.groovy index 01f63fb9..cc7a56ed 100644 --- a/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_allowed-plugin-repo/verify.groovy +++ b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_allowed-plugin-repo/verify.groovy @@ -17,6 +17,6 @@ * under the License. */ File buildLog = new File( basedir, 'build.log' ) -assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.plugins.enforcer.RequireNoRepositories failed with message:' ) +assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.enforcer.rules.RequireNoRepositories failed with message:' ) assert buildLog.text.contains( 'Some poms have repositories defined:' ) assert buildLog.text.contains( 'org.apache.maven.its.enforcer:test version:1.0 has repositories [com.asual.maven.public]' ) diff --git a/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_plugin-repositories/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_plugin-repositories/verify.groovy index 634d4aa9..8096a1d9 100644 --- a/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_plugin-repositories/verify.groovy +++ b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_plugin-repositories/verify.groovy @@ -17,6 +17,6 @@ * under the License. */ File buildLog = new File( basedir, 'build.log' ) -assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.plugins.enforcer.RequireNoRepositories failed with message:' ) +assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.enforcer.rules.RequireNoRepositories failed with message:' ) assert buildLog.text.contains( 'Some poms have repositories defined:' ) assert buildLog.text.contains( 'org.apache.maven.its.enforcer:test version:1.0 has plugin repositories [repo]' ) diff --git a/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_repositories/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_repositories/verify.groovy index 01f63fb9..cc7a56ed 100644 --- a/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_repositories/verify.groovy +++ b/maven-enforcer-plugin/src/it/projects/require-no-repositories_failure_repositories/verify.groovy @@ -17,6 +17,6 @@ * under the License. */ File buildLog = new File( basedir, 'build.log' ) -assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.plugins.enforcer.RequireNoRepositories failed with message:' ) +assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.enforcer.rules.RequireNoRepositories failed with message:' ) assert buildLog.text.contains( 'Some poms have repositories defined:' ) assert buildLog.text.contains( 'org.apache.maven.its.enforcer:test version:1.0 has repositories [com.asual.maven.public]' ) diff --git a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java index 24c2545c..ad2a8f7c 100644 --- a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java +++ b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java @@ -25,9 +25,13 @@ import java.util.Optional; import java.util.stream.Collectors; +import org.apache.maven.enforcer.rule.api.AbstractEnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerLevel; +import org.apache.maven.enforcer.rule.api.EnforcerLogger; import org.apache.maven.enforcer.rule.api.EnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRule2; +import org.apache.maven.enforcer.rule.api.EnforcerRuleBase; +import org.apache.maven.enforcer.rule.api.EnforcerRuleError; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.apache.maven.execution.MavenSession; @@ -41,6 +45,11 @@ 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.plugins.enforcer.internal.EnforcerLoggerError; +import org.apache.maven.plugins.enforcer.internal.EnforcerLoggerWarn; +import org.apache.maven.plugins.enforcer.internal.EnforcerRuleCache; +import org.apache.maven.plugins.enforcer.internal.EnforcerRuleDesc; +import org.apache.maven.plugins.enforcer.internal.EnforcerRuleManager; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.configuration.DefaultPlexusConfiguration; @@ -147,6 +156,9 @@ public class EnforceMojo extends AbstractMojo { @Component private EnforcerRuleManager enforcerRuleManager; + @Component + private EnforcerRuleCache ruleCache; + private List rulesToExecute; /** @@ -180,6 +192,10 @@ public void setCommandLineRules(List rulesToExecute) throws MojoExecutio setRulesToExecute(rulesToExecute); } + private EnforcerLogger enforcerLoggerError; + + private EnforcerLogger enforcerLoggerWarn; + @Override public void execute() throws MojoExecutionException { Log log = this.getLog(); @@ -209,6 +225,9 @@ public void execute() throws MojoExecutionException { } } + enforcerLoggerError = new EnforcerLoggerError(log); + enforcerLoggerWarn = new EnforcerLoggerWarn(log); + // messages with warn/error flag Map messages = new LinkedHashMap<>(); @@ -225,55 +244,31 @@ public void execute() throws MojoExecutionException { boolean hasErrors = false; // go through each rule - for (int i = 0; i < rulesList.size(); i++) { + for (int ruleIndex = 0; ruleIndex < rulesList.size(); ruleIndex++) { // prevent against empty rules - EnforcerRuleDesc ruleDesc = rulesList.get(i); + EnforcerRuleDesc ruleDesc = rulesList.get(ruleIndex); if (ruleDesc != null) { - EnforcerRule rule = ruleDesc.getRule(); + EnforcerRuleBase rule = ruleDesc.getRule(); EnforcerLevel level = getLevel(rule); - // store the current rule for - // logging purposes - String currentRule = rule.getClass().getName(); try { - if (ignoreCache || shouldExecute(rule)) { - // execute the rule - // noinspection SynchronizationOnLocalVariableOrMethodParameter - synchronized (rule) { - log.info("Executing rule: " + currentRule); - rule.execute(helper); - } - } + executeRule(ruleIndex, ruleDesc, helper); + } catch (EnforcerRuleError e) { + String ruleMessage = createRuleMessage(ruleIndex, ruleDesc, EnforcerLevel.ERROR, e); + throw new MojoExecutionException(ruleMessage, e); } catch (EnforcerRuleException e) { - // i can throw an exception - // because failfast will be - // false if fail is false. + + String ruleMessage = createRuleMessage(ruleIndex, ruleDesc, level, e); + if (failFast && level == EnforcerLevel.ERROR) { - throw new MojoExecutionException( - currentRule + " failed with message:" + System.lineSeparator() + e.getMessage(), e); + throw new MojoExecutionException(ruleMessage, e); + } + + if (level == EnforcerLevel.ERROR) { + hasErrors = true; + messages.put(ruleMessage, true); } else { - // log a warning in case the exception message is missing - // so that the user can figure out what is going on - final String exceptionMessage = e.getMessage(); - if (exceptionMessage != null) { - log.debug("Adding " + level + " message due to exception", e); - } else { - log.warn("Rule " + i + ": " + currentRule + " failed without a message", e); - } - // add the 'failed/warned' message including exceptionMessage - // which might be null in rare cases - if (level == EnforcerLevel.ERROR) { - hasErrors = true; - messages.put( - "Rule " + i + ": " + currentRule + " failed with message:" + System.lineSeparator() - + exceptionMessage, - true); - } else { - messages.put( - "Rule " + i + ": " + currentRule + " warned with message:" + System.lineSeparator() - + exceptionMessage, - false); - } + messages.put(ruleMessage, false); } } } @@ -294,6 +289,52 @@ public void execute() throws MojoExecutionException { } } + private void executeRule(int ruleIndex, EnforcerRuleDesc ruleDesc, EnforcerRuleHelper helper) + throws EnforcerRuleException { + + if (getLog().isDebugEnabled()) { + getLog().debug(String.format("Executing Rule %d: %s", ruleIndex, ruleDesc.getRule())); + } + + long startTime = System.currentTimeMillis(); + + try { + if (ruleDesc.getRule() instanceof EnforcerRule) { + executeRuleOld(ruleIndex, ruleDesc, helper); + } else if (ruleDesc.getRule() instanceof AbstractEnforcerRule) { + executeRuleNew(ruleIndex, ruleDesc); + } + } finally { + if (getLog().isDebugEnabled()) { + long workTime = System.currentTimeMillis() - startTime; + getLog().debug(String.format( + "Finish Rule %d: %s take %d ms", ruleIndex, getRuleName(ruleDesc), workTime)); + } + } + } + + private void executeRuleOld(int ruleIndex, EnforcerRuleDesc ruleDesc, EnforcerRuleHelper helper) + throws EnforcerRuleException { + + EnforcerRule rule = (EnforcerRule) ruleDesc.getRule(); + + if (ignoreCache || shouldExecute(rule)) { + rule.execute(helper); + getLog().info(String.format("Rule %d: %s executed", ruleIndex, getRuleName(ruleDesc))); + } + } + + private void executeRuleNew(int ruleIndex, EnforcerRuleDesc ruleDesc) throws EnforcerRuleException { + + AbstractEnforcerRule rule = (AbstractEnforcerRule) ruleDesc.getRule(); + rule.setLog(rule.getLevel() == EnforcerLevel.ERROR ? enforcerLoggerError : enforcerLoggerWarn); + + if (ignoreCache || !ruleCache.isCached(rule)) { + rule.execute(); + getLog().info(String.format("Rule %d: %s executed", ruleIndex, getRuleName(ruleDesc))); + } + } + /** * Create rules configuration based on command line provided rules list. * @@ -316,7 +357,6 @@ private Optional createRulesFromCommandLineOptions() { * Filter out (remove) rules that have been specifically skipped via additional configuration. * * @param allRules list of enforcer rules to go through and filter - * * @return list of filtered rules */ private List filterOutSkippedRules(List allRules) { @@ -379,18 +419,50 @@ public boolean isFailFast() { return failFast; } - protected String createRuleMessage(int i, String currentRule, EnforcerRuleException e) { - return "Rule " + i + ": " + currentRule + " failed with message:" + System.lineSeparator() + e.getMessage(); + private String createRuleMessage( + int ruleIndex, EnforcerRuleDesc ruleDesc, EnforcerLevel level, EnforcerRuleException e) { + + StringBuilder result = new StringBuilder(); + result.append("Rule ").append(ruleIndex).append(": ").append(getRuleName(ruleDesc)); + + if (level == EnforcerLevel.ERROR) { + result.append(" failed"); + } else { + result.append(" warned"); + } + + if (e.getMessage() != null) { + result.append(" with message:").append(System.lineSeparator()).append(e.getMessage()); + } else { + result.append(" without a message"); + } + + return result.toString(); + } + + private String getRuleName(EnforcerRuleDesc ruleDesc) { + + Class ruleClass = ruleDesc.getRule().getClass(); + + String ruleName = ruleClass.getName(); + + if (!ruleClass.getSimpleName().equalsIgnoreCase(ruleDesc.getName())) { + ruleName += "(" + ruleDesc.getName() + ")"; + } + + return ruleName; } /** * Returns the level of the rule, defaults to {@link EnforcerLevel#ERROR} for backwards compatibility. * - * @param rule might be of type {@link EnforcerRule2}. + * @param rule might be of type {{@link AbstractEnforcerRule} or {@link EnforcerRule2} * @return level of the rule. */ - private EnforcerLevel getLevel(EnforcerRule rule) { - if (rule instanceof EnforcerRule2) { + private EnforcerLevel getLevel(EnforcerRuleBase rule) { + if (rule instanceof AbstractEnforcerRule) { + return ((AbstractEnforcerRule) rule).getLevel(); + } else if (rule instanceof EnforcerRule2) { return ((EnforcerRule2) rule).getLevel(); } else { return EnforcerLevel.ERROR; diff --git a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/AbstractEnforcerLogger.java b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/AbstractEnforcerLogger.java new file mode 100644 index 00000000..bfd0920f --- /dev/null +++ b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/AbstractEnforcerLogger.java @@ -0,0 +1,88 @@ +/* + * 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. + */ +package org.apache.maven.plugins.enforcer.internal; + +import java.util.Objects; +import java.util.function.Supplier; + +import org.apache.maven.enforcer.rule.api.EnforcerLogger; +import org.apache.maven.plugin.logging.Log; + +/** + * Base EnforcerLogger implementation + * + * @author Slawomir Jaranowski + * @since 3.2.0 + */ +public abstract class AbstractEnforcerLogger implements EnforcerLogger { + + protected final Log log; + + protected AbstractEnforcerLogger(Log log) { + this.log = Objects.requireNonNull(log, "log must be not null"); + } + + @Override + public void debug(CharSequence message) { + log.debug(message); + } + + @Override + public void debug(Supplier messageSupplier) { + if (log.isDebugEnabled()) { + log.debug(messageSupplier.get()); + } + } + + @Override + public void info(CharSequence message) { + log.info(message); + } + + @Override + public void info(Supplier messageSupplier) { + if (log.isInfoEnabled()) { + log.info(messageSupplier.get()); + } + } + + @Override + public void warn(CharSequence message) { + log.warn(message); + } + + @Override + public void warn(Supplier messageSupplier) { + if (log.isWarnEnabled()) { + log.warn(messageSupplier.get()); + } + } + + @Override + public void error(CharSequence message) { + log.error(message); + } + + @Override + public void error(Supplier messageSupplier) { + if (log.isErrorEnabled()) { + log.error(messageSupplier.get()); + } + } +} diff --git a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerLoggerError.java b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerLoggerError.java new file mode 100644 index 00000000..981f939d --- /dev/null +++ b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerLoggerError.java @@ -0,0 +1,48 @@ +/* + * 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. + */ +package org.apache.maven.plugins.enforcer.internal; + +import java.util.function.Supplier; + +import org.apache.maven.plugin.logging.Log; + +/** + * EnforcerLogger implementation for {@code ERROR} execution level + * + * @author Slawomir Jaranowski + * @since 3.2.0 + */ +public class EnforcerLoggerError extends AbstractEnforcerLogger { + + public EnforcerLoggerError(Log log) { + super(log); + } + + @Override + public void warnOrError(CharSequence message) { + log.error(message); + } + + @Override + public void warnOrError(Supplier messageSupplier) { + if (log.isErrorEnabled()) { + log.error(messageSupplier.get()); + } + } +} diff --git a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerLoggerWarn.java b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerLoggerWarn.java new file mode 100644 index 00000000..3ec547ac --- /dev/null +++ b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerLoggerWarn.java @@ -0,0 +1,48 @@ +/* + * 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. + */ +package org.apache.maven.plugins.enforcer.internal; + +import java.util.function.Supplier; + +import org.apache.maven.plugin.logging.Log; + +/** + * EnforcerLogger implementation for {@code WARN} execution level + * + * @author Slawomir Jaranowski + * @since 3.2.0 + */ +public class EnforcerLoggerWarn extends AbstractEnforcerLogger { + + public EnforcerLoggerWarn(Log log) { + super(log); + } + + @Override + public void warnOrError(CharSequence message) { + log.warn(message); + } + + @Override + public void warnOrError(Supplier messageSupplier) { + if (log.isWarnEnabled()) { + log.warn(messageSupplier.get()); + } + } +} diff --git a/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleCache.java b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleCache.java new file mode 100644 index 00000000..14595deb --- /dev/null +++ b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleCache.java @@ -0,0 +1,70 @@ +/* + * 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. + */ +package org.apache.maven.plugins.enforcer.internal; + +import javax.inject.Named; +import javax.inject.Singleton; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.maven.enforcer.rule.api.AbstractEnforcerRule; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Service for manage rules cache storage. + * + * @author Slawomir Jaranowski + * @since 3.2.0 + */ +@Named +@Singleton +public class EnforcerRuleCache { + + private final Logger logger = LoggerFactory.getLogger(EnforcerRuleCache.class); + + private final Map, List> cache = new HashMap<>(); + + public boolean isCached(AbstractEnforcerRule rule) { + + String cacheId = rule.getCacheId(); + + if (cacheId == null) { + return false; + } + + Class ruleClass = rule.getClass(); + logger.debug("Check cache for {} with id {}", ruleClass, cacheId); + + synchronized (this) { + List cacheIdList = cache.computeIfAbsent(ruleClass, (k) -> new ArrayList<>()); + if (cacheIdList.contains(cacheId)) { + logger.debug("Already cached {} with id {}", ruleClass, cacheId); + return true; + } + logger.debug("Add cache {} with id {}", ruleClass, cacheId); + cacheIdList.add(cacheId); + } + + return false; + } +} diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EnforcerRuleDesc.java b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleDesc.java similarity index 70% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EnforcerRuleDesc.java rename to maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleDesc.java index 84d59775..ec0f8ed1 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EnforcerRuleDesc.java +++ b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleDesc.java @@ -16,24 +16,29 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer; +package org.apache.maven.plugins.enforcer.internal; -import org.apache.maven.enforcer.rule.api.EnforcerRule; +import org.apache.maven.enforcer.rule.api.EnforcerRuleBase; /** - * Description of rule to eecute. + * Description of rule to execute. + * + * @author Slawomir Jaranowski + * @since 3.2.0 */ public class EnforcerRuleDesc { private final String name; - private final EnforcerRule rule; + + private final EnforcerRuleBase rule; /** * Create a new Rule Description + * * @param name a rule name * @param rule a rule instance */ - EnforcerRuleDesc(String name, EnforcerRule rule) { + public EnforcerRuleDesc(String name, EnforcerRuleBase rule) { this.name = name; this.rule = rule; } @@ -42,7 +47,12 @@ public String getName() { return name; } - public EnforcerRule getRule() { + public EnforcerRuleBase getRule() { return rule; } + + @Override + public String toString() { + return "EnforcerRuleDesc[name=" + name + ", rule=" + rule + "]"; + } } diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EnforcerRuleManager.java b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleManager.java similarity index 62% rename from enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EnforcerRuleManager.java rename to maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleManager.java index 07531c9f..0b2cd725 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EnforcerRuleManager.java +++ b/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleManager.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer; +package org.apache.maven.plugins.enforcer.internal; import javax.inject.Inject; import javax.inject.Named; @@ -25,33 +25,52 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; -import org.apache.maven.enforcer.rule.api.EnforcerRule; +import org.apache.maven.enforcer.rule.api.EnforcerRuleBase; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.PluginParameterExpressionEvaluator; +import org.apache.maven.plugins.enforcer.EnforcerRuleManagerException; +import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.classworlds.realm.ClassRealm; import org.codehaus.plexus.component.configurator.ComponentConfigurationException; import org.codehaus.plexus.component.configurator.ComponentConfigurator; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.configuration.PlexusConfiguration; /** * Manage enforcer rules. + * + * @author Slawomir Jaranowski + * @since 3.2.0 */ @Named @Singleton public class EnforcerRuleManager { - @Inject - private Provider sessionProvider; + private final Provider sessionProvider; - @Inject - private Provider mojoExecutionProvider; + private final Provider mojoExecutionProvider; + + private final ComponentConfigurator componentConfigurator; + + private final PlexusContainer plexusContainer; @Inject - @Named("basic") - private ComponentConfigurator componentConfigurator; + public EnforcerRuleManager( + Provider sessionProvider, + Provider mojoExecutionProvider, + @Named("basic") ComponentConfigurator componentConfigurator, + PlexusContainer plexusContainer) { + this.sessionProvider = Objects.requireNonNull(sessionProvider, "sessionProvider must be not null"); + this.mojoExecutionProvider = + Objects.requireNonNull(mojoExecutionProvider, "mojoExecutionProvider must be not null"); + this.componentConfigurator = + Objects.requireNonNull(componentConfigurator, "componentConfigurator must be not null"); + this.plexusContainer = Objects.requireNonNull(plexusContainer, "plexusContainer must be not null"); + } /** * Create enforcer rules based on xml configuration. @@ -93,6 +112,16 @@ public List createRules(PlexusConfiguration rules) throws Enfo private EnforcerRuleDesc createRuleDesc(String name, String implementation) throws EnforcerRuleManagerException { + // component name should always start at lowercase character + String ruleName = Character.toLowerCase(name.charAt(0)) + name.substring(1); + + try { + return new EnforcerRuleDesc(ruleName, plexusContainer.lookup(EnforcerRuleBase.class, ruleName)); + } catch (ComponentLookupException e) { + // no component for rule + // process old way, by class name + } + String ruleClass; if (implementation != null && !implementation.isEmpty()) { ruleClass = implementation; @@ -101,15 +130,16 @@ private EnforcerRuleDesc createRuleDesc(String name, String implementation) thro } if (!ruleClass.contains(".")) { - ruleClass = getClass().getPackage().getName() + "." + Character.toUpperCase(ruleClass.charAt(0)) + ruleClass = "org.apache.maven.plugins.enforcer." + Character.toUpperCase(ruleClass.charAt(0)) + ruleClass.substring(1); } try { return new EnforcerRuleDesc( - name, (EnforcerRule) Class.forName(ruleClass).newInstance()); + name, (EnforcerRuleBase) Class.forName(ruleClass).newInstance()); } catch (Exception e) { - throw new EnforcerRuleManagerException("Failed to create enforcer rules for class: " + ruleClass, e); + throw new EnforcerRuleManagerException( + "Failed to create enforcer rules with name: " + ruleName + " or for class: " + ruleClass, e); } } } diff --git a/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java index cd25b7c3..bead244b 100644 --- a/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java +++ b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java @@ -23,10 +23,15 @@ import java.util.List; import org.apache.maven.enforcer.rule.api.EnforcerRule; +import org.apache.maven.enforcer.rule.api.EnforcerRuleError; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.logging.Log; +import org.apache.maven.plugins.enforcer.internal.EnforcerRuleDesc; +import org.apache.maven.plugins.enforcer.internal.EnforcerRuleManager; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -36,9 +41,13 @@ import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** @@ -53,22 +62,29 @@ class TestEnforceMojo { @Mock private EnforcerRuleManager ruleManager; + @Mock + private MavenSession session; + @InjectMocks private EnforceMojo mojo; @Test - void testEnforceMojo() throws Exception { - setupBasics(false); + void emptyRuleListShouldThrowException() { + mojo.setFail(false); - Log logSpy = setupLogSpy(); + assertThatCode(() -> mojo.execute()) + .isInstanceOf(MojoExecutionException.class) + .hasMessage("No rules are configured. Use the skip flag if you want to disable execution."); + } - try { - mojo.execute(); - fail("Expected a Mojo Execution Exception."); - } catch (MojoExecutionException e) { - System.out.println("Caught Expected Exception:" + e.getLocalizedMessage()); - } + @Test + void failedRulesAndNoFailPassBuild() throws Exception { + // set fail to false + mojo.setFail(false); + + Log logSpy = setupLogSpy(); + // two rules which fail EnforcerRuleDesc[] rules = new EnforcerRuleDesc[2]; rules[0] = new EnforcerRuleDesc("mockEnforcerRule", new MockEnforcerRule(true)); rules[1] = new EnforcerRuleDesc("mockEnforcerRule", new MockEnforcerRule(true)); @@ -77,8 +93,51 @@ void testEnforceMojo() throws Exception { mojo.execute(); - Mockito.verify(logSpy, Mockito.times(2)) - .info(Mockito.contains("Executing rule: " + MockEnforcerRule.class.getName())); + verify(logSpy) + .warn(Mockito.contains( + "Rule 0: org.apache.maven.plugins.enforcer.MockEnforcerRule failed with message")); + verify(logSpy) + .warn(Mockito.contains( + "Rule 1: org.apache.maven.plugins.enforcer.MockEnforcerRule failed with message")); + } + + @Test + void breakBuildImmediately() throws Exception { + // set fail to false + mojo.setFail(false); + + Log logSpy = setupLogSpy(); + + // this rule break build immediately + EnforcerRule ruleBreakBuild = Mockito.mock(EnforcerRule.class); + Mockito.doThrow(EnforcerRuleError.class).when(ruleBreakBuild).execute(any(EnforcerRuleHelper.class)); + + EnforcerRuleDesc[] rules = new EnforcerRuleDesc[3]; + rules[0] = new EnforcerRuleDesc("mockEnforcerRule", new MockEnforcerRule(false)); + rules[1] = new EnforcerRuleDesc("ruleBreakBuild", ruleBreakBuild); + rules[2] = new EnforcerRuleDesc("mockEnforcerRule", new MockEnforcerRule(false)); + + when(ruleManager.createRules(any())).thenReturn(Arrays.asList(rules)); + + Assertions.assertThatCode(() -> mojo.execute()) + .isInstanceOf(MojoExecutionException.class) + .hasCauseInstanceOf(EnforcerRuleError.class); + + assertTrue(((MockEnforcerRule) rules[0].getRule()).executed, "Expected this rule to be executed."); + assertFalse(((MockEnforcerRule) rules[2].getRule()).executed, "Expected this rule to be not executed."); + + verify(logSpy).info(Mockito.contains("Rule 0: org.apache.maven.plugins.enforcer.MockEnforcerRule executed")); + } + + @Test + void testEnforceMojo() throws Exception { + mojo.setFail(true); + + EnforcerRuleDesc[] rules = new EnforcerRuleDesc[2]; + rules[0] = new EnforcerRuleDesc("mockEnforcerRule", new MockEnforcerRule(true)); + rules[1] = new EnforcerRuleDesc("mockEnforcerRule", new MockEnforcerRule(true)); + + when(ruleManager.createRules(any())).thenReturn(Arrays.asList(rules)); try { mojo.setFailFast(false); @@ -105,7 +164,7 @@ void testEnforceMojo() throws Exception { @Test void testCaching() throws Exception { - setupBasics(true); + mojo.setFail(true); EnforcerRuleDesc[] rules = new EnforcerRuleDesc[10]; @@ -174,7 +233,7 @@ void testCaching() throws Exception { @Test void testCachePersistence1() throws Exception { - setupBasics(true); + mojo.setFail(true); EnforcerRuleDesc[] rules = new EnforcerRuleDesc[10]; @@ -192,7 +251,7 @@ void testCachePersistence1() throws Exception { @Test void testCachePersistence2() throws Exception { - setupBasics(true); + mojo.setFail(true); EnforcerRuleDesc[] rules = new EnforcerRuleDesc[10]; @@ -216,7 +275,7 @@ void testCachePersistence3() throws Exception { } catch (InterruptedException e) { } - setupBasics(true); + mojo.setFail(true); EnforcerRuleDesc[] rules = new EnforcerRuleDesc[10]; @@ -234,7 +293,7 @@ void testCachePersistence3() throws Exception { @Test void testLoggingOnEnforcerRuleExceptionWithMessage() throws Exception { // fail=false because this is out of scope here (also allows for cleaner test code without catch block) - setupBasics(false); + mojo.setFail(false); // the regular kind of EnforcerRuleException: EnforcerRuleException ruleException = new EnforcerRuleException("testMessage"); @@ -248,18 +307,16 @@ void testLoggingOnEnforcerRuleExceptionWithMessage() throws Exception { mojo.execute(); - Mockito.verify(logSpy).debug(Mockito.anyString(), Mockito.same(ruleException)); + verify(logSpy, Mockito.never()).warn(Mockito.anyString(), any(Throwable.class)); - Mockito.verify(logSpy, Mockito.never()).warn(Mockito.anyString(), any(Throwable.class)); - - Mockito.verify(logSpy) + verify(logSpy) .warn(Mockito.matches(".* failed with message:" + System.lineSeparator() + ruleException.getMessage())); } @Test void testLoggingOnEnforcerRuleExceptionWithoutMessage() throws Exception { // fail=false because this is out of scope here (also allows for cleaner test code without catch block) - setupBasics(false); + mojo.setFail(false); // emulate behaviour of various rules that just catch Exception and wrap into EnforcerRuleException: NullPointerException npe = new NullPointerException(); @@ -275,27 +332,25 @@ void testLoggingOnEnforcerRuleExceptionWithoutMessage() throws Exception { mojo.execute(); - Mockito.verify(logSpy).warn(Mockito.contains("failed without a message"), Mockito.same(enforcerRuleException)); - - Mockito.verify(logSpy).warn(Mockito.matches(".* failed with message:" + System.lineSeparator() + "null")); + Mockito.verify(logSpy).warn(Mockito.matches(".* failed without a message")); } @Test void testFailIfNoTests() throws MojoExecutionException { - setupBasics(false); + mojo.setFail(false); mojo.setFailIfNoRules(false); Log logSpy = setupLogSpy(); mojo.execute(); - Mockito.verify(logSpy).warn("No rules are configured."); + verify(logSpy).warn("No rules are configured."); Mockito.verifyNoMoreInteractions(logSpy); } @Test void testFailIfBothRuleOverridePropertiesAreSet() throws MojoExecutionException { - setupBasics(false); + mojo.setFail(false); Log logSpy = setupLogSpy(); List rules = Arrays.asList("rule1", "rule2"); @@ -309,7 +364,7 @@ void testFailIfBothRuleOverridePropertiesAreSet() throws MojoExecutionException @Test void testShouldPrintWarnWhenUsingDeprecatedRulesProperty() throws MojoExecutionException { - setupBasics(false); + mojo.setFail(false); Log logSpy = setupLogSpy(); @@ -321,7 +376,7 @@ void testShouldPrintWarnWhenUsingDeprecatedRulesProperty() throws MojoExecutionE @Test void testShouldNotPrintWarnWhenDeprecatedRulesPropertyIsEmpty() throws MojoExecutionException { - setupBasics(false); + mojo.setFail(false); Log logSpy = setupLogSpy(); @@ -330,12 +385,6 @@ void testShouldNotPrintWarnWhenDeprecatedRulesPropertyIsEmpty() throws MojoExecu Mockito.verifyNoInteractions(logSpy); } - private void setupBasics(boolean fail) { - mojo.setFail(fail); - mojo.setSession(EnforcerTestUtils.getMavenSession()); - mojo.setProject(new MockProject()); - } - private Log setupLogSpy() { Log spy = Mockito.spy(mojo.getLog()); mojo.setLog(spy); diff --git a/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestDefaultEnforcementRuleHelper.java b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestRule1.java similarity index 57% rename from maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestDefaultEnforcementRuleHelper.java rename to maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestRule1.java index a0ade167..fdef9a2c 100644 --- a/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestDefaultEnforcementRuleHelper.java +++ b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestRule1.java @@ -18,21 +18,11 @@ */ package org.apache.maven.plugins.enforcer; -import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; -import org.junit.jupiter.api.Test; +import org.apache.maven.enforcer.rule.api.EnforcerRuleException; +import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; -import static org.junit.jupiter.api.Assertions.assertNotNull; +public class TestRule1 extends AbstractNonCacheableEnforcerRule { -/** - * @author Brian Fox - */ -public class TestDefaultEnforcementRuleHelper { - @Test - public void testHelper() throws ExpressionEvaluationException { - DefaultEnforcementRuleHelper helper = (DefaultEnforcementRuleHelper) EnforcerTestUtils.getHelper(); - - assertNotNull(helper.getLog()); - assertNotNull(helper.evaluate("${session}")); - assertNotNull(helper.evaluate("${project}")); - } + @Override + public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {} } diff --git a/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestRule2.java b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestRule2.java new file mode 100644 index 00000000..4b2a2c57 --- /dev/null +++ b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestRule2.java @@ -0,0 +1,28 @@ +/* + * 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. + */ +package org.apache.maven.plugins.enforcer; + +import org.apache.maven.enforcer.rule.api.EnforcerRuleException; +import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; + +public class TestRule2 extends AbstractNonCacheableEnforcerRule { + + @Override + public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {} +} diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerRuleManagerTest.java b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleManagerTest.java similarity index 66% rename from enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerRuleManagerTest.java rename to maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleManagerTest.java index 99626cd2..a068e506 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerRuleManagerTest.java +++ b/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/internal/EnforcerRuleManagerTest.java @@ -16,31 +16,39 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.maven.plugins.enforcer; +package org.apache.maven.plugins.enforcer.internal; import javax.inject.Provider; import java.util.List; import org.apache.maven.enforcer.rule.api.EnforcerRule; +import org.apache.maven.enforcer.rule.api.EnforcerRuleBase; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.descriptor.MojoDescriptor; import org.apache.maven.plugin.descriptor.PluginDescriptor; +import org.apache.maven.plugins.enforcer.EnforcerRuleManagerException; +import org.apache.maven.plugins.enforcer.TestRule1; +import org.apache.maven.plugins.enforcer.TestRule2; +import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.component.configurator.ComponentConfigurationException; import org.codehaus.plexus.component.configurator.ComponentConfigurator; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.configuration.DefaultPlexusConfiguration; import org.codehaus.plexus.configuration.PlexusConfiguration; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -58,10 +66,18 @@ class EnforcerRuleManagerTest { @Mock private ComponentConfigurator componentConfigurator; - @InjectMocks + @Mock + private PlexusContainer plexusContainer; + private EnforcerRuleManager enforcerRuleManager; - void setupMocks() { + @BeforeEach + void setup() { + enforcerRuleManager = + new EnforcerRuleManager(sessionProvider, mojoExecutionProvider, componentConfigurator, plexusContainer); + } + + void setupMocks() throws Exception { MojoExecution mojoExecution = mock(MojoExecution.class); when(mojoExecutionProvider.get()).thenReturn(mojoExecution); @@ -71,10 +87,12 @@ void setupMocks() { when(mojoDescriptor.getPluginDescriptor()).thenReturn(mock(PluginDescriptor.class)); when(sessionProvider.get()).thenReturn(mock(MavenSession.class)); + + doThrow(ComponentLookupException.class).when(plexusContainer).lookup(any(Class.class), anyString()); } @Test - void nulConfigReturnEmptyRules() throws Exception { + void nullConfigReturnEmptyRules() throws Exception { List rules = enforcerRuleManager.createRules(null); @@ -90,7 +108,7 @@ void emptyConfigReturnEmptyRules() throws Exception { } @Test - void unKnownRuleThrowException() { + void unKnownRuleThrowException() throws Exception { setupMocks(); @@ -98,17 +116,18 @@ void unKnownRuleThrowException() { assertThatCode(() -> enforcerRuleManager.createRules(configuration)) .isInstanceOf(EnforcerRuleManagerException.class) - .hasMessage("Failed to create enforcer rules for class: org.apache.maven.plugins.enforcer.UnKnowRule") + .hasMessage( + "Failed to create enforcer rules with name: unKnowRule or for class: org.apache.maven.plugins.enforcer.UnKnowRule") .hasCauseInstanceOf(ClassNotFoundException.class); } @Test - void invalidConfigurationThrowException() throws ComponentConfigurationException { + void invalidConfigurationThrowException() throws Exception { setupMocks(); PlexusConfiguration ruleConfig = - new DefaultPlexusConfiguration("alwaysPass").addChild("message", "messageValue"); + new DefaultPlexusConfiguration("testRule1").addChild("message", "messageValue"); PlexusConfiguration configuration = new DefaultPlexusConfiguration("rules"); configuration.addChild(ruleConfig); @@ -122,49 +141,70 @@ void invalidConfigurationThrowException() throws ComponentConfigurationException } @Test - void createSimpleRule() throws EnforcerRuleManagerException { + void createSimpleRule() throws Exception { + + setupMocks(); + + PlexusConfiguration configuration = new DefaultPlexusConfiguration("rules") + .addChild("TestRule1", null) + .addChild("testRule2", null); + + List rules = enforcerRuleManager.createRules(configuration); + + assertThat(rules) + .hasSize(2) + .map(EnforcerRuleDesc::getRule) + .hasExactlyElementsOfTypes(TestRule1.class, TestRule2.class); + + assertThat(rules).hasSize(2).map(EnforcerRuleDesc::getName).containsExactly("TestRule1", "testRule2"); + } + + @Test + void createSimpleRuleFromComponentAndClasses() throws Exception { setupMocks(); + Mockito.doReturn(new TestRule1()).when(plexusContainer).lookup(EnforcerRuleBase.class, "testRule1"); + PlexusConfiguration configuration = new DefaultPlexusConfiguration("rules") - .addChild("AlwaysFail", null) - .addChild("alwaysPass", null); + .addChild("TestRule1", null) + .addChild("testRule2", null); List rules = enforcerRuleManager.createRules(configuration); assertThat(rules) .hasSize(2) .map(EnforcerRuleDesc::getRule) - .hasExactlyElementsOfTypes(AlwaysFail.class, AlwaysPass.class); + .hasExactlyElementsOfTypes(TestRule1.class, TestRule2.class); - assertThat(rules).hasSize(2).map(EnforcerRuleDesc::getName).containsExactly("AlwaysFail", "alwaysPass"); + assertThat(rules).hasSize(2).map(EnforcerRuleDesc::getName).containsExactly("testRule1", "testRule2"); } @Test - void createRuleWithImplementation() throws EnforcerRuleManagerException { + void createRuleWithImplementation() throws Exception { setupMocks(); - PlexusConfiguration ruleConfig = new DefaultPlexusConfiguration("alwaysPassWithImp"); - ruleConfig.setAttribute("implementation", AlwaysPass.class.getName()); + PlexusConfiguration ruleConfig = new DefaultPlexusConfiguration("testRuleWithImp"); + ruleConfig.setAttribute("implementation", TestRule1.class.getName()); PlexusConfiguration configuration = new DefaultPlexusConfiguration("rules"); configuration.addChild(ruleConfig); List rules = enforcerRuleManager.createRules(configuration); - assertThat(rules).hasSize(1).map(EnforcerRuleDesc::getRule).hasExactlyElementsOfTypes(AlwaysPass.class); + assertThat(rules).hasSize(1).map(EnforcerRuleDesc::getRule).hasExactlyElementsOfTypes(TestRule1.class); - assertThat(rules).hasSize(1).map(EnforcerRuleDesc::getName).containsExactly("alwaysPassWithImp"); + assertThat(rules).hasSize(1).map(EnforcerRuleDesc::getName).containsExactly("testRuleWithImp"); } @Test - void ruleShouldBeConfigured() throws EnforcerRuleManagerException, ComponentConfigurationException { + void ruleShouldBeConfigured() throws Exception { setupMocks(); PlexusConfiguration ruleConfig = - new DefaultPlexusConfiguration("alwaysPass").addChild("message", "messageValue"); + new DefaultPlexusConfiguration("testRule1").addChild("message", "messageValue"); PlexusConfiguration configuration = new DefaultPlexusConfiguration("rules"); configuration.addChild(ruleConfig); @@ -177,7 +217,7 @@ void ruleShouldBeConfigured() throws EnforcerRuleManagerException, ComponentConf verify(componentConfigurator) .configureComponent(ruleCaptor.capture(), configurationCaptor.capture(), any(), any()); - assertThat(ruleCaptor.getValue()).isInstanceOf(AlwaysPass.class); + assertThat(ruleCaptor.getValue()).isInstanceOf(TestRule1.class); assertThat(configurationCaptor.getValue()).isSameAs(ruleConfig); } }