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