From 5175156acfe8dc37ae71d297e8ea41c22caab004 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda Date: Wed, 29 Jul 2015 13:04:45 +0200 Subject: [PATCH 1/2] Add "failOnViolation" setting to optionally fail builds Sometimes it is desired to let a build succeed, even if violations have been found. The "failOnViolation" setting for the Ant task and the Maven Mojo enables the user to let their builds succeed even if violations have been found by the forbidden APIs checker. --- src/main/docs/ant-task.html | 7 ++++ .../forbiddenapis/AbstractCheckMojo.java | 11 ++++- .../de/thetaphi/forbiddenapis/AntTask.java | 11 ++++- .../de/thetaphi/forbiddenapis/Checker.java | 7 ++-- .../de/thetaphi/forbiddenapis/CliMain.java | 2 +- src/test/antunit/TestFailOnViolation.xml | 40 +++++++++++++++++++ src/test/antunit/TestMavenMojo.xml | 10 +++++ src/test/antunit/pom-generator.xsl | 1 + .../forbiddenapis/CheckerSetupTest.java | 2 +- 9 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 src/test/antunit/TestFailOnViolation.xml 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..c81318c2 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, 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 From 8466a8d5a0c19b94cce2a248c80348b3cfa7565f Mon Sep 17 00:00:00 2001 From: Jochen Schalanda Date: Thu, 30 Jul 2015 10:57:00 +0200 Subject: [PATCH 2/2] Add system property to set failOnViolation in Maven builds --- src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java index c81318c2..afe1bf5e 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java +++ b/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java @@ -102,7 +102,7 @@ public abstract class AbstractCheckMojo extends AbstractMojo { * Fail the build if violations have been found. Defaults to {@code true}. * @since 1.9 */ - @Parameter(required = false, defaultValue = "true") + @Parameter(required = false, property="forbiddenapis.failOnViolation", defaultValue = "true") private boolean failOnViolation; /**