Skip to content
Merged
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
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ Rules can be sourced from OSS libraries or private internal libraries.
### Runner Plugin
[![Gradle Plugin Portal](https://img.shields.io/gradle-plugin-portal/v/com.netflix.nebula.archrules.runner?style=for-the-badge&color=01AF01)](https://plugins.gradle.org/plugin/com.netflix.nebula.archrules.runner)

### Aggregate Console Report Plugin
[![Gradle Plugin Portal](https://img.shields.io/gradle-plugin-portal/v/com.netflix.nebula.archrules.aggregate?style=for-the-badge&color=01AF01)](https://plugins.gradle.org/plugin/com.netflix.nebula.archrules.aggregate)


## Authoring Rules

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
package com.netflix.nebula.archrules.core;

import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.core.importer.ClassFileImporterWithPackage;
import com.tngtech.archunit.core.importer.Location;
import com.tngtech.archunit.core.importer.Locations;
import com.tngtech.archunit.lang.ArchRule;
import com.tngtech.archunit.lang.ConditionEvents;
import com.tngtech.archunit.lang.EvaluationResult;

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.*;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -52,22 +49,7 @@ public static EvaluationResult check(ArchRule rule, Class<?>... classesToCheck)
.map(Locations::ofClass)
.flatMap(Collection::stream)
.collect(Collectors.toSet());
List<URL> uris = Arrays.stream(classesToCheck)
.map(clazz -> clazz.getPackage().getName())
.map(Locations::ofPackage)
.flatMap(it -> it.stream().map(Location::asURI))
.map(u -> URI.create(u.toASCIIString() + "package-info.class"))
.map(uri -> {
try {
return uri.toURL();
} catch (MalformedURLException e) {
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
locs.addAll(Locations.of(uris));
final JavaClasses classes = new ClassFileImporter()
final JavaClasses classes = new ClassFileImporterWithPackage()
.importLocations(locs);
return check(rule, classes);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.tngtech.archunit.core.domain;

import java.util.Arrays;

/**
* logic from <a href="https://github.com/TNG/ArchUnit/pull/1565">package dependency scanning</a>
*/
public class DomainObjectCreationContextWithPackage {

public static void completePackage(JavaClass javaClass, ImportContext importContext) {
JavaPackage javaPackage = JavaPackage.from(Arrays.asList(
javaClass,
importContext.resolveClass(javaClass.getPackageName() + ".package-info")));
javaClass.setPackage(javaPackage);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.tngtech.archunit.core.importer;

import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.thirdparty.com.google.common.collect.Iterables;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toSet;

/**
* copy of <a href="https://github.com/TNG/ArchUnit/blob/main/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileImporter.java">ClassFileImporter</a>
* changed to use custom elements for package info resolution
*/
public class ClassFileImporterWithPackage {
private static final Logger LOG = LoggerFactory.getLogger(ClassFileImporterWithPackage.class);
private final ImportOptions importOptions;

public ClassFileImporterWithPackage() {
this(new ImportOptions());
}

public ClassFileImporterWithPackage(Collection<ImportOption> importOptions) {
this(new ImportOptions().with(importOptions));
}

private ClassFileImporterWithPackage(ImportOptions importOptions) {
this.importOptions = importOptions;
}

public JavaClasses importLocations(Collection<Location> locations) {
List<ClassFileSource> sources = new ArrayList<>();
for (Location location : locations) {
tryAdd(sources, location);
}
return new ClassFileProcessorWithPackage().process(unify(sources));
}

public JavaClasses importPaths(String... paths) {
return importPaths(stream(paths).map(Paths::get).collect(toSet()));
}

public JavaClasses importPaths(Collection<Path> paths) {
return importLocations(paths.stream().map(Location::of).collect(toSet()));
}

private void tryAdd(List<ClassFileSource> sources, Location location) {
try {
sources.add(location.asClassFileSource(importOptions));
} catch (Exception e) {
LOG.warn(String.format("Couldn't derive %s from %s",
ClassFileSource.class.getSimpleName(), location), e);
}
}

private ClassFileSource unify(List<ClassFileSource> sources) {
return Iterables.concat(sources)::iterator;
}
}
Loading