xref: /aosp_15_r20/external/spdx-tools/rdfloader/parser2v3/parse_annotation.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Li
3*ba677afaSXin Lipackage parser2v3
4*ba677afaSXin Li
5*ba677afaSXin Liimport (
6*ba677afaSXin Li	"errors"
7*ba677afaSXin Li	"fmt"
8*ba677afaSXin Li
9*ba677afaSXin Li	gordfParser "github.com/spdx/gordf/rdfloader/parser"
10*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_3"
11*ba677afaSXin Li)
12*ba677afaSXin Li
13*ba677afaSXin Li// creates a new instance of annotation and sets the annotation attributes
14*ba677afaSXin Li// associated with the given node.
15*ba677afaSXin Li// The newly created annotation is appended to the doc.
16*ba677afaSXin Lifunc (parser *rdfParser2_3) parseAnnotationFromNode(node *gordfParser.Node) (err error) {
17*ba677afaSXin Li	ann := &v2_3.Annotation{}
18*ba677afaSXin Li	for _, subTriple := range parser.nodeToTriples(node) {
19*ba677afaSXin Li		switch subTriple.Predicate.ID {
20*ba677afaSXin Li		case SPDX_ANNOTATOR:
21*ba677afaSXin Li			// cardinality: exactly 1
22*ba677afaSXin Li			err = setAnnotatorFromString(subTriple.Object.ID, ann)
23*ba677afaSXin Li		case SPDX_ANNOTATION_DATE:
24*ba677afaSXin Li			// cardinality: exactly 1
25*ba677afaSXin Li			ann.AnnotationDate = subTriple.Object.ID
26*ba677afaSXin Li		case RDFS_COMMENT:
27*ba677afaSXin Li			// cardinality: exactly 1
28*ba677afaSXin Li			ann.AnnotationComment = subTriple.Object.ID
29*ba677afaSXin Li		case SPDX_ANNOTATION_TYPE:
30*ba677afaSXin Li			// cardinality: exactly 1
31*ba677afaSXin Li			err = setAnnotationType(subTriple.Object.ID, ann)
32*ba677afaSXin Li		case RDF_TYPE:
33*ba677afaSXin Li			// cardinality: exactly 1
34*ba677afaSXin Li			continue
35*ba677afaSXin Li		default:
36*ba677afaSXin Li			err = fmt.Errorf("unknown predicate %s while parsing annotation", subTriple.Predicate.ID)
37*ba677afaSXin Li		}
38*ba677afaSXin Li		if err != nil {
39*ba677afaSXin Li			return err
40*ba677afaSXin Li		}
41*ba677afaSXin Li	}
42*ba677afaSXin Li	return setAnnotationToParser(parser, ann)
43*ba677afaSXin Li}
44*ba677afaSXin Li
45*ba677afaSXin Lifunc setAnnotationToParser(parser *rdfParser2_3, annotation *v2_3.Annotation) error {
46*ba677afaSXin Li	if parser.doc == nil {
47*ba677afaSXin Li		return errors.New("uninitialized spdx document")
48*ba677afaSXin Li	}
49*ba677afaSXin Li	if parser.doc.Annotations == nil {
50*ba677afaSXin Li		parser.doc.Annotations = []*v2_3.Annotation{}
51*ba677afaSXin Li	}
52*ba677afaSXin Li	parser.doc.Annotations = append(parser.doc.Annotations, annotation)
53*ba677afaSXin Li	return nil
54*ba677afaSXin Li}
55*ba677afaSXin Li
56*ba677afaSXin Li// annotator is of type [Person|Organization|Tool]:String
57*ba677afaSXin Lifunc setAnnotatorFromString(annotatorString string, ann *v2_3.Annotation) error {
58*ba677afaSXin Li	subkey, subvalue, err := ExtractSubs(annotatorString, ":")
59*ba677afaSXin Li	if err != nil {
60*ba677afaSXin Li		return err
61*ba677afaSXin Li	}
62*ba677afaSXin Li	if subkey == "Person" || subkey == "Organization" || subkey == "Tool" {
63*ba677afaSXin Li		ann.Annotator.AnnotatorType = subkey
64*ba677afaSXin Li		ann.Annotator.Annotator = subvalue
65*ba677afaSXin Li		return nil
66*ba677afaSXin Li	}
67*ba677afaSXin Li	return fmt.Errorf("unrecognized Annotator type %v while parsing annotation", subkey)
68*ba677afaSXin Li}
69*ba677afaSXin Li
70*ba677afaSXin Li// it can be NS_SPDX+annotationType_[review|other]
71*ba677afaSXin Lifunc setAnnotationType(annType string, ann *v2_3.Annotation) error {
72*ba677afaSXin Li	switch annType {
73*ba677afaSXin Li	case SPDX_ANNOTATION_TYPE_OTHER:
74*ba677afaSXin Li		ann.AnnotationType = "OTHER"
75*ba677afaSXin Li	case SPDX_ANNOTATION_TYPE_REVIEW:
76*ba677afaSXin Li		ann.AnnotationType = "REVIEW"
77*ba677afaSXin Li	default:
78*ba677afaSXin Li		return fmt.Errorf("unknown annotation type %s", annType)
79*ba677afaSXin Li	}
80*ba677afaSXin Li	return nil
81*ba677afaSXin Li}
82