13
13
import org .apache .maven .plugins .annotations .ResolutionScope ;
14
14
import org .apache .maven .project .MavenProject ;
15
15
16
+ import static java .util .stream .Collectors .joining ;
17
+ import static java .util .stream .Collectors .toList ;
18
+
16
19
import java .io .File ;
17
20
import java .io .FileWriter ;
18
21
import java .io .IOException ;
@@ -41,6 +44,8 @@ public class AutoProvidesMojo extends AbstractMojo {
41
44
@ Parameter (defaultValue = "${project}" , readonly = true , required = true )
42
45
private MavenProject project ;
43
46
47
+ private final List <AvajeModule > modules = new ArrayList <>();
48
+
44
49
@ Override
45
50
public void execute () throws MojoExecutionException {
46
51
final var listUrl = compileDependencies ();
@@ -51,14 +56,16 @@ public void execute() throws MojoExecutionException {
51
56
}
52
57
53
58
try (var newClassLoader = createClassLoader (listUrl );
54
- var f = createFileWriter ("avaje-plugin-exists.txt" );
59
+ var flagFile = createFileWriter ("avaje-plugin-exists.txt" );
55
60
var moduleWriter = createFileWriter ("avaje-module-provides.txt" );
56
- var pluginWriter = createFileWriter ("avaje-plugin-provides.txt" )) {
61
+ var pluginWriter = createFileWriter ("avaje-plugin-provides.txt" );
62
+ var moduleCSV = createFileWriter ("avaje-module-dependencies.csv" )) {
57
63
58
- f .append (DISABLING_AVAJE_MODULE_VERIFICATION );
64
+ flagFile .append (DISABLING_AVAJE_MODULE_VERIFICATION );
59
65
getLog ().info (DISABLING_AVAJE_MODULE_VERIFICATION );
60
66
writeProvidedPlugins (newClassLoader , pluginWriter );
61
67
writeProvidedModules (newClassLoader , moduleWriter );
68
+ writeModuleCSV (moduleCSV );
62
69
63
70
} catch (final IOException e ) {
64
71
throw new MojoExecutionException ("Failed to write spi classes" , e );
@@ -117,17 +124,37 @@ private void writeProvidedModules(URLClassLoader newClassLoader, FileWriter modu
117
124
118
125
final Log log = getLog ();
119
126
for (final var module : ServiceLoader .load (Module .class , newClassLoader )) {
120
- log .info ("Detected External Module: " + module .getClass ().getCanonicalName ());
121
127
128
+ final var name = module .getClass ().getCanonicalName ();
129
+ log .info ("Detected External Module: " + name );
130
+
131
+ final var provides = new ArrayList <String >();
122
132
for (final Class <?> provide : module .provides ()) {
123
- providedTypes .add (provide .getCanonicalName ());
133
+ var type = provide .getCanonicalName ();
134
+ providedTypes .add (type );
135
+ provides .add (type );
124
136
}
125
137
for (final Class <?> provide : module .autoProvides ()) {
126
- providedTypes .add (provide .getCanonicalName ());
138
+ var type = provide .getCanonicalName ();
139
+ providedTypes .add (type );
140
+ provides .add (type );
127
141
}
128
142
for (final Class <?> provide : module .autoProvidesAspects ()) {
129
- providedTypes .add (wrapAspect (provide .getCanonicalName ()));
143
+ var type = wrapAspect (provide .getCanonicalName ());
144
+ providedTypes .add (type );
145
+ provides .add (type );
130
146
}
147
+
148
+ final var requires =
149
+ Arrays .stream (module .requires ()).map (Class ::getCanonicalName ).collect (toList ());
150
+
151
+ Arrays .stream (module .autoRequires ()).map (Class ::getCanonicalName ).forEach (requires ::add );
152
+ Arrays .stream (module .requiresPackages ()).map (Class ::getCanonicalName ).forEach (requires ::add );
153
+ Arrays .stream (module .autoRequiresAspects ())
154
+ .map (Class ::getCanonicalName )
155
+ .map (AutoProvidesMojo ::wrapAspect )
156
+ .forEach (requires ::add );
157
+ modules .add (new AvajeModule (name , provides , requires ));
131
158
}
132
159
133
160
for (final String providedType : providedTypes ) {
@@ -136,6 +163,20 @@ private void writeProvidedModules(URLClassLoader newClassLoader, FileWriter modu
136
163
}
137
164
}
138
165
166
+ private void writeModuleCSV (FileWriter moduleWriter ) throws IOException {
167
+ moduleWriter .write ("External Module Type|Provides|Requires" );
168
+ for (AvajeModule avajeModule : modules ) {
169
+ moduleWriter .write ("\n " );
170
+ moduleWriter .write (avajeModule .name ());
171
+ moduleWriter .write ("|" );
172
+ var provides = avajeModule .provides ().stream ().collect (joining ("," ));
173
+ moduleWriter .write (provides .isEmpty () ? " " : provides );
174
+ moduleWriter .write ("|" );
175
+ var requires = avajeModule .requires ().stream ().collect (joining ("," ));
176
+ moduleWriter .write (requires .isEmpty () ? " " : requires );
177
+ }
178
+ }
179
+
139
180
private static String wrapAspect (String aspect ) {
140
181
return "io.avaje.inject.aop.AspectProvider<" + aspect + ">" ;
141
182
}
0 commit comments