From 691b622cf0043e6ea4f980903a9dc90ff578b538 Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Wed, 19 Apr 2017 16:00:48 +0200 Subject: [PATCH] DemoBench: address review comments and fix refresh bug --- tools/demobench/build.gradle | 4 --- .../kotlin/net/corda/demobench/DemoBench.kt | 3 -- .../corda/demobench/model/NodeController.kt | 1 - .../kotlin/net/corda/demobench/pty/R3Pty.kt | 4 +-- .../net/corda/demobench/views/NodeTabView.kt | 32 ++++++++----------- .../corda/demobench/views/NodeTerminalView.kt | 16 ++++++---- .../net/corda/demobench/web/WebServer.kt | 1 - .../demobench/web/WebServerController.kt | 2 -- .../demobench/views/NodeTerminalView.fxml | 5 ++- 9 files changed, 27 insertions(+), 41 deletions(-) diff --git a/tools/demobench/build.gradle b/tools/demobench/build.gradle index 8b2a9e0f62..6d5de77dd8 100644 --- a/tools/demobench/build.gradle +++ b/tools/demobench/build.gradle @@ -38,10 +38,6 @@ repositories { } } -compileKotlin { - kotlinOptions.jvmTarget= "1.8" -} - dependencies { // TornadoFX: A lightweight Kotlin framework for working with JavaFX UI's. compile "no.tornado:tornadofx:$tornadofx_version" diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/DemoBench.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/DemoBench.kt index 4cb33ffb04..2dd37fd648 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/DemoBench.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/DemoBench.kt @@ -5,8 +5,6 @@ import net.corda.demobench.views.DemoBenchView import tornadofx.* import java.io.InputStreamReader import java.nio.charset.StandardCharsets.UTF_8 -import javax.swing.SwingUtilities -import javax.swing.UIManager /** * README! @@ -38,7 +36,6 @@ import javax.swing.UIManager */ class DemoBench : App(DemoBenchView::class) { - /* * This entry point is needed by JavaPackager, as * otherwise the packaged application cannot run. diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt index 38243165ed..974696ed41 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt @@ -25,7 +25,6 @@ class NodeController(check: atRuntime = ::checkExists) : Controller() { private var baseDir: Path = baseDirFor(ManagementFactory.getRuntimeMXBean().startTime) private val cordaPath: Path = jvm.applicationDir.resolve("corda").resolve("corda.jar") - //private val command = arrayOf("/usr/local/bin/fish") private val command = jvm.commandFor(cordaPath).toTypedArray() private val nodes = LinkedHashMap() diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt index a1ac7f40fb..f38c1f1e0c 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt @@ -11,7 +11,7 @@ import java.nio.charset.StandardCharsets.UTF_8 import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -class R3Pty(val name: String, settings: SettingsProvider, dimension: Dimension, val onExit: () -> Unit) : AutoCloseable { +class R3Pty(val name: String, settings: SettingsProvider, dimension: Dimension, val onExit: (Int) -> Unit) : AutoCloseable { private companion object { val log = loggerFor() } @@ -57,7 +57,7 @@ class R3Pty(val name: String, settings: SettingsProvider, dimension: Dimension, executor.submit { val exitValue = connector.waitFor() log.info("Terminal has exited (value={})", exitValue) - onExit() + onExit(exitValue) } val session = terminal.createTerminalSession(connector) diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt index 231db1b994..b9e2ace161 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt @@ -21,7 +21,6 @@ import net.corda.demobench.model.* import net.corda.demobench.ui.CloseableTab import tornadofx.* import java.nio.file.Path -import java.text.DecimalFormat import java.util.* class NodeTabView : Fragment() { @@ -34,13 +33,7 @@ class NodeTabView : Fragment() { const val textWidth = 465.0 const val maxNameLength = 15 - val integerFormat = DecimalFormat() - val jvm by inject() - - init { - integerFormat.isGroupingUsed = false - } } private val nodeController by inject() @@ -215,7 +208,6 @@ class NodeTabView : Fragment() { val config = nodeController.validate(model.item) if (config != null) { nodeConfigView.isVisible = false - nodeTab.graphic = ImageView(flags.get()[model.nearestCity.value.countryCode]).apply { fitWidth = 24.0; isPreserveRatio = true } config.install(cordapps) launchNode(config) } @@ -230,22 +222,24 @@ class NodeTabView : Fragment() { } private fun launchNode(config: NodeConfig) { + val countryCode = CityDatabase.cityMap[config.nearestCity]?.countryCode + if (countryCode != null) { + nodeTab.graphic = ImageView(flags.get()[countryCode]).apply { fitWidth = 24.0; isPreserveRatio = true } + } nodeTab.text = config.legalName - nodeTerminalView.open(config, onExit = { onTerminalExit(config) }) + nodeTerminalView.open(config) { exitCode -> + Platform.runLater { + if (exitCode == 0) + nodeTab.requestClose() + nodeController.dispose(config) + main.forceAtLeastOneTab() + } + } nodeTab.setOnSelectionChanged { if (nodeTab.isSelected) { - // Doesn't work yet - nodeTerminalView.refreshTerminal() + nodeTerminalView.takeFocus() } } } - - private fun onTerminalExit(config: NodeConfig) { - Platform.runLater { - nodeTab.requestClose() - nodeController.dispose(config) - main.forceAtLeastOneTab() - } - } } diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt index 4bb090be94..41bda9c809 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt @@ -22,7 +22,6 @@ import net.corda.demobench.ui.PropertyLabel import net.corda.demobench.web.DBViewer import net.corda.demobench.web.WebServerController import tornadofx.* -import java.awt.Color import java.awt.Dimension import java.util.logging.Level import javax.swing.SwingUtilities @@ -50,12 +49,12 @@ class NodeTerminalView : Fragment() { private var rpc: NodeRPC? = null private var pty: R3Pty? = null private lateinit var logo: ImageView + private lateinit var swingTerminal: SwingNode - fun open(config: NodeConfig, onExit: () -> Unit) { + fun open(config: NodeConfig, onExit: (Int) -> Unit) { nodeName.text = config.legalName - launchWebButton.text = "Launch\nWeb Server\n(Port ${config.webPort})" - val swingTerminal = SwingNode() + swingTerminal = SwingNode() swingTerminal.setOnMouseClicked { swingTerminal.requestFocus() } @@ -139,6 +138,7 @@ class NodeTerminalView : Fragment() { webServer.open(config, onExit = { launchWebButton.isDisable = false + app.hostServices.showDocument("http://localhost:${config.webPort}/") }) } } @@ -174,8 +174,12 @@ class NodeTerminalView : Fragment() { } } - fun refreshTerminal() { - // TODO - Force a repaint somehow? My naive attempts have not worked. + fun takeFocus() { + // Request focus. This also forces a repaint, without this, for some reason the terminal has gone to sleep + // and is no longer updating in response to new data from the pty. + Platform.runLater { + swingTerminal.requestFocus() + } } // TODO - Will change when we modify RPC Observables handling. diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/web/WebServer.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/web/WebServer.kt index 7cd5480204..1154c9456f 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/web/WebServer.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/web/WebServer.kt @@ -68,5 +68,4 @@ class WebServer internal constructor(private val webServerController: WebServerC log.error("Failed to close stream: '{}'", e.message) } } - } diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/web/WebServerController.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/web/WebServerController.kt index 9af01e60b1..a73f652cac 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/web/WebServerController.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/web/WebServerController.kt @@ -4,7 +4,6 @@ import net.corda.demobench.model.JVMConfig import tornadofx.* class WebServerController : Controller() { - private val jvm by inject() private val webserverPath = jvm.applicationDir.resolve("corda").resolve("corda-webserver.jar") @@ -15,5 +14,4 @@ class WebServerController : Controller() { internal fun process() = jvm.processFor(webserverPath) fun webServer() = WebServer(this) - } diff --git a/tools/demobench/src/main/resources/net/corda/demobench/views/NodeTerminalView.fxml b/tools/demobench/src/main/resources/net/corda/demobench/views/NodeTerminalView.fxml index 70a418cace..4724ee7c23 100644 --- a/tools/demobench/src/main/resources/net/corda/demobench/views/NodeTerminalView.fxml +++ b/tools/demobench/src/main/resources/net/corda/demobench/views/NodeTerminalView.fxml @@ -3,17 +3,16 @@ - + - -