Search in sources :

Example 1 with HttpClient

use of org.sonarsource.sonarlint.core.commons.http.HttpClient in project sonarlint-core by SonarSource.

the class ConnectedSonarLintEngineImpl method getActiveRuleDetails.

@Override
public CompletableFuture<ConnectedRuleDetails> getActiveRuleDetails(EndpointParams endpoint, HttpClient client, String ruleKey, @Nullable String projectKey) {
    var allRulesDefinitionsByKey = analysisContext.get().allRulesDefinitionsByKey;
    var ruleDefFromPlugin = allRulesDefinitionsByKey.get(ruleKey);
    if (ruleDefFromPlugin != null && (globalConfig.getExtraPluginsPathsByKey().containsKey(ruleDefFromPlugin.getLanguage().getPluginKey()) || projectKey == null)) {
        // if no project key, or for rules from extra plugins there will be no rules metadata in the storage
        return CompletableFuture.completedFuture(new DefaultRuleDetails(ruleKey, ruleDefFromPlugin.getName(), ruleDefFromPlugin.getHtmlDescription(), ruleDefFromPlugin.getSeverity(), ruleDefFromPlugin.getType(), ruleDefFromPlugin.getLanguage(), ""));
    }
    if (projectKey != null) {
        var analyzerConfiguration = projectStorage.getAnalyzerConfiguration(projectKey);
        var storageActiveRule = analyzerConfiguration.getRuleSetByLanguageKey().values().stream().flatMap(s -> s.getRules().stream()).filter(r -> r.getRuleKey().equals(ruleKey)).findFirst();
        if (storageActiveRule.isPresent()) {
            var activeRuleFromStorage = storageActiveRule.get();
            var serverSeverity = activeRuleFromStorage.getSeverity();
            if (StringUtils.isNotBlank(activeRuleFromStorage.getTemplateKey())) {
                var templateRuleDefFromPlugin = Optional.ofNullable(allRulesDefinitionsByKey.get(activeRuleFromStorage.getTemplateKey())).orElseThrow(() -> new IllegalStateException("Unable to find rule definition for rule template " + activeRuleFromStorage.getTemplateKey()));
                return new ServerApi(new ServerApiHelper(endpoint, client)).rules().getRule(ruleKey).thenApply(serverRule -> new DefaultRuleDetails(ruleKey, serverRule.getName(), serverRule.getHtmlDesc(), serverSeverity, templateRuleDefFromPlugin.getType(), templateRuleDefFromPlugin.getLanguage(), serverRule.getHtmlNote()));
            } else {
                if (ruleDefFromPlugin == null) {
                    throw new IllegalStateException("Unable to find rule definition for rule " + ruleKey);
                }
                return new ServerApi(new ServerApiHelper(endpoint, client)).rules().getRule(ruleKey).thenApply(serverRule -> new DefaultRuleDetails(ruleKey, ruleDefFromPlugin.getName(), ruleDefFromPlugin.getHtmlDescription(), serverSeverity != null ? serverSeverity : ruleDefFromPlugin.getSeverity(), ruleDefFromPlugin.getType(), ruleDefFromPlugin.getLanguage(), serverRule.getHtmlNote()));
            }
        }
    }
    throw new IllegalStateException("Unable to find rule details for '" + ruleKey + "'");
}
Also used : ClientLogOutput(org.sonarsource.sonarlint.core.commons.log.ClientLogOutput) FileMatcher(org.sonarsource.sonarlint.core.container.storage.FileMatcher) Language(org.sonarsource.sonarlint.core.commons.Language) GlobalUpdateStatusReader(org.sonarsource.sonarlint.core.container.storage.GlobalUpdateStatusReader) DefaultClientIssue(org.sonarsource.sonarlint.core.client.api.common.analysis.DefaultClientIssue) IssueStoreReader(org.sonarsource.sonarlint.core.container.storage.IssueStoreReader) SonarLintRuleDefinition(org.sonarsource.sonarlint.core.rule.extractor.SonarLintRuleDefinition) Version(org.sonarsource.sonarlint.core.commons.Version) StringUtils(org.apache.commons.lang3.StringUtils) ProjectStorageStatus(org.sonarsource.sonarlint.core.client.api.connected.ProjectStorageStatus) ServerApiHelper(org.sonarsource.sonarlint.core.serverapi.ServerApiHelper) AnalyzeCommand(org.sonarsource.sonarlint.core.analysis.command.AnalyzeCommand) Map(java.util.Map) ConnectedRuleDetails(org.sonarsource.sonarlint.core.client.api.connected.ConnectedRuleDetails) GlobalStores(org.sonarsource.sonarlint.core.container.storage.GlobalStores) Path(java.nio.file.Path) ActiveRule(org.sonarsource.sonarlint.core.analysis.api.ActiveRule) ConnectedSonarLintEngine(org.sonarsource.sonarlint.core.client.api.connected.ConnectedSonarLintEngine) EndpointParams(org.sonarsource.sonarlint.core.serverapi.EndpointParams) StringUtils.trimToNull(org.apache.commons.lang3.StringUtils.trimToNull) StorageException(org.sonarsource.sonarlint.core.client.api.exceptions.StorageException) StorageFileExclusions(org.sonarsource.sonarlint.core.container.storage.StorageFileExclusions) Predicate(java.util.function.Predicate) DefaultRuleDetails(org.sonarsource.sonarlint.core.container.storage.DefaultRuleDetails) PluginInstancesRepository(org.sonarsource.sonarlint.core.plugin.commons.PluginInstancesRepository) Collection(java.util.Collection) ServerActiveRule(org.sonarsource.sonarlint.core.serverapi.rules.ServerActiveRule) Set(java.util.Set) ServerProject(org.sonarsource.sonarlint.core.serverapi.component.ServerProject) ProjectListDownloader(org.sonarsource.sonarlint.core.container.connected.update.ProjectListDownloader) Collectors(java.util.stream.Collectors) List(java.util.List) SonarLintWrappedException(org.sonarsource.sonarlint.core.client.api.exceptions.SonarLintWrappedException) AnalysisEngineConfiguration(org.sonarsource.sonarlint.core.analysis.api.AnalysisEngineConfiguration) HttpClient(org.sonarsource.sonarlint.core.commons.http.HttpClient) Optional(java.util.Optional) FilenameUtils(org.apache.commons.io.FilenameUtils) IssueStoreFactory(org.sonarsource.sonarlint.core.container.connected.IssueStoreFactory) AnalysisResults(org.sonarsource.sonarlint.core.analysis.api.AnalysisResults) GlobalStorageUpdateExecutor(org.sonarsource.sonarlint.core.container.connected.update.perform.GlobalStorageUpdateExecutor) Configuration(org.sonarsource.sonarlint.core.plugin.commons.PluginInstancesRepository.Configuration) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) ConnectedAnalysisConfiguration(org.sonarsource.sonarlint.core.client.api.connected.ConnectedAnalysisConfiguration) ServerIssue(org.sonarsource.sonarlint.core.client.api.connected.ServerIssue) AnalysisEngine(org.sonarsource.sonarlint.core.analysis.AnalysisEngine) ProjectStorageStatusReader(org.sonarsource.sonarlint.core.container.storage.ProjectStorageStatusReader) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) Supplier(java.util.function.Supplier) ConnectedGlobalConfiguration(org.sonarsource.sonarlint.core.client.api.connected.ConnectedGlobalConfiguration) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) IssueListener(org.sonarsource.sonarlint.core.client.api.common.analysis.IssueListener) ProjectStoragePaths.encodeForFs(org.sonarsource.sonarlint.core.container.storage.ProjectStoragePaths.encodeForFs) UpdateResult(org.sonarsource.sonarlint.core.client.api.connected.UpdateResult) LocalStorageSynchronizer(org.sonarsource.sonarlint.core.storage.LocalStorageSynchronizer) ProjectStorageUpdateExecutor(org.sonarsource.sonarlint.core.container.connected.update.perform.ProjectStorageUpdateExecutor) Issue(org.sonarsource.sonarlint.core.analysis.api.Issue) Objects.requireNonNull(java.util.Objects.requireNonNull) ProjectStorage(org.sonarsource.sonarlint.core.storage.ProjectStorage) IssueStorePaths(org.sonarsource.sonarlint.core.container.connected.update.IssueStorePaths) ProjectStoragePaths(org.sonarsource.sonarlint.core.container.storage.ProjectStoragePaths) DownloadException(org.sonarsource.sonarlint.core.client.api.exceptions.DownloadException) Nullable(javax.annotation.Nullable) ProjectBranches(org.sonarsource.sonarlint.core.client.api.connected.ProjectBranches) AnalysisConfiguration(org.sonarsource.sonarlint.core.analysis.api.AnalysisConfiguration) ProjectBinding(org.sonarsource.sonarlint.core.client.api.connected.ProjectBinding) StorageReader(org.sonarsource.sonarlint.core.container.storage.StorageReader) PluginDetails(org.sonarsource.sonarlint.core.client.api.common.PluginDetails) ClientProgressMonitor(org.sonarsource.sonarlint.core.commons.progress.ClientProgressMonitor) PluginsStorage(org.sonarsource.sonarlint.core.storage.PluginsStorage) ServerApi(org.sonarsource.sonarlint.core.serverapi.ServerApi) PartialUpdaterFactory(org.sonarsource.sonarlint.core.container.storage.partialupdate.PartialUpdaterFactory) Paths(java.nio.file.Paths) GlobalStorageStatus(org.sonarsource.sonarlint.core.client.api.connected.GlobalStorageStatus) ProgressMonitor(org.sonarsource.sonarlint.core.commons.progress.ProgressMonitor) DefaultRuleDetails(org.sonarsource.sonarlint.core.container.storage.DefaultRuleDetails) ServerApi(org.sonarsource.sonarlint.core.serverapi.ServerApi) ServerApiHelper(org.sonarsource.sonarlint.core.serverapi.ServerApiHelper)

Example 2 with HttpClient

use of org.sonarsource.sonarlint.core.commons.http.HttpClient in project sonarlint-core by SonarSource.

the class MockWebServerExtension method httpClient.

public static HttpClient httpClient() {
    return new HttpClient() {

        private final OkHttpClient okClient = SHARED_CLIENT.newBuilder().build();

        @Override
        public Response post(String url, String contentType, String bodyContent) {
            var body = RequestBody.create(MediaType.get(contentType), bodyContent);
            var request = new Request.Builder().url(url).post(body).build();
            return executeRequest(request);
        }

        @Override
        public Response get(String url) {
            var request = new Request.Builder().url(url).build();
            return executeRequest(request);
        }

        @Override
        public CompletableFuture<Response> getAsync(String url) {
            var request = new Request.Builder().url(url).build();
            return executeRequestAsync(request);
        }

        @Override
        public Response delete(String url, String contentType, String bodyContent) {
            var body = RequestBody.create(MediaType.get(contentType), bodyContent);
            var request = new Request.Builder().url(url).delete(body).build();
            return executeRequest(request);
        }

        private Response executeRequest(Request request) {
            try {
                return wrap(okClient.newCall(request).execute());
            } catch (IOException e) {
                throw new IllegalStateException("Unable to execute request: " + e.getMessage(), e);
            }
        }

        private CompletableFuture<Response> executeRequestAsync(Request request) {
            var call = okClient.newCall(request);
            var futureResponse = new CompletableFuture<Response>().whenComplete((response, error) -> {
                if (error instanceof CancellationException) {
                    call.cancel();
                }
            });
            call.enqueue(new Callback() {

                @Override
                public void onFailure(Call call, IOException e) {
                    futureResponse.completeExceptionally(e);
                }

                @Override
                public void onResponse(Call call, okhttp3.Response response) {
                    futureResponse.complete(wrap(response));
                }
            });
            return futureResponse;
        }

        private Response wrap(okhttp3.Response wrapped) {
            return new Response() {

                @Override
                public String url() {
                    return wrapped.request().url().toString();
                }

                @Override
                public int code() {
                    return wrapped.code();
                }

                @Override
                public void close() {
                    wrapped.close();
                }

                @Override
                public String bodyAsString() {
                    try (var body = wrapped.body()) {
                        return body.string();
                    } catch (IOException e) {
                        throw new IllegalStateException("Unable to read response body: " + e.getMessage(), e);
                    }
                }

                @Override
                public InputStream bodyAsStream() {
                    return wrapped.body().byteStream();
                }

                @Override
                public String toString() {
                    return wrapped.toString();
                }
            };
        }
    };
}
Also used : Call(okhttp3.Call) OkHttpClient(okhttp3.OkHttpClient) Request(okhttp3.Request) RecordedRequest(mockwebserver3.RecordedRequest) IOException(java.io.IOException) MockResponse(mockwebserver3.MockResponse) AfterEachCallback(org.junit.jupiter.api.extension.AfterEachCallback) BeforeEachCallback(org.junit.jupiter.api.extension.BeforeEachCallback) Callback(okhttp3.Callback) CancellationException(java.util.concurrent.CancellationException) OkHttpClient(okhttp3.OkHttpClient) HttpClient(org.sonarsource.sonarlint.core.commons.http.HttpClient)

Aggregations

IOException (java.io.IOException)1 Path (java.nio.file.Path)1 Paths (java.nio.file.Paths)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 List (java.util.List)1 Map (java.util.Map)1 Objects.requireNonNull (java.util.Objects.requireNonNull)1 Optional (java.util.Optional)1 Set (java.util.Set)1 CancellationException (java.util.concurrent.CancellationException)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 Function (java.util.function.Function)1 Predicate (java.util.function.Predicate)1 Supplier (java.util.function.Supplier)1 Collectors (java.util.stream.Collectors)1 Nullable (javax.annotation.Nullable)1