Skip to content

Commit 72d3a48

Browse files
authored
feat: upgrade to spdx-jackson-java 2.x lib (#426)
Signed-off-by: Ruben Romero Montes <[email protected]>
1 parent e2ff4f5 commit 72d3a48

File tree

9 files changed

+297
-267
lines changed

9 files changed

+297
-267
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
<!-- Dependencies -->
5151
<exhort-api.version>1.0.5</exhort-api.version>
5252
<sentry.version>7.8.0</sentry.version>
53-
<spdx.version>1.1.9.1</spdx.version>
53+
<spdx.version>2.0.2</spdx.version>
5454
<htmlunit.version>4.11.1</htmlunit.version>
5555
<wiremock.version>3.4.2</wiremock.version>
5656
<cvss-calculator.version>1.4.2</cvss-calculator.version>

src/main/java/com/redhat/exhort/config/exception/SbomValidationException.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,8 @@ public abstract class SbomValidationException extends ClientDetailedException {
2323
public SbomValidationException(String message, String detail) {
2424
super(message, detail);
2525
}
26+
27+
public SbomValidationException(String message, Exception e) {
28+
super(message, e);
29+
}
2630
}

src/main/java/com/redhat/exhort/config/exception/SpdxValidationException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,6 @@ public SpdxValidationException(String expectedVersion, List<String> errors) {
3131
}
3232

3333
public SpdxValidationException(String message, Exception e) {
34-
this(message + ": " + e.getMessage());
34+
super(message + ": " + e.getMessage(), e);
3535
}
3636
}

src/main/java/com/redhat/exhort/integration/backend/sbom/spdx/SpdxParser.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@
2727
import java.util.Set;
2828
import java.util.stream.Collectors;
2929

30+
import org.spdx.core.InvalidSPDXAnalysisException;
3031
import org.spdx.jacksonstore.MultiFormatStore;
3132
import org.spdx.jacksonstore.MultiFormatStore.Format;
32-
import org.spdx.library.InvalidSPDXAnalysisException;
33-
import org.spdx.library.model.SpdxPackage;
34-
import org.spdx.library.model.enumerations.RelationshipType;
33+
import org.spdx.library.model.v2.SpdxPackage;
34+
import org.spdx.library.model.v2.enumerations.RelationshipType;
3535
import org.spdx.storage.simple.InMemSpdxStore;
3636

3737
import com.redhat.exhort.api.PackageRef;
@@ -44,7 +44,6 @@ public class SpdxParser extends SbomParser {
4444

4545
@Override
4646
protected DependencyTree buildTree(InputStream input) {
47-
4847
var inputStore = new MultiFormatStore(new InMemSpdxStore(), Format.JSON_PRETTY);
4948
var wrapper = new SpdxWrapper(inputStore, input);
5049
var deps = buildDeps(wrapper);
@@ -117,19 +116,19 @@ private void createPackageLinks(
117116
packages.stream().anyMatch(pkg -> pkg.getId().equals(relatedId));
118117

119118
switch (RelationshipDirection.fromRelationshipType(rel.getRelationshipType())) {
120-
case FORWARD:
119+
case FORWARD -> {
121120
if (shouldIndexRelated) {
122121
addLink(links, pkgId, relatedId);
123122
} else {
124123
addLink(links, pkgId, null);
125124
}
126-
break;
127-
case BACKWARDS:
125+
}
126+
case BACKWARDS -> {
128127
if (shouldIndexRelated) {
129128
addLink(links, relatedId, pkgId);
130129
}
131-
break;
132-
case IGNORED:
130+
}
131+
default -> {}
133132
}
134133
} catch (InvalidSPDXAnalysisException e) {
135134
throw new SpdxValidationException(

src/main/java/com/redhat/exhort/integration/backend/sbom/spdx/SpdxWrapper.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@
2424
import java.util.Optional;
2525
import java.util.stream.Collectors;
2626

27+
import org.spdx.core.InvalidSPDXAnalysisException;
28+
import org.spdx.core.TypedValue;
2729
import org.spdx.jacksonstore.MultiFormatStore;
28-
import org.spdx.library.InvalidSPDXAnalysisException;
29-
import org.spdx.library.SpdxConstants;
30-
import org.spdx.library.model.ExternalRef;
31-
import org.spdx.library.model.SpdxDocument;
32-
import org.spdx.library.model.SpdxPackage;
33-
import org.spdx.library.model.TypedValue;
30+
import org.spdx.library.SpdxModelFactory;
31+
import org.spdx.library.model.v2.ExternalRef;
32+
import org.spdx.library.model.v2.SpdxConstantsCompatV2;
33+
import org.spdx.library.model.v2.SpdxDocument;
34+
import org.spdx.library.model.v2.SpdxPackage;
3435

3536
import com.redhat.exhort.api.PackageRef;
3637
import com.redhat.exhort.config.exception.SpdxValidationException;
@@ -41,16 +42,23 @@ public class SpdxWrapper {
4142

4243
private MultiFormatStore inputStore;
4344
private SpdxDocument doc;
44-
private String uri;
45+
private String docUri;
4546
private Collection<SpdxPackage> packages;
4647

48+
static {
49+
SpdxModelFactory.init();
50+
}
51+
4752
public SpdxWrapper(MultiFormatStore inputStore, InputStream input)
4853
throws SpdxValidationException {
4954
this.inputStore = inputStore;
5055
try {
5156
this.inputStore.deSerialize(input, false);
52-
this.uri = inputStore.getDocumentUris().get(0);
53-
this.doc = new SpdxDocument(inputStore, uri, null, false);
57+
var uris = inputStore.getDocumentUris();
58+
if (uris != null && !uris.isEmpty()) {
59+
this.docUri = uris.iterator().next();
60+
}
61+
this.doc = new SpdxDocument(inputStore, docUri, null, false);
5462

5563
var version = doc.getSpecVersion();
5664
var verify = doc.verify(version);
@@ -111,9 +119,17 @@ public Collection<SpdxPackage> getPackages() {
111119
return this.packages;
112120
}
113121

122+
public SpdxPackage getPackageByUri(String uri) {
123+
try {
124+
return new SpdxPackage(inputStore, docUri, uri.substring(docUri.length() + 1), null, false);
125+
} catch (InvalidSPDXAnalysisException e) {
126+
throw new SpdxValidationException("Unable to create SpdxPackage for URI: " + uri, e);
127+
}
128+
}
129+
114130
public SpdxPackage getPackageById(String id) {
115131
try {
116-
return new SpdxPackage(inputStore, uri, id, null, false);
132+
return new SpdxPackage(inputStore, docUri, id, null, false);
117133
} catch (InvalidSPDXAnalysisException e) {
118134
throw new SpdxValidationException("Unable to create SpdxPackage for id: " + id, e);
119135
}
@@ -122,9 +138,9 @@ public SpdxPackage getPackageById(String id) {
122138
private Collection<SpdxPackage> parsePackages() throws InvalidSPDXAnalysisException {
123139
var docName = doc.getName();
124140
return inputStore
125-
.getAllItems(uri, SpdxConstants.CLASS_SPDX_PACKAGE)
126-
.map(TypedValue::getId)
127-
.map(this::getPackageById)
141+
.getAllItems(docUri, SpdxConstantsCompatV2.CLASS_SPDX_PACKAGE)
142+
.map(TypedValue::getObjectUri)
143+
.map(this::getPackageByUri)
128144
.filter(this::hasPurl)
129145
.filter(p -> !packageHasName(p, docName))
130146
.collect(Collectors.toList());

src/test/java/com/redhat/exhort/integration/backend/sbom/SpdxWrapperTest.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626
import org.junit.jupiter.api.Test;
2727
import org.junit.jupiter.params.ParameterizedTest;
2828
import org.junit.jupiter.params.provider.ValueSource;
29+
import org.spdx.core.InvalidSPDXAnalysisException;
2930
import org.spdx.jacksonstore.MultiFormatStore;
3031
import org.spdx.jacksonstore.MultiFormatStore.Format;
31-
import org.spdx.library.InvalidSPDXAnalysisException;
32-
import org.spdx.library.Version;
32+
import org.spdx.library.model.v2.Version;
3333
import org.spdx.storage.simple.InMemSpdxStore;
3434

3535
import com.redhat.exhort.config.exception.SpdxValidationException;
@@ -55,11 +55,15 @@ void testVersions(String version) throws InvalidSPDXAnalysisException, IOExcepti
5555

5656
@Test
5757
void testInvalidDocument() {
58-
assertThrows(
59-
SpdxValidationException.class,
60-
() ->
61-
new SpdxWrapper(
62-
inputStore,
63-
this.getClass().getClassLoader().getResourceAsStream("cyclonedx/empty-sbom.json")));
58+
var err =
59+
assertThrows(
60+
SpdxValidationException.class,
61+
() ->
62+
new SpdxWrapper(
63+
inputStore,
64+
this.getClass()
65+
.getClassLoader()
66+
.getResourceAsStream("cyclonedx/empty-sbom.json")));
67+
assertNotNull(err.getMessage());
6468
}
6569
}

0 commit comments

Comments
 (0)