Skip to content

SLCORE-2061 SLCORE-2062 [WIP] On-demand analyzers.#1888

Draft
Krosovok wants to merge 7 commits intofeature/on-demand-analyzersfrom
feature/vt/SLCORE-2061-SLCORE-2062-on-demand-analyzers
Draft

SLCORE-2061 SLCORE-2062 [WIP] On-demand analyzers.#1888
Krosovok wants to merge 7 commits intofeature/on-demand-analyzersfrom
feature/vt/SLCORE-2061-SLCORE-2062-on-demand-analyzers

Conversation

@Krosovok
Copy link
Contributor

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 PluginArtifactProvider that 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:

  • retry mechanism
  • overriddenVersion field - for now it's always empty

@hashicorp-vault-sonar-prod
Copy link

hashicorp-vault-sonar-prod bot commented Mar 10, 2026

SLCORE-2061
SLCORE-2062

@Krosovok Krosovok requested a review from nquinquenel March 11, 2026 08:09
@Krosovok Krosovok force-pushed the feature/vt/SLCORE-2061-SLCORE-2062-on-demand-analyzers branch from 44913be to 100a222 Compare March 12, 2026 11:45
@nquinquenel nquinquenel requested a review from Copilot March 12, 2026 13:15
Copy link

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

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.

@Krosovok Krosovok changed the base branch from master to feature/on-demand-analyzers March 18, 2026 12:13
@sonarqube-next
Copy link

Quality Gate failed Quality Gate failed

Failed conditions
15 New issues

See analysis details on SonarQube

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE SonarQube for IDE

@Krosovok Krosovok force-pushed the feature/vt/SLCORE-2061-SLCORE-2062-on-demand-analyzers branch from 3ea63af to 2df3632 Compare March 19, 2026 15:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants