Skip to content

Commit 3776c43

Browse files
committed
Introduces ScanOption.ignoreExternalJars
1 parent a137d34 commit 3776c43

File tree

6 files changed

+39
-9
lines changed

6 files changed

+39
-9
lines changed

equalsverifier-core/src/main/java/nl/jqno/equalsverifier/ScanOption.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ public static ScanOption recursive() {
1717
return ScanOptions.O.RECURSIVE;
1818
}
1919

20+
/**
21+
* Signals that packages from external jars, which can't be scanned, will be ignored rather than throw an exception.
22+
*
23+
* @return The 'ignore external jars' flag.
24+
*/
25+
public static ScanOption ignoreExternalJars() {
26+
return ScanOptions.O.IGNORE_EXTERNAL_JARS;
27+
}
28+
2029
/**
2130
* Finds only classes that extend or implement the given type.
2231
*

equalsverifier-core/src/main/java/nl/jqno/equalsverifier/ScanOptions.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ final class ScanOptions {
99
private ScanOptions() {}
1010

1111
enum O implements ScanOption {
12-
RECURSIVE;
12+
RECURSIVE, IGNORE_EXTERNAL_JARS;
1313
}
1414

1515
static class MustExtend implements ScanOption {
@@ -45,6 +45,9 @@ public static PackageScanOptions process(ScanOption... options) {
4545
if (option.equals(O.RECURSIVE)) {
4646
result.scanRecursively = true;
4747
}
48+
if (option.equals(O.IGNORE_EXTERNAL_JARS)) {
49+
result.ignoreExternalJars = true;
50+
}
4851
if (option instanceof MustExtend) {
4952
MustExtend me = (MustExtend) option;
5053
result.mustExtend = me.type;

equalsverifier-core/src/main/java/nl/jqno/equalsverifier/internal/reflection/PackageScanOptions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
public class PackageScanOptions {
88

99
public boolean scanRecursively = false;
10+
public boolean ignoreExternalJars = false;
1011
public Class<?> mustExtend = null;
1112
public Set<Class<?>> exceptClasses = new HashSet<>();
1213
public Predicate<Class<?>> exclusionPredicate = c -> false;

equalsverifier-core/src/main/java/nl/jqno/equalsverifier/internal/reflection/PackageScanner.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44

55
import java.io.File;
66
import java.net.URL;
7-
import java.util.Arrays;
8-
import java.util.Collections;
9-
import java.util.List;
7+
import java.util.*;
108
import java.util.stream.Collectors;
9+
import java.util.stream.Stream;
1110

1211
import nl.jqno.equalsverifier.internal.exceptions.ReflectionException;
1312
import nl.jqno.equalsverifier.internal.util.Validations;
@@ -30,7 +29,7 @@ private PackageScanner() {}
3029
* @return the classes contained in the given package.
3130
*/
3231
public static List<Class<?>> getClassesIn(String packageName, PackageScanOptions options) {
33-
List<Class<?>> result = getDirs(packageName)
32+
List<Class<?>> result = getDirs(packageName, options)
3433
.stream()
3534
.flatMap(d -> getClassesInDir(packageName, d, options).stream())
3635
.collect(Collectors.toList());
@@ -41,24 +40,27 @@ public static List<Class<?>> getClassesIn(String packageName, PackageScanOptions
4140
return result;
4241
}
4342

44-
private static List<File> getDirs(String packageName) {
43+
private static List<File> getDirs(String packageName, PackageScanOptions options) {
4544
ClassLoader cl = Thread.currentThread().getContextClassLoader();
4645
String path = packageName.replace('.', '/');
4746
return rethrow(
4847
() -> Collections
4948
.list(cl.getResources(path))
5049
.stream()
51-
.map(r -> new File(getResourcePath(r)))
50+
.flatMap(r -> getResourcePath(r, options))
5251
.collect(Collectors.toList()),
5352
e -> "Could not scan package " + packageName);
5453
}
5554

56-
private static String getResourcePath(URL r) {
55+
private static Stream<File> getResourcePath(URL r, PackageScanOptions options) {
5756
String result = rethrow(() -> r.toURI().getPath(), e -> "Could not resolve resource path: " + e.getMessage());
5857
if (result == null) {
58+
if (options.ignoreExternalJars) {
59+
return Stream.empty();
60+
}
5961
throw new ReflectionException("Could not resolve third-party resource " + r);
6062
}
61-
return result;
63+
return Stream.of(new File(result));
6264
}
6365

6466
private static List<Class<?>> getClassesInDir(String packageName, File dir, PackageScanOptions options) {

equalsverifier-core/src/test/java/nl/jqno/equalsverifier/integration/operational/MultipleTypeEqualsVerifierTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ void fail_whenVerifyingAThirdPartyPackage() {
7878
.assertMessageContains("Could not resolve");
7979
}
8080

81+
@Test
82+
void failDifferently_whenVerifyingAThirdPartyPackage_givenScanOptionIgnoreExternalJars() {
83+
ExpectedException
84+
.when(() -> EqualsVerifier.forPackage("org.junit", ScanOption.ignoreExternalJars()).verify())
85+
.assertThrows(IllegalStateException.class)
86+
.assertMessageContains("org.junit", "doesn't contain any (non-Test) types");
87+
}
88+
8189
@Test
8290
void doesNotReportNonrecursive_whenPackageContainsRecursiveAndNonrecursiveClasses() {
8391
ExpectedException

equalsverifier-core/src/test/java/nl/jqno/equalsverifier/internal/reflection/PackageScannerTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,13 @@ void dependencyPackage() {
140140
.hasMessageContaining("Could not resolve third-party resource");
141141
}
142142

143+
@Test
144+
void dependencyPackageWithIgnore() {
145+
opts.ignoreExternalJars = true;
146+
List<Class<?>> classes = PackageScanner.getClassesIn("org.junit", opts);
147+
assertThat(classes).isEmpty();
148+
}
149+
143150
private void sort(List<Class<?>> classes) {
144151
classes.sort(Comparator.comparing(Class::getName));
145152
}

0 commit comments

Comments
 (0)