SLCORE-2061 SLCORE-2062 [WIP] On-demand analyzers.#1888
Draft
Krosovok wants to merge 7 commits intofeature/on-demand-analyzersfrom
Draft
SLCORE-2061 SLCORE-2062 [WIP] On-demand analyzers.#1888Krosovok wants to merge 7 commits intofeature/on-demand-analyzersfrom
Krosovok wants to merge 7 commits intofeature/on-demand-analyzersfrom
Conversation
44913be to
100a222
Compare
There was a problem hiding this comment.
Pull request overview
Adds an on-demand fallback mechanism for analyzers (notably CFamily and C#/VB.NET), refactoring plugin/artifact resolution into a centralized PluginArtifactProvider that can resolve from connected sync, IDE-embedded artifacts, or on-demand downloads (with async status updates via events).
Changes:
- Introduces a resolver chain (
PluginArtifactProvider+ individual resolvers) and new plugin status/event model to support async downloads and clearer “source/state” reporting. - Adds on-demand download support with PGP signature verification, cache management, and build-time provisioning of signatures/versions.
- Updates synchronization and analysis scheduling/readiness to react to plugin availability changes (including reload/evict of related caches).
Reviewed changes
Copilot reviewed 63 out of 65 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| pom.xml | Adds versions for on-demand analyzers + BouncyCastle deps. |
| backend/core/pom.xml | Adds BouncyCastle deps + resource filtering + signature download plugin executions. |
| backend/core/src/main/resources/ondemand-plugins.properties | Adds filtered properties for on-demand artifact versions. |
| backend/core/src/main/resources/sonarsource-public.key | Adds the production SonarSource PGP public key used for verification. |
| backend/commons/src/main/java/org/sonarsource/sonarlint/core/commons/api/SonarLanguage.java | Adjusts IaC-related plugin keys and adds ALL_PLUGIN_KEYS. |
| backend/server-connection/src/main/java/org/sonarsource/sonarlint/core/serverconnection/LocalStorageSynchronizer.java | Removes old plugin sync from local storage synchronizer summary. |
| backend/server-connection/src/main/java/org/sonarsource/sonarlint/core/serverconnection/storage/PluginsStorage.java | Ensures plugin directory exists before cleanup. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/sync/SynchronizationService.java | Switches to PluginArtifactProvider.syncConnectionPlugins and always publishes sync event via provider. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/spring/SonarLintSpringAppConfig.java | Registers PluginsConfig. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/spring/PluginsConfig.java | Wires resolver beans and on-demand artifact mapping + executor. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/ArtifactState.java | Renames state enum to ArtifactState. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/AnalyzerArtifacts.java | Introduces container for plugin jar + extra artifacts + status. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/ResolvedArtifact.java | Replaces old sync summary with ResolvedArtifact record. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/PluginStatus.java | Switches to language-based status + includes on-disk path. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/PluginStatusMapper.java | Maps ArtifactState to RPC DTO state. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/PluginJarUtils.java | Adds helper to read plugin versions from jars. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/PluginsRepository.java | Adds embedded unload helper. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/PluginsService.java | Refactors plugin loading/statuses around PluginArtifactProvider; adds embedded unload/evict flow. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/PluginLifecycleService.java | Adds embedded reload/unload methods and evicts rules/active-rules caches. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/DotnetSupport.java | Adds omnisharp artifact paths propagation. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/ServerPluginsCache.java | Adds caching for /api/plugins/installed results + invalidation hooks. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/PluginArtifactProvider.java | New central resolver chain + sync logic + cache/event updates. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/resolvers/package-info.java | Adds non-null-by-default package annotation. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/resolvers/ArtifactResolver.java | Defines sync/async resolver API. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/resolvers/ConnectedModeArtifactResolver.java | New connected-mode resolver with sync + async download paths. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/resolvers/EmbeddedArtifactResolver.java | New embedded resolver for standalone/connected embedded plugin paths. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/resolvers/ExtraArtifactResolver.java | Defines extra artifact resolution API. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/resolvers/EmbeddedExtraArtifactResolver.java | Resolves omnisharp distribution paths from initialize params. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/resolvers/PremiumArtifactResolver.java | Emits PREMIUM for connected-only languages. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/resolvers/UnsupportedArtifactResolver.java | Emits UNSUPPORTED when language not enabled for the given mode. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/ondemand/DownloadableArtifact.java | Defines downloadable artifacts + versions/properties lookup. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/ondemand/OnDemandArtifactResolver.java | Implements on-demand download, signature verification, caching, events. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/ondemand/OnDemandPluginSignatureVerifier.java | Adds PGP signature verification using bundled key + signatures. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/ondemand/OnDemandPluginCacheManager.java | Adds LRU-ish cleanup of old cached versions. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/event/PluginStatusChangedEvent.java | Expands event to include connectionId + collection of statuses. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/languages/LanguageSupportRepository.java | Refactors enabled-language storage + adds isEnabledIn*Mode helpers. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/repository/rules/RulesRepository.java | Adds embedded rules eviction method. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/active/rules/ActiveRulesService.java | Adds standalone active-rules eviction method. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/analysis/AnalysisSchedulerCache.java | Refactors dotnet extra properties and adds reload hooks for standalone/all connections. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/analysis/AnalysisService.java | Listens to plugin status changes, triggers reload/check readiness, and re-checks readiness during scheduling. |
| backend/core/src/main/java/org/sonarsource/sonarlint/core/SonarQubeClientManager.java | Adds “connection gone” guards before client retrieval. |
| backend/server-connection/src/main/java/org/sonarsource/sonarlint/core/serverconnection/PluginsSynchronizer.java | Removes old synchronizer (logic moved/replaced by provider + resolvers). |
| backend/server-connection/src/test/java/org/sonarsource/sonarlint/core/serverconnection/PluginsSynchronizerTests.java | Removes tests for deleted synchronizer. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/ConnectedModeArtifactResolverTest.java | Adds unit tests for connected-mode resolver behavior. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/EmbeddedArtifactResolverTest.java | Adds unit tests for embedded resolver behavior. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/EmbeddedExtraArtifactResolverTest.java | Adds unit tests for extra (omnisharp) embedded paths. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/PremiumArtifactResolverTest.java | Adds unit tests for PREMIUM behavior. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/UnsupportedArtifactResolverTest.java | Adds unit tests for UNSUPPORTED behavior. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/ServerPluginsCacheTest.java | Adds unit tests for server plugins caching/invalidation. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/PluginArtifactProviderTest.java | Adds unit tests for provider resolution/cache/ready checks. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/PluginsServiceTest.java | Updates tests to reflect provider-based resolution. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/DotnetSupportTest.java | Updates construction to pass omnisharp artifacts map. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/ondemand/OnDemandArtifactResolverTest.java | Adds unit tests for on-demand sync/async behavior and events. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/ondemand/OnDemandPluginCacheManagerTest.java | Adds tests for cache cleanup logic. |
| backend/core/src/test/java/org/sonarsource/sonarlint/core/plugin/ondemand/OnDemandPluginSignatureVerifierTest.java | Adds tests for signature verification behavior. |
| backend/core/src/test/resources/sonarsource-public.key | Adds test key used for signature verification tests. |
| backend/core/src/test/resources/sonar-cpp-plugin.jar.asc | Adds test signature. |
| backend/core/src/test/resources/sonar-cpp-plugin-test.jar | Adds test jar bytes. |
| medium-tests/src/test/java/mediumtest/plugin/OnDemandMediumTests.java | Adds medium tests covering on-demand download/cache/error cases. |
| medium-tests/src/test/java/mediumtest/plugin/PluginRpcServiceMediumTests.java | Updates plugin status expectations (actual versions, FAILED vs UNSUPPORTED). |
| medium-tests/src/test/java/mediumtest/synchronization/ConnectionSyncMediumTests.java | Updates expected invalid-token renotify count. |
| medium-tests/src/test/java/mediumtest/analysis/AnalysisMediumTests.java | Clears logs due to unconditional plugin sync event. |
| medium-tests/src/test/resources/sonarsource-public.key | Adds test key for medium tests. |
| medium-tests/src/test/resources/sonar-cpp-plugin.jar.asc | Adds test signature for medium tests. |
| medium-tests/src/test/resources/sonar-cpp-plugin-test.jar | Adds test jar bytes for medium tests. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
...e/src/main/java/org/sonarsource/sonarlint/core/plugin/ondemand/OnDemandArtifactResolver.java
Show resolved
Hide resolved
...e/src/main/java/org/sonarsource/sonarlint/core/plugin/ondemand/OnDemandArtifactResolver.java
Show resolved
Hide resolved
...e/src/main/java/org/sonarsource/sonarlint/core/plugin/ondemand/OnDemandArtifactResolver.java
Show resolved
Hide resolved
backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/PluginArtifactProvider.java
Outdated
Show resolved
Hide resolved
backend/core/src/main/java/org/sonarsource/sonarlint/core/plugin/PluginArtifactProvider.java
Outdated
Show resolved
Hide resolved
|
3ea63af to
2df3632
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.




Adding on-demand fallback for CFamily and C# analyzers. If they are not provided by the IDE, they will be downloaded from binaries.
I moved good chunk of plugin resolution logic to a new
PluginArtifactProviderthat contains a chain of resolution for plugins. It handles:Connected mode - synchronized with SQS/SQC,
Embedded - provided by IDE,
On-demand - download from binaries when supported
This way we clearly know where the plugin came from (or why is it not active). Download happens asynchronously and then status is updated with events.
What is WIP: ANSIBLE/GITHUBACTIONS status is tricky to figure out as they are either iac or iacenterprise depending on server version.
What I want to do separately:
overriddenVersionfield - for now it's always empty