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,18 @@ 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 ((configuration ) -> {
89
+ configuration .setClassResolver (CompileClasspathClassResolver .class );
90
+ configuration .setProperty (CompileClasspathClassResolver .PROPERTY_NAME , getCompileClasspath ().getAsPath ());
91
+ JavaClasses javaClasses = new ClassFileImporter ().importPaths (classFilesPaths ());
92
+ List <EvaluationResult > violations = evaluate (javaClasses ).filter (EvaluationResult ::hasViolation ).toList ();
93
+ File outputFile = getOutputDirectory ().file ("failure-report.txt" ).get ().getAsFile ();
94
+ writeViolationReport (violations , outputFile );
95
+ if (!violations .isEmpty ()) {
96
+ throw new VerificationException ("Architecture check failed. See '" + outputFile + "' for details." );
97
+ }
98
+ });
91
99
}
92
100
93
101
private List <Path > classFilesPaths () {
@@ -98,15 +106,21 @@ private Stream<EvaluationResult> evaluate(JavaClasses javaClasses) {
98
106
return getRules ().get ().stream ().map ((rule ) -> rule .evaluate (javaClasses ));
99
107
}
100
108
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" ));
109
+ private void writeViolationReport (List <EvaluationResult > violations , File outputFile ) {
110
+ try {
111
+ Files .createDirectories (outputFile .getParentFile ().toPath ());
112
+ StringBuilder report = new StringBuilder ();
113
+ for (EvaluationResult violation : violations ) {
114
+ report .append (violation .getFailureReport ());
115
+ report .append (String .format ("%n" ));
116
+ }
117
+ Files .writeString (outputFile .toPath (), report .toString (), StandardOpenOption .CREATE ,
118
+ StandardOpenOption .TRUNCATE_EXISTING );
119
+ }
120
+ catch (IOException ex ) {
121
+ throw new VerificationException (
122
+ "Failed to write violation report to '" + outputFile + "' " + ex .getMessage ());
107
123
}
108
- Files .writeString (outputFile .toPath (), report .toString (), StandardOpenOption .CREATE ,
109
- StandardOpenOption .TRUNCATE_EXISTING );
110
124
}
111
125
112
126
public void setClasses (FileCollection classes ) {
@@ -126,6 +140,10 @@ final FileTree getInputClasses() {
126
140
return this .classes .getAsFileTree ();
127
141
}
128
142
143
+ @ InputFiles
144
+ @ Classpath
145
+ public abstract ConfigurableFileCollection getCompileClasspath ();
146
+
129
147
@ Optional
130
148
@ InputFiles
131
149
@ PathSensitive (PathSensitivity .RELATIVE )
0 commit comments