diff --git a/maven-plugin/src/it/verify-fail-on/expected_violation_file.xml b/maven-plugin/src/it/verify-fail-on/expected_violation_file.xml new file mode 100644 index 00000000..cde014d3 --- /dev/null +++ b/maven-plugin/src/it/verify-fail-on/expected_violation_file.xml @@ -0,0 +1,6 @@ + + + + The xml element <modelVersion> should be placed before <name> + + \ No newline at end of file diff --git a/maven-plugin/src/it/verify-fail-on/invoker.properties b/maven-plugin/src/it/verify-fail-on/invoker.properties new file mode 100644 index 00000000..8d0f0f22 --- /dev/null +++ b/maven-plugin/src/it/verify-fail-on/invoker.properties @@ -0,0 +1 @@ +invoker.goals=-e clean verify \ No newline at end of file diff --git a/maven-plugin/src/it/verify-fail-on/pom.xml b/maven-plugin/src/it/verify-fail-on/pom.xml new file mode 100644 index 00000000..c31addc3 --- /dev/null +++ b/maven-plugin/src/it/verify-fail-on/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + com.github.ekryd.sortpom.its + default-configuration + 0.0.1-SNAPSHOT + pom + SortPom Plugin :: ITs :: Default configuration + Test default parameters of the plugin + no-url + + UTF-8 + + + + + + com.github.ekryd.sortpom + sortpom-maven-plugin + @pom.version@ + + + + verify + + + target/sortpom_reports/violation.xml + warn + lines + + + + + + + diff --git a/maven-plugin/src/it/verify-fail-on/postbuild.groovy b/maven-plugin/src/it/verify-fail-on/postbuild.groovy new file mode 100644 index 00000000..a3841879 --- /dev/null +++ b/maven-plugin/src/it/verify-fail-on/postbuild.groovy @@ -0,0 +1,14 @@ +log = new File(basedir, 'build.log') +sorted = new File(basedir, 'pom.xml') +violationFile = new File(basedir, 'target/sortpom_reports/violation.xml') +expected_violationFile = new File(basedir, 'expected_violation_file.xml') + +assert log.exists() +assert log.text.contains('[INFO] Verifying file ' + sorted.absolutePath) +assert log.text.contains('[WARNING] The xml element should be placed before ') +assert log.text.contains('[INFO] Saving violation report to ' + violationFile.absolutePath) +assert log.text.contains('[WARNING] The file ' + sorted.absolutePath + ' is not sorted') + +assert expected_violationFile.text.replaceAll('@POM_PATH@', sorted.absolutePath).tokenize('\n').equals(violationFile.text.replaceAll('\r','').replaceAll('\\\\','').tokenize('\n')) + +return true diff --git a/maven-plugin/src/main/java/sortpom/VerifyMojo.java b/maven-plugin/src/main/java/sortpom/VerifyMojo.java index 7154b300..4051fd2c 100644 --- a/maven-plugin/src/main/java/sortpom/VerifyMojo.java +++ b/maven-plugin/src/main/java/sortpom/VerifyMojo.java @@ -23,6 +23,12 @@ public class VerifyMojo extends AbstractParentMojo { @Parameter(property = "sort.verifyFail", defaultValue = "sort") private String verifyFail; + /** + * What kind of differences should trigger verify failure. Can be either 'xmlElements', 'lines' or 'strict' + */ + @Parameter(property = "sort.verifyFailOn", defaultValue = "xmlElements") + private String verifyFailOn; + /** * Saves the verification failure to an external xml file, recommended filename is 'target/sortpom_reports/violation.xml'. */ @@ -40,7 +46,7 @@ public void setup() throws MojoFailureException { .setIndent(nrOfIndentSpace, indentBlankLines) .setSortOrder(sortOrderFile, predefinedSortOrder) .setSortEntities(sortDependencies, sortPlugins, sortProperties, sortModules, sortExecutions) - .setVerifyFail(verifyFail) + .setVerifyFail(verifyFail, verifyFailOn) .build(); sortPomImpl.setup(new MavenLogger(getLog()), pluginParameters); diff --git a/sorter/src/main/java/sortpom/parameter/PluginParameters.java b/sorter/src/main/java/sortpom/parameter/PluginParameters.java index d0198796..55fabd56 100644 --- a/sorter/src/main/java/sortpom/parameter/PluginParameters.java +++ b/sorter/src/main/java/sortpom/parameter/PluginParameters.java @@ -23,6 +23,7 @@ public class PluginParameters { public final boolean keepBlankLines; public final boolean indentBlankLines; public final VerifyFailType verifyFailType; + public final VerifyFailOnType verifyFailOn; public final boolean ignoreLineSeparators; public final boolean keepTimestamp; @@ -30,7 +31,7 @@ private PluginParameters(File pomFile, boolean createBackupFile, String backupFi LineSeparatorUtil lineSeparatorUtil, boolean expandEmptyElements, boolean spaceBeforeCloseEmptyElement, boolean keepBlankLines, String indentCharacters, boolean indentBlankLines, String predefinedSortOrder, String customSortOrderFile, DependencySortOrder sortDependencies, DependencySortOrder sortPlugins, boolean sortProperties, boolean sortModules, - boolean sortExecutions, VerifyFailType verifyFailType, boolean ignoreLineSeparators, boolean keepTimestamp) { + boolean sortExecutions, VerifyFailType verifyFailType, VerifyFailOnType verifyFailOn, boolean ignoreLineSeparators, boolean keepTimestamp) { this.pomFile = pomFile; this.createBackupFile = createBackupFile; this.backupFileExtension = backupFileExtension; @@ -50,6 +51,7 @@ private PluginParameters(File pomFile, boolean createBackupFile, String backupFi this.keepBlankLines = keepBlankLines; this.indentBlankLines = indentBlankLines; this.verifyFailType = verifyFailType; + this.verifyFailOn = verifyFailOn; this.ignoreLineSeparators = ignoreLineSeparators; this.keepTimestamp = keepTimestamp; } @@ -80,6 +82,7 @@ public static class Builder { private boolean sortExecutions; private boolean keepBlankLines; private VerifyFailType verifyFailType; + private VerifyFailOnType verifyFailOn; private boolean ignoreLineSeparators; private boolean keepTimestamp; @@ -145,8 +148,9 @@ public Builder setSortEntities(final String sortDependencies, final String sortP } /** Sets the verify operation behaviour */ - public Builder setVerifyFail(String verifyFail) { + public Builder setVerifyFail(String verifyFail, String verifyFailOn) { this.verifyFailType = VerifyFailType.fromString(verifyFail); + this.verifyFailOn = VerifyFailOnType.fromString(verifyFailOn); return this; } @@ -162,7 +166,8 @@ public PluginParameters build() { encoding, lineSeparatorUtil, expandEmptyElements, spaceBeforeCloseEmptyElement, keepBlankLines, indentCharacters, indentBlankLines, predefinedSortOrder, customSortOrderFile, sortDependencies, sortPlugins, sortProperties, sortModules, sortExecutions, - verifyFailType, ignoreLineSeparators, keepTimestamp); + verifyFailType, verifyFailOn, + ignoreLineSeparators, keepTimestamp); } } diff --git a/sorter/src/main/java/sortpom/parameter/VerifyFailOnType.java b/sorter/src/main/java/sortpom/parameter/VerifyFailOnType.java new file mode 100644 index 00000000..d67e8a84 --- /dev/null +++ b/sorter/src/main/java/sortpom/parameter/VerifyFailOnType.java @@ -0,0 +1,19 @@ +package sortpom.parameter; + +import sortpom.exception.FailureException; + +import java.util.Arrays; + +public enum VerifyFailOnType { + XMLELEMENTS, LINES, STRICT; + + static VerifyFailOnType fromString(String verifyFailOn) { + if (verifyFailOn == null) { + throw new FailureException("verifyFailOn must be either xmlElements, lines or strict. Was: null"); + } + return Arrays.stream(VerifyFailOnType.values()) + .filter(e -> e.toString().equalsIgnoreCase(verifyFailOn)) + .findAny() + .orElseThrow(() -> new FailureException("verifyFailOn must be either xmlElements, lines or strict. Was: " + verifyFailOn)); + } +} diff --git a/sorter/src/test/java/sortpom/parameter/VerifyFailOnTypeTest.java b/sorter/src/test/java/sortpom/parameter/VerifyFailOnTypeTest.java new file mode 100644 index 00000000..88510321 --- /dev/null +++ b/sorter/src/test/java/sortpom/parameter/VerifyFailOnTypeTest.java @@ -0,0 +1,62 @@ +package sortpom.parameter; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.ValueSource; +import sortpom.exception.FailureException; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * + */ +class VerifyFailOnTypeTest { + @Test + void xmlElementsIgnoreCaseValueIsOk() { + PluginParameters pluginParameters = PluginParameters.builder() + .setVerifyFail("STOP", "XMLElements") + .build(); + + assertEquals(VerifyFailOnType.XMLELEMENTS, pluginParameters.verifyFailOn); + } + + @Test + void linesIgnoreCaseValueIsOk() { + PluginParameters pluginParameters = PluginParameters.builder() + .setVerifyFail("STOP", "liNES") + .build(); + + assertEquals(VerifyFailOnType.LINES, pluginParameters.verifyFailOn); + } + + @Test + void strictIgnoreCaseValueIsOk() { + PluginParameters pluginParameters = PluginParameters.builder() + .setVerifyFail("STOP", "stRIct") + .build(); + + assertEquals(VerifyFailOnType.STRICT, pluginParameters.verifyFailOn); + } + + @ParameterizedTest + @NullAndEmptySource + @ValueSource(strings = "gurka") + void verifyFailFaultyValues(String value) { + + final Executable testMethod = () -> PluginParameters.builder() + .setVerifyFail("STOP", value) + .build(); + + final FailureException thrown = assertThrows(FailureException.class, testMethod); + + assertThat(thrown.getMessage(), is(equalTo("verifyFailOn must be either xmlElements, lines or strict. Was: " + value))); + } + + +} diff --git a/sorter/src/test/java/sortpom/parameter/VerifyFailParameterTest.java b/sorter/src/test/java/sortpom/parameter/VerifyFailParameterTest.java index edd2a3c0..38472d5f 100644 --- a/sorter/src/test/java/sortpom/parameter/VerifyFailParameterTest.java +++ b/sorter/src/test/java/sortpom/parameter/VerifyFailParameterTest.java @@ -18,7 +18,7 @@ class VerifyFailParameterTest { @Test void stopIgnoreCaseValueIsOk() { PluginParameters pluginParameters = PluginParameters.builder() - .setVerifyFail("sToP") + .setVerifyFail("sToP", "strict") .build(); assertEquals(VerifyFailType.STOP, pluginParameters.verifyFailType); @@ -27,7 +27,7 @@ void stopIgnoreCaseValueIsOk() { @Test void warnIgnoreCaseValueIsOk() { PluginParameters pluginParameters = PluginParameters.builder() - .setVerifyFail("wArN") + .setVerifyFail("wArN", "strict") .build(); assertEquals(VerifyFailType.WARN, pluginParameters.verifyFailType); @@ -36,7 +36,7 @@ void warnIgnoreCaseValueIsOk() { @Test void sortIgnoreCaseValueIsOk() { PluginParameters pluginParameters = PluginParameters.builder() - .setVerifyFail("sOrT") + .setVerifyFail("sOrT", "strict") .build(); assertEquals(VerifyFailType.SORT, pluginParameters.verifyFailType); @@ -48,7 +48,7 @@ void sortIgnoreCaseValueIsOk() { void verifyFailFaultyValues(String value) { final Executable testMethod = () -> PluginParameters.builder() - .setVerifyFail(value) + .setVerifyFail(value, "strict") .build(); final FailureException thrown = assertThrows(FailureException.class, testMethod); diff --git a/sorter/src/test/java/sortpom/util/SortPomImplUtil.java b/sorter/src/test/java/sortpom/util/SortPomImplUtil.java index ee5c50ba..1a8f072f 100644 --- a/sorter/src/test/java/sortpom/util/SortPomImplUtil.java +++ b/sorter/src/test/java/sortpom/util/SortPomImplUtil.java @@ -35,6 +35,7 @@ public class SortPomImplUtil { private boolean indentBLankLines = false; private boolean keepTimestamp = false; private String verifyFail = "SORT"; + private String verifyFailOn = "xmlElements"; private String encoding = "UTF-8"; private File testpom; private String violationFile; @@ -210,6 +211,11 @@ public SortPomImplUtil verifyFail(String verifyFail) { return this; } + public SortPomImplUtil verifyFailOn(String verifyFailOn) { + this.verifyFailOn = verifyFailOn; + return this; + } + public SortPomImplUtil backupFileExtension(String backupFileExtension) { this.testPomBackupExtension = backupFileExtension; return this; @@ -244,7 +250,7 @@ private PluginParameters getPluginParameters() { .setIndent(nrOfIndentSpace, indentBLankLines) .setSortEntities(sortDependencies, sortPlugins, sortProperties, sortModules, sortExecutions) .setSortOrder(defaultOrderFileName, predefinedSortOrder) - .setVerifyFail(verifyFail) + .setVerifyFail(verifyFail, verifyFailOn) .setTriggers(ignoreLineSeparators) .build(); }