From 6381b5e6a1a3cc77fab8486c336497f265ed7560 Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Mon, 13 Jun 2016 18:33:53 +0100 Subject: [PATCH 1/7] Added OkHttp and used it to clean up the HTTP calls in the demo and then moved those new functions to a util lib. --- build.gradle | 1 + src/main/kotlin/com/r3corda/demos/IRSDemo.kt | 73 +------------------ .../com/r3corda/demos/utilities/HttpUtils.kt | 39 ++++++++++ 3 files changed, 42 insertions(+), 71 deletions(-) create mode 100644 src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt diff --git a/build.gradle b/build.gradle index 39d87a3993..e2a00d8296 100644 --- a/build.gradle +++ b/build.gradle @@ -85,6 +85,7 @@ dependencies { compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" compile "org.jetbrains.kotlinx:kotlinx-support-jdk8:0.2" + compile 'com.squareup.okhttp3:okhttp:3.3.1' // Unit testing helpers. testCompile 'junit:junit:4.12' diff --git a/src/main/kotlin/com/r3corda/demos/IRSDemo.kt b/src/main/kotlin/com/r3corda/demos/IRSDemo.kt index c2a60d4609..1a91e48dd9 100644 --- a/src/main/kotlin/com/r3corda/demos/IRSDemo.kt +++ b/src/main/kotlin/com/r3corda/demos/IRSDemo.kt @@ -37,6 +37,8 @@ import java.nio.file.Paths import java.util.* import kotlin.concurrent.fixedRateTimer import kotlin.system.exitProcess +import org.apache.commons.io.IOUtils +import com.r3corda.demos.utilities.* // IRS DEMO // @@ -421,77 +423,6 @@ private fun runUploadRates(host: HostAndPort) { }) } -// Todo: Use a simpler library function for this and handle timeout exceptions -private fun sendJson(url: URL, data: String, method: String) : Boolean { - val connection = url.openConnection() as HttpURLConnection - connection.doOutput = true - connection.useCaches = false - connection.requestMethod = method - connection.connectTimeout = 5000 - connection.readTimeout = 60000 - connection.setRequestProperty("Connection", "Keep-Alive") - connection.setRequestProperty("Cache-Control", "no-cache") - connection.setRequestProperty("Content-Type", "application/json") - connection.setRequestProperty("Content-Length", data.length.toString()) - - try { - val outStream = DataOutputStream(connection.outputStream) - outStream.writeBytes(data) - outStream.close() - - return when (connection.responseCode) { - 200 -> true - 201 -> true - else -> { - println("Failed to " + method + " data. Status Code: " + connection.responseCode + ". Message: " + connection.responseMessage) - false - } - } - } catch(e: SocketTimeoutException) { - println("Server took too long to respond") - return false - } -} - -private fun putJson(url: URL, data: String) : Boolean { - return sendJson(url, data, "PUT") -} - -private fun postJson(url: URL, data: String) : Boolean { - return sendJson(url, data, "POST") -} - -// Todo: Use a simpler library function for this and handle timeout exceptions -private fun uploadFile(url: URL, file: String) : Boolean { - val boundary = "===" + System.currentTimeMillis() + "===" - val hyphens = "--" - val clrf = "\r\n" - - val connection = url.openConnection() as HttpURLConnection - connection.doOutput = true - connection.doInput = true - connection.useCaches = false - connection.requestMethod = "POST" - connection.connectTimeout = 5000 - connection.readTimeout = 60000 - connection.setRequestProperty("Connection", "Keep-Alive") - connection.setRequestProperty("Cache-Control", "no-cache") - connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary) - - val request = DataOutputStream(connection.outputStream) - request.writeBytes(hyphens + boundary + clrf) - request.writeBytes("Content-Disposition: form-data; name=\"rates\" filename=\"example.rates.txt\"$clrf") - request.writeBytes(clrf) - request.writeBytes(file) - request.writeBytes(clrf) - request.writeBytes(hyphens + boundary + hyphens + clrf) - - if (connection.responseCode == 200) { - return true - } else { - println("Could not upload file. Status Code: " + connection + ". Message: " + connection.responseMessage) - return false - } } private fun getNodeConfig(cliParams: CliParams.RunNode): NodeConfiguration { diff --git a/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt b/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt new file mode 100644 index 0000000000..f26340303d --- /dev/null +++ b/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt @@ -0,0 +1,39 @@ +package com.r3corda.demos.utilities + +import okhttp3.* +import java.net.URL +import java.util.concurrent.TimeUnit + +/** + * A small set of utilities for making HttpCalls, aimed at demos. + */ +private val client = OkHttpClient.Builder() + .connectTimeout(5, TimeUnit.SECONDS) + .readTimeout(15, TimeUnit.SECONDS).build(); + +fun putJson(url: URL, data: String) : Boolean { + val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), data) + return makeRequest(Request.Builder().url(url).put(body).build()) +} + +fun postJson(url: URL, data: String) : Boolean { + val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), data) + return makeRequest(Request.Builder().url(url).post(body).build()) +} + +fun uploadFile(url: URL, file: String) : Boolean { + val body = MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("rates", "example.rates.txt", RequestBody.create(MediaType.parse("text/plain"), file)) + .build(); + return makeRequest(Request.Builder().url(url).post(body).build()) +} + +private fun makeRequest(request: Request): Boolean { + val response = client.newCall(request).execute(); + + if (!response.isSuccessful) { + println("Could not fulfill HTTP request. Status Code: ${response.code()}. Message: ${response.body()}") + } + return response.isSuccessful +} \ No newline at end of file From 3651bd54aa1efa1e300806a00457e54d825c2185 Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Tue, 14 Jun 2016 11:28:28 +0100 Subject: [PATCH 2/7] Increased read timeout in order to avoid timeouts on long fixing periods (ie; 2020-01-01) on the IRS demo. --- src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt b/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt index f26340303d..f6d54e6a44 100644 --- a/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt +++ b/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt @@ -9,7 +9,7 @@ import java.util.concurrent.TimeUnit */ private val client = OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) - .readTimeout(15, TimeUnit.SECONDS).build(); + .readTimeout(60, TimeUnit.SECONDS).build(); fun putJson(url: URL, data: String) : Boolean { val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), data) From 98b02e9d3321acac12bb31378faf52f5b2560f31 Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Tue, 14 Jun 2016 16:41:08 +0100 Subject: [PATCH 3/7] Added some simple documentation to the IRSDemo. --- src/main/kotlin/com/r3corda/demos/IRSDemo.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/r3corda/demos/IRSDemo.kt b/src/main/kotlin/com/r3corda/demos/IRSDemo.kt index 1a91e48dd9..fd24b5929e 100644 --- a/src/main/kotlin/com/r3corda/demos/IRSDemo.kt +++ b/src/main/kotlin/com/r3corda/demos/IRSDemo.kt @@ -256,7 +256,7 @@ fun runIRSDemo(args: Array): Int { CliParams.parse(CliParamsSpec.parser.parse(*args)) } catch (e: Exception) { println(e) - printHelp() + printHelp(CliParamsSpec.parser) return 1 } @@ -462,8 +462,10 @@ private fun createDefaultConfigFile(configFile: File, legalName: String) { """.trimIndent().toByteArray()) } -private fun printHelp() { +private fun printHelp(parser: OptionParser) { println(""" - Please refer to the documentation in docs/build/index.html to learn how to run the demo. + Usage: irsdemo --role [NodeA|NodeB|Trade|Date] [|] [options] + Please refer to the documentation in docs/build/index.html for more info. + """.trimIndent()) } From 24deb5a79c2165484951761f9d05604ea22750f6 Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Tue, 14 Jun 2016 17:03:07 +0100 Subject: [PATCH 4/7] Added more useful help message that includes basic usage to the TraderDemo. --- src/main/kotlin/com/r3corda/demos/TraderDemo.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/r3corda/demos/TraderDemo.kt b/src/main/kotlin/com/r3corda/demos/TraderDemo.kt index c1e6fce49c..c5f62ea2b2 100644 --- a/src/main/kotlin/com/r3corda/demos/TraderDemo.kt +++ b/src/main/kotlin/com/r3corda/demos/TraderDemo.kt @@ -84,7 +84,7 @@ fun runTraderDemo(args: Array): Int { parser.parse(*args) } catch (e: Exception) { println(e.message) - println("Please refer to the documentation in docs/build/index.html to learn how to run the demo.") + printHelp(parser) return 1 } @@ -377,3 +377,13 @@ private class TraderDemoProtocolSeller(val otherSide: Party, } } + +private fun printHelp(parser: OptionParser) { + println(""" + Usage: trader-demo --role [BUYER|SELLER] [options] + Please refer to the documentation in docs/build/index.html for more info. + + """.trimIndent()) + parser.printHelpOn(System.out) +} + From d4da633b1eff016bbfd01965f24ca95b6b44c015 Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Thu, 7 Jul 2016 16:31:52 +0100 Subject: [PATCH 5/7] Fixed merge issues --- src/main/kotlin/com/r3corda/demos/IRSDemo.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/kotlin/com/r3corda/demos/IRSDemo.kt b/src/main/kotlin/com/r3corda/demos/IRSDemo.kt index fd24b5929e..6ced85929a 100644 --- a/src/main/kotlin/com/r3corda/demos/IRSDemo.kt +++ b/src/main/kotlin/com/r3corda/demos/IRSDemo.kt @@ -26,10 +26,7 @@ import com.typesafe.config.ConfigFactory import joptsimple.OptionParser import joptsimple.OptionSet import org.apache.commons.io.IOUtils -import java.io.DataOutputStream import java.io.File -import java.net.HttpURLConnection -import java.net.SocketTimeoutException import java.net.URL import java.nio.file.Files import java.nio.file.Path @@ -37,7 +34,6 @@ import java.nio.file.Paths import java.util.* import kotlin.concurrent.fixedRateTimer import kotlin.system.exitProcess -import org.apache.commons.io.IOUtils import com.r3corda.demos.utilities.* // IRS DEMO @@ -423,8 +419,6 @@ private fun runUploadRates(host: HostAndPort) { }) } -} - private fun getNodeConfig(cliParams: CliParams.RunNode): NodeConfiguration { if (!Files.exists(cliParams.dir)) { throw NotSetupException("Missing config directory. Please run node setup before running the node") From 01e64d303056ba01e233f6af8c7ab17ee7b2ac0b Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Thu, 7 Jul 2016 17:23:14 +0100 Subject: [PATCH 6/7] Fixed merge conflicts. --- src/main/kotlin/com/r3corda/demos/IRSDemo.kt | 1 + src/main/kotlin/com/r3corda/demos/TraderDemo.kt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/com/r3corda/demos/IRSDemo.kt b/src/main/kotlin/com/r3corda/demos/IRSDemo.kt index 6ced85929a..0a2f3cdd13 100644 --- a/src/main/kotlin/com/r3corda/demos/IRSDemo.kt +++ b/src/main/kotlin/com/r3corda/demos/IRSDemo.kt @@ -462,4 +462,5 @@ private fun printHelp(parser: OptionParser) { Please refer to the documentation in docs/build/index.html for more info. """.trimIndent()) + parser.printHelpOn(System.out) } diff --git a/src/main/kotlin/com/r3corda/demos/TraderDemo.kt b/src/main/kotlin/com/r3corda/demos/TraderDemo.kt index c5f62ea2b2..d994281a20 100644 --- a/src/main/kotlin/com/r3corda/demos/TraderDemo.kt +++ b/src/main/kotlin/com/r3corda/demos/TraderDemo.kt @@ -71,7 +71,6 @@ fun main(args: Array) { } fun runTraderDemo(args: Array): Int { - val cashIssuerKey = generateKeyPair() val parser = OptionParser() val roleArg = parser.accepts("role").withRequiredArg().ofType(Role::class.java).required() From 639df4dcb90edebc7271efe81ad6ef57713f0cfa Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Fri, 8 Jul 2016 10:48:55 +0100 Subject: [PATCH 7/7] Http Client is now lazy init. --- src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt b/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt index f6d54e6a44..24d09b7b09 100644 --- a/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt +++ b/src/main/kotlin/com/r3corda/demos/utilities/HttpUtils.kt @@ -7,9 +7,11 @@ import java.util.concurrent.TimeUnit /** * A small set of utilities for making HttpCalls, aimed at demos. */ -private val client = OkHttpClient.Builder() +private val client by lazy { + OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS).build(); +} fun putJson(url: URL, data: String) : Boolean { val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), data)