diff options
Diffstat (limited to 'rdfloader')
-rw-r--r-- | rdfloader/parser2v2/license_utils.go | 5 | ||||
-rw-r--r-- | rdfloader/parser2v2/parse_annotation.go | 4 | ||||
-rw-r--r-- | rdfloader/parser2v2/parse_annotation_test.go | 10 | ||||
-rw-r--r-- | rdfloader/parser2v2/parse_creation_info.go | 18 | ||||
-rw-r--r-- | rdfloader/parser2v2/parse_creation_info_test.go | 14 | ||||
-rw-r--r-- | rdfloader/parser2v2/parse_file.go | 17 | ||||
-rw-r--r-- | rdfloader/parser2v2/parse_file_test.go | 52 | ||||
-rw-r--r-- | rdfloader/parser2v2/parse_package.go | 65 | ||||
-rw-r--r-- | rdfloader/parser2v2/parse_package_test.go | 38 | ||||
-rw-r--r-- | rdfloader/parser2v2/parse_snippet_info.go | 16 | ||||
-rw-r--r-- | rdfloader/parser2v2/parse_spdx_document.go | 20 | ||||
-rw-r--r-- | rdfloader/parser2v2/parser.go | 23 | ||||
-rw-r--r-- | rdfloader/parser2v2/parser_test.go | 4 |
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) } } |