xref: /aosp_15_r20/external/spdx-tools/spdxlib/documents.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Lipackage spdxlib
3*ba677afaSXin Li
4*ba677afaSXin Liimport (
5*ba677afaSXin Li	"fmt"
6*ba677afaSXin Li
7*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/common"
8*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_1"
9*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_2"
10*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_3"
11*ba677afaSXin Li)
12*ba677afaSXin Li
13*ba677afaSXin Li// ValidateDocument2_1 returns an error if the Document is found to be invalid, or nil if the Document is valid.
14*ba677afaSXin Li// Currently, this only verifies that all Element IDs mentioned in Relationships exist in the Document as either a
15*ba677afaSXin Li// Package or an UnpackagedFile.
16*ba677afaSXin Lifunc ValidateDocument2_1(doc *v2_1.Document) error {
17*ba677afaSXin Li	// cache a map of valid package IDs for quick lookups
18*ba677afaSXin Li	validElementIDs := make(map[common.ElementID]bool)
19*ba677afaSXin Li	for _, docPackage := range doc.Packages {
20*ba677afaSXin Li		validElementIDs[docPackage.PackageSPDXIdentifier] = true
21*ba677afaSXin Li	}
22*ba677afaSXin Li
23*ba677afaSXin Li	for _, unpackagedFile := range doc.Files {
24*ba677afaSXin Li		validElementIDs[unpackagedFile.FileSPDXIdentifier] = true
25*ba677afaSXin Li	}
26*ba677afaSXin Li
27*ba677afaSXin Li	// add the Document element ID
28*ba677afaSXin Li	validElementIDs[common.MakeDocElementID("", "DOCUMENT").ElementRefID] = true
29*ba677afaSXin Li
30*ba677afaSXin Li	for _, relationship := range doc.Relationships {
31*ba677afaSXin Li		if !validElementIDs[relationship.RefA.ElementRefID] {
32*ba677afaSXin Li			return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefA.ElementRefID))
33*ba677afaSXin Li		}
34*ba677afaSXin Li
35*ba677afaSXin Li		if !validElementIDs[relationship.RefB.ElementRefID] {
36*ba677afaSXin Li			return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefB.ElementRefID))
37*ba677afaSXin Li		}
38*ba677afaSXin Li	}
39*ba677afaSXin Li
40*ba677afaSXin Li	return nil
41*ba677afaSXin Li}
42*ba677afaSXin Li
43*ba677afaSXin Li// ValidateDocument2_2 returns an error if the Document is found to be invalid, or nil if the Document is valid.
44*ba677afaSXin Li// Currently, this only verifies that all Element IDs mentioned in Relationships exist in the Document as either a
45*ba677afaSXin Li// Package or an UnpackagedFile.
46*ba677afaSXin Lifunc ValidateDocument2_2(doc *v2_2.Document) error {
47*ba677afaSXin Li	// cache a map of package IDs for quick lookups
48*ba677afaSXin Li	validElementIDs := make(map[common.ElementID]bool)
49*ba677afaSXin Li	for _, docPackage := range doc.Packages {
50*ba677afaSXin Li		validElementIDs[docPackage.PackageSPDXIdentifier] = true
51*ba677afaSXin Li	}
52*ba677afaSXin Li
53*ba677afaSXin Li	for _, unpackagedFile := range doc.Files {
54*ba677afaSXin Li		validElementIDs[unpackagedFile.FileSPDXIdentifier] = true
55*ba677afaSXin Li	}
56*ba677afaSXin Li
57*ba677afaSXin Li	// add the Document element ID
58*ba677afaSXin Li	validElementIDs[common.MakeDocElementID("", "DOCUMENT").ElementRefID] = true
59*ba677afaSXin Li
60*ba677afaSXin Li	for _, relationship := range doc.Relationships {
61*ba677afaSXin Li		if !validElementIDs[relationship.RefA.ElementRefID] {
62*ba677afaSXin Li			return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefA.ElementRefID))
63*ba677afaSXin Li		}
64*ba677afaSXin Li
65*ba677afaSXin Li		if !validElementIDs[relationship.RefB.ElementRefID] {
66*ba677afaSXin Li			return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefB.ElementRefID))
67*ba677afaSXin Li		}
68*ba677afaSXin Li	}
69*ba677afaSXin Li
70*ba677afaSXin Li	return nil
71*ba677afaSXin Li}
72*ba677afaSXin Li
73*ba677afaSXin Li// ValidateDocument2_3 returns an error if the Document is found to be invalid, or nil if the Document is valid.
74*ba677afaSXin Li// Currently, this only verifies that all Element IDs mentioned in Relationships exist in the Document as either a
75*ba677afaSXin Li// Package or an UnpackagedFile.
76*ba677afaSXin Lifunc ValidateDocument2_3(doc *v2_3.Document) error {
77*ba677afaSXin Li	// cache a map of package IDs for quick lookups
78*ba677afaSXin Li	validElementIDs := make(map[common.ElementID]bool)
79*ba677afaSXin Li	for _, docPackage := range doc.Packages {
80*ba677afaSXin Li		validElementIDs[docPackage.PackageSPDXIdentifier] = true
81*ba677afaSXin Li	}
82*ba677afaSXin Li
83*ba677afaSXin Li	for _, unpackagedFile := range doc.Files {
84*ba677afaSXin Li		validElementIDs[unpackagedFile.FileSPDXIdentifier] = true
85*ba677afaSXin Li	}
86*ba677afaSXin Li
87*ba677afaSXin Li	// add the Document element ID
88*ba677afaSXin Li	validElementIDs[common.MakeDocElementID("", "DOCUMENT").ElementRefID] = true
89*ba677afaSXin Li
90*ba677afaSXin Li	for _, relationship := range doc.Relationships {
91*ba677afaSXin Li		if !validElementIDs[relationship.RefA.ElementRefID] {
92*ba677afaSXin Li			return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefA.ElementRefID))
93*ba677afaSXin Li		}
94*ba677afaSXin Li
95*ba677afaSXin Li		if !validElementIDs[relationship.RefB.ElementRefID] {
96*ba677afaSXin Li			return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefB.ElementRefID))
97*ba677afaSXin Li		}
98*ba677afaSXin Li	}
99*ba677afaSXin Li
100*ba677afaSXin Li	return nil
101*ba677afaSXin Li}
102