| // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later |
| |
| package parser2v2 |
| |
| import ( |
| "fmt" |
| |
| gordfParser "github.com/spdx/gordf/rdfloader/parser" |
| "github.com/spdx/tools-golang/spdx/common" |
| "github.com/spdx/tools-golang/spdx/v2_2" |
| ) |
| |
| func (parser *rdfParser2_2) parseSpdxDocumentNode(spdxDocNode *gordfParser.Node) (err error) { |
| // shorthand for document's creation info. |
| ci := parser.doc.CreationInfo |
| |
| // parse the document header information (SPDXID and document namespace) |
| // the Subject.ID is of type baseURI#spdxID |
| baseUri, offset, err := ExtractSubs(spdxDocNode.ID, "#") |
| if err != nil { |
| return err |
| } |
| parser.doc.DocumentNamespace = baseUri // 2.5 |
| parser.doc.SPDXIdentifier = common.ElementID(offset) // 2.3 |
| |
| // parse other associated triples. |
| for _, subTriple := range parser.nodeToTriples(spdxDocNode) { |
| objectValue := subTriple.Object.ID |
| switch subTriple.Predicate.ID { |
| case RDF_TYPE: |
| continue |
| case SPDX_SPEC_VERSION: // 2.1: specVersion |
| // cardinality: exactly 1 |
| 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 |
| } |
| parser.doc.DataLicense = dataLicense.ToLicenseString() |
| case SPDX_NAME: // 2.4: DocumentName |
| // cardinality: exactly 1 |
| parser.doc.DocumentName = objectValue |
| case SPDX_EXTERNAL_DOCUMENT_REF: // 2.6: externalDocumentReferences |
| // cardinality: min 0 |
| var extRef v2_2.ExternalDocumentRef |
| extRef, err = parser.getExternalDocumentRefFromNode(subTriple.Object) |
| if err != nil { |
| return err |
| } |
| 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 |
| parser.doc.DocumentComment = objectValue |
| case SPDX_REVIEWED: // reviewed: |
| // cardinality: min 0 |
| err = parser.setReviewFromNode(subTriple.Object) |
| case SPDX_DESCRIBES_PACKAGE: // describes Package |
| // cardinality: min 0 |
| var pkg *v2_2.Package |
| pkg, err = parser.getPackageFromNode(subTriple.Object) |
| if err != nil { |
| return err |
| } |
| parser.doc.Packages = append(parser.doc.Packages, pkg) |
| case SPDX_HAS_EXTRACTED_LICENSING_INFO: // hasExtractedLicensingInfo |
| // cardinality: min 0 |
| extractedLicensingInfo, err := parser.getExtractedLicensingInfoFromNode(subTriple.Object) |
| if err != nil { |
| return fmt.Errorf("error setting extractedLicensingInfo in spdxDocument: %v", err) |
| } |
| othLicense := parser.extractedLicenseToOtherLicense(extractedLicensingInfo) |
| parser.doc.OtherLicenses = append(parser.doc.OtherLicenses, &othLicense) |
| case SPDX_RELATIONSHIP: // relationship |
| // cardinality: min 0 |
| err = parser.parseRelationship(subTriple) |
| case SPDX_ANNOTATION: // annotations |
| // cardinality: min 0 |
| err = parser.parseAnnotationFromNode(subTriple.Object) |
| default: |
| return fmt.Errorf("invalid predicate while parsing SpdxDocument: %v", subTriple.Predicate) |
| } |
| if err != nil { |
| return err |
| } |
| } |
| return nil |
| } |
| |
| func (parser *rdfParser2_2) getExternalDocumentRefFromNode(node *gordfParser.Node) (edr v2_2.ExternalDocumentRef, err error) { |
| for _, triple := range parser.nodeToTriples(node) { |
| switch triple.Predicate.ID { |
| case SPDX_EXTERNAL_DOCUMENT_ID: |
| // cardinality: exactly 1 |
| edr.DocumentRefID = triple.Object.ID |
| case SPDX_SPDX_DOCUMENT: |
| // cardinality: exactly 1 |
| // assumption: "spdxDocument" property of an external document |
| // reference is just a uri which doesn't follow a spdxDocument definition |
| edr.URI = triple.Object.ID |
| case SPDX_CHECKSUM: |
| // cardinality: exactly 1 |
| 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: |
| return edr, fmt.Errorf("unknown predicate ID (%s) while parsing externalDocumentReference", triple.Predicate.ID) |
| } |
| } |
| return edr, nil |
| } |