How blackducksoftware/bdio works
Purpose and build
Black Duck I/O (BDIO) is a Java 8+ multi-module library and CLI for producing, consuming, validating, transforming, and storing JSON-LD BOM and scan graphs. The root Gradle build assembles its modules; the normative format is documented under docs/spec/02.Model.txt and docs/spec/04.DocumentFormat.txt.
Core JSON-LD model and streaming API
The bdio2 module defines the primary public data model, document framing/context, and streaming read/write contracts. Applications construct model nodes, associate them with metadata/context, then serialize or consume document entries through reader/writer/emitter abstractions.
• bdio2/src/main/java/com/blackducksoftware/bdio2/BdioDocument.java
• bdio2/src/main/java/com/blackducksoftware/bdio2/BdioReader.java
• bdio2/src/main/java/com/blackducksoftware/bdio2/BdioWriter.java
• bdio2/src/main/java/com/blackducksoftware/bdio2/model/
Context, compatibility, and parsing boundary
BdioContext and bundled JSON-LD contexts define vocabulary/version interpretation. Emitters provide the ingestion boundary for native BDIO streams and legacy BDIO 1.x or scan-container inputs, isolating compatibility conversion from the current model.
• bdio2/src/main/java/com/blackducksoftware/bdio2/BdioContext.java
• bdio2/src/main/java/com/blackducksoftware/bdio2/EmitterFactory.java
• bdio2/src/main/java/com/blackducksoftware/bdio2/LegacyBdio1xEmitter.java
• bdio2/src/main/resources/com/blackducksoftware/bdio2/bdio-context-2.1.jsonld
Reactive document implementations
Two adapter modules expose the core document/JSON-LD processing flow under alternative reactive runtimes. Consumers choose Reactor or RxJava rather than the base streaming interfaces; these are library integrations, not standalone services.
• bdio-reactor/src/main/java/com/blackducksoftware/bdio2/reactor/ReactorBdioDocument.java
• bdio-reactor/src/main/java/com/blackducksoftware/bdio2/reactor/ReactorJsonLdProcessing.java
• bdio-rxjava/src/main/java/com/blackducksoftware/bdio2/rxjava/RxJavaBdioDocument.java
• bdio-rxjava/src/main/java/com/blackducksoftware/bdio2/rxjava/RxJavaJsonLdProcessing.java
TinkerPop graph persistence and normalization
The graph layer maps BDIO JSON-LD documents to Apache TinkerPop graphs, with reader/writer and normalization stages behind a common BlackDuckIo API. Default implementations target in-memory TinkerGraph; SQLG implementations support PostgreSQL-backed graph storage, query optimization, and schema migration.
• bdio-tinkerpop/src/main/java/com/blackducksoftware/bdio2/tinkerpop/BlackDuckIo.java
• bdio-tinkerpop/src/main/java/com/blackducksoftware/bdio2/tinkerpop/spi/DefaultBlackDuckIoReader.java
• bdio-tinkerpop/src/main/java/com/blackducksoftware/bdio2/tinkerpop/sqlg/SqlgBlackDuckIo.java
• bdio-tinkerpop/src/main/java/com/blackducksoftware/bdio2/tinkerpop/sqlg/flyway/SqlgFlywayExecutor.java
Protobuf scan interchange
bdio-protobuf is a separate binary scan-data interchange path. Version-specific readers, writers, validators, and converters operate on typed header/node/chunk APIs, generated from protobuf schemas. Its boundary is distinct from the JSON-LD BDIO 2 graph model.
• bdio-protobuf/src/main/java/com/blackducksoftware/bdio/proto/ProtobufBdioReader.java
• bdio-protobuf/src/main/java/com/blackducksoftware/bdio/proto/impl/ProtobufBdioConverter.java
• bdio-protobuf/src/main/java/com/blackducksoftware/bdio/proto/impl/ProtobufBdioV2Writer.java
• bdio-protobuf/src/main/proto/bdba_scan_nodes_v2.proto
CLI entry point and operational flow
bdio-tool provides the executable entry point, BdioMain, dispatching file and graph operations such as concatenation, filtering, dependency/tree views, JSON-LD conversion, linting, SPDX output, and visualization. It consumes/produces BDIO through the core and graph boundaries rather than hosting a web application.
• bdio-tool/src/main/java/com/blackducksoftware/bdio2/tool/BdioMain.java
• bdio-tool/src/main/java/com/blackducksoftware/bdio2/tool/AbstractFileTool.java
• bdio-tool/src/main/java/com/blackducksoftware/bdio2/tool/AbstractGraphTool.java
• bdio-tool/src/main/java/com/blackducksoftware/bdio2/tool/LintTool.java
Infrastructure and external dependencies
The material runtime is the JVM with Gradle builds. JSON-LD is the interchange representation; Reactor/RxJava are optional processing runtimes; Apache TinkerPop is the graph abstraction. SQLG, Flyway, JDBC, and PostgreSQL comprise the persistent graph path; bdio-tinkerpop-db/Dockerfile supplies the database image used by the documented build/test setup.
Main entry points: BdioDocument.java BdioDocument · BdioReader.java Reader / Writer · BlackDuckIo.java BlackDuckIo · BdioMain.java BdioMain
Components 22
BDIO 2 Core
JSON-LD model, contexts, and streaming contracts.
- BdioDocument · Frames model nodes with metadata and JSON-LD context.
bdio2/src/main/java/com/blackducksoftware/bdio2/BdioDocument.java - BDIO model nodes · Domain nodes used to construct BOM and scan graphs.
- BdioContext · Interprets BDIO vocabulary and versions.
bdio2/src/main/java/com/blackducksoftware/bdio2/BdioContext.java - Bundled JSON-LD context
bdio2/src/main/resources/com/blackducksoftware/bdio2/bdio-context-2.1.jsonld - Reader / Writer · Reads and writes BDIO document entries.
bdio2/src/main/java/com/blackducksoftware/bdio2/BdioReader.java - EmitterFactory · Selects native and compatibility stream emitters.
bdio2/src/main/java/com/blackducksoftware/bdio2/EmitterFactory.java - Legacy BDIO 1.x emitter · Converts legacy BDIO and scan-container input.
bdio2/src/main/java/com/blackducksoftware/bdio2/LegacyBdio1xEmitter.java
Reactive Adapters
Optional Reactor and RxJava integrations.
- Reactor document API · Reactive document and JSON-LD processing for Reactor.
bdio-reactor/src/main/java/com/blackducksoftware/bdio2/reactor/ReactorBdioDocument.java - RxJava document API · Reactive document and JSON-LD processing for RxJava.
bdio-rxjava/src/main/java/com/blackducksoftware/bdio2/rxjava/RxJavaBdioDocument.java
Graph Persistence
TinkerPop mapping, normalization, and SQL-backed storage.
- BlackDuckIo · Common API for BDIO-to-TinkerPop graph operations.
bdio-tinkerpop/src/main/java/com/blackducksoftware/bdio2/tinkerpop/BlackDuckIo.java - Default graph reader · Reads BDIO into normalized TinkerPop graphs.
bdio-tinkerpop/src/main/java/com/blackducksoftware/bdio2/tinkerpop/spi/DefaultBlackDuckIoReader.java - SQLG graph backend · PostgreSQL-backed BlackDuckIo implementation.
bdio-tinkerpop/src/main/java/com/blackducksoftware/bdio2/tinkerpop/sqlg/SqlgBlackDuckIo.java - SQLG Flyway migrations · Migrates persistent graph schema.
bdio-tinkerpop/src/main/java/com/blackducksoftware/bdio2/tinkerpop/sqlg/flyway/SqlgFlywayExecutor.java
Protobuf Interchange
Separate typed binary scan-data path.
- Scan protobuf schema · Defines typed version-2 scan headers, nodes, and chunks.
bdio-protobuf/src/main/proto/bdba_scan_nodes_v2.proto - Protobuf converter · Converts typed protobuf scan data.
bdio-protobuf/src/main/java/com/blackducksoftware/bdio/proto/impl/ProtobufBdioConverter.java - Protobuf reader
bdio-protobuf/src/main/java/com/blackducksoftware/bdio/proto/ProtobufBdioReader.java - Protobuf V2 writer
bdio-protobuf/src/main/java/com/blackducksoftware/bdio/proto/impl/ProtobufBdioV2Writer.java
CLI
Command-line file and graph operations.
- BdioMain · Dispatches file, conversion, lint, graph, and output commands.
bdio-tool/src/main/java/com/blackducksoftware/bdio2/tool/BdioMain.java - File tools · Handles file-oriented BDIO transformations.
bdio-tool/src/main/java/com/blackducksoftware/bdio2/tool/AbstractFileTool.java - Graph tools · Provides dependency, tree, visualization, and graph views.
bdio-tool/src/main/java/com/blackducksoftware/bdio2/tool/AbstractGraphTool.java - LintTool · Validates BDIO input from the command line.
bdio-tool/src/main/java/com/blackducksoftware/bdio2/tool/LintTool.java
Other components
- BDIO format spec · Defines the JSON-LD model and document format.
docs/spec/02.Model.txt
Connections 22
- BDIO format spec → BdioDocument: specifies
- BDIO model nodes → BdioDocument: framed by
- Bundled JSON-LD context → BdioContext: defines vocabulary
- BdioContext → BdioDocument: interprets
- BdioDocument → Reader / Writer: serialized as entries
- EmitterFactory → Reader / Writer: emits input to
- Legacy BDIO 1.x emitter → EmitterFactory: selected for legacy input
- Reactor document API → BdioDocument: adapts
- RxJava document API → BdioDocument: adapts
- Reader / Writer → BlackDuckIo: maps documents through
- BlackDuckIo → Default graph reader: default implementation
- BlackDuckIo → SQLG graph backend: persistent implementation
- SQLG Flyway migrations → SQLG graph backend: migrates schema for
- Scan protobuf schema → Protobuf converter: generates typed API for
- Protobuf reader → Protobuf converter: feeds typed scan data
- Protobuf converter → Protobuf V2 writer: converts before output
- BdioMain → File tools: dispatches
- BdioMain → Graph tools: dispatches
- BdioMain → LintTool: dispatches
- File tools → Reader / Writer: consumes and produces
- Graph tools → BlackDuckIo: uses
- LintTool → Reader / Writer: validates input through