From c002bcb0bf7cf2f1e388bbab9d6cc5e4673b81f9 Mon Sep 17 00:00:00 2001 From: Nikita Iarychenko Date: Wed, 28 Jan 2026 16:29:23 +0400 Subject: [PATCH] OPENIDE fix compile errors for 2025.3.2 (cherry picked from commit 9d93258eedf7d753398da50001959cbacdb11f70) --- .../connection/ConfigurationClientFactory.kt | 33 ++------ .../EventLogUploadSettingsClient.kt | 12 +-- .../connection/RemoteConfigurationClient.kt | 75 ++++++++++--------- 3 files changed, 53 insertions(+), 67 deletions(-) diff --git a/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/ConfigurationClientFactory.kt b/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/ConfigurationClientFactory.kt index add5f68c36da..45df0b3d96cb 100644 --- a/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/ConfigurationClientFactory.kt +++ b/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/ConfigurationClientFactory.kt @@ -4,11 +4,9 @@ // Any modifications are available on the same license terms as the original source code. package com.intellij.internal.statistic.eventLog.connection +import com.jetbrains.fus.reporting.FusHttpClient +import com.jetbrains.fus.reporting.FusJsonSerializer import com.jetbrains.fus.reporting.configuration.ConfigurationClient -import com.jetbrains.fus.reporting.configuration.RegionCode -import com.jetbrains.fus.reporting.model.http.HttpClientBuilder -import com.jetbrains.fus.reporting.model.http.HttpRequestBuilder -import com.jetbrains.fus.reporting.model.serialization.Serializer import java.util.concurrent.TimeUnit class ConfigurationClientFactory { @@ -21,14 +19,6 @@ class ConfigurationClientFactory { * @param productVersion Product version * @param isTestConfiguration Set it to true to use the test configuration url, * otherwise set it false to use the production one. - * @param httpClientBuilder FUS-client supports java http client com.jetbrains.fus.reporting.connection.JavaHttpClientBuilder, - * You can configure it or use another http client [com.jetbrains.fus.reporting.model.http.HttpClientBuilder]. - * @param httpRequestBuilder FUS-client supports java http request com.jetbrains.fus.reporting.connection.JavaHttpRequestBuilder, - * You can configure it or use another http request [com.jetbrains.fus.reporting.model.http.HttpRequestBuilder]. - * @param regionCode The region code for the downloading configuration, - * configuration url depends on the region code. - * Configuration template url for China region code is [com.jetbrains.fus.reporting.configuration.RegionCode.CN]. - * Configuration template url for all other regions is [com.jetbrains.fus.reporting.configuration.RegionCode.ALL]. * @param cacheTimeoutMs The frequency of the downloading configuration, it is 10 minutes by default. * @param serializer FUS-client supports jackson serialization com.jetbrains.fus.reporting.serialization.FusJacksonSerializer, * kotlin serialization com.jetbrains.fus.reporting.serialization.FusKotlinSerializer. @@ -40,20 +30,16 @@ class ConfigurationClientFactory { productCode: String, productVersion: String, isTestConfiguration: Boolean, - httpClientBuilder: HttpClientBuilder, - httpRequestBuilder: HttpRequestBuilder, - regionCode: RegionCode = RegionCode.ALL, + httpClient: FusHttpClient, cacheTimeoutMs: Long = TimeUnit.MINUTES.toMillis(10), - serializer: Serializer + serializer: FusJsonSerializer ): ConfigurationClient { return createConfigurationClient( recorderId, productCode, productVersion, isTestConfiguration, - httpClientBuilder, - httpRequestBuilder, - regionCode, + httpClient, cacheTimeoutMs, serializer ) @@ -64,11 +50,9 @@ class ConfigurationClientFactory { productCode: String, productVersion: String, isTestConfiguration: Boolean, - httpClientBuilder: HttpClientBuilder, - httpRequestBuilder: HttpRequestBuilder, - regionCode: RegionCode, + httpClient: FusHttpClient, cacheTimeoutMs: Long, - serializer: Serializer + serializer: FusJsonSerializer ): ConfigurationClient { val eventLogSettingsURLTemplate = "https://stats.openide.ru/storage/fus/config/v4/%s/%s.json" val configurationUrl: String = @@ -81,8 +65,7 @@ class ConfigurationClientFactory { configurationUrl, productCode, productVersion, - httpClientBuilder.newClient(configurationUrl), - httpRequestBuilder.newGetRequest(configurationUrl), + httpClient, serializer, cacheTimeoutMs ) diff --git a/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/EventLogUploadSettingsClient.kt b/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/EventLogUploadSettingsClient.kt index 03fba0238d60..94fb0f567845 100644 --- a/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/EventLogUploadSettingsClient.kt +++ b/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/EventLogUploadSettingsClient.kt @@ -1,4 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// +// Modified by Nikita Iarychenko at 2025 as part of the OpenIDE project(https://openide.ru). +// Any modifications are available on the same license terms as the original source code. package com.intellij.internal.statistic.eventLog.connection import com.fasterxml.jackson.annotation.JsonInclude @@ -13,12 +16,11 @@ import com.fasterxml.jackson.databind.json.JsonMapper import com.intellij.internal.statistic.eventLog.EventLogApplicationInfo import com.jetbrains.fus.reporting.FusJsonSerializer import com.jetbrains.fus.reporting.configuration.ConfigurationClient -import com.jetbrains.fus.reporting.configuration.ConfigurationClientFactory -import com.jetbrains.fus.reporting.configuration.RegionCode import com.jetbrains.fus.reporting.jvm.JvmHttpClient import com.jetbrains.fus.reporting.jvm.ProxyInfo import com.jetbrains.fus.reporting.model.serialization.SerializationException import org.jetbrains.annotations.ApiStatus +import org.jetbrains.annotations.VisibleForTesting import java.util.concurrent.TimeUnit /** @@ -34,7 +36,8 @@ open class EventLogUploadSettingsClient( cacheTimeoutMs: Long = TimeUnit.MINUTES.toMillis(10) ) : EventLogSettingsClient() { companion object { - const val chinaRegion: String = "china" //com.intellij.ide.Region.CHINA + @VisibleForTesting + val chinaRegion: String = "china" //com.intellij.ide.Region.CHINA } override var configurationClient: ConfigurationClient = ConfigurationClientFactory.create( recorderId = recorderId, @@ -49,7 +52,6 @@ open class EventLogUploadSettingsClient( extraHeadersProvider = { applicationInfo.connectionSettings.provideExtraHeaders() }, userAgent = applicationInfo.connectionSettings.provideUserAgent() ), - regionCode = if (applicationInfo.regionalCode == chinaRegion) RegionCode.CN else RegionCode.ALL, serializer = FusJacksonSerializer(), cacheTimeoutMs = cacheTimeoutMs ) @@ -127,4 +129,4 @@ open class EventLogUploadSettingsClient( return CustomPrettyPrinter(this) } } -} +} \ No newline at end of file diff --git a/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/RemoteConfigurationClient.kt b/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/RemoteConfigurationClient.kt index d66d1e1aa507..449e94330c3e 100644 --- a/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/RemoteConfigurationClient.kt +++ b/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/RemoteConfigurationClient.kt @@ -4,26 +4,22 @@ // Any modifications are available on the same license terms as the original source code. package com.intellij.internal.statistic.eventLog.connection +import com.jetbrains.fus.reporting.FusHttpClient +import com.jetbrains.fus.reporting.FusJsonSerializer import com.jetbrains.fus.reporting.configuration.ConfigurationClient import com.jetbrains.fus.reporting.model.config.v4.Configuration import com.jetbrains.fus.reporting.model.config.v4.ConfigurationVersion import com.jetbrains.fus.reporting.model.exceptions.StatsResponseException -import com.jetbrains.fus.reporting.model.http.HttpClient -import com.jetbrains.fus.reporting.model.http.HttpRequest -import com.jetbrains.fus.reporting.model.http.HttpResponse +import com.jetbrains.fus.reporting.HttpResponse import com.jetbrains.fus.reporting.model.serialization.SerializationException -import com.jetbrains.fus.reporting.model.serialization.Serializer import java.io.IOException -import java.io.InputStream -import java.nio.charset.StandardCharsets internal class RemoteConfigurationClient internal constructor( override val configurationUrl: String, override val productCode: String, private val productVersion: String, - private val httpClient: HttpClient, - private val httpRequest: HttpRequest, - private val serializer: Serializer, + private val httpClient: FusHttpClient, + private val serializer: FusJsonSerializer, cacheTimeoutMs: Long ) : ConfigurationClient() { private val cachedConfigurationVersion: StatisticsCachingSupplier = @@ -46,27 +42,23 @@ internal class RemoteConfigurationClient internal constructor( private fun loadConfiguration(): ConfigurationVersion? { val processor = object : ResponseProcessor { override fun onSucceed(response: HttpResponse): ConfigurationVersion? { - val responseContent: InputStream? = response.read() - if (responseContent != null) { - val content = responseContent.bufferedReader(StandardCharsets.UTF_8).use { reader -> - reader.readText() - } - val configuration = serializer.deserializeConfiguration(content) - return configuration.findProductVersion(productVersion) - } - return null + val content = response.body ?: return null + val configuration = serializer.fromJson(content, Configuration::class.java) + return configuration.findProductVersion(productVersion) } } - val statsRequestResult = HttpClientProcessor.send(httpClient, httpRequest, processor) - if (statsRequestResult.errorCode != -1) - throw StatsResponseException( - "Http response status code to get fus reporting " + - "configuration: ${statsRequestResult.errorCode}. " + - "Configuration url: $configurationUrl. " + - "Product code: $productCode. " + - "Product version: $productVersion." - ) - return statsRequestResult.result + val statsRequestResult = HttpClientProcessor.send(httpClient, configurationUrl, processor) + + if (statsRequestResult.errorCode == -1) { + return statsRequestResult.result + } + + throw StatsResponseException( + "Http response status code to get fus reporting configuration: ${statsRequestResult.errorCode}. " + + "Configuration url: $configurationUrl. " + + "Product code: $productCode. " + + "Product version: $productVersion." + ) } } @@ -93,8 +85,8 @@ internal object HttpClientProcessor { * */ @Throws(IOException::class, InterruptedException::class, SecurityException::class) - fun send(httpClient: HttpClient, httpRequest: HttpRequest, processor: ResponseProcessor): RequestResult { - val response = trySend(httpClient, httpRequest) + fun send(httpClient: FusHttpClient, url: String, processor: ResponseProcessor): RequestResult { + val response = trySend(httpClient, url) val code = response?.statusCode if (code == SUCCESS_CODE) { val result: T = processor.onSucceed(response) @@ -105,17 +97,26 @@ internal object HttpClientProcessor { } @Throws(IOException::class, InterruptedException::class, SecurityException::class) - private fun trySend(httpClient: HttpClient, httpRequest: HttpRequest): HttpResponse? { + private fun trySend(httpClient: FusHttpClient, url: String): HttpResponse? { var retryCounter = 0 + while (retryCounter < MAX_RETRIES) { - val response = httpClient.send(httpRequest) - retryCounter++ - if (CAN_RETRY_CODES.contains(response.statusCode) && (retryCounter != MAX_RETRIES - 1)) { - Thread.sleep(RETRY_INTERVAL.toLong()) - } else { - return response + val response = try { + httpClient.get(url) + } catch (e: Exception) { + null } + + retryCounter++ + + if ((response == null || response.statusCode in CAN_RETRY_CODES) && retryCounter != MAX_RETRIES - 1) { + Thread.sleep(RETRY_INTERVAL.toLong()) + continue + } + + return response } + return null }