26
26
import java .util .function .Supplier ;
27
27
import java .util .stream .Stream ;
28
28
29
+ import com .tngtech .archunit .ArchConfiguration ;
29
30
import com .tngtech .archunit .core .domain .JavaClasses ;
30
31
import com .tngtech .archunit .core .importer .ClassFileImporter ;
31
32
import com .tngtech .archunit .lang .ArchRule ;
32
33
import com .tngtech .archunit .lang .EvaluationResult ;
33
34
import org .gradle .api .DefaultTask ;
34
35
import org .gradle .api .Task ;
35
36
import org .gradle .api .Transformer ;
37
+ import org .gradle .api .file .ConfigurableFileCollection ;
36
38
import org .gradle .api .file .DirectoryProperty ;
37
39
import org .gradle .api .file .FileCollection ;
38
40
import org .gradle .api .file .FileTree ;
39
41
import org .gradle .api .provider .ListProperty ;
40
42
import org .gradle .api .provider .Property ;
43
+ import org .gradle .api .tasks .Classpath ;
41
44
import org .gradle .api .tasks .IgnoreEmptyDirectories ;
42
45
import org .gradle .api .tasks .Input ;
43
46
import org .gradle .api .tasks .InputFiles ;
58
61
* @author Scott Frederick
59
62
* @author Ivan Malutin
60
63
* @author Phillip Webb
64
+ * @author Dmytro Nosan
61
65
*/
62
66
public abstract class ArchitectureCheck extends DefaultTask {
63
67
@@ -80,14 +84,19 @@ private List<String> asDescriptions(List<ArchRule> rules) {
80
84
}
81
85
82
86
@ 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
+ });
91
100
}
92
101
93
102
private List <Path > classFilesPaths () {
@@ -98,15 +107,21 @@ private Stream<EvaluationResult> evaluate(JavaClasses javaClasses) {
98
107
return getRules ().get ().stream ().map ((rule ) -> rule .evaluate (javaClasses ));
99
108
}
100
109
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 ());
107
124
}
108
- Files .writeString (outputFile .toPath (), report .toString (), StandardOpenOption .CREATE ,
109
- StandardOpenOption .TRUNCATE_EXISTING );
110
125
}
111
126
112
127
public void setClasses (FileCollection classes ) {
@@ -126,6 +141,10 @@ final FileTree getInputClasses() {
126
141
return this .classes .getAsFileTree ();
127
142
}
128
143
144
+ @ InputFiles
145
+ @ Classpath
146
+ public abstract ConfigurableFileCollection getCompileClasspath ();
147
+
129
148
@ Optional
130
149
@ InputFiles
131
150
@ PathSensitive (PathSensitivity .RELATIVE )
0 commit comments