# Copyright (C) 2025 Siemens
#
# SPDX-License-Identifier: MIT
from abc import abstractmethod
from io import IOBase
from pathlib import Path
from ..sbom import SBOMType
from ..util.sbom_processor import SbomProcessor
[docs]
class BomReader(SbomProcessor):
"""Base class for SBOM importers"""
[docs]
@classmethod
def create(cls, filename: Path, bomtype: SBOMType | None = None):
if bomtype is SBOMType.SPDX or filename.name.endswith("spdx.json"):
SBOMType.SPDX.validate_dependency_availability()
from .spdxbomreader import SpdxBomFileReader
reader_cls = SpdxBomFileReader
elif bomtype is SBOMType.CycloneDX or filename.name.endswith("cdx.json"):
SBOMType.CycloneDX.validate_dependency_availability()
from .cdxbomreader import CdxBomFileReader
reader_cls = CdxBomFileReader
else:
raise RuntimeError("SBOM type cannot be detected based on filename")
return reader_cls(filename)
[docs]
@classmethod
def from_stream(cls, stream: IOBase, bomtype: SBOMType):
if bomtype is SBOMType.SPDX:
SBOMType.SPDX.validate_dependency_availability()
from .spdxbomreader import SpdxBomFileReader
reader_cls = SpdxBomFileReader
elif bomtype is SBOMType.CycloneDX:
SBOMType.CycloneDX.validate_dependency_availability()
from .cdxbomreader import CdxBomFileReader
reader_cls = CdxBomFileReader
else:
raise NotImplementedError("Unsupported SBOM type")
return reader_cls(stream)
[docs]
@classmethod
def from_json(cls, json_obj, bomtype: SBOMType):
if bomtype is SBOMType.SPDX:
SBOMType.SPDX.validate_dependency_availability()
from .spdxbomreader import SpdxBomJsonReader
reader_cls = SpdxBomJsonReader
elif bomtype is SBOMType.CycloneDX:
SBOMType.CycloneDX.validate_dependency_availability()
from .cdxbomreader import CdxBomJsonReader
reader_cls = CdxBomJsonReader
else:
raise NotImplementedError("Unsupported SBOM type")
return reader_cls(json_obj)
@abstractmethod
def read(self):
raise NotImplementedError()