diff options
Diffstat (limited to 'rdfloader/parser2v3/parse_annotation.go')
-rw-r--r-- | rdfloader/parser2v3/parse_annotation.go | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/rdfloader/parser2v3/parse_annotation.go b/rdfloader/parser2v3/parse_annotation.go new file mode 100644 index 0000000..507158a --- /dev/null +++ b/rdfloader/parser2v3/parse_annotation.go @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + +package parser2v3 + +import ( + "errors" + "fmt" + + gordfParser "github.com/spdx/gordf/rdfloader/parser" + "github.com/spdx/tools-golang/spdx/v2_3" +) + +// creates a new instance of annotation and sets the annotation attributes +// associated with the given node. +// The newly created annotation is appended to the doc. +func (parser *rdfParser2_3) parseAnnotationFromNode(node *gordfParser.Node) (err error) { + ann := &v2_3.Annotation{} + for _, subTriple := range parser.nodeToTriples(node) { + switch subTriple.Predicate.ID { + case SPDX_ANNOTATOR: + // cardinality: exactly 1 + err = setAnnotatorFromString(subTriple.Object.ID, ann) + case SPDX_ANNOTATION_DATE: + // cardinality: exactly 1 + ann.AnnotationDate = subTriple.Object.ID + case RDFS_COMMENT: + // cardinality: exactly 1 + ann.AnnotationComment = subTriple.Object.ID + case SPDX_ANNOTATION_TYPE: + // cardinality: exactly 1 + err = setAnnotationType(subTriple.Object.ID, ann) + case RDF_TYPE: + // cardinality: exactly 1 + continue + default: + err = fmt.Errorf("unknown predicate %s while parsing annotation", subTriple.Predicate.ID) + } + if err != nil { + return err + } + } + return setAnnotationToParser(parser, ann) +} + +func setAnnotationToParser(parser *rdfParser2_3, annotation *v2_3.Annotation) error { + if parser.doc == nil { + return errors.New("uninitialized spdx document") + } + if parser.doc.Annotations == nil { + parser.doc.Annotations = []*v2_3.Annotation{} + } + parser.doc.Annotations = append(parser.doc.Annotations, annotation) + return nil +} + +// annotator is of type [Person|Organization|Tool]:String +func setAnnotatorFromString(annotatorString string, ann *v2_3.Annotation) error { + subkey, subvalue, err := ExtractSubs(annotatorString, ":") + if err != nil { + return err + } + if subkey == "Person" || subkey == "Organization" || subkey == "Tool" { + ann.Annotator.AnnotatorType = subkey + ann.Annotator.Annotator = subvalue + return nil + } + return fmt.Errorf("unrecognized Annotator type %v while parsing annotation", subkey) +} + +// it can be NS_SPDX+annotationType_[review|other] +func setAnnotationType(annType string, ann *v2_3.Annotation) error { + switch annType { + case SPDX_ANNOTATION_TYPE_OTHER: + ann.AnnotationType = "OTHER" + case SPDX_ANNOTATION_TYPE_REVIEW: + ann.AnnotationType = "REVIEW" + default: + return fmt.Errorf("unknown annotation type %s", annType) + } + return nil +} |