33
33
import javax .inject .Singleton ;
34
34
35
35
import org .codehaus .plexus .component .annotations .Component ;
36
- import org .codehaus .plexus .languages .java .jpms .ResolvePathsResult .ModuleNameSource ;
37
36
38
37
/**
39
38
* Maps artifacts to modules and analyzes the type of required modules
@@ -49,18 +48,46 @@ public class LocationManager
49
48
50
49
private SourceModuleInfoParser sourceParser ;
51
50
51
+ private ManifestModuleNameExtractor manifestModuleNameExtractor ;
52
+
52
53
public LocationManager ()
53
54
{
54
55
this .binaryParser = new BinaryModuleInfoParser ();
55
56
this .sourceParser = new SourceModuleInfoParser ();
57
+ this .manifestModuleNameExtractor = new ManifestModuleNameExtractor ();
56
58
}
57
59
58
60
LocationManager ( ModuleInfoParser binaryParser , SourceModuleInfoParser sourceParser )
59
61
{
60
62
this .binaryParser = binaryParser ;
61
63
this .sourceParser = sourceParser ;
64
+ this .manifestModuleNameExtractor = new ManifestModuleNameExtractor ();
62
65
}
63
66
67
+ public <T > ResolvePathResult resolvePath ( final ResolvePathRequest <T > request ) throws Exception
68
+ {
69
+ ModuleNameExtractor filenameExtractor = new ModuleNameExtractor ()
70
+ {
71
+ MainClassModuleNameExtractor extractor = new MainClassModuleNameExtractor ( request .getJdkHome () );
72
+
73
+ @ Override
74
+ public String extract ( Path file )
75
+ throws IOException
76
+ {
77
+ if ( request .getJdkHome () != null )
78
+ {
79
+ return extractor .extract ( Collections .singletonMap ( file , file ) ).get ( file );
80
+ }
81
+ else
82
+ {
83
+ return CmdModuleNameExtractor .getModuleName ( file );
84
+ }
85
+ }
86
+ };
87
+
88
+ return resolvePath ( request .toPath ( request .getPathElement () ), filenameExtractor );
89
+ }
90
+
64
91
/**
65
92
* Decide for every {@code request.getPathElements()} if it belongs to the modulePath or classPath, based on the
66
93
* {@code request.getMainModuleDescriptor()}.
@@ -69,10 +96,10 @@ public LocationManager()
69
96
* @return the result of the resolution
70
97
* @throws IOException if a critical IOException occurs
71
98
*/
72
- public <T > ResolvePathsResult <T > resolvePaths ( ResolvePathsRequest <T > request )
99
+ public <T > ResolvePathsResult <T > resolvePaths ( final ResolvePathsRequest <T > request )
73
100
throws IOException
74
101
{
75
- ResolvePathsResult <T > result = request .createResult ();
102
+ final ResolvePathsResult <T > result = request .createResult ();
76
103
77
104
Map <T , JavaModuleDescriptor > pathElements = new LinkedHashMap <>( request .getPathElements ().size () );
78
105
@@ -107,72 +134,44 @@ else if ( descriptorPath.endsWith( "module-info.class" ) )
107
134
// start from root
108
135
result .setMainModuleDescriptor ( mainModuleDescriptor );
109
136
110
- Map <T , Path > filenameAutoModules = new HashMap <>();
137
+ final Map <T , Path > filenameAutoModules = new HashMap <>();
111
138
112
- ManifestModuleNameExtractor manifestModuleNameExtractor = new ManifestModuleNameExtractor ();
113
-
114
139
// collect all modules from path
115
- for ( T t : request .getPathElements () )
140
+ for ( final T t : request .getPathElements () )
116
141
{
117
- Path path = request .toPath ( t );
142
+ JavaModuleDescriptor moduleDescriptor ;
143
+ ModuleNameSource source ;
118
144
119
- JavaModuleDescriptor moduleDescriptor = null ;
120
- ModuleNameSource source = null ;
121
-
122
- // either jar or outputDirectory
123
- if ( Files .isRegularFile ( path ) || Files .exists ( path .resolve ( "module-info.class" ) ) )
145
+ ModuleNameExtractor nameExtractor = new ModuleNameExtractor ()
124
146
{
125
- try
147
+ @ Override
148
+ public String extract ( Path path )
149
+ throws IOException
126
150
{
127
- moduleDescriptor = binaryParser .getModuleDescriptor ( path );
128
- }
129
- catch ( IOException e )
130
- {
131
- result .getPathExceptions ().put ( t , e );
132
- continue ;
133
- }
134
- }
135
-
136
- if ( moduleDescriptor != null )
137
- {
138
- source = ModuleNameSource .MODULEDESCRIPTOR ;
139
- }
140
- else
141
- {
142
- String moduleName = manifestModuleNameExtractor .extract ( path );
143
-
144
- if ( moduleName != null )
145
- {
146
- source = ModuleNameSource .MANIFEST ;
147
- }
148
- else if ( request .getJdkHome () != null )
149
- {
150
- // Will require external JVM, which is considered slow(er)
151
- // Collect first, next resolve all at once
152
- filenameAutoModules .put ( t , path );
153
- }
154
- else
155
- {
156
- try
151
+ if ( request .getJdkHome () != null )
157
152
{
158
- moduleName = MainClassModuleNameExtractor . getModuleName ( path );
153
+ filenameAutoModules . put ( t , path );
159
154
}
160
- catch ( Exception e )
155
+ else
161
156
{
162
- result .getPathExceptions ().put ( t , e );
163
- continue ;
164
- }
165
-
166
- if ( moduleName != null )
167
- {
168
- source = ModuleNameSource .FILENAME ;
157
+ return CmdModuleNameExtractor .getModuleName ( path );
169
158
}
159
+ return null ;
170
160
}
161
+ };
162
+
163
+ try
164
+ {
165
+ ResolvePathResult resolvedPath = resolvePath ( request .toPath ( t ), nameExtractor );
166
+
167
+ moduleDescriptor = resolvedPath .getModuleDescriptor ();
171
168
172
- if ( moduleName != null )
173
- {
174
- moduleDescriptor = JavaModuleDescriptor .newAutomaticModule ( moduleName ).build ();
175
- }
169
+ source = resolvedPath .getModuleNameSource ();
170
+ }
171
+ catch ( Exception e )
172
+ {
173
+ result .getPathExceptions ().put ( t , e );
174
+ continue ;
176
175
}
177
176
178
177
if ( moduleDescriptor != null )
@@ -243,6 +242,49 @@ else if ( request.getJdkHome() != null )
243
242
return result ;
244
243
}
245
244
245
+ private ResolvePathResult resolvePath ( Path path , ModuleNameExtractor fileModulenameExtractor ) throws Exception
246
+ {
247
+ ResolvePathResult result = new ResolvePathResult ();
248
+ JavaModuleDescriptor moduleDescriptor = null ;
249
+
250
+ // either jar or outputDirectory
251
+ if ( Files .isRegularFile ( path ) || Files .exists ( path .resolve ( "module-info.class" ) ) )
252
+ {
253
+ moduleDescriptor = binaryParser .getModuleDescriptor ( path );
254
+ }
255
+
256
+ if ( moduleDescriptor != null )
257
+ {
258
+ result .setModuleNameSource ( ModuleNameSource .MODULEDESCRIPTOR );
259
+ }
260
+ else
261
+ {
262
+ String moduleName = manifestModuleNameExtractor .extract ( path );
263
+
264
+ if ( moduleName != null )
265
+ {
266
+ result .setModuleNameSource ( ModuleNameSource .MANIFEST );
267
+ }
268
+ else
269
+ {
270
+ moduleName = fileModulenameExtractor .extract ( path );
271
+
272
+ if ( moduleName != null )
273
+ {
274
+ result .setModuleNameSource ( ModuleNameSource .FILENAME );
275
+ }
276
+ }
277
+
278
+ if ( moduleName != null )
279
+ {
280
+ moduleDescriptor = JavaModuleDescriptor .newAutomaticModule ( moduleName ).build ();
281
+ }
282
+ }
283
+
284
+ result .setModuleDescriptor ( moduleDescriptor );
285
+ return result ;
286
+ }
287
+
246
288
private void select ( JavaModuleDescriptor module , Map <String , JavaModuleDescriptor > availableModules ,
247
289
Set <String > namedModules )
248
290
{
0 commit comments