Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 40 additions & 43 deletions src/main/java/de/thetaphi/forbiddenapis/Checker.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,7 @@
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.NavigableSet;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
import java.util.*;
import java.util.regex.Pattern;

import org.objectweb.asm.ClassReader;
Expand Down Expand Up @@ -437,7 +426,7 @@ public void addSuppressAnnotation(String annoName) {
}

/** Parses a class and checks for valid method invocations */
private int checkClass(ClassMetadata c, Pattern suppressAnnotationsPattern) throws ForbiddenApiException {
private ScanResult checkClass(ClassMetadata c, Pattern suppressAnnotationsPattern) throws ForbiddenApiException {
final String className = c.getBinaryClassName();
final ClassScanner scanner = new ClassScanner(c, this, forbiddenSignatures, suppressAnnotationsPattern, options.contains(Option.FAIL_ON_VIOLATION));
try {
Expand Down Expand Up @@ -472,41 +461,40 @@ private int checkClass(ClassMetadata c, Pattern suppressAnnotationsPattern) thro
// else rethrow (it's occuring in our code):
throw re;
}
final List<ForbiddenViolation> violations = scanner.getSortedViolations();
final Pattern splitter = Pattern.compile(Pattern.quote(ForbiddenViolation.SEPARATOR));
int numErrors = 0;
for (final ForbiddenViolation v : violations) {
if (v.severity == ViolationSeverity.ERROR) {
numErrors++;
}
for (final String line : splitter.split(v.format(className, scanner.getSourceFile()))) {
switch (v.severity) {
case DEBUG:
logger.debug(line);
break;
case INFO:
logger.info(line);
break;
case WARNING:
logger.warn(line);
break;
case ERROR:
logger.error(line);
break;
default:
break;
}
}
}
return numErrors;
return new ScanResult(className, scanner.getSourceFile(), scanner.getSortedViolations());
}

public void run() throws ForbiddenApiException {
logger.info("Scanning classes for violations...");
int errors = 0;
final Pattern suppressAnnotationsPattern = AsmUtils.glob2Pattern(suppressAnnotations.toArray(new String[suppressAnnotations.size()]));
for (final ClassMetadata c : classesToCheck.values()) {
errors += checkClass(c, suppressAnnotationsPattern);

List<ScanResult> scanResults = runWithResults();
final Pattern splitter = Pattern.compile(Pattern.quote(ForbiddenViolation.SEPARATOR));

for (ScanResult scanResult : scanResults) {
for (ForbiddenViolation violation : scanResult.getViolations()) {
if (violation.severity == ViolationSeverity.ERROR) {
errors++;
}
for (final String line : splitter.split(violation.format(scanResult.getClassName(), scanResult.getSourceFile()))) {
switch (violation.severity) {
case DEBUG:
logger.debug(line);
break;
case INFO:
logger.info(line);
break;
case WARNING:
logger.warn(line);
break;
case ERROR:
logger.error(line);
break;
default:
break;
}
}
}
}

if (!missingClasses.isEmpty() ) {
Expand All @@ -524,4 +512,13 @@ public void run() throws ForbiddenApiException {
logger.info(message);
}
}

public List<ScanResult> runWithResults() throws ForbiddenApiException {
List<ScanResult> overallChecks = new ArrayList<>();
final Pattern suppressAnnotationsPattern = AsmUtils.glob2Pattern(suppressAnnotations.toArray(new String[0]));
for (final ClassMetadata c : classesToCheck.values()) {
overallChecks.add(checkClass(c, suppressAnnotationsPattern));
}
return overallChecks;
}
}
31 changes: 31 additions & 0 deletions src/main/java/de/thetaphi/forbiddenapis/ScanResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package de.thetaphi.forbiddenapis;

import java.util.List;

/**
* Result of a single class scan.
*/
public final class ScanResult {

private final String className;
private final String sourceFile;
private final List<ForbiddenViolation> violations;

ScanResult(String className, String sourceFile, List<ForbiddenViolation> violations) {
this.className = className;
this.sourceFile = sourceFile;
this.violations = violations;
}

public String getClassName() {
return className;
}

public String getSourceFile() {
return sourceFile;
}

public List<ForbiddenViolation> getViolations() {
return violations;
}
}