Skip to content

Commit 9de5e1f

Browse files
committed
Hide warnings about missing classes in bundled signatures. This prevents the common warning in Java 9 when you load deprecated signatures
1 parent 1be7471 commit 9de5e1f

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

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

+32-17
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,29 @@ public static enum Option {
9090
// descriptors (not internal names) of all annotations that suppress:
9191
final Set<String> suppressAnnotations = new LinkedHashSet<String>();
9292

93+
private static enum UnresolvableReporting {
94+
FAIL() {
95+
@Override
96+
public void parseFailed(Logger logger, String message, String signature) throws ParseException {
97+
throw new ParseException(String.format(Locale.ENGLISH, "%s while parsing signature: %s", message, signature));
98+
}
99+
},
100+
WARNING() {
101+
@Override
102+
public void parseFailed(Logger logger, String message, String signature) throws ParseException {
103+
logger.warn(String.format(Locale.ENGLISH, "%s while parsing signature: %s [signature ignored]", message, signature));
104+
}
105+
},
106+
SILENT() {
107+
@Override
108+
public void parseFailed(Logger logger, String message, String signature) throws ParseException {
109+
// keep silent
110+
}
111+
};
112+
113+
public abstract void parseFailed(Logger logger, String message, String signature) throws ParseException;
114+
}
115+
93116
public Checker(Logger logger, ClassLoader loader, Option... options) {
94117
this(logger, loader, (options.length == 0) ? EnumSet.noneOf(Option.class) : EnumSet.copyOf(Arrays.asList(options)));
95118
}
@@ -296,16 +319,8 @@ public ClassSignature lookupRelatedClass(String internalName) {
296319
return c;
297320
}
298321

299-
private void reportParseFailed(boolean failOnUnresolvableSignatures, String message, String signature) throws ParseException {
300-
if (failOnUnresolvableSignatures) {
301-
throw new ParseException(String.format(Locale.ENGLISH, "%s while parsing signature: %s", message, signature));
302-
} else {
303-
logger.warn(String.format(Locale.ENGLISH, "%s while parsing signature: %s [signature ignored]", message, signature));
304-
}
305-
}
306-
307322
/** Adds the method signature to the list of disallowed methods. The Signature is checked against the given ClassLoader. */
308-
private void addSignature(final String line, final String defaultMessage, final boolean failOnUnresolvableSignatures) throws ParseException,IOException {
323+
private void addSignature(final String line, final String defaultMessage, final UnresolvableReporting report) throws ParseException,IOException {
309324
final String clazz, field, signature, message;
310325
final Method method;
311326
int p = line.indexOf('@');
@@ -355,7 +370,7 @@ private void addSignature(final String line, final String defaultMessage, final
355370
try {
356371
c = getClassFromClassLoader(clazz);
357372
} catch (ClassNotFoundException cnfe) {
358-
reportParseFailed(failOnUnresolvableSignatures, String.format(Locale.ENGLISH, "Class '%s' not found on classpath", cnfe.getMessage()), signature);
373+
report.parseFailed(logger, String.format(Locale.ENGLISH, "Class '%s' not found on classpath", cnfe.getMessage()), signature);
359374
return;
360375
}
361376
if (method != null) {
@@ -370,13 +385,13 @@ private void addSignature(final String line, final String defaultMessage, final
370385
}
371386
}
372387
if (!found) {
373-
reportParseFailed(failOnUnresolvableSignatures, "Method not found", signature);
388+
report.parseFailed(logger, "Method not found", signature);
374389
return;
375390
}
376391
} else if (field != null) {
377392
assert method == null;
378393
if (!c.fields.contains(field)) {
379-
reportParseFailed(failOnUnresolvableSignatures, "Field not found", signature);
394+
report.parseFailed(logger, "Field not found", signature);
380395
return;
381396
}
382397
forbiddenFields.put(c.className + '\000' + field, printout);
@@ -445,29 +460,29 @@ private void parseSignaturesFile(InputStream in, boolean allowBundled) throws IO
445460
private static final String DEFAULT_MESSAGE_PREFIX = "@defaultMessage ";
446461
private static final String IGNORE_UNRESOLVABLE_LINE = "@ignoreUnresolvable";
447462

448-
private void parseSignaturesFile(Reader reader, boolean allowBundled) throws IOException,ParseException {
463+
private void parseSignaturesFile(Reader reader, boolean isBundled) throws IOException,ParseException {
449464
final BufferedReader r = new BufferedReader(reader);
450465
try {
451466
String line, defaultMessage = null;
452-
boolean failOnUnresolvableSignatures = options.contains(Option.FAIL_ON_UNRESOLVABLE_SIGNATURES);
467+
UnresolvableReporting reporter = options.contains(Option.FAIL_ON_UNRESOLVABLE_SIGNATURES) ? UnresolvableReporting.FAIL : UnresolvableReporting.WARNING;
453468
while ((line = r.readLine()) != null) {
454469
line = line.trim();
455470
if (line.length() == 0 || line.startsWith("#"))
456471
continue;
457472
if (line.startsWith("@")) {
458-
if (allowBundled && line.startsWith(BUNDLED_PREFIX)) {
473+
if (isBundled && line.startsWith(BUNDLED_PREFIX)) {
459474
final String name = line.substring(BUNDLED_PREFIX.length()).trim();
460475
parseBundledSignatures(name, null, false);
461476
} else if (line.startsWith(DEFAULT_MESSAGE_PREFIX)) {
462477
defaultMessage = line.substring(DEFAULT_MESSAGE_PREFIX.length()).trim();
463478
if (defaultMessage.length() == 0) defaultMessage = null;
464479
} else if (line.equals(IGNORE_UNRESOLVABLE_LINE)) {
465-
failOnUnresolvableSignatures = false;
480+
reporter = isBundled ? UnresolvableReporting.SILENT : UnresolvableReporting.WARNING;
466481
} else {
467482
throw new ParseException("Invalid line in signature file: " + line);
468483
}
469484
} else {
470-
addSignature(line, defaultMessage, failOnUnresolvableSignatures);
485+
addSignature(line, defaultMessage, reporter);
471486
}
472487
}
473488
} finally {

0 commit comments

Comments
 (0)