Skip to content

Commit 4e13d3a

Browse files
committed
Fixed mapping to have a list of BomReference for provides; added tests
Signed-off-by: Andrea Vibelli <[email protected]>
1 parent 150666d commit 4e13d3a

10 files changed

+291
-55
lines changed

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ public class Dependency extends BomReference {
3939

4040
@VersionFilter(Version.VERSION_16)
4141
@JsonProperty("provides")
42+
@JacksonXmlElementWrapper(useWrapping = false)
4243
@JacksonXmlProperty(localName = "provides")
43-
private List<Dependency> provides;
44+
private List<BomReference> provides;
4445

4546
public Dependency(final String ref) {
4647
super(ref);
@@ -66,18 +67,15 @@ public void addDependency(final Dependency dependency) {
6667
}
6768
}
6869

69-
@VersionFilter(Version.VERSION_16)
70-
public List<Dependency> getProvides() {
70+
public List<BomReference> getProvides() {
7171
return provides;
7272
}
7373

74-
@VersionFilter(Version.VERSION_16)
75-
public void setProvides(final List<Dependency> provides) {
74+
public void setProvides(final List<BomReference> provides) {
7675
this.provides = provides;
7776
}
7877

79-
@VersionFilter(Version.VERSION_16)
80-
public void addProvides(final Dependency dependency) {
78+
public void addProvides(final BomReference dependency) {
8179
if (provides == null) {
8280
provides = new ArrayList<>();
8381
}

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

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.apache.commons.collections4.CollectionUtils;
3535
import org.apache.commons.lang3.StringUtils;
3636
import org.cyclonedx.CycloneDxSchema;
37+
import org.cyclonedx.model.BomReference;
3738
import org.cyclonedx.model.Dependency;
3839
import org.cyclonedx.model.DependencyList;
3940

@@ -99,7 +100,7 @@ private void writeJSONDependenciesWithGenerator(final JsonGenerator generator, f
99100
generator.writeEndArray();
100101
if (CollectionUtils.isNotEmpty(dependency.getProvides())) {
101102
generator.writeArrayFieldStart("provides");
102-
for (Dependency subDependency : dependency.getProvides()) {
103+
for (BomReference subDependency : dependency.getProvides()) {
103104
generator.writeString(subDependency.getRef());
104105
}
105106
generator.writeEndArray();
@@ -141,24 +142,42 @@ private void writeXMLDependency(final Dependency dependency, final ToXmlGenerato
141142
generator.writeString(dependency.getRef());
142143
generator.setNextIsAttribute(false);
143144

145+
// Write provides
146+
if (CollectionUtils.isNotEmpty(dependency.getProvides())) {
147+
writeXMLProvides(dependency, generator);
148+
}
149+
144150
if (CollectionUtils.isNotEmpty(dependency.getDependencies())) {
145151
for (Dependency subDependency : dependency.getDependencies()) {
146152
// You got Shay'd
147153
writeXMLDependency(subDependency, generator);
148154
}
149155
}
150156

151-
if (CollectionUtils.isNotEmpty(dependency.getProvides())) {
152-
for (Dependency subDependency : dependency.getProvides()) {
153-
writeXMLDependency(subDependency, generator);
154-
}
157+
if (CollectionUtils.isNotEmpty(dependency.getDependencies())) {
158+
generator.writeEndArray();
155159
}
156160

157-
if (CollectionUtils.isNotEmpty(dependency.getDependencies())) {
158-
generator.writeEndArray();
161+
generator.writeEndObject();
159162
}
160163

161-
generator.writeEndObject();
164+
private void writeXMLProvides(final Dependency dependency, final ToXmlGenerator generator)
165+
throws IOException, XMLStreamException
166+
{
167+
QName qName = new QName("provides");
168+
generator.setNextName(qName);
169+
generator.writeFieldName(qName.getLocalPart());
170+
generator.writeStartArray();
171+
172+
for (BomReference ref : dependency.getProvides()) {
173+
generator.writeStartObject();
174+
generator.setNextIsAttribute(true);
175+
generator.writeFieldName("ref");
176+
generator.writeString(ref.getRef());
177+
generator.setNextIsAttribute(false);
178+
generator.writeEndObject();
179+
}
180+
generator.writeEndArray();
162181
}
163182

164183
private void processNamespace(final ToXmlGenerator toXmlGenerator, final String dependencies)

src/test/java/org/cyclonedx/BomJsonGeneratorTest.java

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,20 @@
2020

2121
import com.fasterxml.jackson.databind.JsonNode;
2222

23-
import java.io.FileReader;
2423
import java.nio.charset.StandardCharsets;
2524
import org.apache.commons.io.IOUtils;
26-
import org.cyclonedx.exception.GeneratorException;
2725
import org.cyclonedx.generators.BomGeneratorFactory;
2826
import org.cyclonedx.generators.json.BomJsonGenerator;
2927
import org.cyclonedx.generators.xml.BomXmlGenerator;
3028
import org.cyclonedx.model.Bom;
3129
import org.cyclonedx.model.Component;
30+
import org.cyclonedx.model.Dependency;
3231
import org.cyclonedx.model.Component.Type;
3332
import org.cyclonedx.model.License;
3433
import org.cyclonedx.model.LicenseChoice;
3534
import org.cyclonedx.model.Metadata;
36-
import org.cyclonedx.model.OrganizationalContact;
3735
import org.cyclonedx.model.Service;
3836
import org.cyclonedx.model.license.Expression;
39-
import org.cyclonedx.model.metadata.ToolInformation;
4037
import org.cyclonedx.parsers.JsonParser;
4138
import org.cyclonedx.parsers.XmlParser;
4239
import org.junit.jupiter.api.AfterEach;
@@ -52,10 +49,6 @@
5249
import java.nio.file.Files;
5350
import java.nio.file.Path;
5451
import java.util.ArrayList;
55-
import java.util.Arrays;
56-
import java.util.LinkedList;
57-
import java.util.List;
58-
import java.util.UUID;
5952
import java.util.stream.Stream;
6053
import java.util.Objects;
6154

@@ -336,6 +329,72 @@ public void schema16_testAttestations_json() throws Exception {
336329
assertTrue(parser.isValid(loadedFile, version));
337330
}
338331

332+
@Test
333+
public void schema16_testDependencyProvides_json() throws Exception {
334+
Version version = Version.VERSION_16;
335+
Bom bom = createCommonJsonBom("/1.6/valid-dependency-provides-1.6.json");
336+
337+
BomJsonGenerator generator = BomGeneratorFactory.createJson(version, bom);
338+
File loadedFile = writeToFile(generator.toJsonString());
339+
340+
JsonParser parser = new JsonParser();
341+
assertTrue(parser.isValid(loadedFile, version));
342+
343+
Bom parsedBom = parser.parse(loadedFile);
344+
assertNotNull(parsedBom.getDependencies());
345+
assertEquals(3, parsedBom.getDependencies().size());
346+
// Test dependency library-a
347+
Dependency libA = parsedBom.getDependencies().get(0);
348+
assertEquals("library-a", libA.getRef());
349+
assertNotNull(libA.getDependencies());
350+
assertEquals(0, libA.getDependencies().size());
351+
assertNull(libA.getProvides());
352+
// Test dependency library-b
353+
Dependency libB = parsedBom.getDependencies().get(1);
354+
assertEquals("library-b", libB.getRef());
355+
assertEquals(1, libB.getDependencies().size());
356+
assertEquals("library-c", libB.getDependencies().get(0).getRef());
357+
// Test dependency library-c
358+
Dependency libC = parsedBom.getDependencies().get(2);
359+
assertEquals("library-c", libC.getRef());
360+
assertNotNull(libC.getDependencies());
361+
assertNotNull(libC.getProvides());
362+
assertEquals("library-d", libC.getProvides().get(0).getRef());
363+
}
364+
365+
@Test
366+
public void schema16_testDependencyProvides() throws Exception {
367+
Version version = Version.VERSION_16;
368+
Bom bom = createCommonXmlBom("/1.6/valid-dependency-provides-1.6.xml");
369+
370+
BomJsonGenerator generator = BomGeneratorFactory.createJson(version, bom);
371+
File loadedFile = writeToFile(generator.toJsonString());
372+
373+
JsonParser parser = new JsonParser();
374+
assertTrue(parser.isValid(loadedFile, version));
375+
376+
Bom parsedBom = parser.parse(loadedFile);
377+
assertNotNull(parsedBom.getDependencies());
378+
assertEquals(3, parsedBom.getDependencies().size());
379+
// Test dependency library-a
380+
Dependency libA = parsedBom.getDependencies().get(0);
381+
assertEquals("library-a", libA.getRef());
382+
assertNotNull(libA.getDependencies());
383+
assertEquals(0, libA.getDependencies().size());
384+
assertNull(libA.getProvides());
385+
// Test dependency library-b
386+
Dependency libB = parsedBom.getDependencies().get(1);
387+
assertEquals("library-b", libB.getRef());
388+
assertEquals(1, libB.getDependencies().size());
389+
assertEquals("library-c", libB.getDependencies().get(0).getRef());
390+
// Test dependency library-c
391+
Dependency libC = parsedBom.getDependencies().get(2);
392+
assertEquals("library-c", libC.getRef());
393+
assertNotNull(libC.getDependencies());
394+
assertNotNull(libC.getProvides());
395+
assertEquals("library-d", libC.getProvides().get(0).getRef());
396+
}
397+
339398
@Test
340399
public void schema16_testCompositions() throws Exception {
341400
Version version = Version.VERSION_16;

src/test/java/org/cyclonedx/BomXmlGeneratorTest.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.cyclonedx.model.Bom;
2929
import org.cyclonedx.model.Component;
3030
import org.cyclonedx.model.Component.Type;
31+
import org.cyclonedx.model.Dependency;
3132
import org.cyclonedx.model.ExtensibleType;
3233
import org.cyclonedx.model.ExternalReference;
3334
import org.cyclonedx.model.License;
@@ -454,6 +455,70 @@ public void schema16_testAttestations_xml() throws Exception {
454455
assertTrue(parser.isValid(loadedFile, version));
455456
}
456457

458+
@Test
459+
public void schema16_testDependencyProvides() throws Exception {
460+
Version version = Version.VERSION_16;
461+
Bom bom = createCommonJsonBom("/1.6/valid-dependency-provides-1.6.json");
462+
463+
BomXmlGenerator generator = BomGeneratorFactory.createXml(version, bom);
464+
File loadedFile = writeToFile(generator.toXmlString());
465+
466+
XmlParser parser = new XmlParser();
467+
assertTrue(parser.isValid(loadedFile, version));
468+
469+
Bom parsedBom = parser.parse(loadedFile);
470+
assertNotNull(parsedBom.getDependencies());
471+
assertEquals(3, parsedBom.getDependencies().size());
472+
// Test dependency library-a
473+
Dependency libA = parsedBom.getDependencies().get(0);
474+
assertEquals("library-a", libA.getRef());
475+
assertNull(libA.getDependencies());
476+
assertNull(libA.getProvides());
477+
// Test dependency library-b
478+
Dependency libB = parsedBom.getDependencies().get(1);
479+
assertEquals("library-b", libB.getRef());
480+
assertEquals(1, libB.getDependencies().size());
481+
assertEquals("library-c", libB.getDependencies().get(0).getRef());
482+
// Test dependency library-c
483+
Dependency libC = parsedBom.getDependencies().get(2);
484+
assertEquals("library-c", libC.getRef());
485+
assertNull(libC.getDependencies());
486+
assertNotNull(libC.getProvides());
487+
assertEquals("library-d", libC.getProvides().get(0).getRef());
488+
}
489+
490+
@Test
491+
public void schema16_testDependencyProvides_xml() throws Exception {
492+
Version version = Version.VERSION_16;
493+
Bom bom = createCommonBomXml("/1.6/valid-dependency-provides-1.6.xml");
494+
495+
BomXmlGenerator generator = BomGeneratorFactory.createXml(version, bom);
496+
File loadedFile = writeToFile(generator.toXmlString());
497+
498+
XmlParser parser = new XmlParser();
499+
assertTrue(parser.isValid(loadedFile, version));
500+
501+
Bom parsedBom = parser.parse(loadedFile);
502+
assertNotNull(parsedBom.getDependencies());
503+
assertEquals(3, parsedBom.getDependencies().size());
504+
// Test dependency library-a
505+
Dependency libA = parsedBom.getDependencies().get(0);
506+
assertEquals("library-a", libA.getRef());
507+
assertNull(libA.getDependencies());
508+
assertNull(libA.getProvides());
509+
// Test dependency library-b
510+
Dependency libB = parsedBom.getDependencies().get(1);
511+
assertEquals("library-b", libB.getRef());
512+
assertEquals(1, libB.getDependencies().size());
513+
assertEquals("library-c", libB.getDependencies().get(0).getRef());
514+
// Test dependency library-c
515+
Dependency libC = parsedBom.getDependencies().get(2);
516+
assertEquals("library-c", libC.getRef());
517+
assertNull(libC.getDependencies());
518+
assertNotNull(libC.getProvides());
519+
assertEquals("library-d", libC.getProvides().get(0).getRef());
520+
}
521+
457522
private void addSignature(Bom bom) {
458523
List<Attribute> attributes = new ArrayList<>();
459524
attributes.add(new Attribute("xmlns", "http://www.w3.org/2000/09/xmldsig#"));

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

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,6 @@
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"
3125
}
3226
],
3327
"dependencies": [
@@ -40,12 +34,6 @@
4034
"dependsOn": [
4135
"library-c"
4236
]
43-
},
44-
{
45-
"ref": "library-c",
46-
"provides": [
47-
"library-d"
48-
]
4937
}
5038
]
51-
}
39+
}

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,6 @@ 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-
}
3125
dependencies {
3226
ref: "library-a"
3327
}
@@ -36,9 +30,4 @@ dependencies {
3630
dependencies {
3731
ref: "library-c"
3832
}
39-
}
40-
dependencies {
41-
ref: "library-c"
42-
provides: ["library-d"]
43-
}
4433
}

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,11 @@
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>
2016
</components>
2117
<dependencies>
2218
<dependency ref="library-a"/>
2319
<dependency ref="library-b">
2420
<dependency ref="library-c"/>
2521
</dependency>
26-
<dependency ref="library-c">
27-
<provides ref="library-d"/>
28-
</dependency>
2922
</dependencies>
30-
</bom>
23+
</bom>

0 commit comments

Comments
 (0)