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