aboutsummaryrefslogtreecommitdiff
path: root/rdfloader
diff options
context:
space:
mode:
authorIan Ling <ian@iancaling.com>2022-04-08 08:52:57 -0700
committerIan Ling <ian@iancaling.com>2022-04-25 15:00:47 -0700
commit460cf54ece7eba418c50407ee35544c5d63588a7 (patch)
tree07ec7aaf51a92a1ae209e540f45241f990561919 /rdfloader
parentfa24fac85dd550a3f815896241081a1246810d2c (diff)
downloadspdx-tools-460cf54ece7eba418c50407ee35544c5d63588a7.tar.gz
Overhaul structs, refactor JSON parser and saver
Signed-off-by: Ian Ling <ian@iancaling.com>
Diffstat (limited to 'rdfloader')
-rw-r--r--rdfloader/parser2v2/license_utils.go5
-rw-r--r--rdfloader/parser2v2/parse_annotation.go4
-rw-r--r--rdfloader/parser2v2/parse_annotation_test.go10
-rw-r--r--rdfloader/parser2v2/parse_creation_info.go18
-rw-r--r--rdfloader/parser2v2/parse_creation_info_test.go14
-rw-r--r--rdfloader/parser2v2/parse_file.go17
-rw-r--r--rdfloader/parser2v2/parse_file_test.go52
-rw-r--r--rdfloader/parser2v2/parse_package.go65
-rw-r--r--rdfloader/parser2v2/parse_package_test.go38
-rw-r--r--rdfloader/parser2v2/parse_snippet_info.go16
-rw-r--r--rdfloader/parser2v2/parse_spdx_document.go20
-rw-r--r--rdfloader/parser2v2/parser.go23
-rw-r--r--rdfloader/parser2v2/parser_test.go4
13 files changed, 157 insertions, 129 deletions
diff --git a/rdfloader/parser2v2/license_utils.go b/rdfloader/parser2v2/license_utils.go
index 80b0a71..0a823ef 100644
--- a/rdfloader/parser2v2/license_utils.go
+++ b/rdfloader/parser2v2/license_utils.go
@@ -5,6 +5,7 @@ package parser2v2
import (
"fmt"
gordfParser "github.com/spdx/gordf/rdfloader/parser"
+ "github.com/spdx/tools-golang/spdx"
"strings"
)
@@ -25,7 +26,7 @@ func getLicenseStringFromURI(uri string) string {
// returns the checksum algorithm and it's value
// In the newer versions, these two strings will be bound to a single checksum struct
// whose pointer will be returned.
-func (parser *rdfParser2_2) getChecksumFromNode(checksumNode *gordfParser.Node) (algorithm string, value string, err error) {
+func (parser *rdfParser2_2) getChecksumFromNode(checksumNode *gordfParser.Node) (algorithm spdx.ChecksumAlgorithm, value string, err error) {
var checksumValue, checksumAlgorithm string
for _, checksumTriple := range parser.nodeToTriples(checksumNode) {
switch checksumTriple.Predicate.ID {
@@ -45,7 +46,7 @@ func (parser *rdfParser2_2) getChecksumFromNode(checksumNode *gordfParser.Node)
return
}
}
- return checksumAlgorithm, checksumValue, nil
+ return spdx.ChecksumAlgorithm(checksumAlgorithm), checksumValue, nil
}
func getAlgorithmFromURI(algorithmURI string) (checksumAlgorithm string, err error) {
diff --git a/rdfloader/parser2v2/parse_annotation.go b/rdfloader/parser2v2/parse_annotation.go
index 92a5610..18e4533 100644
--- a/rdfloader/parser2v2/parse_annotation.go
+++ b/rdfloader/parser2v2/parse_annotation.go
@@ -59,8 +59,8 @@ func setAnnotatorFromString(annotatorString string, ann *spdx.Annotation2_2) err
return err
}
if subkey == "Person" || subkey == "Organization" || subkey == "Tool" {
- ann.AnnotatorType = subkey
- ann.Annotator = subvalue
+ ann.Annotator.AnnotatorType = subkey
+ ann.Annotator.Annotator = subvalue
return nil
}
return fmt.Errorf("unrecognized Annotator type %v while parsing annotation", subkey)
diff --git a/rdfloader/parser2v2/parse_annotation_test.go b/rdfloader/parser2v2/parse_annotation_test.go
index 49a099d..0226d85 100644
--- a/rdfloader/parser2v2/parse_annotation_test.go
+++ b/rdfloader/parser2v2/parse_annotation_test.go
@@ -31,10 +31,10 @@ func Test_setAnnotatorFromString(t *testing.T) {
if err != nil {
t.Errorf("unexpected error for a valid annotator")
}
- if ann.AnnotatorType != "Person" {
+ if ann.Annotator.AnnotatorType != "Person" {
t.Errorf("wrnog annotator type: expected: %s, found: %s", "Person", ann.Annotator)
}
- if ann.Annotator != "Rishabh" {
+ if ann.Annotator.Annotator != "Rishabh" {
t.Errorf("wrong annotator: expected: %s, found: %s", "Rishabh", ann.Annotator)
}
}
@@ -169,11 +169,11 @@ func Test_rdfParser2_2_parseAnnotationFromNode(t *testing.T) {
t.Errorf(`expected: "%s", found "%s"`, expectedDate, ann.AnnotationDate)
}
expectedAnnotator := "Jane Doe"
- if expectedAnnotator != ann.Annotator {
+ if expectedAnnotator != ann.Annotator.Annotator {
t.Errorf(`expected: "%s", found "%s"`, expectedAnnotator, ann.Annotator)
}
- if ann.AnnotatorType != "Person" {
- t.Errorf(`expected: "%s", found "%s"`, "Person", ann.AnnotatorType)
+ if ann.Annotator.AnnotatorType != "Person" {
+ t.Errorf(`expected: "%s", found "%s"`, "Person", ann.Annotator.AnnotatorType)
}
expectedAnnotationType := "OTHER"
if expectedAnnotationType != ann.AnnotationType {
diff --git a/rdfloader/parser2v2/parse_creation_info.go b/rdfloader/parser2v2/parse_creation_info.go
index 45c39b1..dc4da77 100644
--- a/rdfloader/parser2v2/parse_creation_info.go
+++ b/rdfloader/parser2v2/parse_creation_info.go
@@ -35,20 +35,22 @@ func (parser *rdfParser2_2) parseCreationInfoFromNode(ci *spdx.CreationInfo2_2,
return nil
}
-func setCreator(creator string, ci *spdx.CreationInfo2_2) error {
- entityType, entity, err := ExtractSubs(creator, ":")
+func setCreator(creatorStr string, ci *spdx.CreationInfo2_2) error {
+ entityType, entity, err := ExtractSubs(creatorStr, ":")
if err != nil {
return fmt.Errorf("error setting creator of a creation info: %s", err)
}
+
+ creator := spdx.Creator{Creator: entity}
+
switch entityType {
- case "Person":
- ci.CreatorPersons = append(ci.CreatorPersons, entity)
- case "Organization":
- ci.CreatorOrganizations = append(ci.CreatorOrganizations, entity)
- case "Tool":
- ci.CreatorTools = append(ci.CreatorTools, entity)
+ case "Person", "Organization", "Tool":
+ creator.CreatorType = entityType
default:
return fmt.Errorf("unknown creatorType %v in a creation info", entityType)
}
+
+ ci.Creators = append(ci.Creators, creator)
+
return nil
}
diff --git a/rdfloader/parser2v2/parse_creation_info_test.go b/rdfloader/parser2v2/parse_creation_info_test.go
index 9ea62d9..415d18e 100644
--- a/rdfloader/parser2v2/parse_creation_info_test.go
+++ b/rdfloader/parser2v2/parse_creation_info_test.go
@@ -29,12 +29,12 @@ func Test_setCreator(t *testing.T) {
if err != nil {
t.Errorf("error parsing a valid input: %v", err)
}
- if len(ci.CreatorPersons) != 1 {
- t.Errorf("creationInfo should've had 1 creatorPersons, found %d", len(ci.CreatorPersons))
+ if len(ci.Creators) != 1 {
+ t.Errorf("creationInfo should've had 1 creatorPersons, found %d", len(ci.Creators))
}
expectedPerson := "Jane Doe"
- if ci.CreatorPersons[0] != expectedPerson {
- t.Errorf("expected %s, found %s", expectedPerson, ci.CreatorPersons[0])
+ if ci.Creators[0].Creator != expectedPerson {
+ t.Errorf("expected %s, found %s", expectedPerson, ci.Creators[0])
}
}
@@ -88,12 +88,12 @@ func Test_rdfParser2_2_parseCreationInfoFromNode(t *testing.T) {
if ci.LicenseListVersion != "2.6" {
t.Errorf(`expected %s, found %s`, "2.6", ci.LicenseListVersion)
}
- n := len(ci.CreatorPersons)
+ n := len(ci.Creators)
if n != 1 {
t.Errorf("expected 1 creatorPersons, found %d", n)
}
- if ci.CreatorPersons[0] != "fossy" {
- t.Errorf("expected %s, found %s", "fossy", ci.CreatorPersons[0])
+ if ci.Creators[0].Creator != "fossy" {
+ t.Errorf("expected %s, found %s", "fossy", ci.Creators[0].Creator)
}
expectedCreated := "2018-08-24T19:55:34Z"
if ci.Created != expectedCreated {
diff --git a/rdfloader/parser2v2/parse_file.go b/rdfloader/parser2v2/parse_file.go
index b3b0e49..a149712 100644
--- a/rdfloader/parser2v2/parse_file.go
+++ b/rdfloader/parser2v2/parse_file.go
@@ -56,7 +56,7 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s
// cardinality: min 0
fileType := ""
fileType, err = parser.getFileTypeFromUri(subTriple.Object.ID)
- file.FileType = append(file.FileType, fileType)
+ file.FileTypes = append(file.FileTypes, fileType)
case SPDX_CHECKSUM: // 4.4
// cardinality: min 1
err = parser.setFileChecksumFromNode(file, subTriple.Object)
@@ -73,7 +73,7 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s
if err != nil {
return nil, fmt.Errorf("error parsing licenseInfoInFile: %v", err)
}
- file.LicenseInfoInFile = append(file.LicenseInfoInFile, lic.ToLicenseString())
+ file.LicenseInfoInFiles = append(file.LicenseInfoInFiles, lic.ToLicenseString())
case SPDX_LICENSE_COMMENTS: // 4.7
// cardinality: max 1
file.LicenseComments = subTriple.Object.ID
@@ -97,7 +97,7 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s
file.FileNotice = getNoticeTextFromNode(subTriple.Object)
case SPDX_FILE_CONTRIBUTOR: // 4.14
// cardinality: min 0
- file.FileContributor = append(file.FileContributor, subTriple.Object.ID)
+ file.FileContributors = append(file.FileContributors, subTriple.Object.ID)
case SPDX_FILE_DEPENDENCY:
// cardinality: min 0
newFile, err := parser.getFileFromNode(subTriple.Object)
@@ -130,13 +130,12 @@ func (parser *rdfParser2_2) setFileChecksumFromNode(file *spdx.File2_2, checksum
if err != nil {
return fmt.Errorf("error parsing checksumNode of a file: %v", err)
}
- if file.FileChecksums == nil {
- file.FileChecksums = map[spdx.ChecksumAlgorithm]spdx.Checksum{}
+ if file.Checksums == nil {
+ file.Checksums = []spdx.Checksum{}
}
switch checksumAlgorithm {
case spdx.MD5, spdx.SHA1, spdx.SHA256:
- algorithm := spdx.ChecksumAlgorithm(checksumAlgorithm)
- file.FileChecksums[algorithm] = spdx.Checksum{Algorithm: algorithm, Value: checksumValue}
+ file.Checksums = append(file.Checksums, spdx.Checksum{Algorithm: checksumAlgorithm, Value: checksumValue})
case "":
return fmt.Errorf("empty checksum algorithm and value")
default:
@@ -176,13 +175,13 @@ func (parser *rdfParser2_2) getFileTypeFromUri(uri string) (string, error) {
return strings.TrimPrefix(lastPart, "fileType_"), nil
}
-// populates parser.doc.UnpackagedFiles by a list of files which are not
+// populates parser.doc.Files by a list of files which are not
// associated with a package by the hasFile attribute
// assumes: all the packages are already parsed.
func (parser *rdfParser2_2) setUnpackagedFiles() {
for fileID := range parser.files {
if !parser.assocWithPackage[fileID] {
- parser.doc.UnpackagedFiles[fileID] = parser.files[fileID]
+ parser.doc.Files = append(parser.doc.Files, parser.files[fileID])
}
}
}
diff --git a/rdfloader/parser2v2/parse_file_test.go b/rdfloader/parser2v2/parse_file_test.go
index 069eb26..8c5ea0d 100644
--- a/rdfloader/parser2v2/parse_file_test.go
+++ b/rdfloader/parser2v2/parse_file_test.go
@@ -157,18 +157,18 @@ func Test_rdfParser2_2_setUnpackagedFiles(t *testing.T) {
rdfParser.setUnpackagedFiles()
- // after setting unpackaged files, parser.doc.UnpackagedFiles must've file2 and file3
- if n := len(rdfParser.doc.UnpackagedFiles); n != 2 {
+ // after setting unpackaged files, parser.doc.Files must've file2 and file3
+ if n := len(rdfParser.doc.Files); n != 2 {
t.Errorf("unpackage files should've had 2 files, found %d files", n)
}
// checking if the unpackagedFiles contain only file2 & file3.
- for fileID, _ := range rdfParser.doc.UnpackagedFiles {
- switch string(fileID) {
+ for _, file := range rdfParser.doc.Files {
+ switch string(file.FileSPDXIdentifier) {
case "file2", "file3":
continue
default:
- t.Errorf("unexpected file with id %s found in unpackaged files", fileID)
+ t.Errorf("unexpected file with id %s found in unpackaged files", file.FileSPDXIdentifier)
}
}
}
@@ -207,7 +207,7 @@ func Test_rdfParser2_2_setFileChecksumFromNode(t *testing.T) {
t.Errorf("error parsing a valid checksum node")
}
checksumValue := "d2356e0fe1c0b85285d83c6b2ad51b5f"
- for _, checksum := range file.FileChecksums {
+ for _, checksum := range file.Checksums {
switch checksum.Algorithm {
case spdx.SHA1:
if checksum.Value != "" {
@@ -237,7 +237,7 @@ func Test_rdfParser2_2_setFileChecksumFromNode(t *testing.T) {
if err != nil {
t.Errorf("error parsing a valid checksum node")
}
- for _, checksum := range file.FileChecksums {
+ for _, checksum := range file.Checksums {
switch checksum.Algorithm {
case spdx.SHA1:
if checksum.Value != checksumValue {
@@ -267,7 +267,7 @@ func Test_rdfParser2_2_setFileChecksumFromNode(t *testing.T) {
if err != nil {
t.Errorf("error parsing a valid checksum node")
}
- for _, checksum := range file.FileChecksums {
+ for _, checksum := range file.Checksums {
switch checksum.Algorithm {
case spdx.SHA1:
if checksum.Value != checksumValue {
@@ -508,12 +508,12 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) {
t.Errorf("expected %s, found %s", expectedLicenseConcluded, file.LicenseConcluded)
}
expectedFileType := "source"
- if file.FileType[0] != expectedFileType {
- t.Errorf("expected %s, found %s", expectedFileType, file.FileType)
+ if file.FileTypes[0] != expectedFileType {
+ t.Errorf("expected %s, found %s", expectedFileType, file.FileTypes)
}
expectedLicenseInfoInFile := "NOASSERTION"
- if file.LicenseInfoInFile[0] != expectedLicenseInfoInFile {
- t.Errorf("expected %s, found %s", expectedLicenseInfoInFile, file.LicenseInfoInFile[0])
+ if file.LicenseInfoInFiles[0] != expectedLicenseInfoInFile {
+ t.Errorf("expected %s, found %s", expectedLicenseInfoInFile, file.LicenseInfoInFiles[0])
}
// TestCase 12: checking if recursive dependencies are resolved.
@@ -590,17 +590,17 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) {
t.Errorf("expected %s, found %s", expectedFileName, file.FileName)
}
- if len(file.FileType) != 1 {
- t.Errorf("given file should have 1 fileType attribute. found %d", len(file.FileType))
+ if len(file.FileTypes) != 1 {
+ t.Errorf("given file should have 1 fileType attribute. found %d", len(file.FileTypes))
}
expectedFileType = "source"
- if file.FileType[0] != expectedFileType {
- t.Errorf("expected %s, found %s", expectedFileType, file.FileType)
+ if file.FileTypes[0] != expectedFileType {
+ t.Errorf("expected %s, found %s", expectedFileType, file.FileTypes)
}
expectedChecksum := "0a3a0e1ab72b7c132f5021c538a7a3ea6d539bcd"
- for _, checksum := range file.FileChecksums {
+ for _, checksum := range file.Checksums {
switch checksum.Algorithm {
case spdx.SHA1:
if checksum.Value != expectedChecksum {
@@ -614,12 +614,12 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) {
t.Errorf("expected %s, found %s", expectedLicenseConcluded, file.LicenseConcluded)
}
- if len(file.LicenseInfoInFile) != 1 {
- t.Errorf("given file should have 1 licenseInfoInFile attribute. found %d", len(file.LicenseInfoInFile))
+ if len(file.LicenseInfoInFiles) != 1 {
+ t.Errorf("given file should have 1 licenseInfoInFile attribute. found %d", len(file.LicenseInfoInFiles))
}
expectedLicenseInfoInFile = "NOASSERTION"
- if file.LicenseInfoInFile[0] != expectedLicenseInfoInFile {
- t.Errorf("expected %s, found %s", expectedLicenseInfoInFile, file.LicenseInfoInFile[0])
+ if file.LicenseInfoInFiles[0] != expectedLicenseInfoInFile {
+ t.Errorf("expected %s, found %s", expectedLicenseInfoInFile, file.LicenseInfoInFiles[0])
}
expectedLicenseComments := "no comments"
@@ -657,12 +657,12 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) {
t.Errorf("expected %s, found %s", expectedNoticeText, file.FileNotice)
}
- if n := len(file.FileContributor); n != 1 {
+ if n := len(file.FileContributors); n != 1 {
t.Errorf("given file should have 1 fileContributor. found %d", n)
}
expectedFileContributor := "Some Organization"
- if file.FileContributor[0] != expectedFileContributor {
- t.Errorf("expected %s, found %s", expectedFileContributor, file.FileContributor)
+ if file.FileContributors[0] != expectedFileContributor {
+ t.Errorf("expected %s, found %s", expectedFileContributor, file.FileContributors)
}
if n := len(file.FileDependencies); n != 1 {
@@ -698,12 +698,12 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) {
t.Errorf("expected %s, found %s", expectedAnnotationType, ann.AnnotationType)
}
expectedAnnotator := "File Commenter"
- if ann.Annotator != expectedAnnotator {
+ if ann.Annotator.Annotator != expectedAnnotator {
t.Errorf("expected %s, found %s", expectedAnnotator, ann.Annotator)
}
expectedAnnotatorType := "Person"
if ann.AnnotationType != expectedAnnotationType {
- t.Errorf("expected %s, found %s", expectedAnnotatorType, ann.AnnotatorType)
+ t.Errorf("expected %s, found %s", expectedAnnotatorType, ann.Annotator.AnnotatorType)
}
if n := len(parser.doc.Relationships); n != 1 {
diff --git a/rdfloader/parser2v2/parse_package.go b/rdfloader/parser2v2/parse_package.go
index 47a2af8..41ccab3 100644
--- a/rdfloader/parser2v2/parse_package.go
+++ b/rdfloader/parser2v2/parse_package.go
@@ -40,8 +40,14 @@ func (parser *rdfParser2_2) getPackageFromNode(packageNode *gordfParser.Node) (p
}
pkg.PackageSPDXIdentifier = eId // 3.2
- if existingPkg := parser.doc.Packages[eId]; existingPkg != nil {
- pkg = existingPkg
+ // check if we already have a package initialized for this ID
+ existingPackageIndex := -1
+ for ii, existingPkg := range parser.doc.Packages {
+ if existingPkg != nil && existingPkg.PackageSPDXIdentifier == eId {
+ existingPackageIndex = ii
+ pkg = existingPkg
+ break
+ }
}
// iterate over all the triples associated with the provided package packageNode.
@@ -150,7 +156,12 @@ func (parser *rdfParser2_2) getPackageFromNode(packageNode *gordfParser.Node) (p
}
}
- parser.doc.Packages[pkg.PackageSPDXIdentifier] = pkg
+ if existingPackageIndex != -1 {
+ parser.doc.Packages[existingPackageIndex] = pkg
+ } else {
+ parser.doc.Packages = append(parser.doc.Packages, pkg)
+ }
+
return pkg, nil
}
@@ -199,10 +210,10 @@ func (parser *rdfParser2_2) setPackageVerificationCode(pkg *spdx.Package2_2, nod
switch subTriple.Predicate.ID {
case SPDX_PACKAGE_VERIFICATION_CODE_VALUE:
// cardinality: exactly 1
- pkg.PackageVerificationCode = subTriple.Object.ID
+ pkg.PackageVerificationCode.Value = subTriple.Object.ID
case SPDX_PACKAGE_VERIFICATION_CODE_EXCLUDED_FILE:
// cardinality: min 0
- pkg.PackageVerificationCodeExcludedFile = subTriple.Object.ID
+ pkg.PackageVerificationCode.ExcludedFiles = append(pkg.PackageVerificationCode.ExcludedFiles, subTriple.Object.ID)
case RDF_TYPE:
// cardinality: exactly 1
continue
@@ -217,9 +228,9 @@ func (parser *rdfParser2_2) setPackageVerificationCode(pkg *spdx.Package2_2, nod
// file to indicate the file is associated with a package
func (parser *rdfParser2_2) setFileToPackage(pkg *spdx.Package2_2, file *spdx.File2_2) {
if pkg.Files == nil {
- pkg.Files = map[spdx.ElementID]*spdx.File2_2{}
+ pkg.Files = []*spdx.File2_2{}
}
- pkg.Files[file.FileSPDXIdentifier] = file
+ pkg.Files = append(pkg.Files, file)
parser.assocWithPackage[file.FileSPDXIdentifier] = true
}
@@ -228,22 +239,27 @@ func (parser *rdfParser2_2) setFileToPackage(pkg *spdx.Package2_2, file *spdx.Fi
// value: [NOASSERTION | [Person | Organization]: string]
func setPackageSupplier(pkg *spdx.Package2_2, value string) error {
value = strings.TrimSpace(value)
+ supplier := &spdx.Supplier{}
if strings.ToUpper(value) == "NOASSERTION" {
- pkg.PackageSupplierNOASSERTION = true
+ supplier.Supplier = "NOASSERTION"
+ pkg.PackageSupplier = supplier
return nil
}
+
subKey, subValue, err := ExtractSubs(value, ":")
if err != nil {
return fmt.Errorf("package supplier must be of the form NOASSERTION or [Person|Organization]: string. found: %s", value)
}
switch subKey {
- case "Person":
- pkg.PackageSupplierPerson = subValue
- case "Organization":
- pkg.PackageSupplierOrganization = subValue
+ case "Person", "Organization":
+ supplier.Supplier = subValue
+ supplier.SupplierType = subKey
default:
return fmt.Errorf("unknown supplier %s", subKey)
}
+
+ pkg.PackageSupplier = supplier
+
return nil
}
@@ -252,23 +268,27 @@ func setPackageSupplier(pkg *spdx.Package2_2, value string) error {
// value: [NOASSERTION | [Person | Organization]: string]
func setPackageOriginator(pkg *spdx.Package2_2, value string) error {
value = strings.TrimSpace(value)
+ originator := &spdx.Originator{}
if strings.ToUpper(value) == "NOASSERTION" {
- pkg.PackageOriginatorNOASSERTION = true
+ originator.Originator = "NOASSERTION"
+ pkg.PackageOriginator = originator
return nil
}
+
subKey, subValue, err := ExtractSubs(value, ":")
if err != nil {
- return fmt.Errorf("package originator must be of the form NOASSERTION or [Person|Organization]: string. found: %s", value)
+ return fmt.Errorf("package Originator must be of the form NOASSERTION or [Person|Organization]: string. found: %s", value)
}
-
switch subKey {
- case "Person":
- pkg.PackageOriginatorPerson = subValue
- case "Organization":
- pkg.PackageOriginatorOrganization = subValue
+ case "Person", "Organization":
+ originator.Originator = subValue
+ originator.OriginatorType = subKey
default:
- return fmt.Errorf("originator can be either a Person or Organization. found %s", subKey)
+ return fmt.Errorf("unknown Originator %s", subKey)
}
+
+ pkg.PackageOriginator = originator
+
return nil
}
@@ -302,12 +322,11 @@ func (parser *rdfParser2_2) setPackageChecksum(pkg *spdx.Package2_2, node *gordf
return fmt.Errorf("error getting checksum algorithm and value from %v", node)
}
if pkg.PackageChecksums == nil {
- pkg.PackageChecksums = make(map[spdx.ChecksumAlgorithm]spdx.Checksum)
+ pkg.PackageChecksums = make([]spdx.Checksum, 0, 1)
}
switch checksumAlgorithm {
case spdx.MD5, spdx.SHA1, spdx.SHA256:
- algorithm := spdx.ChecksumAlgorithm(checksumAlgorithm)
- pkg.PackageChecksums[algorithm] = spdx.Checksum{Algorithm: algorithm, Value: checksumValue}
+ pkg.PackageChecksums = append(pkg.PackageChecksums, spdx.Checksum{Algorithm: checksumAlgorithm, Value: checksumValue})
default:
return fmt.Errorf("unknown checksumAlgorithm %s while parsing a package", checksumAlgorithm)
}
diff --git a/rdfloader/parser2v2/parse_package_test.go b/rdfloader/parser2v2/parse_package_test.go
index 9744760..c1bc7ed 100644
--- a/rdfloader/parser2v2/parse_package_test.go
+++ b/rdfloader/parser2v2/parse_package_test.go
@@ -19,8 +19,8 @@ func Test_setPackageSupplier(t *testing.T) {
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
- if !pkg.PackageSupplierNOASSERTION {
- t.Errorf("PackageSupplierNOASSERTION must've been set to true")
+ if pkg.PackageSupplier.Supplier != "NOASSERTION" {
+ t.Errorf("PackageSupplier must've been set to NOASSERTION")
}
// TestCase 2: lower-case noassertion must also set the
@@ -30,8 +30,8 @@ func Test_setPackageSupplier(t *testing.T) {
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
- if !pkg.PackageSupplierNOASSERTION {
- t.Errorf("PackageSupplierNOASSERTION must've been set to true")
+ if pkg.PackageSupplier.Supplier != "NOASSERTION" {
+ t.Errorf("PackageSupplier must've been set to NOASSERTION")
}
// TestCase 3: invalid input without colon separator. must raise an error
@@ -50,8 +50,8 @@ func Test_setPackageSupplier(t *testing.T) {
if err != nil {
t.Errorf("unexpected error: %v", err)
}
- if pkg.PackageSupplierPerson != personName {
- t.Errorf("PackageSupplierPerson should be %s. found %s", personName, pkg.PackageSupplierPerson)
+ if pkg.PackageSupplier.Supplier != personName {
+ t.Errorf("PackageSupplierPerson should be %s. found %s", personName, pkg.PackageSupplier.Supplier)
}
// TestCase 5: Valid Organization
@@ -62,8 +62,8 @@ func Test_setPackageSupplier(t *testing.T) {
if err != nil {
t.Errorf("unexpected error: %v", err)
}
- if pkg.PackageSupplierOrganization != orgName {
- t.Errorf("PackageSupplierPerson should be %s. found %s", orgName, pkg.PackageSupplierOrganization)
+ if pkg.PackageSupplier.Supplier != orgName {
+ t.Errorf("PackageSupplierPerson should be %s. found %s", orgName, pkg.PackageSupplier.Supplier)
}
// TestCase 6: Invalid EntityType
@@ -84,8 +84,8 @@ func Test_setPackageOriginator(t *testing.T) {
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
- if !pkg.PackageOriginatorNOASSERTION {
- t.Errorf("PackageOriginatorNOASSERTION must've been set to true")
+ if pkg.PackageOriginator.Originator != "NOASSERTION" {
+ t.Errorf("PackageOriginator must've been set to NOASSERTION")
}
// TestCase 2: lower-case noassertion must also set the
@@ -95,8 +95,8 @@ func Test_setPackageOriginator(t *testing.T) {
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
- if !pkg.PackageOriginatorNOASSERTION {
- t.Errorf("PackageOriginatorNOASSERTION must've been set to true")
+ if pkg.PackageOriginator.Originator != "NOASSERTION" {
+ t.Errorf("PackageOriginator must've been set to NOASSERTION")
}
// TestCase 3: invalid input without colon separator. must raise an error
@@ -115,8 +115,8 @@ func Test_setPackageOriginator(t *testing.T) {
if err != nil {
t.Errorf("unexpected error: %v", err)
}
- if pkg.PackageOriginatorPerson != personName {
- t.Errorf("PackageOriginatorPerson should be %s. found %s", personName, pkg.PackageOriginatorPerson)
+ if pkg.PackageOriginator.Originator != personName {
+ t.Errorf("PackageOriginatorPerson should be %s. found %s", personName, pkg.PackageOriginator.Originator)
}
// TestCase 5: Valid Organization
@@ -127,8 +127,8 @@ func Test_setPackageOriginator(t *testing.T) {
if err != nil {
t.Errorf("unexpected error: %v", err)
}
- if pkg.PackageOriginatorOrganization != orgName {
- t.Errorf("PackageOriginatorOrganization should be %s. found %s", orgName, pkg.PackageOriginatorOrganization)
+ if pkg.PackageOriginator.Originator != orgName {
+ t.Errorf("PackageOriginatorOrganization should be %s. found %s", orgName, pkg.PackageOriginator.Originator)
}
// TestCase 6: Invalid EntityType
@@ -175,12 +175,12 @@ func Test_rdfParser2_2_setPackageVerificationCode(t *testing.T) {
t.Errorf("unexpected error: %v", err)
}
expectedValue := "cbceb8b5689b75a584efe35587b5d41bd48820ce"
- if pkg.PackageVerificationCode != expectedValue {
+ if pkg.PackageVerificationCode.Value != expectedValue {
t.Errorf("expected %v, got %v", expectedValue, pkg.PackageVerificationCode)
}
expectedExcludedFile := "./package.spdx"
- if pkg.PackageVerificationCodeExcludedFile != expectedExcludedFile {
- t.Errorf("expected %v, got %v", expectedExcludedFile, pkg.PackageVerificationCodeExcludedFile)
+ if pkg.PackageVerificationCode.ExcludedFiles[0] != expectedExcludedFile {
+ t.Errorf("expected %v, got %v", expectedExcludedFile, pkg.PackageVerificationCode.ExcludedFiles)
}
}
diff --git a/rdfloader/parser2v2/parse_snippet_info.go b/rdfloader/parser2v2/parse_snippet_info.go
index d9c8279..a09d671 100644
--- a/rdfloader/parser2v2/parse_snippet_info.go
+++ b/rdfloader/parser2v2/parse_snippet_info.go
@@ -31,7 +31,8 @@ func (parser *rdfParser2_2) getSnippetInformationFromNode2_2(node *gordfParser.N
if err != nil {
return nil, err
}
- si.SnippetFromFileSPDXIdentifier, err = ExtractDocElementID(getLastPartOfURI(siTriple.Object.ID))
+ docElemID, err := ExtractDocElementID(getLastPartOfURI(siTriple.Object.ID))
+ si.SnippetFromFileSPDXIdentifier = docElemID.ElementRefID
case SPDX_RANGE:
// cardinality: min 1
err = parser.setSnippetRangeFromNode(siTriple.Object, si)
@@ -131,12 +132,17 @@ func (parser *rdfParser2_2) setSnippetRangeFromNode(node *gordfParser.Node, si *
return fmt.Errorf("start and end range type doesn't match")
}
+ si.Ranges = []spdx.SnippetRange{{
+ StartPointer: spdx.SnippetRangePointer{FileSPDXIdentifier: si.SnippetFromFileSPDXIdentifier},
+ EndPointer: spdx.SnippetRangePointer{FileSPDXIdentifier: si.SnippetFromFileSPDXIdentifier},
+ }}
+
if startRangeType == LINE_RANGE {
- si.SnippetLineRangeStart = start
- si.SnippetLineRangeEnd = end
+ si.Ranges[0].StartPointer.LineNumber = start
+ si.Ranges[0].EndPointer.LineNumber = end
} else {
- si.SnippetByteRangeStart = start
- si.SnippetByteRangeEnd = end
+ si.Ranges[0].StartPointer.Offset = start
+ si.Ranges[0].EndPointer.Offset = end
}
return nil
}
diff --git a/rdfloader/parser2v2/parse_spdx_document.go b/rdfloader/parser2v2/parse_spdx_document.go
index e98fbf6..6159317 100644
--- a/rdfloader/parser2v2/parse_spdx_document.go
+++ b/rdfloader/parser2v2/parse_spdx_document.go
@@ -18,8 +18,8 @@ func (parser *rdfParser2_2) parseSpdxDocumentNode(spdxDocNode *gordfParser.Node)
if err != nil {
return err
}
- ci.DocumentNamespace = baseUri // 2.5
- ci.SPDXIdentifier = spdx.ElementID(offset) // 2.3
+ parser.doc.DocumentNamespace = baseUri // 2.5
+ parser.doc.SPDXIdentifier = spdx.ElementID(offset) // 2.3
// parse other associated triples.
for _, subTriple := range parser.nodeToTriples(spdxDocNode) {
@@ -29,17 +29,17 @@ func (parser *rdfParser2_2) parseSpdxDocumentNode(spdxDocNode *gordfParser.Node)
continue
case SPDX_SPEC_VERSION: // 2.1: specVersion
// cardinality: exactly 1
- ci.SPDXVersion = objectValue
+ parser.doc.SPDXVersion = objectValue
case SPDX_DATA_LICENSE: // 2.2: dataLicense
// cardinality: exactly 1
dataLicense, err := parser.getAnyLicenseFromNode(subTriple.Object)
if err != nil {
return err
}
- ci.DataLicense = dataLicense.ToLicenseString()
+ parser.doc.DataLicense = dataLicense.ToLicenseString()
case SPDX_NAME: // 2.4: DocumentName
// cardinality: exactly 1
- ci.DocumentName = objectValue
+ parser.doc.DocumentName = objectValue
case SPDX_EXTERNAL_DOCUMENT_REF: // 2.6: externalDocumentReferences
// cardinality: min 0
var extRef spdx.ExternalDocumentRef2_2
@@ -47,13 +47,13 @@ func (parser *rdfParser2_2) parseSpdxDocumentNode(spdxDocNode *gordfParser.Node)
if err != nil {
return err
}
- ci.ExternalDocumentReferences[extRef.DocumentRefID] = extRef
+ parser.doc.ExternalDocumentReferences = append(parser.doc.ExternalDocumentReferences, extRef)
case SPDX_CREATION_INFO: // 2.7 - 2.10:
// cardinality: exactly 1
err = parser.parseCreationInfoFromNode(ci, subTriple.Object)
case RDFS_COMMENT: // 2.11: Document Comment
// cardinality: max 1
- ci.DocumentComment = objectValue
+ parser.doc.DocumentComment = objectValue
case SPDX_REVIEWED: // reviewed:
// cardinality: min 0
err = parser.setReviewFromNode(subTriple.Object)
@@ -64,7 +64,7 @@ func (parser *rdfParser2_2) parseSpdxDocumentNode(spdxDocNode *gordfParser.Node)
if err != nil {
return err
}
- parser.doc.Packages[pkg.PackageSPDXIdentifier] = pkg
+ parser.doc.Packages = append(parser.doc.Packages, pkg)
case SPDX_HAS_EXTRACTED_LICENSING_INFO: // hasExtractedLicensingInfo
// cardinality: min 0
extractedLicensingInfo, err := parser.getExtractedLicensingInfoFromNode(subTriple.Object)
@@ -102,10 +102,12 @@ func (parser *rdfParser2_2) getExternalDocumentRefFromNode(node *gordfParser.Nod
edr.URI = triple.Object.ID
case SPDX_CHECKSUM:
// cardinality: exactly 1
- edr.Alg, edr.Checksum, err = parser.getChecksumFromNode(triple.Object)
+ alg, checksum, err := parser.getChecksumFromNode(triple.Object)
if err != nil {
return edr, err
}
+ edr.Checksum.Value = checksum
+ edr.Checksum.Algorithm = alg
case RDF_TYPE:
continue
default:
diff --git a/rdfloader/parser2v2/parser.go b/rdfloader/parser2v2/parser.go
index ec4f7ff..6329dc4 100644
--- a/rdfloader/parser2v2/parser.go
+++ b/rdfloader/parser2v2/parser.go
@@ -16,19 +16,18 @@ func NewParser2_2(gordfParserObj *gordfParser.Parser, nodeToTriples map[string][
gordfParserObj: gordfParserObj,
nodeStringToTriples: nodeToTriples,
doc: &spdx.Document2_2{
- CreationInfo: &spdx.CreationInfo2_2{
- ExternalDocumentReferences: map[string]spdx.ExternalDocumentRef2_2{},
- },
- Packages: map[spdx.ElementID]*spdx.Package2_2{},
- UnpackagedFiles: map[spdx.ElementID]*spdx.File2_2{},
- OtherLicenses: []*spdx.OtherLicense2_2{},
- Relationships: []*spdx.Relationship2_2{},
- Annotations: []*spdx.Annotation2_2{},
- Reviews: []*spdx.Review2_2{},
+ ExternalDocumentReferences: []spdx.ExternalDocumentRef2_2{},
+ CreationInfo: &spdx.CreationInfo2_2{},
+ Packages: []*spdx.Package2_2{},
+ Files: []*spdx.File2_2{},
+ OtherLicenses: []*spdx.OtherLicense2_2{},
+ Relationships: []*spdx.Relationship2_2{},
+ Annotations: []*spdx.Annotation2_2{},
+ Reviews: []*spdx.Review2_2{},
},
files: map[spdx.ElementID]*spdx.File2_2{},
assocWithPackage: map[spdx.ElementID]bool{},
- cache: map[string]*nodeState{},
+ cache: map[string]*nodeState{},
}
return &parser
}
@@ -66,7 +65,7 @@ func LoadFromGoRDFParser(gordfParserObj *gordfParser.Parser) (*spdx.Document2_2,
if err != nil {
return nil, fmt.Errorf("error parsing a snippet: %v", err)
}
- err = parser.setSnippetToFileWithID(snippet, snippet.SnippetFromFileSPDXIdentifier.ElementRefID)
+ err = parser.setSnippetToFileWithID(snippet, snippet.SnippetFromFileSPDXIdentifier)
if err != nil {
return nil, err
}
@@ -81,7 +80,7 @@ func LoadFromGoRDFParser(gordfParserObj *gordfParser.Parser) (*spdx.Document2_2,
// parsing packages and files sets the files to a files variable which is
// associated with the parser and not the document. following method is
// necessary to transfer the files which are not set in the packages to the
- // UnpackagedFiles attribute of the document
+ // Files attribute of the document
// WARNING: do not relocate following function call. It must be at the end of the function
parser.setUnpackagedFiles()
return parser.doc, nil
diff --git a/rdfloader/parser2v2/parser_test.go b/rdfloader/parser2v2/parser_test.go
index 0d9c30d..11b2da6 100644
--- a/rdfloader/parser2v2/parser_test.go
+++ b/rdfloader/parser2v2/parser_test.go
@@ -24,8 +24,8 @@ func TestNewParser2_2(t *testing.T) {
if parser.doc.Packages == nil {
t.Errorf("doc.Packages should've been initialised, got %v", parser.doc.Packages)
}
- if parser.doc.UnpackagedFiles == nil {
- t.Errorf("doc.UnpackagedFiles should've been initialised, got %v", parser.doc.UnpackagedFiles)
+ if parser.doc.Files == nil {
+ t.Errorf("doc.Files should've been initialised, got %v", parser.doc.Files)
}
}