From 02323e8207dcb5cccb6d2b19a2f8500bf1f1f3ae Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Mon, 30 Jan 2017 13:57:43 +0000 Subject: [PATCH] Launch DB viewer for node. --- tools/demobench/build.gradle | 9 ++-- .../net/corda/demobench/model/DBViewer.kt | 53 +++++++++++++++++++ .../net/corda/demobench/model/NodeConfig.kt | 6 +++ .../corda/demobench/model/NodeController.kt | 1 + .../net/corda/demobench/model/NodeData.kt | 5 +- .../corda/demobench/model/NodeDataModel.kt | 1 + .../net/corda/demobench/views/NodeTabView.kt | 16 ++++++ .../corda/demobench/views/NodeTerminalView.kt | 11 +++- .../org/h2/server/web/LocalWebServer.kt | 22 ++++++++ 9 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 tools/demobench/src/main/kotlin/net/corda/demobench/model/DBViewer.kt create mode 100644 tools/demobench/src/main/kotlin/org/h2/server/web/LocalWebServer.kt diff --git a/tools/demobench/build.gradle b/tools/demobench/build.gradle index 58ae835a85..2673096da9 100644 --- a/tools/demobench/build.gradle +++ b/tools/demobench/build.gradle @@ -1,15 +1,15 @@ group 'net.corda' -version '0.8-SNAPSHOT' +version "$corda_version" buildscript { ext.kotlin_version = '1.0.6' ext.tornadofx_version = '1.6.0' + ext.h2_version = '1.4.193' ext.jna_version = '4.1.0' ext.purejavacomm_version = '0.0.17' ext.guava_version = '14.0.1' ext.slf4j_version = '1.7.22' ext.logback_version = '1.1.3' - ext.typesafeconfig_version = '1.3.1' repositories { mavenCentral() @@ -44,6 +44,7 @@ dependencies { compile "no.tornado:tornadofx:$tornadofx_version" compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compile "com.h2database:h2:$h2_version" compile "net.java.dev.jna:jna:$jna_version" compile "net.java.dev.jna:jna-platform:$jna_version" compile "com.google.guava:guava:$guava_version" @@ -51,11 +52,11 @@ dependencies { compile "org.slf4j:log4j-over-slf4j:$slf4j_version" compile "org.slf4j:jul-to-slf4j:$slf4j_version" compile "ch.qos.logback:logback-classic:$logback_version" - compile "com.typesafe:config:$typesafeconfig_version" + compile "com.typesafe:config:$typesafe_config_version" compile ":jediterm-terminal-2.5" compile ':pty4j-0.7.2' - testCompile group: 'junit', name: 'junit', version: '4.11' + testCompile group: 'junit', name: 'junit', version: "$junit_version" } jar { diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/DBViewer.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/DBViewer.kt new file mode 100644 index 0000000000..49876c639b --- /dev/null +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/DBViewer.kt @@ -0,0 +1,53 @@ +package net.corda.demobench.model + +import org.h2.server.web.LocalWebServer +import org.h2.tools.Server +import org.h2.util.JdbcUtils +import org.slf4j.LoggerFactory +import java.util.concurrent.Executors + + +class DBViewer : AutoCloseable { + private val log = LoggerFactory.getLogger(DBViewer::class.java) + + private val webServer: Server + private val pool = Executors.newCachedThreadPool() + private val t = Thread("DBViewer") + + override fun close() { + webServer.shutdown() + pool.shutdown() + t.join() + } + + fun openBrowser(h2Port: Int) { + val conn = JdbcUtils.getConnection( + "org.h2.Driver", + "jdbc:h2:tcp://localhost:%d/node".format(h2Port), + "sa", + "" + ) + + val url = (webServer.service as LocalWebServer).addSession(conn) + log.info("URL: {}", url) + + pool.execute { + Server.openBrowser(url) + } + } + + init { + val ws = LocalWebServer() + webServer = Server(ws, "-webPort", "0") + ws.setShutdownHandler(webServer) + + webServer.setShutdownHandler { + webServer.stop() + } + + t.run { + webServer.start() + } + } + +} diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt index 0154882eb2..8fe052f40d 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt @@ -11,6 +11,7 @@ class NodeConfig( artemisPort: Int, nearestCity: String, webPort: Int, + h2Port: Int, extraServices: List ) : NetworkMapConfig(legalName, artemisPort) { @@ -22,6 +23,10 @@ class NodeConfig( val webPort : Int get() { return webPortValue } + private var h2PortValue: Int = h2Port + val h2Port : Int + get() { return h2PortValue } + private var extraServicesValue: List = extraServices val extraServices : List get() { return extraServicesValue } @@ -43,6 +48,7 @@ class NodeConfig( } )) .withValue("webAddress", addressValueFor(webPort)) .withValue("rpcUsers", valueFor(listOf())) + .withValue("h2port", valueFor(h2Port)) .withValue("useTestClock", valueFor(true)) } 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 56f3d852c0..cd22ef2043 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 @@ -34,6 +34,7 @@ class NodeController : Controller() { nodeData.artemisPort.value, nodeData.nearestCity.value.trim(), nodeData.webPort.value, + nodeData.h2Port.value, nodeData.extraServices.value ) diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeData.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeData.kt index ac1220256c..921d311882 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeData.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeData.kt @@ -9,8 +9,9 @@ class NodeData { val legalName = SimpleStringProperty("") val nearestCity = SimpleStringProperty("London") - val artemisPort = SimpleIntegerProperty(0) - val webPort = SimpleIntegerProperty(0) + val artemisPort = SimpleIntegerProperty() + val webPort = SimpleIntegerProperty() + val h2Port = SimpleIntegerProperty() val extraServices = SimpleListProperty(mutableListOf().observable()) } diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeDataModel.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeDataModel.kt index b9504e24f9..2bde3ce0ea 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeDataModel.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeDataModel.kt @@ -8,5 +8,6 @@ class NodeDataModel : ItemViewModel(NodeData()) { val nearestCity = bind { item?.nearestCity } val artemisPort = bind { item?.artemisPort } val webPort = bind { item?.webPort } + val h2Port = bind { item?.h2Port } } 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 d4ef891cd2..f18faeecbd 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 @@ -92,6 +92,21 @@ class NodeTabView : Fragment() { } } } + field("Database Port") { + textfield(model.h2Port, NumberStringConverter(INTEGER_FORMAT)) { + minWidth = 100.0 + maxWidth = 100.0 + validator { + if ((it == null) || it.isEmpty()) { + error("Port number required") + } else if (it.contains(NOT_NUMBER)) { + error("Invalid port number") + } else { + null + } + } + } + } } fieldset("Services") { @@ -144,5 +159,6 @@ class NodeTabView : Fragment() { model.artemisPort.value = nodeController.nextPort model.webPort.value = nodeController.nextPort + model.h2Port.value = nodeController.nextPort } } 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 eea8d24b76..28e4ee1b69 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 @@ -10,6 +10,7 @@ import javafx.scene.control.Label import javafx.scene.layout.Priority import javafx.scene.layout.VBox import javax.swing.SwingUtilities +import net.corda.demobench.model.DBViewer import net.corda.demobench.model.NodeConfig import net.corda.demobench.model.NodeController import net.corda.demobench.pty.R3Pty @@ -20,7 +21,7 @@ import tornadofx.vgrow class NodeTerminalView : Fragment() { override val root by fxml() - private val controller by inject() + private val nodeController by inject() private val nodeName by fxid