1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2*ba677afaSXin Li 3*ba677afaSXin Lipackage parser2v2 4*ba677afaSXin Li 5*ba677afaSXin Liimport ( 6*ba677afaSXin Li "fmt" 7*ba677afaSXin Li 8*ba677afaSXin Li gordfParser "github.com/spdx/gordf/rdfloader/parser" 9*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/common" 10*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_2" 11*ba677afaSXin Li) 12*ba677afaSXin Li 13*ba677afaSXin Lifunc (parser *rdfParser2_2) parseSpdxDocumentNode(spdxDocNode *gordfParser.Node) (err error) { 14*ba677afaSXin Li // shorthand for document's creation info. 15*ba677afaSXin Li ci := parser.doc.CreationInfo 16*ba677afaSXin Li 17*ba677afaSXin Li // parse the document header information (SPDXID and document namespace) 18*ba677afaSXin Li // the Subject.ID is of type baseURI#spdxID 19*ba677afaSXin Li baseUri, offset, err := ExtractSubs(spdxDocNode.ID, "#") 20*ba677afaSXin Li if err != nil { 21*ba677afaSXin Li return err 22*ba677afaSXin Li } 23*ba677afaSXin Li parser.doc.DocumentNamespace = baseUri // 2.5 24*ba677afaSXin Li parser.doc.SPDXIdentifier = common.ElementID(offset) // 2.3 25*ba677afaSXin Li 26*ba677afaSXin Li // parse other associated triples. 27*ba677afaSXin Li for _, subTriple := range parser.nodeToTriples(spdxDocNode) { 28*ba677afaSXin Li objectValue := subTriple.Object.ID 29*ba677afaSXin Li switch subTriple.Predicate.ID { 30*ba677afaSXin Li case RDF_TYPE: 31*ba677afaSXin Li continue 32*ba677afaSXin Li case SPDX_SPEC_VERSION: // 2.1: specVersion 33*ba677afaSXin Li // cardinality: exactly 1 34*ba677afaSXin Li parser.doc.SPDXVersion = objectValue 35*ba677afaSXin Li case SPDX_DATA_LICENSE: // 2.2: dataLicense 36*ba677afaSXin Li // cardinality: exactly 1 37*ba677afaSXin Li dataLicense, err := parser.getAnyLicenseFromNode(subTriple.Object) 38*ba677afaSXin Li if err != nil { 39*ba677afaSXin Li return err 40*ba677afaSXin Li } 41*ba677afaSXin Li parser.doc.DataLicense = dataLicense.ToLicenseString() 42*ba677afaSXin Li case SPDX_NAME: // 2.4: DocumentName 43*ba677afaSXin Li // cardinality: exactly 1 44*ba677afaSXin Li parser.doc.DocumentName = objectValue 45*ba677afaSXin Li case SPDX_EXTERNAL_DOCUMENT_REF: // 2.6: externalDocumentReferences 46*ba677afaSXin Li // cardinality: min 0 47*ba677afaSXin Li var extRef v2_2.ExternalDocumentRef 48*ba677afaSXin Li extRef, err = parser.getExternalDocumentRefFromNode(subTriple.Object) 49*ba677afaSXin Li if err != nil { 50*ba677afaSXin Li return err 51*ba677afaSXin Li } 52*ba677afaSXin Li parser.doc.ExternalDocumentReferences = append(parser.doc.ExternalDocumentReferences, extRef) 53*ba677afaSXin Li case SPDX_CREATION_INFO: // 2.7 - 2.10: 54*ba677afaSXin Li // cardinality: exactly 1 55*ba677afaSXin Li err = parser.parseCreationInfoFromNode(ci, subTriple.Object) 56*ba677afaSXin Li case RDFS_COMMENT: // 2.11: Document Comment 57*ba677afaSXin Li // cardinality: max 1 58*ba677afaSXin Li parser.doc.DocumentComment = objectValue 59*ba677afaSXin Li case SPDX_REVIEWED: // reviewed: 60*ba677afaSXin Li // cardinality: min 0 61*ba677afaSXin Li err = parser.setReviewFromNode(subTriple.Object) 62*ba677afaSXin Li case SPDX_DESCRIBES_PACKAGE: // describes Package 63*ba677afaSXin Li // cardinality: min 0 64*ba677afaSXin Li var pkg *v2_2.Package 65*ba677afaSXin Li pkg, err = parser.getPackageFromNode(subTriple.Object) 66*ba677afaSXin Li if err != nil { 67*ba677afaSXin Li return err 68*ba677afaSXin Li } 69*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, pkg) 70*ba677afaSXin Li case SPDX_HAS_EXTRACTED_LICENSING_INFO: // hasExtractedLicensingInfo 71*ba677afaSXin Li // cardinality: min 0 72*ba677afaSXin Li extractedLicensingInfo, err := parser.getExtractedLicensingInfoFromNode(subTriple.Object) 73*ba677afaSXin Li if err != nil { 74*ba677afaSXin Li return fmt.Errorf("error setting extractedLicensingInfo in spdxDocument: %v", err) 75*ba677afaSXin Li } 76*ba677afaSXin Li othLicense := parser.extractedLicenseToOtherLicense(extractedLicensingInfo) 77*ba677afaSXin Li parser.doc.OtherLicenses = append(parser.doc.OtherLicenses, &othLicense) 78*ba677afaSXin Li case SPDX_RELATIONSHIP: // relationship 79*ba677afaSXin Li // cardinality: min 0 80*ba677afaSXin Li err = parser.parseRelationship(subTriple) 81*ba677afaSXin Li case SPDX_ANNOTATION: // annotations 82*ba677afaSXin Li // cardinality: min 0 83*ba677afaSXin Li err = parser.parseAnnotationFromNode(subTriple.Object) 84*ba677afaSXin Li default: 85*ba677afaSXin Li return fmt.Errorf("invalid predicate while parsing SpdxDocument: %v", subTriple.Predicate) 86*ba677afaSXin Li } 87*ba677afaSXin Li if err != nil { 88*ba677afaSXin Li return err 89*ba677afaSXin Li } 90*ba677afaSXin Li } 91*ba677afaSXin Li return nil 92*ba677afaSXin Li} 93*ba677afaSXin Li 94*ba677afaSXin Lifunc (parser *rdfParser2_2) getExternalDocumentRefFromNode(node *gordfParser.Node) (edr v2_2.ExternalDocumentRef, err error) { 95*ba677afaSXin Li for _, triple := range parser.nodeToTriples(node) { 96*ba677afaSXin Li switch triple.Predicate.ID { 97*ba677afaSXin Li case SPDX_EXTERNAL_DOCUMENT_ID: 98*ba677afaSXin Li // cardinality: exactly 1 99*ba677afaSXin Li edr.DocumentRefID = triple.Object.ID 100*ba677afaSXin Li case SPDX_SPDX_DOCUMENT: 101*ba677afaSXin Li // cardinality: exactly 1 102*ba677afaSXin Li // assumption: "spdxDocument" property of an external document 103*ba677afaSXin Li // reference is just a uri which doesn't follow a spdxDocument definition 104*ba677afaSXin Li edr.URI = triple.Object.ID 105*ba677afaSXin Li case SPDX_CHECKSUM: 106*ba677afaSXin Li // cardinality: exactly 1 107*ba677afaSXin Li alg, checksum, err := parser.getChecksumFromNode(triple.Object) 108*ba677afaSXin Li if err != nil { 109*ba677afaSXin Li return edr, err 110*ba677afaSXin Li } 111*ba677afaSXin Li edr.Checksum.Value = checksum 112*ba677afaSXin Li edr.Checksum.Algorithm = alg 113*ba677afaSXin Li case RDF_TYPE: 114*ba677afaSXin Li continue 115*ba677afaSXin Li default: 116*ba677afaSXin Li return edr, fmt.Errorf("unknown predicate ID (%s) while parsing externalDocumentReference", triple.Predicate.ID) 117*ba677afaSXin Li } 118*ba677afaSXin Li } 119*ba677afaSXin Li return edr, nil 120*ba677afaSXin Li} 121