diff --git a/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileImporter.java b/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileImporter.java index 9734ffe465..efa321ba2b 100644 --- a/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileImporter.java +++ b/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileImporter.java @@ -26,6 +26,7 @@ import java.util.Set; import java.util.jar.JarFile; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.tngtech.archunit.PublicAPI; @@ -68,7 +69,21 @@ public JavaClasses importPath(Path path) { @PublicAPI(usage = ACCESS) public JavaClasses importJar(JarFile jar) { - return importLocations(singleton(Location.of(jar))); + return importJars(jar); + } + + @PublicAPI(usage = ACCESS) + public JavaClasses importJars(JarFile... jarFiles) { + return importJars(ImmutableList.copyOf(jarFiles)); + } + + @PublicAPI(usage = ACCESS) + public JavaClasses importJars(Iterable jarFiles) { + Set locations = new HashSet<>(); + for (JarFile jarFile : jarFiles) { + locations.add(Location.of(jarFile)); + } + return importLocations(locations); } /** diff --git a/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterTest.java b/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterTest.java index f3ca89d9cb..0e9dfe4979 100644 --- a/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterTest.java @@ -1,6 +1,5 @@ package com.tngtech.archunit.core.importer; -import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.io.Serializable; @@ -25,6 +24,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Suppliers; import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.tngtech.archunit.ArchConfiguration; @@ -1670,16 +1670,7 @@ public void imports_class_objects() throws Exception { } @Test - public void ImportOptions_are_respected() throws Exception { - ClassFileImporter importer = new ClassFileImporter().withImportOption(importNothing()); - - assertThat(importer.importPath(Paths.get(urlOf(getClass()).toURI()))).isEmpty(); - assertThat(importer.importUrl(urlOf(getClass()))).isEmpty(); - assertThat(importer.importJar(jarFileOf(Rule.class))).isEmpty(); - } - - @Test - public void imports_package() { + public void imports_packages() { Set> expectedClasses = ImmutableSet.of(getClass(), Rule.class); Set packages = packagesOf(expectedClasses); @@ -1688,6 +1679,31 @@ public void imports_package() { assertThatClasses(classes).contain(expectedClasses); } + @Test + public void imports_jars() throws Exception { + JavaClasses classes = new ClassFileImporter().importJar(jarFileOf(Rule.class)); + assertThatClasses(classes).contain(Rule.class); + assertThatClasses(classes).dontContain(Object.class, ImmutableList.class); + + classes = new ClassFileImporter().importJars(jarFileOf(Rule.class), jarFileOf(ImmutableList.class)); + assertThatClasses(classes).contain(Rule.class, ImmutableList.class); + assertThatClasses(classes).dontContain(Object.class); + + classes = new ClassFileImporter().importJars(ImmutableList.of( + jarFileOf(Rule.class), jarFileOf(ImmutableList.class))); + assertThatClasses(classes).contain(Rule.class, ImmutableList.class); + assertThatClasses(classes).dontContain(Object.class); + } + + @Test + public void ImportOptions_are_respected() throws Exception { + ClassFileImporter importer = new ClassFileImporter().withImportOption(importNothing()); + + assertThat(importer.importPath(Paths.get(urlOf(getClass()).toURI()))).isEmpty(); + assertThat(importer.importUrl(urlOf(getClass()))).isEmpty(); + assertThat(importer.importJar(jarFileOf(Rule.class))).isEmpty(); + } + private Set packagesOf(Set> classes) { Set result = new HashSet<>(); for (Class c : classes) { @@ -1696,11 +1712,10 @@ private Set packagesOf(Set> classes) { return result; } - private JarFile jarFileOf(Class clazzInJar) throws IOException { + private JarFile jarFileOf(Class clazzInJar) throws IOException { String fileName = urlOf(clazzInJar).getFile(); checkArgument(fileName.contains(".jar!/"), "Class %s is not contained in a JAR", clazzInJar.getName()); - File file = new File(fileName.replaceAll(".*:", "").replaceAll("!/.*", "")); - return new JarFile(file); + return new JarFile(fileName.replaceAll(".*:", "").replaceAll("!/.*", "")); } private ImportOption importNothing() { diff --git a/archunit/src/test/java/com/tngtech/archunit/testutil/Assertions.java b/archunit/src/test/java/com/tngtech/archunit/testutil/Assertions.java index 6b92d55870..e16723507c 100644 --- a/archunit/src/test/java/com/tngtech/archunit/testutil/Assertions.java +++ b/archunit/src/test/java/com/tngtech/archunit/testutil/Assertions.java @@ -155,13 +155,25 @@ public void matchExactly(Class... classes) { } } + public void contain(Class... classes) { + contain(ImmutableSet.copyOf(classes)); + } + + public void dontContain(Class... classes) { + assertThat(actualNames()).doesNotContainAnyElementsOf(JavaClass.namesOf(classes)); + } + public void contain(Iterable> classes) { + List expectedNames = JavaClass.namesOf(Lists.newArrayList(classes)); + assertThat(actualNames()).as("actual classes").containsAll(expectedNames); + } + + private Set actualNames() { Set actualNames = new HashSet<>(); for (JavaClass javaClass : actual) { actualNames.add(javaClass.getName()); } - List expectedNames = JavaClass.namesOf(Lists.newArrayList(classes)); - assertThat(actualNames).as("actual classes").containsAll(expectedNames); + return actualNames; } }