blob: 7d221036fb125df65297a6e9db4ee382a610571d [file] [log] [blame] [edit]
/* 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;
}