From 5ee7930a1600743c51e1f3008b31a08cfc3631bb Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Fri, 27 Jan 2017 16:25:49 +0000 Subject: [PATCH] Allow configuration of extra network services. --- .../net/corda/demobench/model/NodeConfig.kt | 15 ++++++-- .../corda/demobench/model/NodeController.kt | 4 ++- .../net/corda/demobench/model/NodeData.kt | 3 ++ .../demobench/model/ServiceController.kt | 36 +++++++++++++++++++ .../net/corda/demobench/views/NodeTabView.kt | 28 +++++++++------ .../corda/demobench/views/NodeTerminalView.kt | 2 +- .../src/main/resources/services.conf | 3 ++ 7 files changed, 77 insertions(+), 14 deletions(-) create mode 100644 tools/demobench/src/main/kotlin/net/corda/demobench/model/ServiceController.kt create mode 100644 tools/demobench/src/main/resources/services.conf 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 88e14b5393..0154882eb2 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 @@ -4,8 +4,15 @@ import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import com.typesafe.config.ConfigValue import com.typesafe.config.ConfigValueFactory +import java.lang.String.join -class NodeConfig(legalName: String, artemisPort: Int, nearestCity: String, webPort: Int) : NetworkMapConfig(legalName, artemisPort){ +class NodeConfig( + legalName: String, + artemisPort: Int, + nearestCity: String, + webPort: Int, + extraServices: List +) : NetworkMapConfig(legalName, artemisPort) { private var nearestCityName: String = nearestCity val nearestCity : String @@ -15,6 +22,10 @@ class NodeConfig(legalName: String, artemisPort: Int, nearestCity: String, webPo val webPort : Int get() { return webPortValue } + private var extraServicesValue: List = extraServices + val extraServices : List + get() { return extraServicesValue } + private var networkMapValue: NetworkMapConfig? = null var networkMap : NetworkMapConfig? get() { return networkMapValue } @@ -25,7 +36,7 @@ class NodeConfig(legalName: String, artemisPort: Int, nearestCity: String, webPo .withValue("myLegalName", valueFor(legalName)) .withValue("artemisAddress", addressValueFor(artemisPort)) .withValue("nearestCity", valueFor(nearestCity)) - .withValue("extraAdvertisedServiceIds", valueFor("")) + .withValue("extraAdvertisedServiceIds", valueFor(join(",", extraServices))) .withFallback(optional("networkMapService", networkMap, { c, n -> c.withValue("address", addressValueFor(n.artemisPort)) .withValue("legalName", valueFor(n.legalName)) 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 c9949a46df..56f3d852c0 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 @@ -33,7 +33,8 @@ class NodeController : Controller() { nodeData.legalName.value.trim(), nodeData.artemisPort.value, nodeData.nearestCity.value.trim(), - nodeData.webPort.value + nodeData.webPort.value, + nodeData.extraServices.value ) if (nodes.putIfAbsent(config.key, config) != null) { @@ -77,6 +78,7 @@ class NodeController : Controller() { confFile.writeText(fileData.root().render(renderOptions)) pty.run(command, System.getenv(), nodeDir.toString()) + log.info("Launched node: " + config.legalName) return true } catch (e: Exception) { log.severe("Failed to launch Corda:" + e) 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 8a706990d3..ac1220256c 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 @@ -1,6 +1,8 @@ package net.corda.demobench.model +import tornadofx.observable import javafx.beans.property.SimpleIntegerProperty +import javafx.beans.property.SimpleListProperty import javafx.beans.property.SimpleStringProperty class NodeData { @@ -9,5 +11,6 @@ class NodeData { val nearestCity = SimpleStringProperty("London") val artemisPort = SimpleIntegerProperty(0) val webPort = SimpleIntegerProperty(0) + val extraServices = SimpleListProperty(mutableListOf().observable()) } diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/ServiceController.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/ServiceController.kt new file mode 100644 index 0000000000..3271fd85ba --- /dev/null +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/ServiceController.kt @@ -0,0 +1,36 @@ +package net.corda.demobench.model + +import tornadofx.Controller +import java.io.File +import java.util.* + +class ServiceController : Controller() { + + private var serviceSet : List + + val services : List + get() = serviceSet + + private fun loadConf(name: String): List { + val set = HashSet() + File(name).readLines().forEach { + val service = it.trim() + set.add(service) + + log.info("Supports: " + service) + } + return set.toList() + } + + init { + /* + * Load our list of known extra Corda services. + */ + val serviceConf = javaClass.classLoader.getResource("services.conf") + serviceSet = if (serviceConf == null) { + emptyList() + } else { + loadConf(serviceConf.file) + } + } +} \ No newline at end of file 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 243429533d..d4ef891cd2 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 @@ -1,10 +1,11 @@ package net.corda.demobench.views import java.text.DecimalFormat +import javafx.scene.control.SelectionMode.MULTIPLE import javafx.util.converter.NumberStringConverter import net.corda.demobench.model.NodeController import net.corda.demobench.model.NodeDataModel -import net.corda.demobench.model.toKey +import net.corda.demobench.model.ServiceController import net.corda.demobench.ui.CloseableTab import tornadofx.* @@ -17,10 +18,11 @@ class NodeTabView : Fragment() { private val NOT_NUMBER = "[^\\d]".toRegex() private val model = NodeDataModel() - private val controller by inject() + private val nodeController by inject() + private val serviceController by inject() private val nodeTerminalView = find() - private val nodeConfigView = pane { + private val nodeConfigView = stackpane { form { fieldset("Configuration") { field("Node Name") { @@ -34,7 +36,7 @@ class NodeTabView : Fragment() { val name = it.trim() if (name.isEmpty()) { error("Node name is required") - } else if (controller.nameExists(name)) { + } else if (nodeController.nameExists(name)) { error("Node with this name already exists") } else if (name.length > 10) { error("Name is too long") @@ -92,13 +94,19 @@ class NodeTabView : Fragment() { } } - fieldset("Plugins") { + fieldset("Services") { + listview(serviceController.services.observable()) { + selectionModel.selectionMode = MULTIPLE + model.item.extraServices.set(selectionModel.selectedItems) + } } button("Create Node") { setOnAction() { - launch() - main.enableAddNodes() + if (model.validate()) { + launch() + main.enableAddNodes() + } } } } @@ -108,7 +116,7 @@ class NodeTabView : Fragment() { fun launch() { model.commit() - val config = controller.validate(model.item) + val config = nodeController.validate(model.item) if (config != null) { nodeConfigView.isVisible = false nodeTab.text = config.legalName @@ -134,7 +142,7 @@ class NodeTabView : Fragment() { root.add(nodeConfigView) root.add(nodeTerminalView) - model.artemisPort.value = controller.nextPort - model.webPort.value = controller.nextPort + model.artemisPort.value = nodeController.nextPort + model.webPort.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 6ae79b593a..eea8d24b76 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 @@ -60,7 +60,7 @@ class NodeTerminalView : Fragment() { fun refreshTerminal() { SwingUtilities.invokeLater { - // TODO + // TODO - Force a repaint somehow? My naive attempts have not worked. } } diff --git a/tools/demobench/src/main/resources/services.conf b/tools/demobench/src/main/resources/services.conf new file mode 100644 index 0000000000..790f51d8dc --- /dev/null +++ b/tools/demobench/src/main/resources/services.conf @@ -0,0 +1,3 @@ +corda.notary.validating +corda.notary.simple +corda.interest_rates