Added Javadoc to the cordformation plugin.

This commit is contained in:
Clinton Alexander 2016-10-07 14:30:08 +01:00
parent d85c82d505
commit 1535af50ef
3 changed files with 151 additions and 12 deletions

View File

@ -2,27 +2,54 @@ package com.r3corda.plugins
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Paths import java.nio.file.Paths
/**
* Creates nodes based on the configuration of this task in the gradle configuration DSL.
*
* See documentation for examples.
*/
class Cordform extends DefaultTask { class Cordform extends DefaultTask {
protected Path directory = Paths.get("./build/nodes") protected Path directory = Paths.get("./build/nodes")
protected List<Node> nodes = new ArrayList<Node>() protected List<Node> nodes = new ArrayList<Node>()
protected String networkMapNodeName protected String networkMapNodeName
public String directory(String directory) { /**
* Set the directory to install nodes into.
*
* @param directory The directory the nodes will be installed into.
* @return
*/
public void directory(String directory) {
this.directory = Paths.get(directory) this.directory = Paths.get(directory)
} }
public String networkMap(String nodeName) { /**
* Set the network map node.
*
* @warning Ensure the node name is one of the configured nodes.
* @param nodeName The name of one the node that will host the network map.
*/
public void networkMap(String nodeName) {
networkMapNodeName = nodeName networkMapNodeName = nodeName
} }
/**
* Add a node configuration.
*
* @param configureClosure A node configuration that will be deployed.
*/
public void node(Closure configureClosure) { public void node(Closure configureClosure) {
nodes << project.configure(new Node(project), configureClosure) nodes << project.configure(new Node(project), configureClosure)
} }
/**
* Returns a node by name.
*
* @param name The name of the node as specified in the node configuration DSL.
* @return A node instance.
*/
protected Node getNodeByName(String name) { protected Node getNodeByName(String name) {
for(Node node : nodes) { for(Node node : nodes) {
if(node.name.equals(networkMapNodeName)) { if(node.name.equals(networkMapNodeName)) {
@ -33,6 +60,9 @@ class Cordform extends DefaultTask {
return null return null
} }
/**
* Installs the run script into the nodes directory.
*/
protected void installRunScript() { protected void installRunScript() {
project.copy { project.copy {
from Cordformation.getPluginFile(project, "com/r3corda/plugins/runnodes") from Cordformation.getPluginFile(project, "com/r3corda/plugins/runnodes")
@ -42,8 +72,11 @@ class Cordform extends DefaultTask {
} }
} }
/**
* This task action will create and install the nodes based on the node configurations added.
*/
@TaskAction @TaskAction
def build() { void build() {
installRunScript() installRunScript()
Node networkMapNode = getNodeByName(networkMapNodeName) Node networkMapNode = getNodeByName(networkMapNodeName)
nodes.each { nodes.each {

View File

@ -2,14 +2,20 @@ package com.r3corda.plugins
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.resources.TextResource
/**
* The Cordformation plugin deploys nodes to a directory in a state ready to be used by a developer for experimentation,
* testing, and debugging. It will prepopulate several fields in the configuration and create a simple node runner.
*/
class Cordformation implements Plugin<Project> { class Cordformation implements Plugin<Project> {
void apply(Project project) { /**
* Gets a resource file from this plugin's JAR file.
} *
* @param project The project environment this plugin executes in.
static def getPluginFile(Project project, String filePathInJar) { * @param filePathInJar The file in the JAR, relative to root, you wish to access.
* @return A file handle to the file in the JAR.
*/
static File getPluginFile(Project project, String filePathInJar) {
return project.resources.text.fromArchiveEntry(project.buildscript.configurations.classpath.find { return project.resources.text.fromArchiveEntry(project.buildscript.configurations.classpath.find {
it.name.contains('cordformation') it.name.contains('cordformation')
}, filePathInJar).asFile() }, filePathInJar).asFile()

View File

@ -1,11 +1,16 @@
package com.r3corda.plugins package com.r3corda.plugins
import org.gradle.api.file.FileCollection
import org.gradle.api.internal.file.AbstractFileCollection import org.gradle.api.internal.file.AbstractFileCollection
/**
* Represents a node that will be installed.
*/
class Node { class Node {
static final String JAR_NAME = 'corda.jar' static final String JAR_NAME = 'corda.jar'
/**
* Name of the node.
*/
public String name public String name
private String dirName private String dirName
private String nearestCity private String nearestCity
@ -20,50 +25,108 @@ class Node {
private File nodeDir private File nodeDir
private def project private def project
/**
* Set the name of the node.
*
* @param name The node name.
*/
void name(String name) { void name(String name) {
this.name = name this.name = name
} }
/**
* Set the directory the node will be installed to relative to the directory specified in Cordform task.
*
* @param dirName Subdirectory name for node to be installed to. Must be valid directory name on all OSes.
*/
void dirName(String dirName) { void dirName(String dirName) {
this.dirName = dirName this.dirName = dirName
} }
/**
* Set the nearest city to the node.
*
* @param nearestCity The name of the nearest city to the node.
*/
void nearestCity(String nearestCity) { void nearestCity(String nearestCity) {
this.nearestCity = nearestCity this.nearestCity = nearestCity
} }
/**
* Sets whether this node will be a notary
*
* @param isNotary True if this node is a notary.
*/
void notary(Boolean isNotary) { void notary(Boolean isNotary) {
this.isNotary = isNotary this.isNotary = isNotary
} }
/**
* Sets whether this node will use HTTPS communication.
*
* @param isHttps True if this node uses HTTPS communication.
*/
void https(Boolean isHttps) { void https(Boolean isHttps) {
this.isHttps = isHttps this.isHttps = isHttps
} }
/**
* Set the advertised services for this node.
*
* @param advertisedServices A list of advertised services ID strings.
*/
void advertisedServices(List<String> advertisedServices) { void advertisedServices(List<String> advertisedServices) {
this.advertisedServices = advertisedServices this.advertisedServices = advertisedServices
} }
/**
* Set the artemis port for this node.
*
* @param artemisPort The artemis messaging queue port.
*/
void artemisPort(Integer artemisPort) { void artemisPort(Integer artemisPort) {
this.artemisPort = artemisPort this.artemisPort = artemisPort
} }
/**
* Set the HTTP web server port for this node.
*
* @param webPort The web port number for this node.
*/
void webPort(Integer webPort) { void webPort(Integer webPort) {
this.webPort = webPort this.webPort = webPort
} }
/**
* Set the network map address for this node.
*
* @warning This should not be directly set unless you know what you are doing. Use the networkMapName in the
* Cordform task instead.
* @param networkMapAddress Network map address.
*/
void networkMapAddress(String networkMapAddress) { void networkMapAddress(String networkMapAddress) {
this.networkMapAddress = networkMapAddress this.networkMapAddress = networkMapAddress
} }
/**
* Set the list of cordapps to use on this node.
*
* @note Your app will be installed by default and does not need to be included here.
* @param cordapps The list of cordapps to install to the plugins directory.
*/
void cordapps(List<String> cordapps) { void cordapps(List<String> cordapps) {
this.cordapps = cordapps this.cordapps = cordapps
} }
Node(def project) { Node(Project project) {
this.project = project this.project = project
} }
/**
* Install the nodes to the given base directory.
*
* @param baseDir The base directory for this node. All other paths are relative to it + this nodes dir name.
*/
void build(File baseDir) { void build(File baseDir) {
nodeDir = new File(baseDir, dirName) nodeDir = new File(baseDir, dirName)
installCordaJAR() installCordaJAR()
@ -73,10 +136,18 @@ class Node {
installConfig() installConfig()
} }
/**
* Get the artemis address for this node.
*
* @return This node's artemis address.
*/
String getArtemisAddress() { String getArtemisAddress() {
return "localhost:" + artemisPort return "localhost:" + artemisPort
} }
/**
* Installs the corda fat JAR to the node directory.
*/
private void installCordaJAR() { private void installCordaJAR() {
def cordaJar = verifyAndGetCordaJar() def cordaJar = verifyAndGetCordaJar()
project.copy { project.copy {
@ -86,6 +157,9 @@ class Node {
} }
} }
/**
* Installs this project's cordapp to this directory.
*/
private void installBuiltPlugin() { private void installBuiltPlugin() {
def pluginsDir = getAndCreateDirectory(nodeDir, "plugins") def pluginsDir = getAndCreateDirectory(nodeDir, "plugins")
project.copy { project.copy {
@ -94,6 +168,9 @@ class Node {
} }
} }
/**
* Installs other cordapps to this node's plugins directory.
*/
private void installCordapps() { private void installCordapps() {
def pluginsDir = getAndCreateDirectory(nodeDir, "plugins") def pluginsDir = getAndCreateDirectory(nodeDir, "plugins")
def cordapps = getCordappList() def cordapps = getCordappList()
@ -103,6 +180,9 @@ class Node {
} }
} }
/**
* Installs other dependencies to this node's dependencies directory.
*/
private void installDependencies() { private void installDependencies() {
def cordaJar = verifyAndGetCordaJar() def cordaJar = verifyAndGetCordaJar()
def cordappList = getCordappList() def cordappList = getCordappList()
@ -114,6 +194,9 @@ class Node {
} }
} }
/**
* Installs the configuration file to this node's directory and detokenises it.
*/
private void installConfig() { private void installConfig() {
project.copy { project.copy {
from Cordformation.getPluginFile(project, 'com/r3corda/plugins/nodetemplate.conf') from Cordformation.getPluginFile(project, 'com/r3corda/plugins/nodetemplate.conf')
@ -133,6 +216,11 @@ class Node {
} }
} }
/**
* Find the corda JAR amongst the dependencies.
*
* @return A file representing the Corda JAR.
*/
private File verifyAndGetCordaJar() { private File verifyAndGetCordaJar() {
def maybeCordaJAR = project.configurations.runtime.filter { it.toString().contains("corda-${project.corda_version}.jar")} def maybeCordaJAR = project.configurations.runtime.filter { it.toString().contains("corda-${project.corda_version}.jar")}
if(maybeCordaJAR.size() == 0) { if(maybeCordaJAR.size() == 0) {
@ -144,6 +232,11 @@ class Node {
} }
} }
/**
* Gets a list of cordapps based on what dependent cordapps were specified.
*
* @return List of this node's cordapps.
*/
private AbstractFileCollection getCordappList() { private AbstractFileCollection getCordappList() {
def cordaJar = verifyAndGetCordaJar() def cordaJar = verifyAndGetCordaJar()
return project.configurations.runtime.filter { return project.configurations.runtime.filter {
@ -152,6 +245,13 @@ class Node {
} }
} }
/**
* Create a directory if it doesn't exist and return the file representation of it.
*
* @param baseDir The base directory to create the directory at.
* @param subDirName A valid name of the subdirectory to get and create if not exists.
* @return A file representing the subdirectory.
*/
private static File getAndCreateDirectory(File baseDir, String subDirName) { private static File getAndCreateDirectory(File baseDir, String subDirName) {
File dir = new File(baseDir, subDirName) File dir = new File(baseDir, subDirName)
assert(!dir.exists() || dir.isDirectory()) assert(!dir.exists() || dir.isDirectory())