diff --git a/components/gitpod-protocol/java/src/main/java/io/gitpod/gitpodprotocol/api/GitpodServerLauncher.java b/components/gitpod-protocol/java/src/main/java/io/gitpod/gitpodprotocol/api/GitpodServerLauncher.java index 10322a6c504f39..17064ce885e044 100644 --- a/components/gitpod-protocol/java/src/main/java/io/gitpod/gitpodprotocol/api/GitpodServerLauncher.java +++ b/components/gitpod-protocol/java/src/main/java/io/gitpod/gitpodprotocol/api/GitpodServerLauncher.java @@ -4,6 +4,11 @@ package io.gitpod.gitpodprotocol.api; +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.client.HttpProxy; +import org.eclipse.jetty.client.Socks4Proxy; +import org.eclipse.jetty.util.ssl.SslContextFactory; +import org.eclipse.jetty.websocket.jsr356.ClientContainer; import org.eclipse.lsp4j.jsonrpc.Launcher; import org.eclipse.lsp4j.jsonrpc.MessageConsumer; import org.eclipse.lsp4j.jsonrpc.MessageIssueHandler; @@ -11,10 +16,14 @@ import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints; import org.eclipse.lsp4j.websocket.WebSocketMessageHandler; +import javax.net.ssl.SSLContext; import javax.websocket.*; -import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.SocketAddress; import java.net.URI; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.logging.Level; @@ -47,10 +56,60 @@ public GitpodServerConnection listen( String userAgent, String clientVersion, String token - ) throws DeploymentException, IOException { + ) throws Exception { + return listen(apiUrl, origin, userAgent, clientVersion, token, Collections.emptyList(), null); + } + + public GitpodServerConnection listen( + String apiUrl, + String origin, + String userAgent, + String clientVersion, + String token, + List proxies, + SSLContext sslContext + ) throws Exception { String gitpodHost = URI.create(apiUrl).getHost(); + HttpClient httpClient; + if (sslContext == null) { + httpClient = new HttpClient(); + } else { + SslContextFactory ssl = new SslContextFactory.Client(); + ssl.setSslContext(sslContext); + httpClient = new HttpClient(ssl); + } + for (Proxy proxy : proxies) { + if (proxy.type().equals(Proxy.Type.DIRECT)) { + continue; + } + SocketAddress proxyAddress = proxy.address(); + if (!(proxyAddress instanceof InetSocketAddress)) { + GitpodServerConnectionImpl.LOG.log(Level.WARNING, gitpodHost + ": unexpected proxy:", proxy); + continue; + } + String hostName = ((InetSocketAddress) proxyAddress).getHostString(); + int port = ((InetSocketAddress) proxyAddress).getPort(); + if (proxy.type().equals(Proxy.Type.HTTP)) { + httpClient.getProxyConfiguration().getProxies().add(new HttpProxy(hostName, port)); + } else if (proxy.type().equals(Proxy.Type.SOCKS)) { + httpClient.getProxyConfiguration().getProxies().add(new Socks4Proxy(hostName, port)); + } + } + ClientContainer container = new ClientContainer(httpClient); + // allow clientContainer to own httpClient (for start/stop lifecycle) + container.getClient().addManaged(httpClient); + container.start(); + GitpodServerConnectionImpl connection = new GitpodServerConnectionImpl(gitpodHost); - connection.setSession(ContainerProvider.getWebSocketContainer().connectToServer(new Endpoint() { + connection.whenComplete((input, exception) -> { + try { + container.stop(); + } catch (Throwable t) { + GitpodServerConnectionImpl.LOG.log(Level.WARNING, gitpodHost + ": failed to stop websocket container:", t); + } + }); + + connection.setSession(container.connectToServer(new Endpoint() { @Override public void onOpen(Session session, EndpointConfig config) { session.addMessageHandler(new WebSocketMessageHandler(messageReader, jsonHandler, remoteEndpoint)); diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/auth/GitpodAuthCallbackHandler.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/auth/GitpodAuthCallbackHandler.kt index bf188838bd1410..4c13bbbb9ec70f 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/auth/GitpodAuthCallbackHandler.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/auth/GitpodAuthCallbackHandler.kt @@ -62,4 +62,4 @@ internal class GitpodAuthCallbackHandler : RestService() { """.trimIndent() } -} \ No newline at end of file +} diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/auth/GitpodAuthService.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/auth/GitpodAuthService.kt index 8c5f17493e1f93..5440f6404b80a9 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/auth/GitpodAuthService.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/auth/GitpodAuthService.kt @@ -38,7 +38,6 @@ import java.util.* import java.util.concurrent.CompletableFuture import kotlin.math.absoluteValue - @Service internal class GitpodAuthService : OAuthServiceBase() { override val name: String @@ -66,7 +65,7 @@ internal class GitpodAuthService : OAuthServiceBase() { constructor(gitpodHost: String) { val codeVerifier = generateCodeVerifier() val codeChallenge = generateCodeChallenge(codeVerifier) - val serviceUrl = newFromEncoded("https://${gitpodHost}/api/oauth") + val serviceUrl = newFromEncoded("https://$gitpodHost/api/oauth") credentialsAcquirer = GitpodAuthCredentialsAcquirer( serviceUrl.resolve("token"), mapOf( "grant_type" to "authorization_code", @@ -94,7 +93,7 @@ internal class GitpodAuthService : OAuthServiceBase() { val bytes = ByteArray(size) secureRandom.nextBytes(bytes) - val mask = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"; + val mask = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~" val scale = 256 / mask.length val builder = StringBuilder() for (i in 0 until size) { @@ -147,7 +146,6 @@ internal class GitpodAuthService : OAuthServiceBase() { private data class AuthorizationResponseData(val accessToken: String) private data class JsonWebToken(val jti: String) - } companion object { @@ -198,8 +196,8 @@ internal class GitpodAuthService : OAuthServiceBase() { listener() } } - dispatcher.addListener(internalListener); + dispatcher.addListener(internalListener) return Disposable { dispatcher.removeListener(internalListener) } } } -} \ No newline at end of file +} diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GatewayGitpodClient.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GatewayGitpodClient.kt index b6e8b2986b8e5e..842fb2b8447d02 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GatewayGitpodClient.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GatewayGitpodClient.kt @@ -21,7 +21,8 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock class GatewayGitpodClient( - private val lifetimeDefinition: LifetimeDefinition, private val gitpodHost: String + private val lifetimeDefinition: LifetimeDefinition, + private val gitpodHost: String ) : GitpodClient() { private val mutex = Mutex() @@ -29,7 +30,7 @@ class GatewayGitpodClient( private val listeners = concurrentMapOf>?>() private val timeoutDelayInMinutes = 15 - private var timeoutJob: Job? = null; + private var timeoutJob: Job? = null init { GlobalScope.launch { @@ -59,7 +60,7 @@ class GatewayGitpodClient( } } - private var syncJob: Job? = null; + private var syncJob: Job? = null override fun notifyConnect() { syncJob?.cancel() syncJob = GlobalScope.launch { @@ -69,9 +70,9 @@ class GatewayGitpodClient( continue } try { - syncWorkspace(id); + syncWorkspace(id) } catch (t: Throwable) { - thisLogger().error("${gitpodHost}: ${id}: failed to sync", t) + thisLogger().error("$gitpodHost: $id: failed to sync", t) } } } @@ -79,7 +80,7 @@ class GatewayGitpodClient( override fun onInstanceUpdate(instance: WorkspaceInstance?) { if (instance == null) { - return; + return } GlobalScope.launch { val wsListeners = listeners[instance.workspaceId] ?: return@launch @@ -102,7 +103,7 @@ class GatewayGitpodClient( val listener = Channel() mutex.withLock { val listeners = this.listeners.getOrPut(workspaceId) { CopyOnWriteArrayList() }!! - listeners.add(listener); + listeners.add(listener) cancelTimeout("listening to workspace: $workspaceId") } listenerLifetime.onTerminationOrNow { @@ -120,7 +121,7 @@ class GatewayGitpodClient( if (listeners.isNullOrEmpty()) { return } - listeners.remove(listener); + listeners.remove(listener) if (listeners.isNotEmpty()) { return } @@ -137,5 +138,4 @@ class GatewayGitpodClient( onInstanceUpdate(info.latestInstance) return info } - -} \ No newline at end of file +} diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectionProvider.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectionProvider.kt index e3bd6fb1596050..ce3244ca25118b 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectionProvider.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectionProvider.kt @@ -48,7 +48,6 @@ import javax.swing.JComponent import javax.swing.JLabel import kotlin.coroutines.coroutineContext - class GitpodConnectionProvider : GatewayConnectionProvider { private val gitpod = service() @@ -65,10 +64,10 @@ class GitpodConnectionProvider : GatewayConnectionProvider { requestor: ConnectionRequestor ): GatewayConnectionHandle? { if (parameters["gitpodHost"] == null) { - throw IllegalArgumentException("bad gitpodHost parameter"); + throw IllegalArgumentException("bad gitpodHost parameter") } if (parameters["workspaceId"] == null) { - throw IllegalArgumentException("bad workspaceId parameter"); + throw IllegalArgumentException("bad workspaceId parameter") } val connectParams = ConnectParams( parameters["gitpodHost"]!!, @@ -93,7 +92,7 @@ class GitpodConnectionProvider : GatewayConnectionProvider { background = phaseMessage.background columns = 30 } - var ideUrl = ""; + var ideUrl = "" val connectionPanel = panel { indent { row { @@ -146,18 +145,18 @@ class GitpodConnectionProvider : GatewayConnectionProvider { } GlobalScope.launch { - var thinClient: ThinClientHandle? = null; - var thinClientJob: Job? = null; + var thinClient: ThinClientHandle? = null + var thinClientJob: Job? = null - var lastUpdate: WorkspaceInstance? = null; + var lastUpdate: WorkspaceInstance? = null try { for (update in updates) { try { if (WorkspaceInstance.isUpToDate(lastUpdate, update)) { - continue; + continue } ideUrl = update.ideUrl - lastUpdate = update; + lastUpdate = update if (!update.status.conditions.failed.isNullOrBlank()) { setErrorMessage(update.status.conditions.failed) } @@ -275,7 +274,7 @@ class GitpodConnectionProvider : GatewayConnectionProvider { } } - return GitpodConnectionHandle(connectionLifetime, connectionPanel, connectParams); + return GitpodConnectionHandle(connectionLifetime, connectionPanel, connectParams) } private suspend fun resolveJoinLink( @@ -365,7 +364,6 @@ class GitpodConnectionProvider : GatewayConnectionProvider { break } } - } matchedFingerprint } @@ -378,7 +376,7 @@ class GitpodConnectionProvider : GatewayConnectionProvider { ownerToken: String?, ): String? { val maxRequestTimeout = 30 * 1000L - val timeoutDelayGrowFactor = 1.5; + val timeoutDelayGrowFactor = 1.5 var requestTimeout = 2 * 1000L while (true) { coroutineContext.job.ensureActive() @@ -397,16 +395,16 @@ class GitpodConnectionProvider : GatewayConnectionProvider { return response.body() } if (response.statusCode() < 500) { - thisLogger().error("${connectParams.gitpodHost}: ${connectParams.workspaceId}: failed to fetch '${endpointUrl}': ${response.statusCode()}") + thisLogger().error("${connectParams.gitpodHost}: ${connectParams.workspaceId}: failed to fetch '$endpointUrl': ${response.statusCode()}") return null } - thisLogger().warn("${connectParams.gitpodHost}: ${connectParams.workspaceId}: failed to fetch '${endpointUrl}', trying again...: ${response.statusCode()}") + thisLogger().warn("${connectParams.gitpodHost}: ${connectParams.workspaceId}: failed to fetch '$endpointUrl', trying again...: ${response.statusCode()}") } catch (t: Throwable) { if (t is CancellationException) { throw t } thisLogger().warn( - "${connectParams.gitpodHost}: ${connectParams.workspaceId}: failed to fetch '${endpointUrl}', trying again...:", + "${connectParams.gitpodHost}: ${connectParams.workspaceId}: failed to fetch '$endpointUrl', trying again...:", t ) } @@ -446,5 +444,4 @@ class GitpodConnectionProvider : GatewayConnectionProvider { } private data class SSHHostKey(val type: String, val hostKey: String) - } diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectionService.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectionService.kt index e0e73624a6ecbc..ebdc5eda0221ec 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectionService.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectionService.kt @@ -11,6 +11,8 @@ import com.intellij.openapi.extensions.PluginId import com.intellij.remoteDev.util.onTerminationOrNow import com.intellij.util.ExceptionUtil import com.intellij.util.io.DigestUtil +import com.intellij.util.net.ssl.CertificateManager +import com.intellij.util.proxy.CommonProxy import com.jetbrains.rd.util.concurrentMapOf import com.jetbrains.rd.util.lifetime.Lifetime import io.gitpod.gitpodprotocol.api.GitpodServerLauncher @@ -18,12 +20,13 @@ import io.gitpod.jetbrains.auth.GitpodAuthService import kotlinx.coroutines.* import kotlinx.coroutines.future.await import org.eclipse.jetty.websocket.api.UpgradeException +import java.net.URL import java.nio.charset.StandardCharsets @Service class GitpodConnectionService { - private val clients = concurrentMapOf(); + private val clients = concurrentMapOf() fun obtainClient(gitpodHost: String): GatewayGitpodClient { return clients.getOrPut(gitpodHost) { @@ -37,22 +40,30 @@ class GitpodConnectionService { accessToken = GitpodAuthService.authorize(gitpodHost) } if (accessToken == null) { - authorize(); + authorize() } val plugin = PluginManagerCore.getPlugin(PluginId.getId("io.gitpod.jetbrains.gateway"))!! val connect = suspend { ensureActive() + val originalClassLoader = Thread.currentThread().contextClassLoader val connection = try { + val origin = "https://$gitpodHost/" + val proxies = CommonProxy.getInstance().select(URL(origin)) + val sslContext = CertificateManager.getInstance().sslContext + // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003146180/comments/360000376240 Thread.currentThread().contextClassLoader = GitpodConnectionProvider::class.java.classLoader + launcher.listen( - "wss://${gitpodHost}/api/v1", - "https://${gitpodHost}/", - plugin.pluginId.idString, - plugin.version, - accessToken + "wss://$gitpodHost/api/v1", + origin, + plugin.pluginId.idString, + plugin.version, + accessToken, + proxies, + sslContext ) } catch (t: Throwable) { val badUpgrade = ExceptionUtil.findCause(t, UpgradeException::class.java) @@ -61,7 +72,7 @@ class GitpodConnectionService { } throw t } finally { - Thread.currentThread().contextClassLoader = originalClassLoader; + Thread.currentThread().contextClassLoader = originalClassLoader } val tokenHash = DigestUtil.sha256Hex(accessToken!!.toByteArray(StandardCharsets.UTF_8)) val tokenScopes = client.server.getGitpodTokenScopes(tokenHash).await() @@ -76,34 +87,34 @@ class GitpodConnectionService { val minReconnectionDelay = 2 * 1000L val maxReconnectionDelay = 30 * 1000L - val reconnectionDelayGrowFactor = 1.5; - var reconnectionDelay = minReconnectionDelay; + val reconnectionDelayGrowFactor = 1.5 + var reconnectionDelay = minReconnectionDelay while (isActive) { try { val connection = try { connect() } catch (t: Throwable) { val e = ExceptionUtil.findCause(t, InvalidTokenException::class.java) ?: throw t - thisLogger().warn("${gitpodHost}: invalid token, authorizing again and reconnecting:", e) + thisLogger().warn("$gitpodHost: invalid token, authorizing again and reconnecting:", e) authorize() connect() } reconnectionDelay = minReconnectionDelay - thisLogger().info("${gitpodHost}: connected") + thisLogger().info("$gitpodHost: connected") val reason = connection.await() if (isActive) { - thisLogger().warn("${gitpodHost}: connection closed, reconnecting after $reconnectionDelay milliseconds: $reason") + thisLogger().warn("$gitpodHost: connection closed, reconnecting after $reconnectionDelay milliseconds: $reason") } else { - thisLogger().info("${gitpodHost}: connection permanently closed: $reason") + thisLogger().info("$gitpodHost: connection permanently closed: $reason") } } catch (t: Throwable) { if (isActive) { thisLogger().warn( - "${gitpodHost}: failed to connect, trying again after $reconnectionDelay milliseconds:", - t + "$gitpodHost: failed to connect, trying again after $reconnectionDelay milliseconds:", + t ) } else { - thisLogger().error("${gitpodHost}: connection permanently closed:", t) + thisLogger().error("$gitpodHost: connection permanently closed:", t) } } delay(reconnectionDelay) @@ -122,5 +133,4 @@ class GitpodConnectionService { } private class InvalidTokenException(message: String) : Exception(message) - -} \ No newline at end of file +} diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnector.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnector.kt index 249ba89b4f2388..1f5b2be4dd13d9 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnector.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnector.kt @@ -54,5 +54,4 @@ class GitpodConnector : GatewayConnector { } override fun initProcedure() {} - } diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectorView.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectorView.kt index d21bde18e82bcb..05f6ac000b2537 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectorView.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectorView.kt @@ -44,5 +44,4 @@ class GitpodConnectorView( }.apply { this.background = WelcomeScreenUIManager.getMainAssociatedComponentBackground() } - -} \ No newline at end of file +} diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodRecentConnections.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodRecentConnections.kt index 9474f6caca02b4..3b075c7bfec45c 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodRecentConnections.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodRecentConnections.kt @@ -40,5 +40,4 @@ class GitpodRecentConnections : GatewayRecentConnections { this.view.refresh() } } - -} \ No newline at end of file +} diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodSettingsConfigurable.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodSettingsConfigurable.kt index ce6cd89cd925bf..931eee25ad31a5 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodSettingsConfigurable.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodSettingsConfigurable.kt @@ -42,5 +42,4 @@ class GitpodSettingsConfigurable : BoundConfigurable("Gitpod") { return@run null } } - -} \ No newline at end of file +} diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodSettingsState.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodSettingsState.kt index 82e86d8801c035..c0b7b879030865 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodSettingsState.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodSettingsState.kt @@ -22,7 +22,7 @@ class GitpodSettingsState : PersistentStateComponent { var gitpodHost: String = "gitpod.io" set(value) { if (value.isNullOrBlank()) { - return; + return } val gitpodHost = try { URL(value.trim()).host @@ -47,7 +47,7 @@ class GitpodSettingsState : PersistentStateComponent { listener() } } - dispatcher.addListener(internalListener); + dispatcher.addListener(internalListener) return Disposable { dispatcher.removeListener(internalListener) } } @@ -58,5 +58,4 @@ class GitpodSettingsState : PersistentStateComponent { override fun loadState(state: GitpodSettingsState) { XmlSerializerUtil.copyBean(state, this) } - -} \ No newline at end of file +} diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodStartWorkspaceView.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodStartWorkspaceView.kt index 134f8bf8d5d254..4cfe851b7caabe 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodStartWorkspaceView.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodStartWorkspaceView.kt @@ -149,4 +149,4 @@ class GitpodStartWorkspaceView( toDispose.add(GitpodAuthService.addListener { update() }) lifetime.onTerminationOrNow { toDispose.dispose() } } -} \ No newline at end of file +} diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodWorkspacesView.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodWorkspacesView.kt index 61c1e6c5c85dd8..b32b6426df64c9 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodWorkspacesView.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodWorkspacesView.kt @@ -180,7 +180,7 @@ class GitpodWorkspacesView( ensureActive() updateLifetime?.terminate() updateLifetime = lifetime.createNested() - doUpdate(updateLifetime, workspacesPane); + doUpdate(updateLifetime, workspacesPane) } } lifetime.onTerminationOrNow { updateActor.close() } @@ -239,7 +239,7 @@ class GitpodWorkspacesView( } } catch (e: Throwable) { thisLogger().error( - "${gitpodHost}: ${it.workspace.id}: failed to parse creation time", + "$gitpodHost: ${it.workspace.id}: failed to parse creation time", e ) null @@ -247,7 +247,7 @@ class GitpodWorkspacesView( } for (info in sortedInfos) { if (info.latestInstance == null) { - continue; + continue } indent { row { @@ -330,7 +330,7 @@ class GitpodWorkspacesView( try { info = client.syncWorkspace(update.workspaceId) } catch (t: Throwable) { - thisLogger().error("${gitpodHost}: ${update.workspaceId}: failed to sync", t) + thisLogger().error("$gitpodHost: ${update.workspaceId}: failed to sync", t) continue } workspacesMap[update.workspaceId] = info diff --git a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/icons/GitpodIcons.kt b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/icons/GitpodIcons.kt index caff51450146f4..b6b8d246fab9c4 100644 --- a/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/icons/GitpodIcons.kt +++ b/components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/icons/GitpodIcons.kt @@ -27,4 +27,4 @@ object GitpodIcons { @JvmField val Stopped = IconLoader.getIcon("/icons/stopped.svg", javaClass) -} \ No newline at end of file +}