diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/config/CachedResourceResolver.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/config/CachedResourceResolver.kt index 6123bfd66..28b5392dc 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/config/CachedResourceResolver.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/config/CachedResourceResolver.kt @@ -11,6 +11,7 @@ import com.itangcent.intellij.config.ConfigReader import com.itangcent.intellij.config.resource.DefaultResourceResolver import com.itangcent.intellij.config.resource.URLResource import com.itangcent.intellij.context.ActionContext +import com.itangcent.intellij.extend.callWithTimeout import com.itangcent.intellij.file.LocalFileRepository import com.itangcent.intellij.logger.Logger import com.itangcent.utils.GiteeSupport @@ -37,15 +38,18 @@ open class CachedResourceResolver : DefaultResourceResolver() { @Inject private lateinit var httpSettingsHelper: HttpSettingsHelper + @Inject + private lateinit var actionContext: ActionContext + @Inject private lateinit var logger: Logger private val beanDAO: SqliteDataResourceHelper.ExpiredBeanDAO by lazy { - val context = ActionContext.getContext() - val sqliteDataResourceHelper = context!!.instance(SqliteDataResourceHelper::class) + val sqliteDataResourceHelper = actionContext.instance(SqliteDataResourceHelper::class) sqliteDataResourceHelper.getExpiredBeanDAO( (projectCacheRepository - ?: localFileRepository)!!.getOrCreateFile(".url.cache.v2.1.db").path, "DB_BEAN_BINDER") + ?: localFileRepository)!!.getOrCreateFile(".url.cache.v2.1.db").path, "DB_BEAN_BINDER" + ) } override fun createUrlResource(url: String): URLResource { @@ -65,16 +69,22 @@ open class CachedResourceResolver : DefaultResourceResolver() { return byteArrayOf() } try { - valueBytes = super.inputStream?.use { it.readBytes() } + valueBytes = actionContext.callWithTimeout(timeOut().toLong()) { + super.inputStream?.use { it.readBytes() } + } } catch (e: Exception) { if (url.host.contains("githubusercontent.com")) { GiteeSupport.convertUrlFromGithub(rawUrl)?.let { giteeUrl -> - if(e is SocketTimeoutException){ - logger.error("failed fetch:[$url]\n" + - "Maybe you can use [$giteeUrl] instead") - }else { - logger.traceError("failed fetch:[$url]\n" + - "Maybe you can use [$giteeUrl] instead", e) + if (e is SocketTimeoutException) { + logger.error( + "failed fetch:[$url]\n" + + "Maybe you can use [$giteeUrl] instead" + ) + } else { + logger.traceError( + "failed fetch:[$url]\n" + + "Maybe you can use [$giteeUrl] instead", e + ) } return null } @@ -103,10 +113,12 @@ open class CachedResourceResolver : DefaultResourceResolver() { get() = loadCache()?.let { String(it, Charsets.UTF_8) } override fun onConnection(connection: URLConnection) { - val httpTimeOut = httpSettingsHelper.httpTimeOut(TimeUnit.MILLISECONDS) + val httpTimeOut = timeOut() connection.connectTimeout = httpTimeOut connection.readTimeout = httpTimeOut } + + private fun timeOut() = httpSettingsHelper.httpTimeOut(TimeUnit.MILLISECONDS) } } diff --git a/idea-plugin/src/main/kotlin/com/itangcent/intellij/extend/ActionContextKit.kt b/idea-plugin/src/main/kotlin/com/itangcent/intellij/extend/ActionContextKit.kt index d47e53a6e..831ec41b9 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/intellij/extend/ActionContextKit.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/intellij/extend/ActionContextKit.kt @@ -1,15 +1,9 @@ package com.itangcent.intellij.extend -import com.intellij.openapi.actionSystem.CommonDataKeys -import com.intellij.openapi.actionSystem.DataContext -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod -import com.intellij.psi.util.PsiTreeUtil import com.itangcent.common.concurrent.ValueHolder import com.itangcent.common.logger.traceError import com.itangcent.common.utils.TimeSpanUtils -import com.itangcent.common.utils.cast import com.itangcent.intellij.context.ActionContext import com.itangcent.intellij.context.ThreadFlag import com.itangcent.intellij.logger.Logger diff --git a/idea-plugin/src/test/kotlin/com/itangcent/idea/config/CachedResourceResolverTest.kt b/idea-plugin/src/test/kotlin/com/itangcent/idea/config/CachedResourceResolverTest.kt index 61cc6b3be..5dc227f0e 100644 --- a/idea-plugin/src/test/kotlin/com/itangcent/idea/config/CachedResourceResolverTest.kt +++ b/idea-plugin/src/test/kotlin/com/itangcent/idea/config/CachedResourceResolverTest.kt @@ -13,13 +13,11 @@ import com.itangcent.intellij.extend.guice.with import com.itangcent.mock.AdvancedContextTest import com.itangcent.mock.SettingBinderAdaptor import org.junit.jupiter.api.Test -import org.junit.jupiter.api.condition.DisabledOnOs -import org.junit.jupiter.api.condition.OS import org.mockito.Mockito import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.times -import java.net.SocketTimeoutException +import java.io.IOException import kotlin.test.assertEquals import kotlin.test.assertNotNull import kotlin.test.assertTrue @@ -27,7 +25,7 @@ import kotlin.test.assertTrue /** * Test case of [CachedResourceResolver] */ -@DisabledOnOs(OS.WINDOWS) +//@DisabledOnOs(OS.WINDOWS) internal class CachedResourceResolverTest : AdvancedContextTest() { @Inject @@ -77,7 +75,7 @@ internal class CachedResourceResolverTest : AdvancedContextTest() { } @Test - fun testCachedResource() { + fun testCachedResourceFromGithub() { settings.httpTimeOut = 5 try { @@ -107,9 +105,14 @@ internal class CachedResourceResolverTest : AdvancedContextTest() { assertNotNull(it) assertEquals(content, it.use { input -> input.readString() }) } - } catch (e: SocketTimeoutException) { + } catch (e: IOException) { logger.warn("failed connect raw.githubusercontent.com") } + } + + @Test + fun testCachedResourceFromApache() { + settings.httpTimeOut = 5 try { //test forbidden @@ -127,7 +130,7 @@ internal class CachedResourceResolverTest : AdvancedContextTest() { assertNotNull(it) assertEquals("", it.use { input -> input.readString() }) } - } catch (e: SocketTimeoutException) { + } catch (e: IOException) { logger.warn("failed connect apache.org") } }