aboutsummaryrefslogtreecommitdiff
path: root/rdfloader/parser2v2/parse_file.go
diff options
context:
space:
mode:
Diffstat (limited to 'rdfloader/parser2v2/parse_file.go')
-rw-r--r--rdfloader/parser2v2/parse_file.go60
1 files changed, 48 insertions, 12 deletions
diff --git a/rdfloader/parser2v2/parse_file.go b/rdfloader/parser2v2/parse_file.go
index c91db64..a080808 100644
--- a/rdfloader/parser2v2/parse_file.go
+++ b/rdfloader/parser2v2/parse_file.go
@@ -13,7 +13,7 @@ import (
func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *spdx.File2_2, err error) {
file = &spdx.File2_2{}
- err = setFileIdentifier(fileNode.ID, file, parser) // 4.2
+ err = setFileIdentifier(fileNode.ID, file) // 4.2
if err != nil {
return nil, err
}
@@ -25,7 +25,7 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s
file.FileName = subTriple.Object.ID
case SPDX_NAME:
// cardinality: exactly 1
- // todo: check where it will be set in the golang-tools spdx-data-model
+ // TODO: check where it will be set in the golang-tools spdx-data-model
case RDF_TYPE:
// cardinality: exactly 1
case SPDX_FILE_TYPE: // 4.3
@@ -45,16 +45,20 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s
file.LicenseConcluded = anyLicense.ToLicenseString()
case SPDX_LICENSE_INFO_IN_FILE: // 4.6
// cardinality: min 1
- lastPart := getLastPartOfURI(subTriple.Object.ID)
- file.LicenseInfoInFile = append(file.LicenseInfoInFile, lastPart)
+ lic, err := parser.getLicenseInfoInFileFromNode(subTriple.Object)
+ if err != nil {
+ return nil, fmt.Errorf("error parsing licenseInfoInFile: %v", err)
+ }
+ file.LicenseInfoInFile = append(file.LicenseInfoInFile, lic.ToLicenseString())
case SPDX_LICENSE_COMMENTS: // 4.7
// cardinality: max 1
file.LicenseComments = subTriple.Object.ID
+ // TODO: allow copyright text to be of type NOASSERTION
case SPDX_COPYRIGHT_TEXT: // 4.8
// cardinality: exactly 1
file.FileCopyrightText = subTriple.Object.ID
case SPDX_LICENSE_INFO_FROM_FILES:
- // todo: implement it. It is not defined in the tools-golang model.
+ // TODO: implement it. It is not defined in the tools-golang model.
// deprecated artifactOf (see sections 4.9, 4.10, 4.11)
case SPDX_ARTIFACT_OF:
// cardinality: min 0
@@ -66,23 +70,26 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s
file.FileComment = subTriple.Object.ID
case SPDX_NOTICE_TEXT: // 4.13
// cardinality: max 1
- file.FileNotice = subTriple.Object.ID
+ file.FileNotice = getNoticeTextFromNode(subTriple.Object)
case SPDX_FILE_CONTRIBUTOR: // 4.14
// cardinality: min 0
file.FileContributor = append(file.FileContributor, subTriple.Object.ID)
case SPDX_FILE_DEPENDENCY:
// cardinality: min 0
- file, err := parser.getFileFromNode(subTriple.Object)
+ newFile, err := parser.getFileFromNode(subTriple.Object)
if err != nil {
return nil, fmt.Errorf("error setting a file dependency in a file: %v", err)
}
+ file.FileDependencies = append(file.FileDependencies, string(newFile.FileSPDXIdentifier))
parser.files[file.FileSPDXIdentifier] = file
case SPDX_ATTRIBUTION_TEXT:
// cardinality: min 0
file.FileAttributionTexts = append(file.FileAttributionTexts, subTriple.Object.ID)
- case SPDX_ANNOTATION: // unknown section
+ case SPDX_ANNOTATION:
+ // cardinality: min 0
err = parser.parseAnnotationFromNode(subTriple.Object)
- case SPDX_RELATIONSHIP: // unknown section
+ case SPDX_RELATIONSHIP:
+ // cardinality: min 0
err = parser.parseRelationship(subTriple)
default:
return nil, fmt.Errorf("unknown triple predicate id %s", subTriple.Predicate.ID)
@@ -97,7 +104,7 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s
func (parser *rdfParser2_2) setFileChecksumFromNode(file *spdx.File2_2, checksumNode *gordfParser.Node) error {
checksumAlgorithm, checksumValue, err := parser.getChecksumFromNode(checksumNode)
if err != nil {
- return nil
+ return fmt.Errorf("error parsing checksumNode of a file: %v", err)
}
switch checksumAlgorithm {
case "MD5":
@@ -109,7 +116,7 @@ func (parser *rdfParser2_2) setFileChecksumFromNode(file *spdx.File2_2, checksum
case "":
return fmt.Errorf("empty checksum algorithm and value")
default:
- return fmt.Errorf("unknown checksumAlgorithm %s while parsing a file", checksumAlgorithm)
+ return fmt.Errorf("unknown checksumAlgorithm %s for a file", checksumAlgorithm)
}
return nil
}
@@ -135,6 +142,7 @@ func (parser *rdfParser2_2) getArtifactFromNode(node *gordfParser.Node) (*spdx.A
return artifactOf, nil
}
+// TODO: check if the filetype is valid.
func (parser *rdfParser2_2) getFileTypeFromUri(uri string) (string, error) {
// fileType is given as a uri. for example: http://spdx.org/rdf/terms#fileType_text
lastPart := getLastPartOfURI(uri)
@@ -155,7 +163,7 @@ func (parser *rdfParser2_2) setUnpackagedFiles() {
}
}
-func setFileIdentifier(idURI string, file *spdx.File2_2, parser *rdfParser2_2) (err error) {
+func setFileIdentifier(idURI string, file *spdx.File2_2) (err error) {
idURI = strings.TrimSpace(idURI)
uriFragment := getLastPartOfURI(idURI)
file.FileSPDXIdentifier, err = ExtractElementID(uriFragment)
@@ -164,3 +172,31 @@ func setFileIdentifier(idURI string, file *spdx.File2_2, parser *rdfParser2_2) (
}
return nil
}
+
+func getNoticeTextFromNode(node *gordfParser.Node) string {
+ switch node.ID {
+ case SPDX_NOASSERTION_CAPS, SPDX_NOASSERTION_SMALL:
+ return "NOASSERTION"
+ default:
+ return node.ID
+ }
+}
+
+func (parser *rdfParser2_2) getLicenseInfoInFileFromNode(node *gordfParser.Node) (AnyLicenseInfo, error) {
+ // LicenseInfoInFile can either be NONE | NOASSERTION | SimpleLicensingInfo
+ // return type is kept as AnyLicenseInfo because, we can have
+ // either SpecialLicense or SimpleLicensingInfo as the output
+ switch node.ID {
+ case SPDX_NOASSERTION_CAPS, SPDX_NOASSERTION_SMALL:
+ return SpecialLicense{
+ value: NOASSERTION,
+ }, nil
+ case SPDX_NONE_CAPS, SPDX_NONE_SMALL:
+ return SpecialLicense{
+ value: NONE,
+ }, nil
+ }
+
+ // the license must be a SimpleLicense
+ return parser.getSimpleLicensingInfoFromNode(node)
+}