|
20 | 20 | import java.io.FileWriter; |
21 | 21 | import java.io.IOException; |
22 | 22 | import java.io.PrintWriter; |
| 23 | +import java.util.Collection; |
| 24 | +import java.util.Map; |
23 | 25 | import java.util.Set; |
| 26 | +import java.util.TreeMap; |
24 | 27 | import java.util.TreeSet; |
| 28 | +import java.util.stream.Collectors; |
25 | 29 |
|
26 | 30 | import org.gradle.api.DefaultTask; |
27 | 31 | import org.gradle.api.file.FileCollection; |
@@ -65,48 +69,72 @@ public void documentConstrainedVersions() throws IOException { |
65 | 69 | outputFile.getParentFile().mkdirs(); |
66 | 70 | try (PrintWriter writer = new PrintWriter(new FileWriter(outputFile))) { |
67 | 71 | writer.println("|==="); |
68 | | - writer.println("| Group ID | Artifact ID | Version"); |
69 | | - Set<Id> managedCoordinates = new TreeSet<>((id1, id2) -> { |
70 | | - int result = id1.groupId().compareTo(id2.groupId()); |
71 | | - if (result != 0) { |
72 | | - return result; |
| 72 | + writer.println("| Group ID | Artifact ID | Version | Version Property"); |
| 73 | + Map<Id, Set<String>> managedCoordinates = new TreeMap<>((id1, id2) -> { |
| 74 | + int groupComparison = id1.groupId().compareTo(id2.groupId()); |
| 75 | + if (groupComparison != 0) { |
| 76 | + return groupComparison; |
73 | 77 | } |
74 | | - return id1.artifactId().compareTo(id2.artifactId()); |
| 78 | + int artifactComparison = id1.artifactId().compareTo(id2.artifactId()); |
| 79 | + if (artifactComparison != 0) { |
| 80 | + return artifactComparison; |
| 81 | + } |
| 82 | + return id1.version().compareTo(id2.version()); |
75 | 83 | }); |
76 | 84 | for (File file : getResolvedBoms().getFiles()) { |
77 | | - managedCoordinates.addAll(process(ResolvedBom.readFrom(file))); |
| 85 | + process(ResolvedBom.readFrom(file), managedCoordinates); |
78 | 86 | } |
79 | | - for (Id id : managedCoordinates) { |
| 87 | + for (Map.Entry<Id, Set<String>> entry : managedCoordinates.entrySet()) { |
| 88 | + Id id = entry.getKey(); |
80 | 89 | writer.println(); |
81 | 90 | writer.printf("| `%s`%n", id.groupId()); |
82 | 91 | writer.printf("| `%s`%n", id.artifactId()); |
83 | 92 | writer.printf("| `%s`%n", id.version()); |
| 93 | + writer.println(formatVersionProperties(entry.getValue())); |
84 | 94 | } |
85 | 95 | writer.println("|==="); |
86 | 96 | } |
87 | 97 | } |
88 | 98 |
|
89 | | - private Set<Id> process(ResolvedBom resolvedBom) { |
90 | | - TreeSet<Id> managedCoordinates = new TreeSet<>(); |
| 99 | + private void process(ResolvedBom resolvedBom, Map<Id, Set<String>> managedCoordinates) { |
91 | 100 | for (ResolvedLibrary library : resolvedBom.libraries()) { |
92 | | - for (Id managedDependency : library.managedDependencies()) { |
93 | | - managedCoordinates.add(managedDependency); |
94 | | - } |
| 101 | + String versionProperty = library.versionProperty(); |
| 102 | + addManagedDependencies(managedCoordinates, versionProperty, library.managedDependencies()); |
95 | 103 | for (Bom importedBom : library.importedBoms()) { |
96 | | - managedCoordinates.addAll(process(importedBom)); |
| 104 | + process(importedBom, managedCoordinates, versionProperty); |
97 | 105 | } |
98 | 106 | } |
99 | | - return managedCoordinates; |
100 | 107 | } |
101 | 108 |
|
102 | | - private Set<Id> process(Bom bom) { |
103 | | - TreeSet<Id> managedCoordinates = new TreeSet<>(); |
104 | | - bom.managedDependencies().stream().forEach(managedCoordinates::add); |
| 109 | + private void process(Bom bom, Map<Id, Set<String>> managedCoordinates, String versionProperty) { |
| 110 | + addManagedDependencies(managedCoordinates, versionProperty, bom.managedDependencies()); |
| 111 | + for (Bom importedBom : bom.importedBoms()) { |
| 112 | + process(importedBom, managedCoordinates, versionProperty); |
| 113 | + } |
105 | 114 | Bom parent = bom.parent(); |
106 | 115 | if (parent != null) { |
107 | | - managedCoordinates.addAll(process(parent)); |
| 116 | + process(parent, managedCoordinates, versionProperty); |
| 117 | + } |
| 118 | + } |
| 119 | + |
| 120 | + private void addManagedDependencies(Map<Id, Set<String>> managedCoordinates, String versionProperty, |
| 121 | + Collection<Id> managedDependencies) { |
| 122 | + for (Id managedDependency : managedDependencies) { |
| 123 | + Set<String> properties = managedCoordinates.computeIfAbsent(managedDependency, (id) -> new TreeSet<>()); |
| 124 | + if (versionProperty != null && !versionProperty.isBlank()) { |
| 125 | + properties.add(versionProperty); |
| 126 | + } |
| 127 | + } |
| 128 | + } |
| 129 | + |
| 130 | + private String formatVersionProperties(Set<String> versionProperties) { |
| 131 | + if (versionProperties.isEmpty()) { |
| 132 | + return "|"; |
108 | 133 | } |
109 | | - return managedCoordinates; |
| 134 | + String formattedProperties = versionProperties.stream() |
| 135 | + .map((property) -> "`%s`".formatted(property)) |
| 136 | + .collect(Collectors.joining(", ")); |
| 137 | + return "| " + formattedProperties; |
110 | 138 | } |
111 | 139 |
|
112 | 140 | } |
0 commit comments