82 lines
2.4 KiB
Go
82 lines
2.4 KiB
Go
// 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
|
|
}
|