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