Skip to content

Streamline plugin API#2012

Merged
nscuro merged 1 commit intomainfrom
plugin-api-cleanup
Apr 21, 2026
Merged

Streamline plugin API#2012
nscuro merged 1 commit intomainfrom
plugin-api-cleanup

Conversation

@nscuro
Copy link
Copy Markdown
Member

@nscuro nscuro commented Apr 21, 2026

Description

Streamlines plugin API:

  • Decouples runtime configuration and testing from the ExtensionFactory interface into separate RuntimeConfigurable and Testable interfaces.
  • Replace ExtensionContext with a more generic ServiceRegistry, which will be easier to extend going forward.
  • Improve naming of various classes, e.g. ExtensionKVStore -> KeyValueStore.
  • Updates the extensions REST API to indicate whether a given extension supports runtime configuration or testing.
  • Aligns response of extension list endpoints with others in the API.

Addressed Issue

N/A

Additional Details

Frontend PR: DependencyTrack/hyades-frontend#494

Checklist

  • I have read and understand the contributing guidelines
  • This PR fixes a defect, and I have provided tests to verify that the fix is effective
  • This PR implements an enhancement, and I have provided tests to verify that it works as intended
  • This PR introduces changes to the database model, and I have updated the migration changelog accordingly
  • This PR introduces new or alters existing behavior, and I have updated the documentation accordingly

@nscuro nscuro added this to the 5.7.0 milestone Apr 21, 2026
Copilot AI review requested due to automatic review settings April 21, 2026 17:42
@nscuro nscuro added enhancement New feature or request technical debt labels Apr 21, 2026
@codacy-production
Copy link
Copy Markdown

codacy-production Bot commented Apr 21, 2026

Up to standards ✅

🟢 Issues 3 minor

Results:
3 new issues

Category Results
Documentation 3 minor

View in Codacy

🟢 Metrics 111 complexity

Metric Results
Complexity 111

View in Codacy

🟢 Coverage 98.00% diff coverage

Metric Results
Coverage variation Report missing for 83efdb81
Diff coverage 98.00% diff coverage (70.00%)

View coverage diff in Codacy

Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (83efdb8) Report Missing Report Missing Report Missing
Head commit (e026cda) 43091 36299 84.24%

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#2012) 150 147 98.00%

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

1 Codacy didn't receive coverage data for the commit, or there was an error processing the received data. Check your integration for errors and validate that your coverage setup is correct.

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes. Give us feedback

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR streamlines the plugin API by replacing the monolithic ExtensionContext with a more flexible ServiceRegistry and splitting optional capabilities into dedicated interfaces (RuntimeConfigurable, Testable). It also renames the plugin key/value store abstraction and updates the extensions REST/OpenAPI surface to expose capability flags and align list responses with the API’s pagination shape.

Changes:

  • Replace ExtensionContext/ExtensionHttpContext with ServiceRegistry + MutableServiceRegistry, and move runtime config + testing to RuntimeConfigurable / Testable.
  • Rename ExtensionKVStoreKeyValueStore and update runtime/test implementations and call sites.
  • Update extensions v2 list endpoints + OpenAPI schemas to use items + total, and include configurable/testable flags.

Reviewed changes

Copilot reviewed 99 out of 99 changed files in this pull request and generated 20 comments.

Show a summary per file
File Description
vuln-data-source/osv/src/test/java/org/dependencytrack/vulndatasource/osv/WatermarkManagerTest.java Switch OSV tests to KeyValueStore + MockKeyValueStore.
vuln-data-source/osv/src/test/java/org/dependencytrack/vulndatasource/osv/OsvVulnDataSourceFactoryTest.java Update OSV factory tests to ServiceRegistry init.
vuln-data-source/osv/src/main/java/org/dependencytrack/vulndatasource/osv/WatermarkStore.java Migrate watermark persistence to KeyValueStore.
vuln-data-source/osv/src/main/java/org/dependencytrack/vulndatasource/osv/WatermarkManager.java Update watermark manager factory method signature for KeyValueStore.
vuln-data-source/osv/src/main/java/org/dependencytrack/vulndatasource/osv/OsvVulnDataSourceFactory.java Use ServiceRegistry + RuntimeConfigurable; require ConfigRegistry/KeyValueStore/HttpClient.
vuln-data-source/nvd/src/test/java/org/dependencytrack/vulndatasource/nvd/NvdVulnDataSourceTest.java Update NVD tests to ServiceRegistry init and concrete factory type.
vuln-data-source/nvd/src/test/java/org/dependencytrack/vulndatasource/nvd/NvdVulnDataSourceFactoryTest.java Update NVD factory tests to ServiceRegistry init.
vuln-data-source/nvd/src/main/java/org/dependencytrack/vulndatasource/nvd/WatermarkManager.java Migrate NVD watermarking to KeyValueStore.
vuln-data-source/nvd/src/main/java/org/dependencytrack/vulndatasource/nvd/NvdVulnDataSourceFactory.java Use ServiceRegistry + RuntimeConfigurable + Testable.
vuln-data-source/github/src/test/java/org/dependencytrack/vulndatasource/github/WatermarkManagerTest.java Switch GitHub watermark tests to MockKeyValueStore.
vuln-data-source/github/src/test/java/org/dependencytrack/vulndatasource/github/GitHubVulnDataSourceFactoryTest.java Update GitHub factory tests to ServiceRegistry init.
vuln-data-source/github/src/main/java/org/dependencytrack/vulndatasource/github/WatermarkManager.java Migrate GitHub watermarking to KeyValueStore.
vuln-data-source/github/src/main/java/org/dependencytrack/vulndatasource/github/GitHubVulnDataSourceFactory.java Use ServiceRegistry + RuntimeConfigurable; require services from registry.
vuln-analysis/vuln-db/src/test/java/org/dependencytrack/vulnanalysis/vulndb/VulnDbVulnAnalyzerTest.java Update analyzer tests to build a ServiceRegistry.
vuln-analysis/vuln-db/src/main/java/org/dependencytrack/vulnanalysis/vulndb/VulnDbVulnAnalyzerFactory.java Replace ExtensionHttpContext usage with direct HttpClient from ServiceRegistry.
vuln-analysis/trivy/src/main/java/org/dependencytrack/vulnanalysis/trivy/TrivyVulnAnalyzerFactory.java Use ServiceRegistry + RuntimeConfigurable.
vuln-analysis/snyk/src/test/java/org/dependencytrack/vulnanalysis/snyk/SnykVulnAnalyzerTest.java Update Snyk tests to build a ServiceRegistry.
vuln-analysis/snyk/src/main/java/org/dependencytrack/vulnanalysis/snyk/SnykVulnAnalyzerFactory.java Use ServiceRegistry + RuntimeConfigurable.
vuln-analysis/oss-index/src/test/java/org/dependencytrack/vulnanalysis/ossindex/OssIndexVulnAnalyzerTest.java Update OSS Index tests to build a ServiceRegistry.
vuln-analysis/oss-index/src/test/java/org/dependencytrack/vulnanalysis/ossindex/OssIndexVulnAnalyzerFactoryTest.java Add helper to create a service registry w/ cache + http client for tests.
vuln-analysis/oss-index/src/main/java/org/dependencytrack/vulnanalysis/ossindex/OssIndexVulnAnalyzerFactory.java Use ServiceRegistry + RuntimeConfigurable + Testable.
vuln-analysis/internal/src/test/java/org/dependencytrack/vulnanalysis/internal/InternalVulnAnalyzerTest.java Update internal analyzer tests to ServiceRegistry init.
vuln-analysis/internal/src/main/java/org/dependencytrack/vulnanalysis/internal/InternalVulnAnalyzerFactory.java Use ServiceRegistry + RuntimeConfigurable.
plugin/testing/src/test/java/org/dependencytrack/plugin/testing/MockKeyValueStoreTest.java Move/rename KV store test to plugin.testing package and KeyValueStore.
plugin/testing/src/main/java/org/dependencytrack/plugin/testing/MockKeyValueStore.java Rename/move in-memory KV store to MockKeyValueStore implementing KeyValueStore.
plugin/testing/src/main/java/org/dependencytrack/plugin/testing/AbstractExtensionFactoryTest.java Adjust runtime-config tests to RuntimeConfigurable capability interface.
plugin/runtime/src/test/java/org/dependencytrack/plugin/runtime/PluginManagerTest.java Update runtime tests for KeyValueStore and new PluginManager ctor.
plugin/runtime/src/test/java/org/dependencytrack/plugin/runtime/KeyValueStoreImplTest.java Rename tests to KeyValueStoreImplTest and update types.
plugin/runtime/src/test/java/org/dependencytrack/plugin/runtime/DummyTestExtensionFactory.java Update dummy factory to accept ServiceRegistry.
plugin/runtime/src/main/java/org/dependencytrack/plugin/runtime/PluginManager.java Build/freeze a ServiceRegistry per extension; wire services; handle RuntimeConfigurable.
plugin/runtime/src/main/java/org/dependencytrack/plugin/runtime/KeyValueStoreImpl.java Rename impl from ExtensionKVStoreImpl to KeyValueStoreImpl.
plugin/runtime/src/main/java/org/dependencytrack/plugin/runtime/ExtensionHttpContextImpl.java Remove legacy HTTP context implementation (superseded by ServiceRegistry).
plugin/api/src/test/java/org/dependencytrack/plugin/api/storage/KeyValueStoreTest.java Rename API KV store test class to match KeyValueStore.
plugin/api/src/test/java/org/dependencytrack/plugin/api/MutableServiceRegistryTest.java Add unit tests for MutableServiceRegistry.
plugin/api/src/main/java/org/dependencytrack/plugin/api/storage/KeyValueStore.java Rename API type ExtensionKVStoreKeyValueStore.
plugin/api/src/main/java/org/dependencytrack/plugin/api/storage/CompareAndPutResult.java Update Javadoc references for renamed KV store.
plugin/api/src/main/java/org/dependencytrack/plugin/api/storage/CompareAndDeleteResult.java Update Javadoc references for renamed KV store.
plugin/api/src/main/java/org/dependencytrack/plugin/api/Testable.java Introduce testing capability interface for extensions.
plugin/api/src/main/java/org/dependencytrack/plugin/api/ServiceRegistry.java Introduce registry interface for host-provided services.
plugin/api/src/main/java/org/dependencytrack/plugin/api/RuntimeConfigurable.java Introduce runtime-config capability interface for extensions.
plugin/api/src/main/java/org/dependencytrack/plugin/api/MutableServiceRegistry.java Add mutable builder + freeze mechanism for ServiceRegistry.
plugin/api/src/main/java/org/dependencytrack/plugin/api/ExtensionFactory.java Update init(...) signature; remove runtime-config and test defaults.
plugin/api/src/main/java/org/dependencytrack/plugin/api/ExtensionContext.java Remove legacy context object in favor of ServiceRegistry.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/pypi/PypiPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/nuget/NugetPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/npm/NpmPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/nixpkgs/NixpkgsPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/maven/MavenPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/hex/HexPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/hackage/HackagePackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/gomodules/GoModulesPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/github/GithubPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/gem/GemPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/cpan/CpanPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/composer/ComposerPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/cargo/CargoPackageMetadataResolverTest.java Update resolver tests to ServiceRegistry init.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/PackageMetadataResolverIT.java Update IT harness to build a ServiceRegistry instead of ExtensionContext.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/pypi/PypiPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/nuget/NugetPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/npm/NpmPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/nixpkgs/NixpkgsPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/maven/MavenPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/hex/HexPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/hackage/HackagePackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/gomodules/GoModulesPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/github/GithubPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/gem/GemPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/cpan/CpanPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/composer/ComposerPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/cargo/CargoPackageMetadataResolverFactory.java Switch to ServiceRegistry and require HttpClient/CacheManager.
notification/publishing/src/test/java/org/dependencytrack/notification/publishing/webhook/WebhookNotificationPublisherTest.java Update webhook publisher tests to ServiceRegistry init.
notification/publishing/src/test/java/org/dependencytrack/notification/publishing/email/EmailNotificationPublisherTlsTest.java Update email TLS test to ServiceRegistry init.
notification/publishing/src/test/java/org/dependencytrack/notification/publishing/AbstractNotificationPublisherTest.java Update shared publisher test harness for capability-based runtime config.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/webhook/WebhookNotificationPublisherFactory.java Switch init to ServiceRegistry and require HttpClient.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/webex/WebexNotificationPublisherFactory.java Switch init to ServiceRegistry and require HttpClient.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/slack/SlackNotificationPublisherFactory.java Switch init to ServiceRegistry and require HttpClient.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/msteams/MsTeamsNotificationPublisherFactory.java Switch init to ServiceRegistry and require HttpClient.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/mattermost/MattermostNotificationPublisherFactory.java Switch init to ServiceRegistry and require HttpClient.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/kafka/KafkaNotificationPublisherFactory.java Adopt capability interfaces; init via ServiceRegistry.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/jira/JiraNotificationPublisherFactory.java Switch init to ServiceRegistry and require ConfigRegistry/HttpClient.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/email/EmailNotificationPublisherFactory.java Adopt capability interfaces; init via ServiceRegistry.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/console/ConsoleNotificationPublisherFactory.java Update init signature to ServiceRegistry.
apiserver/src/test/java/org/dependencytrack/vulndatasource/MirrorVulnDataSourceActivityTest.java Update test factories to new init signature; adjust PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/vulnanalysis/VulnAnalysisWorkflowTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/vulnanalysis/PrepareVulnAnalysisActivityTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/vulnanalysis/MockVulnAnalyzerPlugin.java Update mock extension factory init signature.
apiserver/src/test/java/org/dependencytrack/resources/v2/ExtensionsResourceTest.java Update expected JSON (items/total) and capability flags; update init signatures.
apiserver/src/test/java/org/dependencytrack/resources/v1/NotificationRuleResourceTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/resources/v1/NotificationPublisherResourceTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/pkgmetadata/ResolvePackageMetadataWorkflowTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/pkgmetadata/MockPackageMetadataResolverPlugin.java Update mock extension factory init signature.
apiserver/src/test/java/org/dependencytrack/notification/PublishNotificationWorkflowTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/event/EventSubsystemInitializerTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/dex/DexEngineInitializerTest.java Update PluginManager ctor usage.
apiserver/src/main/java/org/dependencytrack/resources/v2/ExtensionsResource.java Align list responses to items/total; expose capability booleans; use Testable/RuntimeConfigurable.
apiserver/src/main/java/org/dependencytrack/plugin/PluginInitializer.java Update PluginManager construction for new signature.
api/src/main/openapi/components/schemas/extensions/list-extensions-response.yaml Align list response shape to paginated schema and items.
api/src/main/openapi/components/schemas/extensions/list-extensions-response-item.yaml Add configurable + testable to response item schema.
api/src/main/openapi/components/schemas/extensions/list-extension-points-response.yaml Align list response shape to paginated schema and items.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@nscuro nscuro force-pushed the plugin-api-cleanup branch from 5ae8c2b to fae0dc9 Compare April 21, 2026 17:56
* Decouples runtime configuration and testing from the ExtensionFactory interface into separate RuntimeConfigurable and Testable interfaces.
* Replace ExtensionContext with a more generic ServiceRegistry, which will be easier to extend going forward.
* Improve naming of various classes, e.g. ExtensionKVStore -> KeyValueStore.
* Updates the extensions REST API to indicate whether a given extension supports runtime configuration or testing.
* Aligns response of extension list endpoints with others in the API.

Signed-off-by: nscuro <nscuro@protonmail.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR streamlines the plugin API by replacing the ExtensionContext with a more extensible ServiceRegistry, splitting optional capabilities (runtime configuration + testing) into RuntimeConfigurable and Testable, and renaming the extension key/value store API to KeyValueStore. It also updates the v2 extensions REST API to expose capability flags and aligns list responses with the API’s paginated response shape.

Changes:

  • Introduce ServiceRegistry / MutableServiceRegistry and migrate factories/tests from ExtensionContext to service lookup via require(...).
  • Split runtime-config + test capabilities out of ExtensionFactory into RuntimeConfigurable and Testable; rename KV store types (ExtensionKVStoreKeyValueStore) and adjust implementations/tests.
  • Update extensions API list responses to use items + total and include configurable/testable flags; update OpenAPI schemas and resource tests accordingly.

Reviewed changes

Copilot reviewed 99 out of 99 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
vuln-data-source/osv/src/test/java/org/dependencytrack/vulndatasource/osv/WatermarkManagerTest.java Switch tests to KeyValueStore + MockKeyValueStore.
vuln-data-source/osv/src/test/java/org/dependencytrack/vulndatasource/osv/OsvVulnDataSourceFactoryTest.java Initialize factory via MutableServiceRegistry and register required services.
vuln-data-source/osv/src/main/java/org/dependencytrack/vulndatasource/osv/WatermarkStore.java Rename store dependency to KeyValueStore.
vuln-data-source/osv/src/main/java/org/dependencytrack/vulndatasource/osv/WatermarkManager.java Update watermark manager factory to accept KeyValueStore.
vuln-data-source/osv/src/main/java/org/dependencytrack/vulndatasource/osv/OsvVulnDataSourceFactory.java Migrate init to ServiceRegistry; implement RuntimeConfigurable.
vuln-data-source/nvd/src/test/java/org/dependencytrack/vulndatasource/nvd/NvdVulnDataSourceTest.java Use MutableServiceRegistry and concrete factory type in tests.
vuln-data-source/nvd/src/test/java/org/dependencytrack/vulndatasource/nvd/NvdVulnDataSourceFactoryTest.java Use MutableServiceRegistry and register dependencies for factory tests.
vuln-data-source/nvd/src/main/java/org/dependencytrack/vulndatasource/nvd/WatermarkManager.java Rename KV dependency to KeyValueStore.
vuln-data-source/nvd/src/main/java/org/dependencytrack/vulndatasource/nvd/NvdVulnDataSourceFactory.java Migrate init to ServiceRegistry; implement RuntimeConfigurable + Testable.
vuln-data-source/github/src/test/java/org/dependencytrack/vulndatasource/github/WatermarkManagerTest.java Switch tests to KeyValueStore + MockKeyValueStore.
vuln-data-source/github/src/test/java/org/dependencytrack/vulndatasource/github/GitHubVulnDataSourceFactoryTest.java Initialize via MutableServiceRegistry and register required services.
vuln-data-source/github/src/main/java/org/dependencytrack/vulndatasource/github/WatermarkManager.java Rename KV dependency to KeyValueStore.
vuln-data-source/github/src/main/java/org/dependencytrack/vulndatasource/github/GitHubVulnDataSourceFactory.java Migrate init to ServiceRegistry; implement RuntimeConfigurable.
vuln-analysis/vuln-db/src/test/java/org/dependencytrack/vulnanalysis/vulndb/VulnDbVulnAnalyzerTest.java Initialize analyzer factory via MutableServiceRegistry.
vuln-analysis/vuln-db/src/main/java/org/dependencytrack/vulnanalysis/vulndb/VulnDbVulnAnalyzerFactory.java Replace ExtensionHttpContext usage with HttpClient from ServiceRegistry.
vuln-analysis/trivy/src/main/java/org/dependencytrack/vulnanalysis/trivy/TrivyVulnAnalyzerFactory.java Migrate init to ServiceRegistry; implement RuntimeConfigurable.
vuln-analysis/snyk/src/test/java/org/dependencytrack/vulnanalysis/snyk/SnykVulnAnalyzerTest.java Initialize analyzer factory via MutableServiceRegistry.
vuln-analysis/snyk/src/main/java/org/dependencytrack/vulnanalysis/snyk/SnykVulnAnalyzerFactory.java Migrate init to ServiceRegistry; implement RuntimeConfigurable.
vuln-analysis/oss-index/src/test/java/org/dependencytrack/vulnanalysis/ossindex/OssIndexVulnAnalyzerTest.java Initialize analyzer factory via MutableServiceRegistry.
vuln-analysis/oss-index/src/test/java/org/dependencytrack/vulnanalysis/ossindex/OssIndexVulnAnalyzerFactoryTest.java Add helper to create service registry including cache + HTTP client.
vuln-analysis/oss-index/src/main/java/org/dependencytrack/vulnanalysis/ossindex/OssIndexVulnAnalyzerFactory.java Migrate init to ServiceRegistry; implement RuntimeConfigurable + Testable.
vuln-analysis/internal/src/test/java/org/dependencytrack/vulnanalysis/internal/InternalVulnAnalyzerTest.java Initialize internal analyzer factory via MutableServiceRegistry.
vuln-analysis/internal/src/main/java/org/dependencytrack/vulnanalysis/internal/InternalVulnAnalyzerFactory.java Migrate init to ServiceRegistry; implement RuntimeConfigurable.
plugin/testing/src/test/java/org/dependencytrack/plugin/testing/MockKeyValueStoreTest.java Move/rename in-memory KV store tests to MockKeyValueStore.
plugin/testing/src/main/java/org/dependencytrack/plugin/testing/MockKeyValueStore.java Provide in-memory KeyValueStore implementation for tests.
plugin/testing/src/main/java/org/dependencytrack/plugin/testing/AbstractExtensionFactoryTest.java Update runtime-config assertions to use RuntimeConfigurable.
plugin/runtime/src/test/java/org/dependencytrack/plugin/runtime/PluginManagerTest.java Update tests for renamed KV store and updated PluginManager ctor.
plugin/runtime/src/test/java/org/dependencytrack/plugin/runtime/KeyValueStoreImplTest.java Rename impl test from ExtensionKVStoreImplTest to KeyValueStoreImplTest.
plugin/runtime/src/test/java/org/dependencytrack/plugin/runtime/DummyTestExtensionFactory.java Update init signature to ServiceRegistry.
plugin/runtime/src/main/java/org/dependencytrack/plugin/runtime/PluginManager.java Build frozen ServiceRegistry for extensions; remove ExtensionHttpContext wiring; rename KV store plumbing.
plugin/runtime/src/main/java/org/dependencytrack/plugin/runtime/KeyValueStoreImpl.java Rename runtime KV store impl class + constructor to KeyValueStoreImpl.
plugin/runtime/src/main/java/org/dependencytrack/plugin/runtime/ExtensionHttpContextImpl.java Remove now-obsolete HTTP context implementation.
plugin/api/src/test/java/org/dependencytrack/plugin/api/storage/KeyValueStoreTest.java Rename and update API tests for KeyValueStore.
plugin/api/src/test/java/org/dependencytrack/plugin/api/MutableServiceRegistryTest.java Add tests for service registration, lookup, freeze behavior.
plugin/api/src/main/java/org/dependencytrack/plugin/api/storage/KeyValueStore.java Rename API interface from ExtensionKVStore to KeyValueStore.
plugin/api/src/main/java/org/dependencytrack/plugin/api/storage/CompareAndPutResult.java Update javadoc references to KeyValueStore.
plugin/api/src/main/java/org/dependencytrack/plugin/api/storage/CompareAndDeleteResult.java Update javadoc references to KeyValueStore.
plugin/api/src/main/java/org/dependencytrack/plugin/api/Testable.java Add capability interface for extension testing.
plugin/api/src/main/java/org/dependencytrack/plugin/api/ServiceRegistry.java Introduce generic service lookup abstraction (get/require).
plugin/api/src/main/java/org/dependencytrack/plugin/api/RuntimeConfigurable.java Add capability interface for runtime configuration via RuntimeConfigSpec.
plugin/api/src/main/java/org/dependencytrack/plugin/api/MutableServiceRegistry.java Add mutable builder + freeze() for registries.
plugin/api/src/main/java/org/dependencytrack/plugin/api/ExtensionFactory.java Update init signature to ServiceRegistry; remove built-in runtime-config and test methods.
plugin/api/src/main/java/org/dependencytrack/plugin/api/ExtensionContext.java Remove now-obsolete extension context wrapper.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/pypi/PypiPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/nuget/NugetPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/npm/NpmPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/nixpkgs/NixpkgsPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/maven/MavenPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/hex/HexPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/hackage/HackagePackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/gomodules/GoModulesPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/github/GithubPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/gem/GemPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/cpan/CpanPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/composer/ComposerPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/cargo/CargoPackageMetadataResolverTest.java Init resolver factory via MutableServiceRegistry and register services.
package-metadata/resolution/src/test/java/org/dependencytrack/pkgmetadata/resolution/PackageMetadataResolverIT.java Use ServiceRegistry instead of ExtensionContext for integration tests.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/pypi/PypiPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/nuget/NugetPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/npm/NpmPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/nixpkgs/NixpkgsPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/maven/MavenPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/hex/HexPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/hackage/HackagePackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/gomodules/GoModulesPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/github/GithubPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/gem/GemPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/cpan/CpanPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/composer/ComposerPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
package-metadata/resolution/src/main/java/org/dependencytrack/pkgmetadata/resolution/cargo/CargoPackageMetadataResolverFactory.java Migrate init to ServiceRegistry; look up HttpClient + CacheManager.
notification/publishing/src/test/java/org/dependencytrack/notification/publishing/webhook/WebhookNotificationPublisherTest.java Initialize publisher factory via MutableServiceRegistry.
notification/publishing/src/test/java/org/dependencytrack/notification/publishing/email/EmailNotificationPublisherTlsTest.java Initialize publisher factory via MutableServiceRegistry.
notification/publishing/src/test/java/org/dependencytrack/notification/publishing/AbstractNotificationPublisherTest.java Use RuntimeConfigurable capability and init via MutableServiceRegistry.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/webhook/WebhookNotificationPublisherFactory.java Migrate init to ServiceRegistry with HttpClient lookup.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/webex/WebexNotificationPublisherFactory.java Migrate init to ServiceRegistry with HttpClient lookup.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/slack/SlackNotificationPublisherFactory.java Migrate init to ServiceRegistry with HttpClient lookup.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/msteams/MsTeamsNotificationPublisherFactory.java Migrate init to ServiceRegistry with HttpClient lookup.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/mattermost/MattermostNotificationPublisherFactory.java Migrate init to ServiceRegistry with HttpClient lookup.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/kafka/KafkaNotificationPublisherFactory.java Implement RuntimeConfigurable + Testable; migrate init to ServiceRegistry.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/jira/JiraNotificationPublisherFactory.java Implement RuntimeConfigurable; migrate init to ServiceRegistry.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/email/EmailNotificationPublisherFactory.java Implement RuntimeConfigurable + Testable; migrate init to ServiceRegistry.
notification/publishing/src/main/java/org/dependencytrack/notification/publishing/console/ConsoleNotificationPublisherFactory.java Update init signature to ServiceRegistry (no services needed).
apiserver/src/test/java/org/dependencytrack/vulndatasource/MirrorVulnDataSourceActivityTest.java Update test factories to new init signature; update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/vulnanalysis/VulnAnalysisWorkflowTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/vulnanalysis/PrepareVulnAnalysisActivityTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/vulnanalysis/MockVulnAnalyzerPlugin.java Update mock factory init signature to ServiceRegistry.
apiserver/src/test/java/org/dependencytrack/resources/v2/ExtensionsResourceTest.java Update expected JSON shape (items/total) + capability flags; update init signatures.
apiserver/src/test/java/org/dependencytrack/resources/v1/NotificationRuleResourceTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/resources/v1/NotificationPublisherResourceTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/pkgmetadata/ResolvePackageMetadataWorkflowTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/pkgmetadata/MockPackageMetadataResolverPlugin.java Update mock factory init signature to ServiceRegistry.
apiserver/src/test/java/org/dependencytrack/notification/PublishNotificationWorkflowTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/event/EventSubsystemInitializerTest.java Update PluginManager ctor usage.
apiserver/src/test/java/org/dependencytrack/dex/DexEngineInitializerTest.java Update PluginManager ctor usage.
apiserver/src/main/java/org/dependencytrack/resources/v2/ExtensionsResource.java Return paginated-style list responses; add capability flags; use RuntimeConfigurable/Testable.
apiserver/src/main/java/org/dependencytrack/plugin/PluginInitializer.java Update PluginManager ctor usage (no separate user-agent arg).
api/src/main/openapi/components/schemas/extensions/list-extensions-response.yaml Align schema with paginated response (items + total).
api/src/main/openapi/components/schemas/extensions/list-extensions-response-item.yaml Add configurable and testable fields.
api/src/main/openapi/components/schemas/extensions/list-extension-points-response.yaml Align schema with paginated response (items + total).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@nscuro nscuro merged commit dd9061d into main Apr 21, 2026
14 of 15 checks passed
@nscuro nscuro deleted the plugin-api-cleanup branch April 21, 2026 18:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request technical debt

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants