1// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2 3package parser2v2 4 5import ( 6 "fmt" 7 8 "github.com/spdx/tools-golang/spdx/common" 9 "github.com/spdx/tools-golang/spdx/v2_2" 10) 11 12func (parser *tvParser2_2) parsePairFromFile2_2(tag string, value string) error { 13 // expire fileAOP for anything other than an AOPHomePage or AOPURI 14 // (we'll actually handle the HomePage and URI further below) 15 if tag != "ArtifactOfProjectHomePage" && tag != "ArtifactOfProjectURI" { 16 parser.fileAOP = nil 17 } 18 19 switch tag { 20 // tag for creating new file section 21 case "FileName": 22 // check if the previous file contained an spdx Id or not 23 if parser.file != nil && parser.file.FileSPDXIdentifier == nullSpdxElementId2_2 { 24 return fmt.Errorf("file with FileName %s does not have SPDX identifier", parser.file.FileName) 25 } 26 parser.file = &v2_2.File{} 27 parser.file.FileName = value 28 // tag for creating new package section and going back to parsing Package 29 case "PackageName": 30 parser.st = psPackage2_2 31 // check if the previous file contained an spdx Id or not 32 if parser.file != nil && parser.file.FileSPDXIdentifier == nullSpdxElementId2_2 { 33 return fmt.Errorf("file with FileName %s does not have SPDX identifier", parser.file.FileName) 34 } 35 parser.file = nil 36 return parser.parsePairFromPackage2_2(tag, value) 37 // tag for going on to snippet section 38 case "SnippetSPDXID": 39 parser.st = psSnippet2_2 40 return parser.parsePairFromSnippet2_2(tag, value) 41 // tag for going on to other license section 42 case "LicenseID": 43 parser.st = psOtherLicense2_2 44 return parser.parsePairFromOtherLicense2_2(tag, value) 45 // tags for file data 46 case "SPDXID": 47 eID, err := extractElementID(value) 48 if err != nil { 49 return err 50 } 51 parser.file.FileSPDXIdentifier = eID 52 if parser.pkg == nil { 53 if parser.doc.Files == nil { 54 parser.doc.Files = []*v2_2.File{} 55 } 56 parser.doc.Files = append(parser.doc.Files, parser.file) 57 } else { 58 if parser.pkg.Files == nil { 59 parser.pkg.Files = []*v2_2.File{} 60 } 61 parser.pkg.Files = append(parser.pkg.Files, parser.file) 62 } 63 case "FileType": 64 parser.file.FileTypes = append(parser.file.FileTypes, value) 65 case "FileChecksum": 66 subkey, subvalue, err := extractSubs(value) 67 if err != nil { 68 return err 69 } 70 if parser.file.Checksums == nil { 71 parser.file.Checksums = []common.Checksum{} 72 } 73 switch common.ChecksumAlgorithm(subkey) { 74 case common.SHA1, 75 common.SHA224, 76 common.SHA256, 77 common.SHA384, 78 common.SHA512, 79 common.MD2, 80 common.MD4, 81 common.MD5, 82 common.MD6: 83 algorithm := common.ChecksumAlgorithm(subkey) 84 parser.file.Checksums = append(parser.file.Checksums, common.Checksum{Algorithm: algorithm, Value: subvalue}) 85 default: 86 return fmt.Errorf("got unknown checksum type %s", subkey) 87 } 88 case "LicenseConcluded": 89 parser.file.LicenseConcluded = value 90 case "LicenseInfoInFile": 91 parser.file.LicenseInfoInFiles = append(parser.file.LicenseInfoInFiles, value) 92 case "LicenseComments": 93 parser.file.LicenseComments = value 94 case "FileCopyrightText": 95 parser.file.FileCopyrightText = value 96 case "ArtifactOfProjectName": 97 parser.fileAOP = &v2_2.ArtifactOfProject{} 98 parser.file.ArtifactOfProjects = append(parser.file.ArtifactOfProjects, parser.fileAOP) 99 parser.fileAOP.Name = value 100 case "ArtifactOfProjectHomePage": 101 if parser.fileAOP == nil { 102 return fmt.Errorf("no current ArtifactOfProject found") 103 } 104 parser.fileAOP.HomePage = value 105 case "ArtifactOfProjectURI": 106 if parser.fileAOP == nil { 107 return fmt.Errorf("no current ArtifactOfProject found") 108 } 109 parser.fileAOP.URI = value 110 case "FileComment": 111 parser.file.FileComment = value 112 case "FileNotice": 113 parser.file.FileNotice = value 114 case "FileContributor": 115 parser.file.FileContributors = append(parser.file.FileContributors, value) 116 case "FileDependency": 117 parser.file.FileDependencies = append(parser.file.FileDependencies, value) 118 case "FileAttributionText": 119 parser.file.FileAttributionTexts = append(parser.file.FileAttributionTexts, value) 120 // for relationship tags, pass along but don't change state 121 case "Relationship": 122 parser.rln = &v2_2.Relationship{} 123 parser.doc.Relationships = append(parser.doc.Relationships, parser.rln) 124 return parser.parsePairForRelationship2_2(tag, value) 125 case "RelationshipComment": 126 return parser.parsePairForRelationship2_2(tag, value) 127 // for annotation tags, pass along but don't change state 128 case "Annotator": 129 parser.ann = &v2_2.Annotation{} 130 parser.doc.Annotations = append(parser.doc.Annotations, parser.ann) 131 return parser.parsePairForAnnotation2_2(tag, value) 132 case "AnnotationDate": 133 return parser.parsePairForAnnotation2_2(tag, value) 134 case "AnnotationType": 135 return parser.parsePairForAnnotation2_2(tag, value) 136 case "SPDXREF": 137 return parser.parsePairForAnnotation2_2(tag, value) 138 case "AnnotationComment": 139 return parser.parsePairForAnnotation2_2(tag, value) 140 // tag for going on to review section (DEPRECATED) 141 case "Reviewer": 142 parser.st = psReview2_2 143 return parser.parsePairFromReview2_2(tag, value) 144 default: 145 return fmt.Errorf("received unknown tag %v in File section", tag) 146 } 147 148 return nil 149} 150