Skip to content

Commit bd8f2c7

Browse files
yaohui-wyhroboquat
authored andcommitted
[jb] enable connect button only when JetBrains Client not activated
1 parent d1e7d83 commit bd8f2c7

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodConnectionProvider.kt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import com.fasterxml.jackson.databind.DeserializationFeature
99
import com.fasterxml.jackson.databind.PropertyNamingStrategies
1010
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
1111
import com.intellij.ide.BrowserUtil
12+
import com.intellij.openapi.Disposable
1213
import com.intellij.openapi.components.service
14+
import com.intellij.openapi.diagnostic.Logger
1315
import com.intellij.openapi.diagnostic.thisLogger
1416
import com.intellij.remote.RemoteCredentialsHolder
1517
import com.intellij.ssh.AskAboutHostKey
@@ -20,6 +22,7 @@ import com.intellij.ui.components.JBTextArea
2022
import com.intellij.ui.dsl.builder.panel
2123
import com.intellij.ui.dsl.gridLayout.HorizontalAlign
2224
import com.intellij.ui.dsl.gridLayout.VerticalAlign
25+
import com.intellij.util.EventDispatcher
2326
import com.intellij.util.application
2427
import com.intellij.util.io.DigestUtil
2528
import com.intellij.util.ui.JBFont
@@ -32,6 +35,8 @@ import com.jetbrains.gateway.ssh.ClientOverSshTunnelConnector
3235
import com.jetbrains.gateway.thinClientLink.ThinClientHandle
3336
import com.jetbrains.rd.util.URI
3437
import com.jetbrains.rd.util.lifetime.Lifetime
38+
import com.jetbrains.rd.util.lifetime.isAlive
39+
import com.jetbrains.rd.util.lifetime.onTermination
3540
import io.gitpod.gitpodprotocol.api.entities.WorkspaceInstance
3641
import io.gitpod.jetbrains.icons.GitpodIcons
3742
import kotlinx.coroutines.*
@@ -52,6 +57,26 @@ class GitpodConnectionProvider : GatewayConnectionProvider {
5257

5358
private val gitpod = service<GitpodConnectionService>()
5459

60+
companion object {
61+
var jetbrainsClientMap: MutableMap<String, ThinClientHandle> = mutableMapOf()
62+
63+
private val dispatcher = EventDispatcher.create(Listener::class.java)
64+
65+
private interface Listener : EventListener {
66+
fun didChange()
67+
}
68+
69+
fun addListener(listener: () -> Unit): Disposable {
70+
val internalListener = object : Listener {
71+
override fun didChange() {
72+
listener()
73+
}
74+
}
75+
dispatcher.addListener(internalListener);
76+
return Disposable { dispatcher.removeListener(internalListener) }
77+
}
78+
}
79+
5580
private val httpClient = HttpClient.newBuilder()
5681
.followRedirects(HttpClient.Redirect.ALWAYS)
5782
.build()
@@ -234,18 +259,27 @@ class GitpodConnectionProvider : GatewayConnectionProvider {
234259
)
235260
val client = connector.connect()
236261
client.clientClosed.advise(connectionLifetime) {
262+
thisLogger().d("clientClosed, ${client.prettyPrint()}")
237263
application.invokeLater {
264+
connectionLifetime.onTermination {
265+
thisLogger().d("clientTermination, clientClosed didChange fired, ${client.prettyPrint()}")
266+
dispatcher.multicaster.didChange()
267+
}
238268
connectionLifetime.terminate()
239269
}
240270
}
241271
client.onClientPresenceChanged.advise(connectionLifetime) {
272+
thisLogger().d("presenceChanged, ${client.prettyPrint()}")
242273
application.invokeLater {
274+
thisLogger().d("clientPresenceChanged didChange fired, ${client.prettyPrint()}")
275+
dispatcher.multicaster.didChange()
243276
if (client.clientPresent) {
244277
statusMessage.text = ""
245278
}
246279
}
247280
}
248281
thinClient = client
282+
jetbrainsClientMap[update.workspaceId] = client
249283
} catch (t: Throwable) {
250284
if (t is CancellationException) {
251285
throw t
@@ -444,3 +478,11 @@ class GitpodConnectionProvider : GatewayConnectionProvider {
444478
private data class SSHHostKey(val type: String, val hostKey: String)
445479

446480
}
481+
482+
fun ThinClientHandle.prettyPrint(): String {
483+
return "uid=${uid}, clientPresent=${clientPresent}, lifeTime={status=${lifetime.status}, alive=${lifetime.isAlive}}"
484+
}
485+
486+
fun Logger.d(message: String) {
487+
thisLogger().info("[jb-gw] $message")
488+
}

components/ide/jetbrains/gateway-plugin/src/main/kotlin/io/gitpod/jetbrains/gateway/GitpodWorkspacesView.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,13 @@ class GitpodWorkspacesView(
168168
init {
169169
refresh()
170170
loggedIn.addListener { refresh() }
171+
GitpodConnectionProvider.addListener {
172+
thisLogger().d("WorkspaceView refresh, " +
173+
GitpodConnectionProvider.jetbrainsClientMap
174+
.map { "[wsId=${it.key}, ${it.value.prettyPrint()}]" }
175+
.joinToString("; "))
176+
refresh()
177+
}
171178
}
172179

173180
private fun startUpdateLoop(lifetime: Lifetime, workspacesPane: JBScrollPane): () -> Unit {
@@ -293,7 +300,10 @@ class GitpodWorkspacesView(
293300
)
294301
}
295302
label(getRelativeTimeSpan(info.latestInstance.creationTime))
296-
button("Connect") {
303+
val jbClientConnected = GitpodConnectionProvider.jetbrainsClientMap[info.workspace.id]
304+
?.lifetime?.isAlive ?: false
305+
val btnText = if (jbClientConnected) "Connected" else "Connect"
306+
button(btnText) {
297307
if (!canConnect) {
298308
BrowserUtil.browse(info.latestInstance.ideUrl)
299309
} else {
@@ -304,7 +314,7 @@ class GitpodWorkspacesView(
304314
)
305315
)
306316
}
307-
}
317+
}.enabled(!jbClientConnected)
308318
cell()
309319
}.layout(RowLayout.PARENT_GRID)
310320
}

0 commit comments

Comments
 (0)