Skip to content

Commit 91b7648

Browse files
committed
Support reading GAV coordinates from a m2 repository path
Fixes #33
1 parent 7efc533 commit 91b7648

File tree

3 files changed

+138
-38
lines changed

3 files changed

+138
-38
lines changed

src/main/java/de/jjohannes/gradle/javamodules/ExtraModuleInfoTransform.java

Lines changed: 10 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@
2929
import java.io.OutputStream;
3030
import java.nio.charset.StandardCharsets;
3131
import java.nio.file.Files;
32-
import java.nio.file.Path;
3332
import java.util.Collection;
3433
import java.util.LinkedHashMap;
3534
import java.util.List;
3635
import java.util.Map;
36+
import java.util.Optional;
3737
import java.util.jar.JarEntry;
3838
import java.util.jar.JarInputStream;
3939
import java.util.jar.JarOutputStream;
@@ -42,6 +42,9 @@
4242
import java.util.zip.ZipEntry;
4343
import java.util.zip.ZipException;
4444

45+
import static de.jjohannes.gradle.javamodules.FilePathToModuleCoordinates.gaCoordinatesFromFilePathMatch;
46+
import static de.jjohannes.gradle.javamodules.FilePathToModuleCoordinates.versionFromFilePath;
47+
4548
/**
4649
* An artifact transform that applies additional information to Jars without module information.
4750
* The transformation fails the build if a Jar does not contain information and no extra information
@@ -97,12 +100,12 @@ public void transform(TransformOutputs outputs) {
97100
private ModuleSpec findModuleSpec(File originalJar) {
98101
Map<String, ModuleSpec> moduleSpecs = getParameters().getModuleSpecs().get();
99102

100-
String gaCoordinates = gaCoordinatesFromFilePath(originalJar.toPath());
101-
String originalJarName = originalJar.getName();
102-
103-
if (moduleSpecs.containsKey(gaCoordinates)) {
104-
return moduleSpecs.get(gaCoordinates);
103+
Optional<String> gaCoordinates = moduleSpecs.keySet().stream().filter(ga -> gaCoordinatesFromFilePathMatch(originalJar.toPath(), ga)).findFirst();
104+
if (gaCoordinates.isPresent()) {
105+
return moduleSpecs.get(gaCoordinates.get());
105106
}
107+
108+
String originalJarName = originalJar.getName();
106109
if (moduleSpecs.containsKey(originalJarName)) {
107110
return moduleSpecs.get(originalJarName);
108111
}
@@ -112,38 +115,7 @@ private ModuleSpec findModuleSpec(File originalJar) {
112115

113116
private boolean willBeMerged(File originalJar, Collection<ModuleSpec> modules) {
114117
return modules.stream().anyMatch(module -> module.getMergedJars().stream().anyMatch(toMerge ->
115-
toMerge.equals(gaCoordinatesFromFilePath(originalJar.toPath())) || toMerge.equals(originalJar.getName())));
116-
}
117-
118-
/**
119-
* Attempts to parse 'group' and 'name' coordinates from a path like:
120-
* .gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.36/6c62681a2f655b49963a5983b8b0950a6120ae14/slf4j-api-1.7.36.jar
121-
*/
122-
@Nullable
123-
private String gaCoordinatesFromFilePath(Path path) {
124-
String version = versionFromFilePath(path);
125-
if (version == null) {
126-
return null;
127-
}
128-
129-
String group = path.getName(path.getNameCount() - 5).toString();
130-
String name = path.getName(path.getNameCount() - 4).toString();
131-
132-
return group + ":" + name;
133-
}
134-
135-
@Nullable
136-
private String versionFromFilePath(Path path) {
137-
if (path.getNameCount() < 5) {
138-
return null;
139-
}
140-
141-
String version = path.getName(path.getNameCount() - 3).toString();
142-
if (!path.getFileName().toString().contains(version)) {
143-
return null;
144-
}
145-
146-
return version;
118+
gaCoordinatesFromFilePathMatch(originalJar.toPath(), toMerge) || toMerge.equals(originalJar.getName())));
147119
}
148120

149121
private boolean isModule(File jar) {
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package de.jjohannes.gradle.javamodules;
2+
3+
import javax.annotation.Nullable;
4+
import java.nio.file.Path;
5+
import java.util.stream.Collectors;
6+
import java.util.stream.StreamSupport;
7+
8+
/**
9+
* Attempts to parse 'group', 'name', 'version' coordinates from a paths like:
10+
* .gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.36/6c62681a2f655b49963a5983b8b0950a6120ae14/slf4j-api-1.7.36.jar
11+
* .m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar
12+
*/
13+
final class FilePathToModuleCoordinates {
14+
15+
@Nullable
16+
static String versionFromFilePath(Path path) {
17+
if (isInGradleCache(path)) {
18+
return path.getName(path.getNameCount() - 3).toString();
19+
}
20+
if (isInM2Cache(path)) {
21+
return path.getName(path.getNameCount() - 2).toString();
22+
}
23+
return null;
24+
}
25+
26+
static boolean gaCoordinatesFromFilePathMatch(Path path, String ga) {
27+
String name = nameCoordinateFromFilePath(path);
28+
String group = groupCoordinateFromFilePath(path);
29+
if (name == null || group == null) {
30+
return false;
31+
}
32+
return (isInGradleCache(path) && ga.equals(group + ":" + name)) || (isInM2Cache(path) && (group + ":" + name).endsWith("." + ga));
33+
}
34+
35+
@Nullable
36+
private static String groupCoordinateFromFilePath(Path path) {
37+
if (isInGradleCache(path)) {
38+
return path.getName(path.getNameCount() - 5).toString();
39+
}
40+
if (isInM2Cache(path)) {
41+
return StreamSupport.stream(path.subpath(0, path.getNameCount() - 3).spliterator(), false).map(Path::toString).collect(Collectors.joining("."));
42+
}
43+
return null;
44+
}
45+
46+
static boolean isInGradleCache(Path path) {
47+
String name = nameCoordinateFromFilePath(path);
48+
if (name == null) {
49+
return false;
50+
}
51+
String version = path.getName(path.getNameCount() - 3).toString();
52+
return path.getFileName().toString().startsWith(name + "-" + version);
53+
}
54+
55+
static boolean isInM2Cache(Path path) {
56+
String name = nameCoordinateFromFilePath(path);
57+
if (name == null) {
58+
return false;
59+
}
60+
String version = path.getName(path.getNameCount() - 2).toString();
61+
return path.getFileName().toString().startsWith(name + "-" + version);
62+
}
63+
64+
@Nullable
65+
private static String nameCoordinateFromFilePath(Path path) {
66+
if (path.getNameCount() < 5) {
67+
return null;
68+
}
69+
70+
String nameFromGradleCachePath = path.getName(path.getNameCount() - 4).toString();
71+
if (path.getFileName().toString().startsWith(nameFromGradleCachePath + "-")) {
72+
return nameFromGradleCachePath;
73+
}
74+
String nameFromM2CachePath = path.getName(path.getNameCount() - 3).toString();
75+
if (path.getFileName().toString().startsWith(nameFromM2CachePath + "-")) {
76+
return nameFromM2CachePath;
77+
}
78+
79+
return null;
80+
}
81+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package de.jjohannes.gradle.javamodules
2+
3+
import spock.lang.Specification
4+
5+
import java.nio.file.Path
6+
7+
import static de.jjohannes.gradle.javamodules.FilePathToModuleCoordinates.gaCoordinatesFromFilePathMatch
8+
import static de.jjohannes.gradle.javamodules.FilePathToModuleCoordinates.versionFromFilePath
9+
10+
class FilePathToModuleCoordinatesTest extends Specification {
11+
12+
def "version from gradle cache file path"() {
13+
given:
14+
def path = path('/Users/someone/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.36/6c62681a2f655b49963a5983b8b0950a6120ae14/slf4j-api-1.7.36.jar')
15+
16+
expect:
17+
versionFromFilePath(path) == "1.7.36"
18+
}
19+
20+
def "ga coordinates from gradle cache file path"() {
21+
given:
22+
def path = path('/Users/someone/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.36/6c62681a2f655b49963a5983b8b0950a6120ae14/slf4j-api-1.7.36.jar')
23+
24+
expect:
25+
gaCoordinatesFromFilePathMatch(path, "org.slf4j:slf4j-api")
26+
}
27+
28+
def "version from m2 repo file path"() {
29+
given:
30+
def path = path('/Users/someone/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar.')
31+
32+
expect:
33+
versionFromFilePath(path) == "3.0.2"
34+
}
35+
36+
def "ga coordinates from m2 repo file path"() {
37+
given:
38+
def path = path('/Users/someone/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar.')
39+
40+
expect:
41+
gaCoordinatesFromFilePathMatch(path, "com.google.code.findbugs:jsr305")
42+
}
43+
44+
private Path path(String path) {
45+
new File(path).toPath()
46+
}
47+
}

0 commit comments

Comments
 (0)