Skip to content

Commit c05258b

Browse files
committed
feat: Add missing provides mapping to Dependency to comply with CycloneDX 1.6 spec
1 parent 24edea0 commit c05258b

File tree

5 files changed

+69
-0
lines changed

5 files changed

+69
-0
lines changed

src/main/java/org/cyclonedx/model/Dependency.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.cyclonedx.model;
2020

21+
import org.cyclonedx.Version;
2122
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
2223
import com.fasterxml.jackson.annotation.JsonInclude;
2324
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -36,6 +37,11 @@ public class Dependency extends BomReference {
3637
@JacksonXmlProperty(localName = "dependency")
3738
private List<Dependency> dependencies;
3839

40+
@VersionFilter(Version.VERSION_16)
41+
@JsonProperty("provides")
42+
@JacksonXmlProperty(localName = "provides")
43+
private List<Dependency> provides;
44+
3945
public Dependency(final String ref) {
4046
super(ref);
4147
}
@@ -60,6 +66,26 @@ public void addDependency(final Dependency dependency) {
6066
}
6167
}
6268

69+
@VersionFilter(Version.VERSION_16)
70+
public List<Dependency> getProvides() {
71+
return provides;
72+
}
73+
74+
@VersionFilter(Version.VERSION_16)
75+
public void setProvides(final List<Dependency> provides) {
76+
this.provides = provides;
77+
}
78+
79+
@VersionFilter(Version.VERSION_16)
80+
public void addProvides(final Dependency dependency) {
81+
if (provides == null) {
82+
provides = new ArrayList<>();
83+
}
84+
boolean found = provides.stream().anyMatch(d -> d.getRef().equals(dependency.getRef()));
85+
if (!found) {
86+
provides.add(dependency);
87+
}
88+
}
6389
@Override
6490
public boolean equals(Object o) {
6591
if (this == o) return true;

src/main/java/org/cyclonedx/util/serializer/DependencySerializer.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,13 @@ private void writeJSONDependenciesWithGenerator(final JsonGenerator generator, f
9797
}
9898
}
9999
generator.writeEndArray();
100+
if (CollectionUtils.isNotEmpty(dependency.getProvides())) {
101+
generator.writeArrayFieldStart("provides");
102+
for (Dependency subDependency : dependency.getProvides()) {
103+
generator.writeString(subDependency.getRef());
104+
}
105+
generator.writeEndArray();
106+
}
100107
generator.writeEndObject();
101108
}
102109
}
@@ -141,6 +148,12 @@ private void writeXMLDependency(final Dependency dependency, final ToXmlGenerato
141148
}
142149
}
143150

151+
if (CollectionUtils.isNotEmpty(dependency.getProvides())) {
152+
for (Dependency subDependency : dependency.getProvides()) {
153+
writeXMLDependency(subDependency, generator);
154+
}
155+
}
156+
144157
if (CollectionUtils.isNotEmpty(dependency.getDependencies())) {
145158
generator.writeEndArray();
146159
}

src/test/resources/1.6/valid-dependency-1.6.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
"type": "library",
2323
"name": "library-c",
2424
"version": "1.0.0"
25+
},
26+
{
27+
"bom-ref": "library-d",
28+
"type": "library",
29+
"name": "library-d",
30+
"version": "1.0.0"
2531
}
2632
],
2733
"dependencies": [
@@ -34,6 +40,12 @@
3440
"dependsOn": [
3541
"library-c"
3642
]
43+
},
44+
{
45+
"ref": "library-c",
46+
"provides": [
47+
"library-d"
48+
]
3749
}
3850
]
3951
}

src/test/resources/1.6/valid-dependency-1.6.textproto

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ components {
2222
name: "library-c"
2323
version: "1.0.0"
2424
}
25+
components {
26+
type: CLASSIFICATION_LIBRARY
27+
bom_ref: "library-d"
28+
name: "library-d"
29+
version: "1.0.0"
30+
}
2531
dependencies {
2632
ref: "library-a"
2733
}
@@ -31,3 +37,8 @@ dependencies {
3137
ref: "library-c"
3238
}
3339
}
40+
dependencies {
41+
ref: "library-c"
42+
provides: ["library-d"]
43+
}
44+
}

src/test/resources/1.6/valid-dependency-1.6.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,18 @@
1313
<name>library-c</name>
1414
<version>1.0.0</version>
1515
</component>
16+
<component type="library" bom-ref="library-d">
17+
<name>library-d</name>
18+
<version>1.0.0</version>
19+
</component>
1620
</components>
1721
<dependencies>
1822
<dependency ref="library-a"/>
1923
<dependency ref="library-b">
2024
<dependency ref="library-c"/>
2125
</dependency>
26+
<dependency ref="library-c">
27+
<provides ref="library-d"/>
28+
</dependency>
2229
</dependencies>
2330
</bom>

0 commit comments

Comments
 (0)