Skip to content

Commit b769415

Browse files
authored
Merge pull request #59 from spdx/v3
Updates to support SPDX Spec version 3
2 parents 817dc18 + c6c69f3 commit b769415

39 files changed

Lines changed: 2643 additions & 1977 deletions

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Spdx-Java-Rdf-Store
22

3-
This Java library implements an RDF store implementing the [SPDX Java Library Storage Interface](https://github.com/spdx/Spdx-Java-Library#storage-interface) using an underlying RDF store.
3+
This Java library implements an RDF store supported SPDX spec version 2.3 and earlier implementing the [SPDX Java Library Storage Interface](https://github.com/spdx/Spdx-Java-Library#storage-interface) using an underlying RDF store.
44

55
# Code quality badges
66

@@ -10,7 +10,9 @@ This Java library implements an RDF store implementing the [SPDX Java Library St
1010

1111
This library is intended to be used in conjunction with the [SPDX Java Library](https://github.com/spdx/Spdx-Java-Library).
1212

13-
Simply create a new instance of `RdfStore()` and reference it as your storage.
13+
Simply create a new instance of `RdfStore(documentNamespace)` and reference it as your storage. The documentNamespace is the namespace used for the store.
14+
15+
Note that this version of the RDF library only supports a single document namespace and DOES NOT support spec versions 3.0 and later.
1416

1517
# Serializing and Deserializing RDF Formats
1618

@@ -24,5 +26,5 @@ A convenience method `public String loadModelFromFile(String fileNameOrUrl, bool
2426

2527
# Development Status
2628

27-
Mostly stable - although it has not been widely used.
29+
Less stable - it has just been updated to support the redesigned storage interfaces.
2830

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<groupId>org.spdx</groupId>
55
<artifactId>spdx-rdf-store</artifactId>
6-
<version>1.1.10-SNAPSHOT</version>
6+
<version>2.0.0-SNAPSHOT</version>
77
<packaging>jar</packaging>
88

99
<name>spdx-rdf-store</name>
@@ -118,7 +118,7 @@
118118
<dependency>
119119
<groupId>org.spdx</groupId>
120120
<artifactId>java-spdx-library</artifactId>
121-
<version>1.1.11</version>
121+
<version>2.0.0-Alpha</version>
122122
</dependency>
123123
<dependency>
124124
<groupId>org.apache.jena</groupId>

src/main/java/org/spdx/spdxRdfStore/CompatibilityUpgrader.java

Lines changed: 40 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@
4141
import org.apache.jena.rdf.model.StmtIterator;
4242
import org.slf4j.Logger;
4343
import org.slf4j.LoggerFactory;
44-
import org.spdx.library.InvalidSPDXAnalysisException;
45-
import org.spdx.library.SpdxConstants;
46-
import org.spdx.library.SpdxVerificationHelper;
47-
import org.spdx.library.model.enumerations.AnnotationType;
48-
import org.spdx.library.model.enumerations.RelationshipType;
44+
import org.spdx.core.InvalidSPDXAnalysisException;
45+
import org.spdx.library.model.v2.SpdxConstantsCompatV2;
46+
import org.spdx.library.model.v2.SpdxVerificationHelper;
47+
import org.spdx.library.model.v2.enumerations.AnnotationType;
48+
import org.spdx.library.model.v2.enumerations.RelationshipType;
4949

5050
/**
5151
* Updates the RDF model for compatibility with the current version of the spec
@@ -61,9 +61,9 @@ public class CompatibilityUpgrader {
6161
Map<String, Map<String, String>> mutableTypePropertyMap = new HashMap<>();
6262
Map<String, String> documentMap = new HashMap<>();
6363
//TODO: In 3.0, uncomment those below to change the spec versions
64-
// documentMap.put(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_SPDX_VERSION,
65-
// SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_SPDX_SPEC_VERSION);
66-
mutableTypePropertyMap.put(SpdxConstants.CLASS_SPDX_DOCUMENT, Collections.unmodifiableMap(documentMap));
64+
// documentMap.put(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_SPDX_VERSION.getName(),
65+
// SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_SPDX_SPEC_VERSION.getName());
66+
mutableTypePropertyMap.put(SpdxConstantsCompatV2.CLASS_SPDX_DOCUMENT, Collections.unmodifiableMap(documentMap));
6767

6868
TYPE_PROPERTY_MAP = Collections.unmodifiableMap(mutableTypePropertyMap);
6969
}
@@ -79,8 +79,8 @@ public static void upgrade(Model model, String documentNamespace) throws Invalid
7979
// update type property names
8080
for (Entry<String, Map<String, String>> entry:TYPE_PROPERTY_MAP.entrySet()) {
8181
String query = "SELECT ?s WHERE { ?s <" +
82-
RdfSpdxDocumentModelManager.RDF_TYPE + "> <" +
83-
SpdxConstants.SPDX_NAMESPACE + entry.getKey() + "> }";
82+
RdfSpdxModelManager.RDF_TYPE + "> <" +
83+
SpdxConstantsCompatV2.SPDX_NAMESPACE + entry.getKey() + "> }";
8484
try (QueryExecution qe = QueryExecutionFactory.create(query, model)) {
8585
ResultSet result = qe.execSelect();
8686
while (result.hasNext()) {
@@ -117,7 +117,7 @@ public static void upgrade(Model model, String documentNamespace) throws Invalid
117117
private static void upgradeHasFiles(Model model, String documentNamespace) {
118118
List<Statement> statementsToRemove = new ArrayList<>();
119119
Property hasFileProperty = model.createProperty("http://spdx.org/rdf/terms#hasFile");
120-
Property relationshipProperty = model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_RELATIONSHIP);
120+
Property relationshipProperty = model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_RELATIONSHIP.getName());
121121
String query = "SELECT ?s ?o WHERE { ?s <http://spdx.org/rdf/terms#hasFile> ?o }";
122122
try (QueryExecution qe = QueryExecutionFactory.create(query, model)) {
123123
ResultSet result = qe.execSelect();
@@ -130,8 +130,8 @@ private static void upgradeHasFiles(Model model, String documentNamespace) {
130130
List<Statement> foundContainsRelationships = new ArrayList<>();
131131
pkg.listProperties(relationshipProperty).forEach((stmt) -> {
132132
Resource existingRelationship = stmt.getObject().asResource();
133-
Resource relatedElement = existingRelationship.getPropertyResourceValue(model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_RELATED_SPDX_ELEMENT));
134-
Resource relationshipType = existingRelationship.getPropertyResourceValue(model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_RELATIONSHIP_TYPE));
133+
Resource relatedElement = existingRelationship.getPropertyResourceValue(model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_RELATED_SPDX_ELEMENT.getName()));
134+
Resource relationshipType = existingRelationship.getPropertyResourceValue(model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_RELATIONSHIP_TYPE.getName()));
135135
if (relatedElement.isURIResource() && file.isURIResource() && relationshipType.isURIResource() &&
136136
relatedElement.getURI().equals(file.getURI()) &&
137137
relationshipType.getURI().equals(RelationshipType.CONTAINS.getIndividualURI())) {
@@ -201,17 +201,16 @@ private static void upgradeExternalDocumentRefs(Model model, String documentName
201201
* @param documentNamespace
202202
* @throws InvalidSPDXAnalysisException
203203
*/
204-
@SuppressWarnings("deprecation")
205204
private static void upgradeReviewers(Model model, String documentNamespace) throws InvalidSPDXAnalysisException {
206-
Resource document = model.createResource(documentNamespace + "#" + SpdxConstants.SPDX_DOCUMENT_ID);
207-
Property annotationProperty = model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_ANNOTATION);
205+
Resource document = model.createResource(documentNamespace + "#" + SpdxConstantsCompatV2.SPDX_DOCUMENT_ID);
206+
Property annotationProperty = model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_ANNOTATION.getName());
208207
Resource reviewerType = model.createResource(AnnotationType.REVIEW.getIndividualURI());
209-
Property typeProperty = model.createProperty(RdfSpdxDocumentModelManager.RDF_TYPE);
210-
Resource annotationClass = model.createResource(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.CLASS_ANNOTATION);
211-
Property commentProperty = model.createProperty(SpdxConstants.RDFS_NAMESPACE + SpdxConstants.RDFS_PROP_COMMENT);
212-
Property annotatorProperty = model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_ANNOTATOR);
213-
Property annotationDateProperty = model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_ANNOTATION_DATE);
214-
Property annotationTypeProperty = model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_ANNOTATION_TYPE);
208+
Property typeProperty = model.createProperty(RdfSpdxModelManager.RDF_TYPE);
209+
Resource annotationClass = model.createResource(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.CLASS_ANNOTATION);
210+
Property commentProperty = model.createProperty(SpdxConstantsCompatV2.RDFS_NAMESPACE + SpdxConstantsCompatV2.RDFS_PROP_COMMENT.getName());
211+
Property annotatorProperty = model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_ANNOTATOR.getName());
212+
Property annotationDateProperty = model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_ANNOTATION_DATE.getName());
213+
Property annotationTypeProperty = model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_ANNOTATION_TYPE.getName());
215214
List<Statement> statementsToRemove = new ArrayList<>();
216215
Set<Integer> addedAnnotations = new HashSet<>(); // to prevent duplicates
217216
String query = "SELECT ?s ?o WHERE { ?s <http://spdx.org/rdf/terms#reviewer> ?o }";
@@ -226,7 +225,7 @@ private static void upgradeReviewers(Model model, String documentNamespace) thro
226225
String reviewDate;
227226
try {
228227
reviewDate = review.getRequiredProperty(model.createProperty(
229-
SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_REVIEW_DATE))
228+
SpdxConstantsCompatV2.SPDX_NAMESPACE + "reviewDate"))
230229
.getString();
231230
if (Objects.isNull(reviewDate)) {
232231
throw new InvalidSPDXAnalysisException("Missing or invalid review date for review");
@@ -258,7 +257,7 @@ private static void upgradeReviewers(Model model, String documentNamespace) thro
258257
annotation.addProperty(annotationTypeProperty, reviewerType);
259258
document.addProperty(annotationProperty, annotation);
260259
}
261-
StmtIterator iter = document.listProperties(model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_SPDX_REVIEWED_BY));
260+
StmtIterator iter = document.listProperties(model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_SPDX_REVIEWED_BY.getName()));
262261
while (iter.hasNext()) {
263262
statementsToRemove.add(iter.next());
264263
}
@@ -277,7 +276,7 @@ private static void upgradeArtifactOf(Model model, String documentNamespace) thr
277276
Set<String> addedDoapProjects = new HashSet<String>(); // prevent duplicates
278277
List<Statement> statementsToRemove = new ArrayList<>();
279278
Property artifactOfProperty = model.createProperty("http://spdx.org/rdf/terms#artifactOf");
280-
Property relationshipProperty = model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_RELATIONSHIP);
279+
Property relationshipProperty = model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_RELATIONSHIP.getName());
281280
String query = "SELECT ?s ?o WHERE { ?s <http://spdx.org/rdf/terms#artifactOf> ?o }";
282281
try (QueryExecution qe = QueryExecutionFactory.create(query, model)) {
283282
ResultSet result = qe.execSelect();
@@ -313,10 +312,10 @@ private static void upgradeArtifactOf(Model model, String documentNamespace) thr
313312
*/
314313
private static Resource createRelationship(Model model, Resource relatedElement, RelationshipType relationshipType) {
315314
Resource retval = model.createResource();
316-
retval.addProperty(model.createProperty(RdfSpdxDocumentModelManager.RDF_TYPE),
317-
model.createResource(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.CLASS_RELATIONSHIP));
318-
retval.addProperty(model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_RELATED_SPDX_ELEMENT), relatedElement);
319-
retval.addProperty(model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_RELATIONSHIP_TYPE),
315+
retval.addProperty(model.createProperty(RdfSpdxModelManager.RDF_TYPE),
316+
model.createResource(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.CLASS_RELATIONSHIP));
317+
retval.addProperty(model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_RELATED_SPDX_ELEMENT.getName()), relatedElement);
318+
retval.addProperty(model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_RELATIONSHIP_TYPE.getName()),
320319
model.createResource(relationshipType.getIndividualURI()));
321320
return retval;
322321
}
@@ -348,23 +347,23 @@ private static int getNexId(Model model, String docNamespace, String idPrefix, i
348347
private static Resource convertDoapProjectToSpdxPackage(Model model, Resource doapProject, String packageUri) throws InvalidSPDXAnalysisException {
349348
String packageName;
350349
try {
351-
packageName = doapProject.getProperty(model.createProperty(SpdxConstants.DOAP_NAMESPACE + SpdxConstants.PROP_NAME)).getString();
350+
packageName = doapProject.getProperty(model.createProperty(SpdxConstantsCompatV2.DOAP_NAMESPACE + SpdxConstantsCompatV2.PROP_NAME.getName())).getString();
352351
} catch (Exception ex) {
353352
throw new InvalidSPDXAnalysisException("DOAP project name is not a valid string");
354353
}
355354
if (Objects.isNull(packageName)) {
356355
throw new InvalidSPDXAnalysisException("Missing required DOAP project name");
357356
}
358357
String homePage = null;
359-
Property homePageProperty = model.createProperty(SpdxConstants.DOAP_NAMESPACE + SpdxConstants.PROP_PROJECT_HOMEPAGE);
358+
Property homePageProperty = model.createProperty(SpdxConstantsCompatV2.DOAP_NAMESPACE + SpdxConstantsCompatV2.PROP_PROJECT_HOMEPAGE.getName());
360359
try {
361360
homePage = doapProject.getProperty(homePageProperty).getString();
362361
} catch (Exception ex) {
363362
homePage = null;
364363
}
365364
String addedPackageComment = "This package was converted from a DOAP Project by the same name";
366-
Property commentProperty = model.createProperty(SpdxConstants.RDFS_NAMESPACE + SpdxConstants.RDFS_PROP_COMMENT);
367-
Property nameProperty = model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_NAME);
365+
Property commentProperty = model.createProperty(SpdxConstantsCompatV2.RDFS_NAMESPACE + SpdxConstantsCompatV2.RDFS_PROP_COMMENT.getName());
366+
Property nameProperty = model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_NAME.getName());
368367
// See if there is already a package matching the name and home page
369368
ResIterator iter = model.listResourcesWithProperty(nameProperty, packageName);
370369
while (iter.hasNext()) {
@@ -385,21 +384,21 @@ private static Resource convertDoapProjectToSpdxPackage(Model model, Resource do
385384
}
386385
}
387386
Resource retval = model.createResource(packageUri);
388-
retval.addProperty(model.createProperty(RdfSpdxDocumentModelManager.RDF_TYPE),
389-
model.createResource(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.CLASS_SPDX_PACKAGE));
387+
retval.addProperty(model.createProperty(RdfSpdxModelManager.RDF_TYPE),
388+
model.createResource(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.CLASS_SPDX_PACKAGE));
390389
// download location
391-
Resource noAssertion = model.createResource(SpdxConstants.URI_VALUE_NOASSERTION);
392-
retval.addProperty(model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_PACKAGE_DOWNLOAD_URL), noAssertion);
390+
Resource noAssertion = model.createResource(SpdxConstantsCompatV2.URI_VALUE_NOASSERTION);
391+
retval.addProperty(model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_PACKAGE_DOWNLOAD_URL.getName()), noAssertion);
393392
// concludedLicense
394-
retval.addProperty(model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_PACKAGE_CONCLUDED_LICENSE), noAssertion);
393+
retval.addProperty(model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_PACKAGE_CONCLUDED_LICENSE.getName()), noAssertion);
395394
// declaredLicense
396-
retval.addProperty(model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_PACKAGE_DECLARED_LICENSE), noAssertion);
395+
retval.addProperty(model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_PACKAGE_DECLARED_LICENSE.getName()), noAssertion);
397396
// copyright
398-
retval.addProperty(model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_PACKAGE_DECLARED_COPYRIGHT), noAssertion);
397+
retval.addProperty(model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_PACKAGE_DECLARED_COPYRIGHT.getName()), noAssertion);
399398
// comment
400399
retval.addProperty(commentProperty, addedPackageComment);
401400
// filesAnalyzed
402-
retval.addLiteral(model.createProperty(SpdxConstants.SPDX_NAMESPACE + SpdxConstants.PROP_PACKAGE_FILES_ANALYZED), false);
401+
retval.addLiteral(model.createProperty(SpdxConstantsCompatV2.SPDX_NAMESPACE + SpdxConstantsCompatV2.PROP_PACKAGE_FILES_ANALYZED.getName()), false);
403402
// name
404403
retval.addLiteral(nameProperty, packageName);
405404
// homePage

0 commit comments

Comments
 (0)