xref: /aosp_15_r20/external/spdx-tools/rdfloader/parser2v2/parse_spdx_document.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
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