mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00
1376 lines
35 KiB
C++
1376 lines
35 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
#include "cmSPDXSerializer.h"
|
|
|
|
#include <new>
|
|
#include <string>
|
|
|
|
#include <cm/optional>
|
|
|
|
#include <cm3p/json/value.h>
|
|
|
|
// Serialization Utilities
|
|
|
|
template <typename T>
|
|
void addVectorSPDXValue(Json::Value& obj, std::string const& key,
|
|
std::vector<T> const& vec)
|
|
{
|
|
auto& list = obj[key];
|
|
list = Json::Value(Json::arrayValue);
|
|
for (auto const& val : vec) {
|
|
list.append(val.toJsonLD());
|
|
}
|
|
}
|
|
|
|
template <>
|
|
void addVectorSPDXValue(Json::Value& obj, std::string const& key,
|
|
std::vector<std::string> const& vec)
|
|
{
|
|
auto& list = obj[key];
|
|
list = Json::Value(Json::arrayValue);
|
|
for (auto const& val : vec) {
|
|
list.append(val);
|
|
}
|
|
}
|
|
|
|
template <typename T>
|
|
void addOptionalSPDXValue(Json::Value& obj, std::string const& key,
|
|
cm::optional<std::vector<T>> const& opt)
|
|
{
|
|
if (opt) {
|
|
addVectorSPDXValue(obj, key, *opt);
|
|
}
|
|
}
|
|
|
|
template <typename T>
|
|
void addOptionalSPDXValue(Json::Value& obj, std::string const& key,
|
|
cm::optional<T> const& opt)
|
|
{
|
|
if (opt) {
|
|
obj[key] = opt->toJsonLD();
|
|
}
|
|
}
|
|
|
|
template <>
|
|
void addOptionalSPDXValue(Json::Value& obj, std::string const& key,
|
|
cm::optional<std::string> const& opt)
|
|
{
|
|
if (opt) {
|
|
obj[key] = *opt;
|
|
}
|
|
}
|
|
|
|
// Base Class
|
|
|
|
cmSPDXSerializationBase::SPDXTypeId cmSPDXSerializationBase::getTypeId() const
|
|
{
|
|
return TypeId;
|
|
}
|
|
|
|
cmSPDXSerializationBase::cmSPDXSerializationBase(SPDXTypeId id)
|
|
: TypeId(id)
|
|
{
|
|
}
|
|
|
|
cmSPDXSerializationBase::cmSPDXSerializationBase(SPDXTypeId id,
|
|
std::string nodeId)
|
|
: NodeId(std::move(nodeId))
|
|
, TypeId(id)
|
|
{
|
|
}
|
|
|
|
// Convenience Classes
|
|
|
|
cmSPDXIdentifierReference::cmSPDXIdentifierReference()
|
|
: cmSPDXSerializationBase(CM_IDENTIFIER_REFERENCE)
|
|
{
|
|
}
|
|
cmSPDXIdentifierReference::cmSPDXIdentifierReference(
|
|
cmSPDXSerializationBase const& ref)
|
|
: cmSPDXSerializationBase(CM_IDENTIFIER_REFERENCE, ref.NodeId)
|
|
{
|
|
}
|
|
cmSPDXIdentifierReference::cmSPDXIdentifierReference(std::string const& ref)
|
|
: cmSPDXSerializationBase(CM_IDENTIFIER_REFERENCE, ref)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXIdentifierReference::toJsonLD() const
|
|
{
|
|
return NodeId;
|
|
}
|
|
|
|
cmSPDXNonElementBase::cmSPDXNonElementBase(SPDXTypeId id)
|
|
: cmSPDXSerializationBase(id)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXNonElementBase::toJsonLD() const
|
|
{
|
|
Json::Value obj(Json::objectValue);
|
|
obj["@id"] = NodeId;
|
|
return obj;
|
|
}
|
|
|
|
// SPDX Core Enums
|
|
|
|
cmSPDXAnnotationType::cmSPDXAnnotationType(cmSPDXAnnotationTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXAnnotationType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case OTHER:
|
|
return "other";
|
|
case REVIEW:
|
|
return "review";
|
|
default:
|
|
return "INVALID_ANNOTATION_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXExternalIdentifierType::cmSPDXExternalIdentifierType(
|
|
cmSPDXExternalIdentifierTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXExternalIdentifierType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case CPE22:
|
|
return "cpe22";
|
|
case CPE23:
|
|
return "cpe23";
|
|
case CVE:
|
|
return "cve";
|
|
case EMAIL:
|
|
return "email";
|
|
case GITOID:
|
|
return "gitoid";
|
|
case OTHER:
|
|
return "other";
|
|
case PACKAGE_URL:
|
|
return "packageUrl";
|
|
case SECURITY_OTHER:
|
|
return "securityOther";
|
|
case SWHID:
|
|
return "swhid";
|
|
case SWID:
|
|
return "swid";
|
|
case URL_SCHEME:
|
|
return "urlScheme";
|
|
default:
|
|
return "INVALID_EXTERNAL_IDENTIFIER_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXExternalRefType::cmSPDXExternalRefType(cmSPDXExternalRefTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXExternalRefType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case ALT_DOWNLOAD_LOCATION:
|
|
return "altDownloadLocation:";
|
|
case ALT_WEB_PAGE:
|
|
return "altWebPage";
|
|
case BINARY_ARTIFACT:
|
|
return "binaryArtifact";
|
|
case BOWER:
|
|
return "bower";
|
|
case BUILD_META:
|
|
return "buildMeta";
|
|
case BUILD_SYSTEM:
|
|
return "buildSystem";
|
|
case CERTIFICATION_REPORT:
|
|
return "certificationReport";
|
|
case CHAT:
|
|
return "chat";
|
|
case COMPONENT_ANALYSIS_REPORT:
|
|
return "componentAnalysisReport";
|
|
case CWE:
|
|
return "cwe";
|
|
case DOCUMENTATION:
|
|
return "documentation";
|
|
case DYNAMIC_ANALYSIS_REPORT:
|
|
return "dynamicAnalysisReport";
|
|
case EOL_NOTICE:
|
|
return "eolNotice";
|
|
case EXPORT_CONTROL_ASSESSMENT:
|
|
return "exportControlAssessment";
|
|
case FUNDING:
|
|
return "funding";
|
|
case ISSUE_TRACKER:
|
|
return "issueTracker";
|
|
case LICENSE:
|
|
return "license";
|
|
case MAILING_LIST:
|
|
return "mailingList";
|
|
case MAVEN_CENTRAL:
|
|
return "mavenCentral";
|
|
case METRICS:
|
|
return "metrics";
|
|
case NPM:
|
|
return "npm";
|
|
case NUGET:
|
|
return "nuget";
|
|
case OTHER:
|
|
return "other";
|
|
case PRIVACY_ASSESSMENT:
|
|
return "privacyAssessment";
|
|
case PRODUCT_METADATA:
|
|
return "productMetadata";
|
|
case PURCHASE_ORDER:
|
|
return "purchaseOrder";
|
|
case QUALITY_ASSESSMENT_REPORT:
|
|
return "qualityAssessmentReport";
|
|
case RELEASE_HISTORY:
|
|
return "releaseHistory";
|
|
case RELEASE_NOTES:
|
|
return "releaseNotes";
|
|
case RISK_ASSESSMENT:
|
|
return "riskAssessment";
|
|
case RUNTIME_ANALYSIS_REPORT:
|
|
return "runtimeAnalysisReport";
|
|
case SECURE_SOFTWARE_ATTESTATION:
|
|
return "secureSoftwareAttestation";
|
|
case SECURITY_ADVERSARY_MODEL:
|
|
return "securityAdversaryModel";
|
|
case SECURITY_ADVISORY:
|
|
return "securityAdvisory";
|
|
case SECURITY_FIX:
|
|
return "securityFix";
|
|
case SECURITY_OTHER:
|
|
return "securityOther";
|
|
case SECURITY_PEN_TEST_REPORT:
|
|
return "securityPenTestReport";
|
|
case SECURITY_POLICY:
|
|
return "securityPolicy";
|
|
case SECURITY_THREAT_MODEL:
|
|
return "securityThreatModel";
|
|
case SOCIAL_MEDIA:
|
|
return "socialMedia";
|
|
case SOURCE_ARTIFACT:
|
|
return "sourceArtifact";
|
|
case STATIC_ANALYSIS_REPORT:
|
|
return "staticAnalysisReport";
|
|
case SUPPORT:
|
|
return "support";
|
|
case VCS:
|
|
return "vcs";
|
|
case VULNERABILITY_DISCLOSURE_REPORT:
|
|
return "vulnerabilityDisclosureReport";
|
|
case VULNERABILITY_EXPLOITABILITY_ASSESSMENT:
|
|
return "vulnerabilityExploitabilityAssessment";
|
|
default:
|
|
return "INVALID_EXTERNAL_REF_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXHashAlgorithm::cmSPDXHashAlgorithm(cmSPDXHashAlgorithmId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXHashAlgorithm::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case ADLER32:
|
|
return "adler32";
|
|
case BLAKE2B256:
|
|
return "blake2b256";
|
|
case BLAKE2B384:
|
|
return "blake2b384";
|
|
case BLAKE2B512:
|
|
return "blake2b512";
|
|
case BLAKE3:
|
|
return "blake3";
|
|
case CRYSTALS_DILITHIUM:
|
|
return "crystalsDilithium";
|
|
case CRYSTALS_KYBER:
|
|
return "crystalsLyber";
|
|
case FALCON:
|
|
return "falcon";
|
|
case MD2:
|
|
return "md2";
|
|
case MD4:
|
|
return "md4";
|
|
case MD5:
|
|
return "md5";
|
|
case MD6:
|
|
return "md6";
|
|
case OTHER:
|
|
return "other";
|
|
case SHA1:
|
|
return "sha1";
|
|
case SHA224:
|
|
return "sha224";
|
|
case SHA256:
|
|
return "sha256";
|
|
case SHA384:
|
|
return "sha384";
|
|
case SHA3_224:
|
|
return "sha3_224";
|
|
case SHA3_256:
|
|
return "sha3_256";
|
|
case SHA3_384:
|
|
return "sha3_384";
|
|
case SHA3_512:
|
|
return "sha3_512";
|
|
case SHA512:
|
|
return "sha512";
|
|
default:
|
|
return "INVALID_HASH_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXLifecycleScopeType::cmSPDXLifecycleScopeType(
|
|
cmSPDXLifecycleScopeTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXLifecycleScopeType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case BUILD:
|
|
return "build";
|
|
case DESIGN:
|
|
return "design";
|
|
case DEVELOPMENT:
|
|
return "development";
|
|
case OTHER:
|
|
return "other";
|
|
case RUNTIME:
|
|
return "runtime";
|
|
case TEST:
|
|
return "test";
|
|
default:
|
|
return "INVALID_LIFECYCLE_SCOPE_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXProfileIdentifierType::cmSPDXProfileIdentifierType(
|
|
cmSPDXProfileIdentifierTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXProfileIdentifierType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case AI:
|
|
return "ai";
|
|
case BUILD:
|
|
return "build";
|
|
case CORE:
|
|
return "code";
|
|
case DATASET:
|
|
return "dataset";
|
|
case EXPANDED_LICENSING:
|
|
return "expandedLicensing";
|
|
case EXTENSION:
|
|
return "extension";
|
|
case LITE:
|
|
return "lite";
|
|
case SECURITY:
|
|
return "security";
|
|
case SIMPLE_LICENSING:
|
|
return "simpleLicensing";
|
|
case SOFTWARE:
|
|
return "software";
|
|
default:
|
|
return "INVALID_PROFILE_IDENTIFIER_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXRelationshipCompletenessType::cmSPDXRelationshipCompletenessType(
|
|
cmSPDXRelationshipCompletenessTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXRelationshipCompletenessType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case COMPLETE:
|
|
return "complete";
|
|
case INCOMPLETE:
|
|
return "incomplete";
|
|
case NO_ASSERTION:
|
|
return "noAssertion";
|
|
default:
|
|
return "INVALID_RELATIONSHIP_COMPLETENESS_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXRelationshipType::cmSPDXRelationshipType(cmSPDXRelationshipTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXRelationshipType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case AFFECTS:
|
|
return "affects";
|
|
case AMENDED_BY:
|
|
return "amendedBy";
|
|
case ANCESTOR_OF:
|
|
return "ancestorOf";
|
|
case AVAILABLE_FROM:
|
|
return "availableFrom";
|
|
case CONFIGURES:
|
|
return "configures";
|
|
case CONTAINS:
|
|
return "contains";
|
|
case COORDINATED_BY:
|
|
return "coordinatedBy";
|
|
case COPIED_TO:
|
|
return "copiedTo";
|
|
case DELEGATED_TO:
|
|
return "delegatedTo";
|
|
case DEPENDS_ON:
|
|
return "dependsOn";
|
|
case DESCENDANT_OF:
|
|
return "descendantOf";
|
|
case DESCRIBES:
|
|
return "describes";
|
|
case DOES_NOT_AFFECT:
|
|
return "doesNotAffect";
|
|
case EXPANDS_TO:
|
|
return "expandsTo";
|
|
case EXPLOIT_CREATED_BY:
|
|
return "exploitCreatedBy";
|
|
case FIXED_BY:
|
|
return "fixedBy";
|
|
case FIXED_IN:
|
|
return "fixedIn";
|
|
case FOUND_BY:
|
|
return "foundBy";
|
|
case GENERATES:
|
|
return "generates";
|
|
case HAS_ADDED_FILE:
|
|
return "hasAddedFile";
|
|
case HAS_ASSESSMENT_FOR:
|
|
return "hasAssessmentFor";
|
|
case HAS_ASSOCIATED_VULNERABILITY:
|
|
return "hasAssociatedVulnerability";
|
|
case HAS_CONCLUDED_LICENSE:
|
|
return "hasConcludedLicense";
|
|
case HAS_DATA_FILE:
|
|
return "hasDataFile";
|
|
case HAS_DECLARED_LICENSE:
|
|
return "hasDeclaredLicense";
|
|
case HAS_DELETED_FILE:
|
|
return "hasDeletedFile";
|
|
case HAS_DEPENDENCY_MANIFEST:
|
|
return "hasDependencyManifest";
|
|
case HAS_DISTRIBUTION_ARTIFACT:
|
|
return "hasDistributionArtifact";
|
|
case HAS_DOCUMENTATION:
|
|
return "hasDocumentation";
|
|
case HAS_DYNAMIC_LINK:
|
|
return "hasDynamicLink";
|
|
case HAS_EVIDENCE:
|
|
return "hasEvidence";
|
|
case HAS_EXAMPLE:
|
|
return "hasExample";
|
|
case HAS_HOST:
|
|
return "hasHost";
|
|
case HAS_INPUT:
|
|
return "hasInput";
|
|
case HAS_METADATA:
|
|
return "hasMetadata";
|
|
case HAS_OPTIONAL_COMPONENT:
|
|
return "hasOptionalComponent";
|
|
case HAS_OPTIONAL_DEPENDENCY:
|
|
return "hasOptionalDependency";
|
|
case HAS_OUTPUT:
|
|
return "hasOutput";
|
|
case HAS_PREREQUISITE:
|
|
return "hasPrerequisite";
|
|
case HAS_PROVIDED_DEPENDENCY:
|
|
return "hasProvidedDependency";
|
|
case HAS_REQUIREMENT:
|
|
return "hasRequirement";
|
|
case HAS_SPECIFICATION:
|
|
return "hasSpecification";
|
|
case HAS_STATIC_LINK:
|
|
return "hasStaticLink";
|
|
case HAS_TEST:
|
|
return "hasTest";
|
|
case HAS_TEST_CASE:
|
|
return "hasTestCase";
|
|
case HAS_VARIANT:
|
|
return "hasVariant";
|
|
case INVOKED_BY:
|
|
return "invokedBy";
|
|
case MODIFIED_BY:
|
|
return "modifiedBy";
|
|
case OTHER:
|
|
return "other";
|
|
case PACKAGED_BY:
|
|
return "packagedBy";
|
|
case PATCHED_BY:
|
|
return "patchedBy";
|
|
case PUBLISHED_BY:
|
|
return "publishedBy";
|
|
case REPORTED_BY:
|
|
return "reportedBy";
|
|
case REPUBLISHED_BY:
|
|
return "republishedBy";
|
|
case SERIALIZED_IN_ARTIFACT:
|
|
return "serializedInArtifact";
|
|
case TESTED_ON:
|
|
return "testedOn";
|
|
case TRAINED_ON:
|
|
return "trainedOn";
|
|
case UNDER_INVESTIGATION_FOR:
|
|
return "underInvestigationFor";
|
|
case USES_TOOL:
|
|
return "usesTool";
|
|
default:
|
|
return "INVALID_RELATIONSHIP_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXSupportType::cmSPDXSupportType(cmSPDXSupportTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXSupportType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case DEPLOYED:
|
|
return "deployed";
|
|
case DEVELOPMENT:
|
|
return "development";
|
|
case END_OF_SUPPORT:
|
|
return "endOfSupport";
|
|
case LIMITED_SUPPORT:
|
|
return "limitedSupport";
|
|
case NO_ASSERTION:
|
|
return "noAssertion";
|
|
case NO_SUPPORT:
|
|
return "noSupport";
|
|
case SUPPORT:
|
|
return "support";
|
|
default:
|
|
return "INVALID_SUPPORT_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
// SPDX Core NonElement Classes, Abstract
|
|
|
|
cmSPDXIntegrityMethod::cmSPDXIntegrityMethod(SPDXTypeId id)
|
|
: cmSPDXNonElementBase(id)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXIntegrityMethod::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXNonElementBase::toJsonLD();
|
|
addOptionalSPDXValue(obj, "comment", Comment);
|
|
return obj;
|
|
}
|
|
|
|
// SPDX Core NonElement Classes, Concrete
|
|
|
|
cmSPDXCreationInfo::cmSPDXCreationInfo()
|
|
: cmSPDXNonElementBase(CORE_CREATION_INFO)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXCreationInfo::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXNonElementBase::toJsonLD();
|
|
obj["type"] = "CreationInfo";
|
|
addOptionalSPDXValue(obj, "Comment", Comment);
|
|
obj["created"] = Created;
|
|
addVectorSPDXValue(obj, "createdBy", CreatedBy);
|
|
addOptionalSPDXValue(obj, "createdUsing", CreatedUsing);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXDictionaryEntry::cmSPDXDictionaryEntry()
|
|
: cmSPDXNonElementBase(CORE_DICTIONARY_ENTRY)
|
|
{
|
|
}
|
|
cmSPDXDictionaryEntry::cmSPDXDictionaryEntry(std::string key)
|
|
: cmSPDXNonElementBase(CORE_DICTIONARY_ENTRY)
|
|
, Key(std::move(key))
|
|
{
|
|
}
|
|
cmSPDXDictionaryEntry::cmSPDXDictionaryEntry(std::string key, std::string val)
|
|
: cmSPDXNonElementBase(CORE_DICTIONARY_ENTRY)
|
|
, Key(std::move(key))
|
|
, Value(std::move(val))
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXDictionaryEntry::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXNonElementBase::toJsonLD();
|
|
obj["type"] = "DictionaryEntry";
|
|
obj["key"] = Key;
|
|
addOptionalSPDXValue(obj, "value", Value);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXExternalIdentifier::cmSPDXExternalIdentifier()
|
|
: cmSPDXNonElementBase(CORE_EXTERNAL_IDENTIFIER)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXExternalIdentifier::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXNonElementBase::toJsonLD();
|
|
obj["type"] = "ExternalIdentifier";
|
|
addOptionalSPDXValue(obj, "comment", Comment);
|
|
obj["externalIdentifierType"] = ExternalIdentifierType.toJsonLD();
|
|
obj["identifier"] = Identifier;
|
|
addOptionalSPDXValue(obj, "identifierLocator", IdentifierLocator);
|
|
addOptionalSPDXValue(obj, "issuingAuthority", IssuingAuthority);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXExternalMap::cmSPDXExternalMap()
|
|
: cmSPDXNonElementBase(CORE_EXTERNAL_MAP)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXExternalMap::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXNonElementBase::toJsonLD();
|
|
obj["type"] = "ExternalMap";
|
|
addOptionalSPDXValue(obj, "definingArtifact", DefiningArtifact);
|
|
obj["externalSpdxId"] = ExternalSpdxId;
|
|
addOptionalSPDXValue(obj, "locationHint", LocationHint);
|
|
addOptionalSPDXValue(obj, "integrityMethod", IntegrityMethod);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXExternalRef::cmSPDXExternalRef()
|
|
: cmSPDXNonElementBase(CORE_EXTERNAL_REF)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXExternalRef::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXNonElementBase::toJsonLD();
|
|
obj["type"] = "ExternalRef";
|
|
addOptionalSPDXValue(obj, "comment", Comment);
|
|
addOptionalSPDXValue(obj, "contentType", ContentType);
|
|
addOptionalSPDXValue(obj, "externalRefType", ExternalRefType);
|
|
addOptionalSPDXValue(obj, "locator", Locator);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXHash::cmSPDXHash()
|
|
: cmSPDXIntegrityMethod(CORE_HASH)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXHash::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXIntegrityMethod::toJsonLD();
|
|
obj["type"] = "Hash";
|
|
obj["algorithm"] = Algorithm.toJsonLD();
|
|
obj["hashValue"] = HashValue;
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXNamespaceMap::cmSPDXNamespaceMap()
|
|
: cmSPDXNonElementBase(CORE_NAMESPACE_MAP)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXNamespaceMap::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXNonElementBase::toJsonLD();
|
|
obj["type"] = "NamespaceMap";
|
|
obj["namespace"] = Namespace;
|
|
obj["prefix"] = Namespace;
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXPackageVerificationCode::cmSPDXPackageVerificationCode()
|
|
: cmSPDXIntegrityMethod(CORE_PACKAGE_VERIFICATION_CODE)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXPackageVerificationCode::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXIntegrityMethod::toJsonLD();
|
|
obj["type"] = "PackageVerificationCode";
|
|
obj["algorithm"] = Algorithm.toJsonLD();
|
|
obj["hashValue"] = HashValue;
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXPositiveIntegerRange::cmSPDXPositiveIntegerRange(
|
|
unsigned int beingIntegerRange, unsigned int endIntegerRange)
|
|
: cmSPDXNonElementBase(CORE_POSITIVE_INTEGER_RANGE)
|
|
, BeginIntegerRange(beingIntegerRange)
|
|
, EndIntegerRange(endIntegerRange)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXPositiveIntegerRange::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXNonElementBase::toJsonLD();
|
|
obj["type"] = "PositiveIntegerRange";
|
|
obj["beginIntegerRange"] = BeginIntegerRange;
|
|
obj["endIntegerRange"] = EndIntegerRange;
|
|
return obj;
|
|
}
|
|
|
|
// SPDX Core Element Classes, Abstract
|
|
|
|
cmSPDXElement::cmSPDXElement(SPDXTypeId id,
|
|
cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXSerializationBase(id)
|
|
, CreationInfo(creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXElement::toJsonLD() const
|
|
{
|
|
Json::Value obj(Json::objectValue);
|
|
addOptionalSPDXValue(obj, "comment", Comment);
|
|
obj["creationInfo"] = CreationInfo.toJsonLD();
|
|
addOptionalSPDXValue(obj, "description", Description);
|
|
addOptionalSPDXValue(obj, "extension", Extension);
|
|
addOptionalSPDXValue(obj, "externalIdentifier", ExternalIdentifier);
|
|
addOptionalSPDXValue(obj, "externalRef", ExternalRef);
|
|
addOptionalSPDXValue(obj, "name", Name);
|
|
obj["spdxId"] = NodeId;
|
|
addOptionalSPDXValue(obj, "summary", Summary);
|
|
addOptionalSPDXValue(obj, "verifiedUsing", VerifiedUsing);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXArtifact::cmSPDXArtifact(SPDXTypeId id,
|
|
cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXElement(id, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXArtifact::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXElement::toJsonLD();
|
|
addOptionalSPDXValue(obj, "builtTime", BuiltTime);
|
|
addOptionalSPDXValue(obj, "originateBy", OriginatedBy);
|
|
addOptionalSPDXValue(obj, "releaseTime", ReleaseTime);
|
|
addOptionalSPDXValue(obj, "standardName", StandardName);
|
|
addOptionalSPDXValue(obj, "suppliedBy", SuppliedBy);
|
|
addOptionalSPDXValue(obj, "supportType", SupportType);
|
|
addOptionalSPDXValue(obj, "validUntilTime", ValidUntilTime);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXElementCollection::cmSPDXElementCollection(
|
|
SPDXTypeId id, cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXElement(id, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXElementCollection::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXElement::toJsonLD();
|
|
addOptionalSPDXValue(obj, "element", Element);
|
|
addOptionalSPDXValue(obj, "profileConformance", ProfileConformance);
|
|
addOptionalSPDXValue(obj, "rootElement", RootElement);
|
|
return obj;
|
|
}
|
|
|
|
// SPDX Implicit Core Element Classes, Abstract
|
|
|
|
// Nominally an inheritable class, but adds nothing to Element
|
|
using cmSPDXAgentAbstract = cmSPDXElement;
|
|
|
|
cmSPDXBundleAbstract::cmSPDXBundleAbstract(
|
|
SPDXTypeId id, cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXElementCollection(id, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXBundleAbstract::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXElementCollection::toJsonLD();
|
|
obj["context"] = Context;
|
|
return obj;
|
|
}
|
|
|
|
// Nominally an inheritable class, but adds nothing to Bundle
|
|
using cmSPDXBomAbstract = cmSPDXBundleAbstract;
|
|
|
|
cmSPDXRelationshipAbstract::cmSPDXRelationshipAbstract(
|
|
SPDXTypeId id, cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXElement(id, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXRelationshipAbstract::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXElement::toJsonLD();
|
|
addOptionalSPDXValue(obj, "completeness", Completeness);
|
|
addOptionalSPDXValue(obj, "endTime", EndTime);
|
|
obj["from"] = From.toJsonLD();
|
|
obj["relationshipType"] = RelationshipType.toJsonLD();
|
|
addOptionalSPDXValue(obj, "startTime", StartTime);
|
|
addVectorSPDXValue(obj, "to", To);
|
|
return obj;
|
|
}
|
|
|
|
// SPDX Core Element Classes, Concrete
|
|
|
|
cmSPDXAgent::cmSPDXAgent(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXAgentAbstract(CORE_AGENT, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXAgent::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXAgentAbstract::toJsonLD();
|
|
obj["type"] = "Agent";
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXAnnotation::cmSPDXAnnotation(cmSPDXCreationInfo const& creationInfo,
|
|
cmSPDXIdentifierReference subject)
|
|
: cmSPDXElement(CORE_ANNOTATION, creationInfo)
|
|
, Subject(std::move(subject))
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXAnnotation::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXElement::toJsonLD();
|
|
obj["type"] = "Annotation";
|
|
obj["annotationType"] = AnnotationType.toJsonLD();
|
|
addOptionalSPDXValue(obj, "contentType", ContentType);
|
|
addOptionalSPDXValue(obj, "statement", Statement);
|
|
obj["subject"] = Subject.toJsonLD();
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXBom::cmSPDXBom(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXBomAbstract(CORE_BOM, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXBom::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXBomAbstract::toJsonLD();
|
|
obj["type"] = "Bom";
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXBundle::cmSPDXBundle(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXBundleAbstract(CORE_BUNDLE, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXBundle::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXBundleAbstract::toJsonLD();
|
|
obj["type"] = "Bundle";
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXIndividualElement::cmSPDXIndividualElement(
|
|
cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXElement(CORE_INDIVIDUAL_ELEMENT, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXIndividualElement::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXElement::toJsonLD();
|
|
obj["type"] = "IndividualElement";
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXLifecycleScopedRelationship::cmSPDXLifecycleScopedRelationship(
|
|
cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXRelationshipAbstract(CORE_LIFECYCLE_SCOPED_RELATIONSHIP,
|
|
creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXLifecycleScopedRelationship::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXRelationshipAbstract::toJsonLD();
|
|
obj["type"] = "LifecycleScopedRelationship";
|
|
addOptionalSPDXValue(obj, "scope", Scope);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXOrganization::cmSPDXOrganization(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXAgentAbstract(CORE_ORGANIZATION, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXOrganization::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXAgentAbstract::toJsonLD();
|
|
obj["type"] = "Organization";
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXPerson::cmSPDXPerson(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXAgentAbstract(CORE_PERSON, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXPerson::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXAgentAbstract::toJsonLD();
|
|
obj["type"] = "Person";
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXRelationship::cmSPDXRelationship(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXRelationshipAbstract(CORE_RELATIONSHIP, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXRelationship::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXRelationshipAbstract::toJsonLD();
|
|
obj["type"] = "Relationship";
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXSoftwareAgent::cmSPDXSoftwareAgent(
|
|
cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXAgentAbstract(CORE_SOFTWARE_AGENT, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXSoftwareAgent::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXAgentAbstract::toJsonLD();
|
|
obj["type"] = "SoftwareAgent";
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXSpdxDocument::cmSPDXSpdxDocument(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXElementCollection(CORE_SPDX_DOCUMENT, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXSpdxDocument::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXElementCollection::toJsonLD();
|
|
obj["type"] = "SpdxDocument";
|
|
addOptionalSPDXValue(obj, "dataLicense", DataLicense);
|
|
addOptionalSPDXValue(obj, "externalMap", ExternalMap);
|
|
addOptionalSPDXValue(obj, "namespaceMap", NamespaceMap);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXTool::cmSPDXTool(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXElement(CORE_TOOL, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXTool::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXElement::toJsonLD();
|
|
obj["type"] = "Tool";
|
|
return obj;
|
|
}
|
|
|
|
// SPDX Software Enums
|
|
|
|
cmSPDXContentIdentifierType::cmSPDXContentIdentifierType(
|
|
cmSPDXContentIdentifierTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXContentIdentifierType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case GITOID:
|
|
return "gitoid";
|
|
case SWHID:
|
|
return "swhid";
|
|
default:
|
|
return "INVALID_CONTENT_IDENTIFIER_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXFileKindType::cmSPDXFileKindType(cmSPDXFileKindTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXFileKindType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case DIRECTORY:
|
|
return "directory";
|
|
case FILE:
|
|
return "file";
|
|
default:
|
|
return "INVALID_FILE_KIND_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXSbomType::cmSPDXSbomType(cmSPDXSbomTypeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXSbomType::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case ANALYZED:
|
|
return "analyzed";
|
|
case BUILD:
|
|
return "build";
|
|
case DEPLOYED:
|
|
return "deployed";
|
|
case DESIGN:
|
|
return "design";
|
|
case RUNTIME:
|
|
return "runtime";
|
|
case SOURCE:
|
|
return "source";
|
|
default:
|
|
return "INVALID_SBOM_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXSoftwarePurpose::cmSPDXSoftwarePurpose(cmSPDXSoftwarePurposeId typeId)
|
|
: TypeId(typeId)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXSoftwarePurpose::toJsonLD() const
|
|
{
|
|
switch (TypeId) {
|
|
case APPLICATION:
|
|
return "application";
|
|
case ARCHIVE:
|
|
return "archive";
|
|
case BOM:
|
|
return "bom";
|
|
case CONFIGURATION:
|
|
return "configuration";
|
|
case CONTAINER:
|
|
return "container";
|
|
case DATA:
|
|
return "data";
|
|
case DEVICE:
|
|
return "device";
|
|
case DEVICE_DRIVER:
|
|
return "deviceDriver";
|
|
case DISK_IMAGE:
|
|
return "diskImage";
|
|
case DOCUMENTATION:
|
|
return "documentation";
|
|
case EVIDENCE:
|
|
return "evidence";
|
|
case EXECUTABLE:
|
|
return "executable";
|
|
case FILE:
|
|
return "file";
|
|
case FILESYSTEM_IMAGE:
|
|
return "filesystemImage";
|
|
case FIRMWARE:
|
|
return "firmware";
|
|
case FRAMEWORK:
|
|
return "framework";
|
|
case INSTALL:
|
|
return "install";
|
|
case LIBRARY:
|
|
return "library";
|
|
case MANIFEST:
|
|
return "manifest";
|
|
case MODEL:
|
|
return "model";
|
|
case MODULE:
|
|
return "module";
|
|
case OPERATING_SYSTEM:
|
|
return "operatingSystem";
|
|
case OTHER:
|
|
return "other";
|
|
case PATCH:
|
|
return "patch";
|
|
case PLATFORM:
|
|
return "platform";
|
|
case REQUIREMENT:
|
|
return "requirement";
|
|
case SOURCE:
|
|
return "source";
|
|
case SPECIFICATION:
|
|
return "specification";
|
|
case TEST:
|
|
return "test";
|
|
default:
|
|
return "INVALID_SOFTWARE_PURPOSE_ID";
|
|
}
|
|
}
|
|
|
|
// SPDX Software NonElement Classes, Concrete
|
|
|
|
cmSPDXContentIdentifier::cmSPDXContentIdentifier()
|
|
: cmSPDXIntegrityMethod(SOFTWARE_CONTENT_IDENTIFIER)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXContentIdentifier::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXIntegrityMethod::toJsonLD();
|
|
obj["type"] = "ContentIdentifier";
|
|
obj["contentIdentifierType"] = ContentIdentifierType.toJsonLD();
|
|
obj["contentIdentifierValue"] = ContentIdentifierValue;
|
|
return obj;
|
|
}
|
|
|
|
// SPDX Software Element Classes, Abstract
|
|
|
|
cmSPDXSoftwareArtifact::cmSPDXSoftwareArtifact(
|
|
SPDXTypeId id, cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXArtifact(id, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXSoftwareArtifact::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXArtifact::toJsonLD();
|
|
addOptionalSPDXValue(obj, "additionalPurpose", AdditionalPurpose);
|
|
addOptionalSPDXValue(obj, "attributionText", AttributionText);
|
|
addOptionalSPDXValue(obj, "contentIdentifier", ContentIdentifier);
|
|
addOptionalSPDXValue(obj, "copyrightText", CopyrightText);
|
|
addOptionalSPDXValue(obj, "primaryPurpose", PrimaryPurpose);
|
|
return obj;
|
|
}
|
|
|
|
// SPDX Software Element Classes, Concrete
|
|
|
|
cmSPDXFile::cmSPDXFile(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXSoftwareArtifact(SOFTWARE_FILE, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXFile::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXSoftwareArtifact::toJsonLD();
|
|
obj["type"] = "File";
|
|
addOptionalSPDXValue(obj, "contentType", ContentType);
|
|
addOptionalSPDXValue(obj, "fileKind", FileKind);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXPackage::cmSPDXPackage(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXSoftwareArtifact(SOFTWARE_PACKAGE, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXPackage::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXSoftwareArtifact::toJsonLD();
|
|
obj["type"] = "Package";
|
|
addOptionalSPDXValue(obj, "downloadLocation", DownloadLocation);
|
|
addOptionalSPDXValue(obj, "homePage", HomePage);
|
|
addOptionalSPDXValue(obj, "packageUrl", PackageUrl);
|
|
addOptionalSPDXValue(obj, "packageVersion", PackageVersion);
|
|
addOptionalSPDXValue(obj, "sourceInfo", SourceInfo);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXSbom::cmSPDXSbom(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXBomAbstract(SOFTWARE_SBOM, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXSbom::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXBomAbstract::toJsonLD();
|
|
obj["type"] = "Sbom";
|
|
addOptionalSPDXValue(obj, "sbomType", SbomType);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXSnippet::cmSPDXSnippet(cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXSoftwareArtifact(SOFTWARE_SNIPPET, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXSnippet::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXSoftwareArtifact::toJsonLD();
|
|
obj["type"] = "Snippet";
|
|
addOptionalSPDXValue(obj, "byteRange", ByteRange);
|
|
addOptionalSPDXValue(obj, "lineRange", LineRange);
|
|
obj["snippetFromFile"] = SnippetFromFile.toJsonLD();
|
|
return obj;
|
|
}
|
|
|
|
// SPDX SimpleLicensing Element Classes, Concrete
|
|
|
|
cmSPDXLicenseExpression::cmSPDXLicenseExpression(
|
|
cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXAnyLicenseInfo(SIMPLE_LICENSING_LICENSE_EXPRESSION, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXLicenseExpression::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXAnyLicenseInfo::toJsonLD();
|
|
obj["type"] = "LicenseExpression";
|
|
addOptionalSPDXValue(obj, "customIdToUri", CustomIdToUri);
|
|
obj["licenseExpression"] = LicenseExpression;
|
|
addOptionalSPDXValue(obj, "licenseListVersion", LicenseListVersion);
|
|
return obj;
|
|
}
|
|
|
|
cmSPDXSimpleLicensingText::cmSPDXSimpleLicensingText(
|
|
cmSPDXCreationInfo const& creationInfo)
|
|
: cmSPDXElement(SIMPLE_LICENSING_SIMPLE_LICENSING_TEXT, creationInfo)
|
|
{
|
|
}
|
|
|
|
Json::Value cmSPDXSimpleLicensingText::toJsonLD() const
|
|
{
|
|
auto obj = cmSPDXElement::toJsonLD();
|
|
obj["type"] = "SimpleLicensingText";
|
|
obj["licenseText"] = LicenseText;
|
|
return obj;
|
|
}
|
|
|
|
// Graph Manipulation
|
|
|
|
#define X_SPDX(classtype, enumid, member, camel) \
|
|
template <> \
|
|
cmSPDXSerializationBase::SPDXTypeId cmSPDXGetTypeId<classtype>() \
|
|
{ \
|
|
return cmSPDXSerializationBase::enumid; \
|
|
} \
|
|
\
|
|
template <> \
|
|
std::string cmSPDXGetTypeName<classtype>() \
|
|
{ \
|
|
return #camel; \
|
|
} \
|
|
\
|
|
cmSPDXObject::cmSPDXObject(classtype val) \
|
|
: member(std::move(val)) {}; \
|
|
\
|
|
void cmSPDXObject::get(classtype** ptr) \
|
|
{ \
|
|
*ptr = SerializationBase.getTypeId() == cmSPDXSerializationBase::enumid \
|
|
? &member \
|
|
: nullptr; \
|
|
}
|
|
#include "cmSPDXTypes.def"
|
|
|
|
cmSPDXObject::cmSPDXObject()
|
|
: IdentifierReference("UNINITIALIZED_SPDX_OBJECT")
|
|
{
|
|
}
|
|
|
|
cmSPDXObject::cmSPDXObject(cmSPDXObject const& other)
|
|
{
|
|
switch (other.SerializationBase.getTypeId()) {
|
|
#define X_SPDX(classtype, enumid, member, camel) \
|
|
case cmSPDXSerializationBase::enumid: \
|
|
new (&member) classtype(other.member); \
|
|
break;
|
|
#include "cmSPDXTypes.def"
|
|
default:
|
|
new (&IdentifierReference)
|
|
cmSPDXIdentifierReference("UNINITIALIZED_SPDX_OBJECT");
|
|
}
|
|
}
|
|
|
|
cmSPDXObject::cmSPDXObject(cmSPDXObject&& other) noexcept
|
|
{
|
|
switch (other.SerializationBase.getTypeId()) {
|
|
#define X_SPDX(classtype, enumid, member, camel) \
|
|
case cmSPDXSerializationBase::enumid: \
|
|
new (&member) classtype(std::move(other.member)); \
|
|
break;
|
|
#include "cmSPDXTypes.def"
|
|
default:
|
|
new (&IdentifierReference)
|
|
cmSPDXIdentifierReference("UNINITIALIZED_SPDX_OBJECT");
|
|
}
|
|
}
|
|
|
|
cmSPDXObject& cmSPDXObject::operator=(cmSPDXObject const& other)
|
|
{
|
|
this->~cmSPDXObject();
|
|
new (this) cmSPDXObject(other);
|
|
return *this;
|
|
}
|
|
|
|
cmSPDXObject& cmSPDXObject::operator=(cmSPDXObject&& other) noexcept
|
|
{
|
|
this->~cmSPDXObject();
|
|
new (this) cmSPDXObject(std::move(other));
|
|
return *this;
|
|
}
|
|
|
|
cmSPDXObject::~cmSPDXObject()
|
|
{
|
|
switch (SerializationBase.getTypeId()) {
|
|
#define X_SPDX(classtype, enumid, member, camel) \
|
|
case cmSPDXSerializationBase::enumid: \
|
|
member.~classtype(); \
|
|
break;
|
|
#include "cmSPDXTypes.def"
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
Json::Value cmSPDXObject::toJsonLD() const
|
|
{
|
|
switch (SerializationBase.getTypeId()) {
|
|
#define X_SPDX(classtype, enumid, member, camel) \
|
|
case cmSPDXSerializationBase::enumid: \
|
|
return member.toJsonLD();
|
|
#include "cmSPDXTypes.def"
|
|
default:
|
|
return "INVALID_SPDX_OBJECT_TYPE_ID";
|
|
}
|
|
}
|
|
|
|
cmSPDXSimpleGraph::cmSPDXSimpleGraph(std::string iriBase,
|
|
cmSPDXCreationInfo creationInfo)
|
|
: IRIBase(std::move(iriBase))
|
|
, CreationInfo(&insert<cmSPDXCreationInfo>(std::move(creationInfo)))
|
|
{
|
|
}
|
|
|
|
cmSPDXCreationInfo& cmSPDXSimpleGraph::getCreationInfo()
|
|
{
|
|
return *CreationInfo;
|
|
}
|
|
|
|
Json::Value cmSPDXSimpleGraph::toJsonLD()
|
|
{
|
|
Json::Value obj(Json::objectValue);
|
|
obj["@context"] = "https://spdx.org/rdf/3.0.1/spdx-context.jsonld";
|
|
|
|
auto& graph = obj["@graph"];
|
|
for (auto const& it : Graph) {
|
|
graph.append(it.second.toJsonLD());
|
|
}
|
|
|
|
return obj;
|
|
}
|