diff --git a/src/main/docs/ant-task.html b/src/main/docs/ant-task.html index 58ac7012..0fccce6d 100644 --- a/src/main/docs/ant-task.html +++ b/src/main/docs/ant-task.html @@ -109,6 +109,13 @@

Parameters

Fail the build if a signature is not resolving. If this parameter is set to to false, then such signatures are silently ignored. + + failOnViolation + boolean + true + Fail the build if violations have been found. If this parameter is set to false, then the build will continue even if violations have been found. + + internalRuntimeForbidden boolean diff --git a/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java index 4db2b566..afe1bf5e 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java +++ b/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java @@ -97,7 +97,14 @@ public abstract class AbstractCheckMojo extends AbstractMojo { */ @Parameter(required = false, defaultValue = "true") private boolean failOnUnresolvableSignatures; - + + /** + * Fail the build if violations have been found. Defaults to {@code true}. + * @since 1.9 + */ + @Parameter(required = false, property="forbiddenapis.failOnViolation", defaultValue = "true") + private boolean failOnViolation; + /** * The default compiler target version used to expand references to bundled JDK signatures. * E.g., if you use "jdk-deprecated", it will expand to this version. @@ -200,7 +207,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { ClassLoader.getSystemClassLoader(); try { - final Checker checker = new Checker(loader, internalRuntimeForbidden, failOnMissingClasses, failOnUnresolvableSignatures) { + final Checker checker = new Checker(loader, internalRuntimeForbidden, failOnMissingClasses, failOnViolation, failOnUnresolvableSignatures) { @Override protected void logError(String msg) { log.error(msg); diff --git a/src/main/java/de/thetaphi/forbiddenapis/AntTask.java b/src/main/java/de/thetaphi/forbiddenapis/AntTask.java index 9bc8fa53..5771e212 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/AntTask.java +++ b/src/main/java/de/thetaphi/forbiddenapis/AntTask.java @@ -59,6 +59,7 @@ public final class AntTask extends Task { private boolean restrictClassFilename = true; private boolean failOnMissingClasses = true; private boolean failOnUnresolvableSignatures = true; + private boolean failOnViolation = true; private boolean ignoreEmptyFileset = false; @Override @@ -76,7 +77,7 @@ public void execute() throws BuildException { classFiles.setProject(getProject()); apiSignatures.setProject(getProject()); - final Checker checker = new Checker(loader, internalRuntimeForbidden, failOnMissingClasses, failOnUnresolvableSignatures) { + final Checker checker = new Checker(loader, internalRuntimeForbidden, failOnMissingClasses, failOnViolation, failOnUnresolvableSignatures) { @Override protected void logError(String msg) { log(msg, Project.MSG_ERR); @@ -325,4 +326,12 @@ public void setIgnoreEmptyFileSet(boolean ignoreEmptyFileset) { this.ignoreEmptyFileset = ignoreEmptyFileset; } + /** + * Fail the build if violations have been found. If this parameter is set to {@code false}, + * then the build will continue even if violations have been found. + * Defaults to {@code true}. + */ + public void setFailOnViolation(boolean failOnViolation) { + this.failOnViolation = failOnViolation; + } } diff --git a/src/main/java/de/thetaphi/forbiddenapis/Checker.java b/src/main/java/de/thetaphi/forbiddenapis/Checker.java index 234feab6..2d4fdcd6 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/Checker.java +++ b/src/main/java/de/thetaphi/forbiddenapis/Checker.java @@ -64,7 +64,7 @@ public abstract class Checker implements RelatedClassLookup { final Set bootClassPathJars; final Set bootClassPathDirs; final ClassLoader loader; - final boolean internalRuntimeForbidden, failOnMissingClasses, defaultFailOnUnresolvableSignatures; + final boolean internalRuntimeForbidden, failOnMissingClasses, failOnViolation, defaultFailOnUnresolvableSignatures; // key is the internal name (slashed): final Map classesToCheck = new HashMap(); @@ -86,10 +86,11 @@ public abstract class Checker implements RelatedClassLookup { protected abstract void logWarn(String msg); protected abstract void logInfo(String msg); - public Checker(ClassLoader loader, boolean internalRuntimeForbidden, boolean failOnMissingClasses, boolean defaultFailOnUnresolvableSignatures) { + public Checker(ClassLoader loader, boolean internalRuntimeForbidden, boolean failOnMissingClasses, boolean failOnViolation, boolean defaultFailOnUnresolvableSignatures) { this.loader = loader; this.internalRuntimeForbidden = internalRuntimeForbidden; this.failOnMissingClasses = failOnMissingClasses; + this.failOnViolation = failOnViolation; this.defaultFailOnUnresolvableSignatures = defaultFailOnUnresolvableSignatures; this.start = System.currentTimeMillis(); @@ -439,7 +440,7 @@ public final void run() throws ForbiddenApiException { final String message = String.format(Locale.ENGLISH, "Scanned %d (and %d related) class file(s) for forbidden API invocations (in %.2fs), %d error(s).", classesToCheck.size(), classesToCheck.isEmpty() ? 0 : classpathClassCache.size(), (System.currentTimeMillis() - start) / 1000.0, errors); - if (errors > 0) { + if (failOnViolation && errors > 0) { logError(message); throw new ForbiddenApiException("Check for forbidden API calls failed, see log."); } else { diff --git a/src/main/java/de/thetaphi/forbiddenapis/CliMain.java b/src/main/java/de/thetaphi/forbiddenapis/CliMain.java index 3e516ef1..9e8372a8 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/CliMain.java +++ b/src/main/java/de/thetaphi/forbiddenapis/CliMain.java @@ -221,7 +221,7 @@ public void run() throws ExitException { final URLClassLoader loader = URLClassLoader.newInstance(urls, ClassLoader.getSystemClassLoader()); try { final Checker checker = new Checker(loader, cmd.hasOption(internalruntimeforbiddenOpt.getLongOpt()), - !cmd.hasOption(allowmissingclassesOpt.getLongOpt()), !cmd.hasOption(allowunresolvablesignaturesOpt.getLongOpt())) { + !cmd.hasOption(allowmissingclassesOpt.getLongOpt()), true, !cmd.hasOption(allowunresolvablesignaturesOpt.getLongOpt())) { @Override protected void logError(String msg) { CliMain.this.logError(msg); diff --git a/src/test/antunit/TestFailOnViolation.xml b/src/test/antunit/TestFailOnViolation.xml new file mode 100644 index 00000000..f7dc998c --- /dev/null +++ b/src/test/antunit/TestFailOnViolation.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + java.awt.Color @ Color is disallowed, thats not bad, because ANT has no colors... + java.lang.String @ You are crazy that you disallow strings + + + + + + + + + java.awt.Color @ Color is disallowed, thats not bad, because ANT has no colors... + java.lang.String @ You are crazy that you disallow strings + + + + \ No newline at end of file diff --git a/src/test/antunit/TestMavenMojo.xml b/src/test/antunit/TestMavenMojo.xml index f646d6fa..bd97b0b6 100644 --- a/src/test/antunit/TestMavenMojo.xml +++ b/src/test/antunit/TestMavenMojo.xml @@ -43,6 +43,16 @@ + + + + + + + + + + diff --git a/src/test/antunit/pom-generator.xsl b/src/test/antunit/pom-generator.xsl index df3e6b46..253c70b3 100644 --- a/src/test/antunit/pom-generator.xsl +++ b/src/test/antunit/pom-generator.xsl @@ -48,6 +48,7 @@ true ${antunit.failOnUnresolvableSignatures} + ${antunit.failOnViolation} jdk-unsafe jdk-deprecated diff --git a/src/test/java/de/thetaphi/forbiddenapis/CheckerSetupTest.java b/src/test/java/de/thetaphi/forbiddenapis/CheckerSetupTest.java index 56900048..1036dbd2 100644 --- a/src/test/java/de/thetaphi/forbiddenapis/CheckerSetupTest.java +++ b/src/test/java/de/thetaphi/forbiddenapis/CheckerSetupTest.java @@ -29,7 +29,7 @@ public final class CheckerSetupTest { @SuppressForbidden static final class MyChecker extends Checker { public MyChecker() { - super(ClassLoader.getSystemClassLoader(), true, true, true); + super(ClassLoader.getSystemClassLoader(), true, true, true, true); } @Override