2626import java .util .function .Supplier ;
2727import java .util .stream .Stream ;
2828
29+ import com .tngtech .archunit .ArchConfiguration ;
2930import com .tngtech .archunit .core .domain .JavaClasses ;
3031import com .tngtech .archunit .core .importer .ClassFileImporter ;
3132import com .tngtech .archunit .lang .ArchRule ;
3233import com .tngtech .archunit .lang .EvaluationResult ;
3334import org .gradle .api .DefaultTask ;
3435import org .gradle .api .Task ;
3536import org .gradle .api .Transformer ;
37+ import org .gradle .api .file .ConfigurableFileCollection ;
3638import org .gradle .api .file .DirectoryProperty ;
3739import org .gradle .api .file .FileCollection ;
3840import org .gradle .api .file .FileTree ;
3941import org .gradle .api .provider .ListProperty ;
4042import org .gradle .api .provider .Property ;
43+ import org .gradle .api .tasks .Classpath ;
4144import org .gradle .api .tasks .IgnoreEmptyDirectories ;
4245import org .gradle .api .tasks .Input ;
4346import org .gradle .api .tasks .InputFiles ;
5861 * @author Scott Frederick
5962 * @author Ivan Malutin
6063 * @author Phillip Webb
64+ * @author Dmytro Nosan
6165 */
6266public abstract class ArchitectureCheck extends DefaultTask {
6367
@@ -80,14 +84,19 @@ private List<String> asDescriptions(List<ArchRule> rules) {
8084 }
8185
8286 @ TaskAction
83- void checkArchitecture () throws IOException {
84- JavaClasses javaClasses = new ClassFileImporter ().importPaths (classFilesPaths ());
85- List <EvaluationResult > violations = evaluate (javaClasses ).filter (EvaluationResult ::hasViolation ).toList ();
86- File outputFile = getOutputDirectory ().file ("failure-report.txt" ).get ().getAsFile ();
87- writeViolationReport (violations , outputFile );
88- if (!violations .isEmpty ()) {
89- throw new VerificationException ("Architecture check failed. See '" + outputFile + "' for details." );
90- }
87+ void checkArchitecture () {
88+ ArchConfiguration .withThreadLocalScope ((archConfiguration ) -> {
89+ archConfiguration .setClassResolver (CompileClasspathClassResolver .class );
90+ archConfiguration .setClassResolverArguments (
91+ getCompileClasspath ().getFiles ().stream ().map (File ::toString ).toArray (String []::new ));
92+ JavaClasses javaClasses = new ClassFileImporter ().importPaths (classFilesPaths ());
93+ List <EvaluationResult > violations = evaluate (javaClasses ).filter (EvaluationResult ::hasViolation ).toList ();
94+ File outputFile = getOutputDirectory ().file ("failure-report.txt" ).get ().getAsFile ();
95+ writeViolationReport (violations , outputFile );
96+ if (!violations .isEmpty ()) {
97+ throw new VerificationException ("Architecture check failed. See '" + outputFile + "' for details." );
98+ }
99+ });
91100 }
92101
93102 private List <Path > classFilesPaths () {
@@ -98,15 +107,21 @@ private Stream<EvaluationResult> evaluate(JavaClasses javaClasses) {
98107 return getRules ().get ().stream ().map ((rule ) -> rule .evaluate (javaClasses ));
99108 }
100109
101- private void writeViolationReport (List <EvaluationResult > violations , File outputFile ) throws IOException {
102- outputFile .getParentFile ().mkdirs ();
103- StringBuilder report = new StringBuilder ();
104- for (EvaluationResult violation : violations ) {
105- report .append (violation .getFailureReport ());
106- report .append (String .format ("%n" ));
110+ private void writeViolationReport (List <EvaluationResult > violations , File outputFile ) {
111+ try {
112+ Files .createDirectories (outputFile .getParentFile ().toPath ());
113+ StringBuilder report = new StringBuilder ();
114+ for (EvaluationResult violation : violations ) {
115+ report .append (violation .getFailureReport ());
116+ report .append (String .format ("%n" ));
117+ }
118+ Files .writeString (outputFile .toPath (), report .toString (), StandardOpenOption .CREATE ,
119+ StandardOpenOption .TRUNCATE_EXISTING );
120+ }
121+ catch (IOException ex ) {
122+ throw new VerificationException (
123+ "Failed to write violation report to '" + outputFile + "' " + ex .getMessage ());
107124 }
108- Files .writeString (outputFile .toPath (), report .toString (), StandardOpenOption .CREATE ,
109- StandardOpenOption .TRUNCATE_EXISTING );
110125 }
111126
112127 public void setClasses (FileCollection classes ) {
@@ -126,6 +141,10 @@ final FileTree getInputClasses() {
126141 return this .classes .getAsFileTree ();
127142 }
128143
144+ @ InputFiles
145+ @ Classpath
146+ public abstract ConfigurableFileCollection getCompileClasspath ();
147+
129148 @ Optional
130149 @ InputFiles
131150 @ PathSensitive (PathSensitivity .RELATIVE )
0 commit comments