Skip to content

Commit f00539a

Browse files
committed
Merge pull request #64 from policeman-tools/feature_optionsEnumSet
Use EnumSet for the checker options
2 parents 2b8cb8c + 5596446 commit f00539a

File tree

5 files changed

+49
-16
lines changed

5 files changed

+49
-16
lines changed

src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
* limitations under the License.
1717
*/
1818

19+
import static de.thetaphi.forbiddenapis.Checker.Option.*;
20+
1921
import org.apache.maven.plugin.AbstractMojo;
2022
import org.apache.maven.plugin.MojoExecutionException;
2123
import org.apache.maven.plugin.MojoFailureException;
@@ -32,6 +34,7 @@
3234
import java.net.MalformedURLException;
3335
import java.net.URL;
3436
import java.util.Arrays;
37+
import java.util.EnumSet;
3538
import java.util.List;
3639
import java.util.Locale;
3740

@@ -207,7 +210,12 @@ public void execute() throws MojoExecutionException, MojoFailureException {
207210
ClassLoader.getSystemClassLoader();
208211

209212
try {
210-
final Checker checker = new Checker(loader, internalRuntimeForbidden, failOnMissingClasses, failOnViolation, failOnUnresolvableSignatures) {
213+
final EnumSet<Checker.Option> options = EnumSet.noneOf(Checker.Option.class);
214+
if (internalRuntimeForbidden) options.add(INTERNAL_RUNTIME_FORBIDDEN);
215+
if (failOnMissingClasses) options.add(FAIL_ON_MISSING_CLASSES);
216+
if (failOnViolation) options.add(FAIL_ON_VIOLATION);
217+
if (failOnUnresolvableSignatures) options.add(FAIL_ON_UNRESOLVABLE_SIGNATURES);
218+
final Checker checker = new Checker(loader, options) {
211219
@Override
212220
protected void logError(String msg) {
213221
log.error(msg);

src/main/java/de/thetaphi/forbiddenapis/AntTask.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
* limitations under the License.
1919
*/
2020

21+
import static de.thetaphi.forbiddenapis.Checker.Option.*;
22+
2123
import org.apache.tools.ant.AntClassLoader;
2224
import org.apache.tools.ant.BuildException;
2325
import org.apache.tools.ant.Project;
@@ -36,6 +38,7 @@
3638
import java.io.IOException;
3739
import java.io.File;
3840
import java.util.ArrayList;
41+
import java.util.EnumSet;
3942
import java.util.Iterator;
4043
import java.util.List;
4144
import java.util.Locale;
@@ -77,7 +80,12 @@ public void execute() throws BuildException {
7780
classFiles.setProject(getProject());
7881
apiSignatures.setProject(getProject());
7982

80-
final Checker checker = new Checker(loader, internalRuntimeForbidden, failOnMissingClasses, failOnViolation, failOnUnresolvableSignatures) {
83+
final EnumSet<Checker.Option> options = EnumSet.noneOf(Checker.Option.class);
84+
if (internalRuntimeForbidden) options.add(INTERNAL_RUNTIME_FORBIDDEN);
85+
if (failOnMissingClasses) options.add(FAIL_ON_MISSING_CLASSES);
86+
if (failOnViolation) options.add(FAIL_ON_VIOLATION);
87+
if (failOnUnresolvableSignatures) options.add(FAIL_ON_UNRESOLVABLE_SIGNATURES);
88+
final Checker checker = new Checker(loader, options) {
8189
@Override
8290
protected void logError(String msg) {
8391
log(msg, Project.MSG_ERR);

src/main/java/de/thetaphi/forbiddenapis/Checker.java

+21-11
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.net.URLConnection;
3737
import java.util.Arrays;
3838
import java.util.Collections;
39+
import java.util.EnumSet;
3940
import java.util.HashMap;
4041
import java.util.LinkedHashSet;
4142
import java.util.List;
@@ -56,6 +57,13 @@
5657
* (which violates the spec).
5758
*/
5859
public abstract class Checker implements RelatedClassLookup {
60+
61+
public static enum Option {
62+
INTERNAL_RUNTIME_FORBIDDEN,
63+
FAIL_ON_MISSING_CLASSES,
64+
FAIL_ON_VIOLATION,
65+
FAIL_ON_UNRESOLVABLE_SIGNATURES
66+
}
5967

6068
public final boolean isSupportedJDK;
6169

@@ -64,7 +72,7 @@ public abstract class Checker implements RelatedClassLookup {
6472
final Set<File> bootClassPathJars;
6573
final Set<String> bootClassPathDirs;
6674
final ClassLoader loader;
67-
final boolean internalRuntimeForbidden, failOnMissingClasses, failOnViolation, defaultFailOnUnresolvableSignatures;
75+
final EnumSet<Option> options;
6876

6977
// key is the internal name (slashed):
7078
final Map<String,ClassSignature> classesToCheck = new HashMap<String,ClassSignature>();
@@ -86,12 +94,14 @@ public abstract class Checker implements RelatedClassLookup {
8694
protected abstract void logWarn(String msg);
8795
protected abstract void logInfo(String msg);
8896

89-
public Checker(ClassLoader loader, boolean internalRuntimeForbidden, boolean failOnMissingClasses, boolean failOnViolation, boolean defaultFailOnUnresolvableSignatures) {
97+
//public Checker(ClassLoader loader, boolean internalRuntimeForbidden, boolean failOnMissingClasses, boolean failOnViolation, boolean defaultFailOnUnresolvableSignatures) {
98+
public Checker(ClassLoader loader, Option... options) {
99+
this(loader, EnumSet.copyOf(Arrays.asList(options)));
100+
}
101+
102+
public Checker(ClassLoader loader, EnumSet<Option> options) {
90103
this.loader = loader;
91-
this.internalRuntimeForbidden = internalRuntimeForbidden;
92-
this.failOnMissingClasses = failOnMissingClasses;
93-
this.failOnViolation = failOnViolation;
94-
this.defaultFailOnUnresolvableSignatures = defaultFailOnUnresolvableSignatures;
104+
this.options = options;
95105
this.start = System.currentTimeMillis();
96106

97107
// default (always available)
@@ -216,7 +226,7 @@ public ClassSignature lookupRelatedClass(String internalName) {
216226
// use binary name, so we need to convert:
217227
c = getClassFromClassLoader(type.getClassName());
218228
} catch (ClassNotFoundException cnfe) {
219-
if (failOnMissingClasses) {
229+
if (options.contains(Option.FAIL_ON_MISSING_CLASSES)) {
220230
throw new WrapperRuntimeException(cnfe);
221231
} else {
222232
logWarn(String.format(Locale.ENGLISH,
@@ -359,7 +369,7 @@ private void parseSignaturesFile(Reader reader, boolean allowBundled) throws IOE
359369
final BufferedReader r = new BufferedReader(reader);
360370
try {
361371
String line, defaultMessage = null;
362-
boolean failOnUnresolvableSignatures = this.defaultFailOnUnresolvableSignatures;
372+
boolean failOnUnresolvableSignatures = options.contains(Option.FAIL_ON_UNRESOLVABLE_SIGNATURES);
363373
while ((line = r.readLine()) != null) {
364374
line = line.trim();
365375
if (line.length() == 0 || line.startsWith("#"))
@@ -397,7 +407,7 @@ public final void addClassToCheck(final InputStream in) throws IOException {
397407
}
398408

399409
public final boolean hasNoSignatures() {
400-
return forbiddenMethods.isEmpty() && forbiddenFields.isEmpty() && forbiddenClasses.isEmpty() && forbiddenClassPatterns.isEmpty() && (!internalRuntimeForbidden);
410+
return forbiddenMethods.isEmpty() && forbiddenFields.isEmpty() && forbiddenClasses.isEmpty() && forbiddenClassPatterns.isEmpty() && (!options.contains(Option.INTERNAL_RUNTIME_FORBIDDEN));
401411
}
402412

403413
/** Adds the given annotation class for suppressing errors. */
@@ -413,7 +423,7 @@ public final void addSuppressAnnotation(String annoName) {
413423
/** Parses a class and checks for valid method invocations */
414424
private int checkClass(final ClassReader reader, Pattern suppressAnnotationsPattern) {
415425
final String className = Type.getObjectType(reader.getClassName()).getClassName();
416-
final ClassScanner scanner = new ClassScanner(this, forbiddenClasses, forbiddenClassPatterns, forbiddenMethods, forbiddenFields, suppressAnnotationsPattern, internalRuntimeForbidden);
426+
final ClassScanner scanner = new ClassScanner(this, forbiddenClasses, forbiddenClassPatterns, forbiddenMethods, forbiddenFields, suppressAnnotationsPattern, options.contains(Option.INTERNAL_RUNTIME_FORBIDDEN));
417427
reader.accept(scanner, ClassReader.SKIP_FRAMES);
418428
final List<ForbiddenViolation> violations = scanner.getSortedViolations();
419429
final Pattern splitter = Pattern.compile(Pattern.quote("\n"));
@@ -440,7 +450,7 @@ public final void run() throws ForbiddenApiException {
440450
final String message = String.format(Locale.ENGLISH,
441451
"Scanned %d (and %d related) class file(s) for forbidden API invocations (in %.2fs), %d error(s).",
442452
classesToCheck.size(), classesToCheck.isEmpty() ? 0 : classpathClassCache.size(), (System.currentTimeMillis() - start) / 1000.0, errors);
443-
if (failOnViolation && errors > 0) {
453+
if (options.contains(Option.FAIL_ON_VIOLATION) && errors > 0) {
444454
logError(message);
445455
throw new ForbiddenApiException("Check for forbidden API calls failed, see log.");
446456
} else {

src/main/java/de/thetaphi/forbiddenapis/CliMain.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616
* limitations under the License.
1717
*/
1818

19+
import static de.thetaphi.forbiddenapis.Checker.Option.*;
20+
1921
import java.io.Closeable;
2022
import java.io.File;
2123
import java.io.FileInputStream;
2224
import java.io.IOException;
2325
import java.util.Arrays;
26+
import java.util.EnumSet;
2427
import java.util.Locale;
2528
import java.net.JarURLConnection;
2629
import java.net.URLConnection;
@@ -220,8 +223,11 @@ public void run() throws ExitException {
220223

221224
final URLClassLoader loader = URLClassLoader.newInstance(urls, ClassLoader.getSystemClassLoader());
222225
try {
223-
final Checker checker = new Checker(loader, cmd.hasOption(internalruntimeforbiddenOpt.getLongOpt()),
224-
!cmd.hasOption(allowmissingclassesOpt.getLongOpt()), true, !cmd.hasOption(allowunresolvablesignaturesOpt.getLongOpt())) {
226+
final EnumSet<Checker.Option> options = EnumSet.of(FAIL_ON_VIOLATION);
227+
if (cmd.hasOption(internalruntimeforbiddenOpt.getLongOpt())) options.add(INTERNAL_RUNTIME_FORBIDDEN);
228+
if (!cmd.hasOption(allowmissingclassesOpt.getLongOpt())) options.add(FAIL_ON_MISSING_CLASSES);
229+
if (!cmd.hasOption(allowunresolvablesignaturesOpt.getLongOpt())) options.add(FAIL_ON_UNRESOLVABLE_SIGNATURES);
230+
final Checker checker = new Checker(loader, options) {
225231
@Override
226232
protected void logError(String msg) {
227233
CliMain.this.logError(msg);

src/test/java/de/thetaphi/forbiddenapis/CheckerSetupTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
* limitations under the License.
1717
*/
1818

19+
import static de.thetaphi.forbiddenapis.Checker.Option.*;
1920
import static org.junit.Assert.assertEquals;
2021
import static org.junit.Assume.assumeTrue;
2122

@@ -29,7 +30,7 @@ public final class CheckerSetupTest {
2930
@SuppressForbidden
3031
static final class MyChecker extends Checker {
3132
public MyChecker() {
32-
super(ClassLoader.getSystemClassLoader(), true, true, true, true);
33+
super(ClassLoader.getSystemClassLoader(), INTERNAL_RUNTIME_FORBIDDEN, FAIL_ON_MISSING_CLASSES, FAIL_ON_VIOLATION, FAIL_ON_UNRESOLVABLE_SIGNATURES);
3334
}
3435

3536
@Override

0 commit comments

Comments
 (0)