1
1
package org.gradle.android.workarounds
2
2
3
+ import com.google.common.annotations.VisibleForTesting
4
+ import com.google.common.collect.Lists
3
5
import org.gradle.android.AndroidIssue
4
6
import org.gradle.api.Project
5
7
import org.gradle.api.artifacts.transform.CacheableTransform
@@ -24,6 +26,8 @@ import javax.inject.Inject
24
26
import java.lang.module.ModuleDescriptor
25
27
import java.nio.ByteBuffer
26
28
import java.nio.file.Files
29
+ import java.util.stream.Collectors
30
+ import java.util.stream.Stream
27
31
28
32
/**
29
33
* Works around cache misses due to the custom Java runtime used when source compatibility is set higher
@@ -178,28 +182,76 @@ class JdkImageWorkaround implements Workaround {
178
182
179
183
// Capture the module descriptor ignoring the version, which is not enforced anyways
180
184
File moduleInfoFile = new File (targetDir, ' java.base/module-info.class' )
181
- ModuleDescriptor strippedDescriptor = captureModuleDescriptorWithoutVersion(moduleInfoFile)
185
+ ModuleDescriptor descriptor = captureModuleDescriptorWithoutVersion(moduleInfoFile)
182
186
File descriptorData = new File (targetDir, " module-descriptor.txt" )
183
- descriptorData. text = strippedDescriptor . toString( )
187
+ descriptorData. text = serializeDescriptor(descriptor )
184
188
185
189
fileOperations. delete {
186
190
delete(moduleInfoFile)
187
191
}
188
192
}
189
193
190
194
private static ModuleDescriptor captureModuleDescriptorWithoutVersion (File moduleFile ) {
191
- ModuleDescriptor descriptor = ModuleDescriptor . read(ByteBuffer . wrap(Files . readAllBytes(moduleFile. toPath())))
192
- ModuleDescriptor.Builder strippedDescriptor = ModuleDescriptor . newModule(descriptor. name())
193
- strippedDescriptor. packages(descriptor. packages())
194
- if (descriptor. mainClass(). present) {
195
- strippedDescriptor. mainClass(descriptor. mainClass(). get())
195
+ return ModuleDescriptor . read(ByteBuffer . wrap(Files . readAllBytes(moduleFile. toPath())))
196
+ }
197
+
198
+ @VisibleForTesting
199
+ static String serializeDescriptor (ModuleDescriptor descriptor ) {
200
+ StringBuilder sb = new StringBuilder ()
201
+
202
+ if (descriptor. isOpen())
203
+ sb. append(" open " )
204
+ sb. append(" module { name: " ). append(descriptor. name())
205
+ if (! descriptor. requires(). isEmpty())
206
+ sb. append(" , " ). append(descriptor. requires(). sort(). collect { serializeRequires(it) })
207
+ if (! descriptor. uses(). isEmpty())
208
+ sb. append(" , uses: " ). append(descriptor. uses(). sort())
209
+ if (! descriptor. exports(). isEmpty())
210
+ sb. append(" , exports: " ). append(descriptor. exports(). sort(). collect { serializeExports(it) })
211
+ if (! descriptor. opens(). isEmpty())
212
+ sb. append(" , opens: " ). append(descriptor. opens(). sort(). collect { serializeOpens(it) })
213
+ if (! descriptor. provides(). isEmpty()) {
214
+ sb. append(" , provides: " ). append(descriptor. provides(). sort(). collect { serializeProvides(it) })
196
215
}
197
- descriptor. exports(). each { strippedDescriptor. exports(it) }
198
- descriptor. opens(). each {strippedDescriptor. opens(it) }
199
- descriptor. provides(). each { strippedDescriptor. provides(it) }
200
- descriptor. requires(). each { strippedDescriptor. requires(it) }
201
- descriptor. uses()each { strippedDescriptor. uses(it) }
202
- return strippedDescriptor. build()
216
+ sb. append(" }" )
217
+ return sb. toString()
218
+ }
219
+
220
+ private static String serializeRequires (ModuleDescriptor.Requires requires ) {
221
+ String requireString
222
+ if (! requires. compiledVersion(). empty) {
223
+ requireString = requires. name() + " (@" + requires. compiledVersion() + " )"
224
+ } else {
225
+ requireString = requires. name()
226
+ }
227
+ return withSerializedMods(requires. modifiers(), requireString)
228
+ }
229
+
230
+ private static String serializeExports (ModuleDescriptor.Exports exports ) {
231
+ String s = withSerializedMods(exports. modifiers(), exports. source())
232
+ if (exports. targets(). isEmpty())
233
+ return s;
234
+ else
235
+ return s + " to " + exports. targets(). sort()
236
+ }
237
+
238
+ private static String serializeOpens (ModuleDescriptor.Opens opens ) {
239
+ String s = withSerializedMods(opens. modifiers(), opens. source())
240
+ if (opens. targets(). isEmpty())
241
+ return s;
242
+ else
243
+ return s + " to " + opens. targets(). sort()
244
+ }
245
+
246
+ private static String serializeProvides (ModuleDescriptor.Provides provides ) {
247
+ return provides. service() + " with " + Lists . newArrayList(provides. providers()). sort()
248
+ }
249
+
250
+ static <M> String withSerializedMods (Set<M> mods , String what ) {
251
+ return (Stream . concat(mods. stream(). map(e -> e. toString()
252
+ .toLowerCase(Locale . ROOT )). sorted(),
253
+ Stream . of(what)))
254
+ .collect(Collectors . joining(" " ))
203
255
}
204
256
}
205
257
}
0 commit comments