mirror of
https://github.com/corda/corda.git
synced 2025-02-25 02:56:29 +00:00
Moved the various extension methods for creating Durations from Utils.kt to KotlinUtils.kt
This commit is contained in:
parent
65ce5fec4b
commit
561a329064
@ -10,7 +10,7 @@ import net.corda.core.messaging.StateMachineTransactionMapping
|
||||
import net.corda.core.messaging.StateMachineUpdate
|
||||
import net.corda.core.node.services.NetworkMapCache.MapChange
|
||||
import net.corda.core.node.services.Vault
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.core.utilities.NetworkHostAndPort
|
||||
import rx.Observable
|
||||
|
@ -12,8 +12,8 @@ import net.corda.core.crypto.random63BitValue
|
||||
import net.corda.core.future
|
||||
import net.corda.core.getOrThrow
|
||||
import net.corda.core.messaging.RPCOps
|
||||
import net.corda.core.millis
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.millis
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.utilities.NetworkHostAndPort
|
||||
import net.corda.core.utilities.Try
|
||||
import net.corda.node.services.messaging.RPCServerConfiguration
|
||||
|
@ -2,9 +2,9 @@ package net.corda.client.rpc.internal
|
||||
|
||||
import net.corda.core.logElapsedTime
|
||||
import net.corda.core.messaging.RPCOps
|
||||
import net.corda.core.minutes
|
||||
import net.corda.core.utilities.minutes
|
||||
import net.corda.core.crypto.random63BitValue
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.utilities.NetworkHostAndPort
|
||||
import net.corda.core.utilities.loggerFor
|
||||
import net.corda.nodeapi.ArtemisTcpTransport.Companion.tcpTransport
|
||||
|
@ -13,7 +13,7 @@ import net.corda.core.messaging.*
|
||||
import net.corda.core.node.NodeInfo
|
||||
import net.corda.core.node.services.Vault
|
||||
import net.corda.core.node.services.vault.*
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.utilities.OpaqueBytes
|
||||
import net.corda.core.utilities.loggerFor
|
||||
import net.corda.flows.CashIssueFlow
|
||||
|
@ -3,7 +3,7 @@ package net.corda.client.rpc
|
||||
import net.corda.client.rpc.internal.RPCClientConfiguration
|
||||
import net.corda.core.future
|
||||
import net.corda.core.messaging.RPCOps
|
||||
import net.corda.core.millis
|
||||
import net.corda.core.utilities.millis
|
||||
import net.corda.core.crypto.random63BitValue
|
||||
import net.corda.core.serialization.CordaSerializable
|
||||
import net.corda.node.services.messaging.RPCServerConfiguration
|
||||
|
@ -3,12 +3,11 @@ package net.corda.client.rpc
|
||||
import com.google.common.base.Stopwatch
|
||||
import net.corda.client.rpc.internal.RPCClientConfiguration
|
||||
import net.corda.core.messaging.RPCOps
|
||||
import net.corda.core.minutes
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.minutes
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.utilities.div
|
||||
import net.corda.node.services.messaging.RPCServerConfiguration
|
||||
import net.corda.testing.RPCDriverExposedDSLInterface
|
||||
import net.corda.testing.driver.ShutdownManager
|
||||
import net.corda.testing.measure
|
||||
import net.corda.testing.performance.startPublishingFixedRateInjector
|
||||
import net.corda.testing.performance.startReporter
|
||||
|
@ -36,14 +36,6 @@ import java.util.zip.ZipOutputStream
|
||||
import kotlin.concurrent.withLock
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
val Int.days: Duration get() = Duration.ofDays(this.toLong())
|
||||
@Suppress("unused") // It's here for completeness
|
||||
val Int.hours: Duration get() = Duration.ofHours(this.toLong())
|
||||
val Int.minutes: Duration get() = Duration.ofMinutes(this.toLong())
|
||||
val Int.seconds: Duration get() = Duration.ofSeconds(this.toLong())
|
||||
val Int.millis: Duration get() = Duration.ofMillis(this.toLong())
|
||||
|
||||
|
||||
// TODO: Review by EOY2016 if we ever found these utilities helpful.
|
||||
val Int.bd: BigDecimal get() = BigDecimal(this)
|
||||
val Double.bd: BigDecimal get() = BigDecimal(this)
|
||||
|
@ -1,5 +1,7 @@
|
||||
package net.corda.core.crypto
|
||||
|
||||
import net.corda.core.utilities.days
|
||||
import net.corda.core.utilities.millis
|
||||
import org.bouncycastle.asn1.ASN1Encodable
|
||||
import org.bouncycastle.asn1.x500.X500Name
|
||||
import org.bouncycastle.asn1.x500.X500NameBuilder
|
||||
@ -33,7 +35,7 @@ object X509Utilities {
|
||||
val CORDA_CLIENT_TLS = "cordaclienttls"
|
||||
val CORDA_CLIENT_CA = "cordaclientca"
|
||||
|
||||
private val DEFAULT_VALIDITY_WINDOW = Pair(Duration.ofMillis(0), Duration.ofDays(365 * 10))
|
||||
private val DEFAULT_VALIDITY_WINDOW = Pair(0.millis, 3650.days)
|
||||
/**
|
||||
* Helper function to return the latest out of an instant and an optional date.
|
||||
*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
package net.corda.core.node.services
|
||||
|
||||
import net.corda.core.contracts.TimeWindow
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.until
|
||||
import java.time.Clock
|
||||
import java.time.Duration
|
||||
|
@ -3,8 +3,15 @@ package net.corda.core.utilities
|
||||
import net.corda.core.serialization.CordaSerializable
|
||||
import org.slf4j.Logger
|
||||
import org.slf4j.LoggerFactory
|
||||
import java.time.Duration
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
//
|
||||
// READ ME FIRST:
|
||||
// This is a collection of public utilities useful only for Kotlin code. If you're looking to add a public utility that
|
||||
// is also relevant to Java then put it in Utils.kt.
|
||||
//
|
||||
|
||||
/**
|
||||
* Get the [Logger] for a class using the syntax
|
||||
*
|
||||
@ -22,6 +29,36 @@ inline fun Logger.debug(msg: () -> String) {
|
||||
if (isDebugEnabled) debug(msg())
|
||||
}
|
||||
|
||||
/**
|
||||
* Extension method for easier construction of [Duration]s in terms of integer days: `val twoDays = 2.days`.
|
||||
* @see Duration.ofDays
|
||||
*/
|
||||
inline val Int.days: Duration get() = Duration.ofDays(toLong())
|
||||
|
||||
/**
|
||||
* Extension method for easier construction of [Duration]s in terms of integer hours: `val twoHours = 2.hours`.
|
||||
* @see Duration.ofHours
|
||||
*/
|
||||
inline val Int.hours: Duration get() = Duration.ofHours(toLong())
|
||||
|
||||
/**
|
||||
* Extension method for easier construction of [Duration]s in terms of integer minutes: `val twoMinutes = 2.minutes`.
|
||||
* @see Duration.ofMinutes
|
||||
*/
|
||||
inline val Int.minutes: Duration get() = Duration.ofMinutes(toLong())
|
||||
|
||||
/**
|
||||
* Extension method for easier construction of [Duration]s in terms of integer seconds: `val twoSeconds = 2.seconds`.
|
||||
* @see Duration.ofSeconds
|
||||
*/
|
||||
inline val Int.seconds: Duration get() = Duration.ofSeconds(toLong())
|
||||
|
||||
/**
|
||||
* Extension method for easier construction of [Duration]s in terms of integer milliseconds: `val twoMillis = 2.millis`.
|
||||
* @see Duration.ofMillis
|
||||
*/
|
||||
inline val Int.millis: Duration get() = Duration.ofMillis(toLong())
|
||||
|
||||
/**
|
||||
* A simple wrapper that enables the use of Kotlin's `val x by transient { ... }` syntax. Such a property
|
||||
* will not be serialized, and if it's missing (or the first time it's accessed), the initializer will be
|
||||
|
@ -1,7 +1,7 @@
|
||||
package net.corda.core.node.services
|
||||
|
||||
import net.corda.core.contracts.TimeWindow
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import org.junit.Test
|
||||
import java.time.Clock
|
||||
import java.time.Instant
|
||||
|
@ -3,7 +3,7 @@ package net.corda.core.serialization
|
||||
import net.corda.core.contracts.*
|
||||
import net.corda.core.crypto.SecureHash
|
||||
import net.corda.core.identity.AbstractParty
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.transactions.TransactionBuilder
|
||||
import net.corda.testing.*
|
||||
import net.corda.testing.node.MockServices
|
||||
|
@ -20,13 +20,13 @@ import net.corda.core.transactions.WireTransaction
|
||||
import net.corda.core.utilities.ProgressTracker
|
||||
import net.corda.core.utilities.ProgressTracker.Step
|
||||
import net.corda.core.utilities.UntrustworthyData
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.utilities.unwrap
|
||||
import net.corda.testing.DUMMY_PUBKEY_1
|
||||
import net.corda.testing.contracts.DummyContract
|
||||
import net.corda.testing.contracts.DummyState
|
||||
import org.bouncycastle.asn1.x500.X500Name
|
||||
import java.security.PublicKey
|
||||
import java.time.Duration
|
||||
import java.time.Instant
|
||||
|
||||
// We group our two flows inside a singleton object to indicate that they work
|
||||
@ -280,11 +280,11 @@ object FlowCookbook {
|
||||
// We can also define a time window as an ``Instant`` +/- a time
|
||||
// tolerance (e.g. 30 seconds):
|
||||
// DOCSTART 42
|
||||
val ourTimeWindow2: TimeWindow = TimeWindow.withTolerance(Instant.now(), Duration.ofSeconds(30))
|
||||
val ourTimeWindow2: TimeWindow = TimeWindow.withTolerance(Instant.now(), 30.seconds)
|
||||
// DOCEND 42
|
||||
// Or as a start-time plus a duration:
|
||||
// DOCSTART 43
|
||||
val ourTimeWindow3: TimeWindow = TimeWindow.fromStartAndDuration(Instant.now(), Duration.ofSeconds(30))
|
||||
val ourTimeWindow3: TimeWindow = TimeWindow.fromStartAndDuration(Instant.now(), 30.seconds)
|
||||
// DOCEND 43
|
||||
|
||||
/**-----------------------
|
||||
@ -326,7 +326,7 @@ object FlowCookbook {
|
||||
// DOCEND 44
|
||||
// Or as a start time plus a duration (e.g. 45 seconds):
|
||||
// DOCSTART 45
|
||||
regTxBuilder.setTimeWindow(serviceHub.clock.instant(), Duration.ofSeconds(45))
|
||||
regTxBuilder.setTimeWindow(serviceHub.clock.instant(), 45.seconds)
|
||||
// DOCEND 45
|
||||
|
||||
/**----------------------
|
||||
|
@ -15,9 +15,9 @@ import net.corda.core.node.ServiceHub
|
||||
import net.corda.core.node.services.linearHeadsOfType
|
||||
import net.corda.core.serialization.CordaSerializable
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.utilities.unwrap
|
||||
import java.security.PublicKey
|
||||
import java.time.Duration
|
||||
|
||||
// DOCSTART 1
|
||||
// Helper method to locate the latest Vault version of a LinearState from a possibly out of date StateRef
|
||||
@ -123,7 +123,7 @@ class SubmitTradeApprovalFlow(val tradeId: String,
|
||||
// Create the TransactionBuilder and populate with the new state.
|
||||
val tx = TransactionType.General.Builder(notary)
|
||||
.withItems(tradeProposal, Command(TradeApprovalContract.Commands.Issue(), listOf(tradeProposal.source.owningKey)))
|
||||
tx.setTimeWindow(serviceHub.clock.instant(), Duration.ofSeconds(60))
|
||||
tx.setTimeWindow(serviceHub.clock.instant(), 60.seconds)
|
||||
// We can automatically sign as there is no untrusted data.
|
||||
val signedTx = serviceHub.signInitialTransaction(tx)
|
||||
// Notarise and distribute.
|
||||
@ -184,7 +184,7 @@ class SubmitCompletionFlow(val ref: StateRef, val verdict: WorkflowState) : Flow
|
||||
newState,
|
||||
Command(TradeApprovalContract.Commands.Completed(),
|
||||
listOf(serviceHub.myInfo.legalIdentity.owningKey, latestRecord.state.data.source.owningKey)))
|
||||
tx.setTimeWindow(serviceHub.clock.instant(), Duration.ofSeconds(60))
|
||||
tx.setTimeWindow(serviceHub.clock.instant(), 60.seconds)
|
||||
// We can sign this transaction immediately as we have already checked all the fields and the decision
|
||||
// is ultimately a manual one from the caller.
|
||||
// As a SignedTransaction we can pass the data around certain that it cannot be modified,
|
||||
|
@ -10,15 +10,15 @@ import net.corda.core.contracts.*
|
||||
import net.corda.core.contracts.clauses.*
|
||||
import net.corda.core.crypto.SecureHash
|
||||
import net.corda.core.crypto.entropyToKeyPair
|
||||
import net.corda.core.crypto.testing.NULL_PARTY
|
||||
import net.corda.core.crypto.random63BitValue
|
||||
import net.corda.core.identity.AbstractParty
|
||||
import net.corda.core.identity.AnonymousParty
|
||||
import net.corda.core.identity.Party
|
||||
import net.corda.core.crypto.random63BitValue
|
||||
import net.corda.core.serialization.CordaSerializable
|
||||
import net.corda.core.transactions.TransactionBuilder
|
||||
import net.corda.core.utilities.Emoji
|
||||
import net.corda.core.utilities.NonEmptySet
|
||||
import net.corda.core.utilities.seconds
|
||||
import org.bouncycastle.asn1.x500.X500Name
|
||||
import java.math.BigInteger
|
||||
import java.security.PublicKey
|
||||
@ -202,7 +202,7 @@ class Obligation<P : Any> : Contract {
|
||||
"amount in settle command ${command.value.amount} matches settled total $totalAmountSettled" using (command.value.amount == totalAmountSettled)
|
||||
"signatures are present from all obligors" using command.signers.containsAll(requiredSigners)
|
||||
"there are no zero sized inputs" using inputs.none { it.amount.quantity == 0L }
|
||||
"at obligor ${obligor} the obligations after settlement balance" using
|
||||
"at obligor $obligor the obligations after settlement balance" using
|
||||
(inputAmount == outputAmount + Amount(totalPenniesSettled, groupingKey))
|
||||
}
|
||||
return setOf(command.value)
|
||||
@ -264,7 +264,7 @@ class Obligation<P : Any> : Contract {
|
||||
|
||||
/** When the contract must be settled by. */
|
||||
val dueBefore: Instant,
|
||||
val timeTolerance: Duration = Duration.ofSeconds(30)
|
||||
val timeTolerance: Duration = 30.seconds
|
||||
) {
|
||||
val product: P
|
||||
get() = acceptableIssuedProducts.map { it.product }.toSet().single()
|
||||
|
@ -12,7 +12,7 @@ import net.corda.core.identity.AbstractParty
|
||||
import net.corda.core.identity.Party
|
||||
import net.corda.core.node.NodeInfo
|
||||
import net.corda.core.node.services.ServiceType
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.serialization.CordaSerializable
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.core.transactions.TransactionBuilder
|
||||
|
@ -8,7 +8,7 @@ import net.corda.core.identity.AbstractParty
|
||||
import net.corda.core.identity.AnonymousParty
|
||||
import net.corda.core.identity.Party
|
||||
import net.corda.core.node.NodeInfo
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.serialization.CordaSerializable
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.core.transactions.TransactionBuilder
|
||||
|
@ -3,12 +3,12 @@ package net.corda.contracts
|
||||
import net.corda.contracts.asset.*
|
||||
import net.corda.testing.contracts.fillWithSomeTestCash
|
||||
import net.corda.core.contracts.*
|
||||
import net.corda.core.days
|
||||
import net.corda.core.utilities.days
|
||||
import net.corda.core.identity.AnonymousParty
|
||||
import net.corda.core.identity.Party
|
||||
import net.corda.core.node.services.Vault
|
||||
import net.corda.core.node.services.VaultService
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.node.utilities.configureDatabase
|
||||
import net.corda.testing.*
|
||||
|
@ -6,16 +6,16 @@ import net.corda.contracts.asset.Obligation.Lifecycle
|
||||
import net.corda.core.contracts.*
|
||||
import net.corda.core.crypto.SecureHash
|
||||
import net.corda.core.crypto.testing.NULL_PARTY
|
||||
import net.corda.core.hours
|
||||
import net.corda.core.identity.AbstractParty
|
||||
import net.corda.core.identity.AnonymousParty
|
||||
import net.corda.core.utilities.NonEmptySet
|
||||
import net.corda.core.utilities.OpaqueBytes
|
||||
import net.corda.core.utilities.days
|
||||
import net.corda.core.utilities.hours
|
||||
import net.corda.testing.*
|
||||
import net.corda.testing.contracts.DummyState
|
||||
import net.corda.testing.node.MockServices
|
||||
import org.junit.Test
|
||||
import java.time.Duration
|
||||
import java.time.Instant
|
||||
import java.time.temporal.ChronoUnit
|
||||
import java.util.*
|
||||
@ -272,7 +272,7 @@ class ObligationTests {
|
||||
@Test
|
||||
fun `generate set lifecycle`() {
|
||||
// We don't actually verify the states, this is just here to make things look sensible
|
||||
val dueBefore = TEST_TX_TIME - Duration.ofDays(7)
|
||||
val dueBefore = TEST_TX_TIME - 7.days
|
||||
|
||||
// Generate a transaction issuing the obligation
|
||||
var tx = TransactionType.General.Builder(null).apply {
|
||||
@ -534,8 +534,8 @@ class ObligationTests {
|
||||
}
|
||||
|
||||
// Try defaulting an obligation due in the future
|
||||
val pastTestTime = TEST_TX_TIME - Duration.ofDays(7)
|
||||
val futureTestTime = TEST_TX_TIME + Duration.ofDays(7)
|
||||
val pastTestTime = TEST_TX_TIME - 7.days
|
||||
val futureTestTime = TEST_TX_TIME + 7.days
|
||||
transaction("Settlement") {
|
||||
input(oneMillionDollars.OBLIGATION between Pair(ALICE, BOB) `at` futureTestTime)
|
||||
output("Alice's defaulted $1,000,000 obligation to Bob") { (oneMillionDollars.OBLIGATION between Pair(ALICE, BOB) `at` futureTestTime).copy(lifecycle = Lifecycle.DEFAULTED) }
|
||||
|
@ -7,7 +7,7 @@ import net.corda.core.contracts.DOLLARS
|
||||
import net.corda.core.flows.FlowLogic
|
||||
import net.corda.core.flows.StartableByRPC
|
||||
import net.corda.core.messaging.startFlow
|
||||
import net.corda.core.minutes
|
||||
import net.corda.core.utilities.minutes
|
||||
import net.corda.core.node.services.ServiceInfo
|
||||
import net.corda.core.utilities.OpaqueBytes
|
||||
import net.corda.core.utilities.div
|
||||
|
@ -10,6 +10,7 @@ import net.corda.core.node.services.ServiceInfo
|
||||
import net.corda.core.serialization.CordaSerializable
|
||||
import net.corda.core.serialization.deserialize
|
||||
import net.corda.core.serialization.serialize
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.node.internal.Node
|
||||
import net.corda.node.services.api.DEFAULT_SESSION_ID
|
||||
import net.corda.node.services.messaging.*
|
||||
|
@ -6,7 +6,7 @@ import net.corda.core.crypto.cert
|
||||
import net.corda.core.crypto.random63BitValue
|
||||
import net.corda.core.getOrThrow
|
||||
import net.corda.core.node.NodeInfo
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.utilities.NonEmptySet
|
||||
import net.corda.node.internal.NetworkMapInfo
|
||||
import net.corda.node.services.config.configureWithDevSSLCertificate
|
||||
|
@ -8,11 +8,7 @@ import net.corda.core.*
|
||||
import net.corda.core.messaging.RPCOps
|
||||
import net.corda.core.node.ServiceHub
|
||||
import net.corda.core.node.services.ServiceInfo
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.NetworkHostAndPort
|
||||
import net.corda.core.utilities.loggerFor
|
||||
import net.corda.core.utilities.parseNetworkHostAndPort
|
||||
import net.corda.core.utilities.trace
|
||||
import net.corda.core.utilities.*
|
||||
import net.corda.node.VersionInfo
|
||||
import net.corda.node.serialization.NodeClock
|
||||
import net.corda.node.services.RPCUserService
|
||||
|
@ -4,17 +4,15 @@ import net.corda.core.crypto.*
|
||||
import net.corda.core.identity.AnonymousParty
|
||||
import net.corda.core.identity.PartyAndCertificate
|
||||
import net.corda.core.node.services.IdentityService
|
||||
import net.corda.core.utilities.days
|
||||
import net.corda.flows.AnonymisedIdentity
|
||||
import org.bouncycastle.cert.X509CertificateHolder
|
||||
import org.bouncycastle.operator.ContentSigner
|
||||
import java.security.KeyPair
|
||||
import java.security.PublicKey
|
||||
import java.security.Security
|
||||
import java.security.cert.CertPath
|
||||
import java.security.cert.CertificateFactory
|
||||
import java.security.cert.X509Certificate
|
||||
import java.time.Duration
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* Generates a new random [KeyPair], adds it to the internal key storage, then generates a corresponding
|
||||
@ -33,7 +31,7 @@ fun freshCertificate(identityService: IdentityService,
|
||||
issuerSigner: ContentSigner,
|
||||
revocationEnabled: Boolean = false): AnonymisedIdentity {
|
||||
val issuerCertificate = issuer.certificate
|
||||
val window = X509Utilities.getCertificateValidityWindow(Duration.ZERO, Duration.ofDays(10 * 365), issuerCertificate)
|
||||
val window = X509Utilities.getCertificateValidityWindow(Duration.ZERO, 3650.days, issuerCertificate)
|
||||
val ourCertificate = Crypto.createCertificate(CertificateType.IDENTITY, issuerCertificate.subject, issuerSigner, issuer.name, subjectPublicKey, window)
|
||||
val certFactory = CertificateFactory.getInstance("X509")
|
||||
val ourCertPath = certFactory.generateCertPath(listOf(ourCertificate.cert) + issuer.certPath.certificates)
|
||||
|
@ -11,9 +11,7 @@ import net.corda.core.internal.div
|
||||
import net.corda.core.node.NodeInfo
|
||||
import net.corda.core.node.services.NetworkMapCache
|
||||
import net.corda.core.node.services.NetworkMapCache.MapChange
|
||||
import net.corda.core.utilities.NetworkHostAndPort
|
||||
import net.corda.core.utilities.debug
|
||||
import net.corda.core.utilities.loggerFor
|
||||
import net.corda.core.utilities.*
|
||||
import net.corda.node.internal.Node
|
||||
import net.corda.node.services.RPCUserService
|
||||
import net.corda.node.services.config.NodeConfiguration
|
||||
|
@ -14,7 +14,7 @@ import com.google.common.collect.SetMultimap
|
||||
import com.google.common.util.concurrent.ThreadFactoryBuilder
|
||||
import net.corda.core.crypto.random63BitValue
|
||||
import net.corda.core.messaging.RPCOps
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.serialization.KryoPoolWithContext
|
||||
import net.corda.core.utilities.*
|
||||
import net.corda.node.services.RPCUserService
|
||||
|
@ -1,6 +1,5 @@
|
||||
package net.corda.node.utilities.registration
|
||||
|
||||
import net.corda.core.*
|
||||
import net.corda.core.crypto.CertificateType
|
||||
import net.corda.core.crypto.Crypto
|
||||
import net.corda.core.crypto.X509Utilities
|
||||
@ -9,6 +8,7 @@ import net.corda.core.crypto.X509Utilities.CORDA_CLIENT_TLS
|
||||
import net.corda.core.crypto.X509Utilities.CORDA_ROOT_CA
|
||||
import net.corda.core.crypto.cert
|
||||
import net.corda.core.internal.*
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.node.services.config.NodeConfiguration
|
||||
import net.corda.node.utilities.*
|
||||
import org.bouncycastle.cert.path.CertPath
|
||||
|
@ -8,7 +8,6 @@ import net.corda.core.contracts.*
|
||||
import net.corda.core.crypto.DigitalSignature
|
||||
import net.corda.core.crypto.SecureHash
|
||||
import net.corda.core.crypto.sign
|
||||
import net.corda.core.crypto.toStringShort
|
||||
import net.corda.core.flows.FlowLogic
|
||||
import net.corda.core.flows.InitiatedBy
|
||||
import net.corda.core.flows.InitiatingFlow
|
||||
@ -27,6 +26,7 @@ import net.corda.core.serialization.serialize
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.core.transactions.TransactionBuilder
|
||||
import net.corda.core.transactions.WireTransaction
|
||||
import net.corda.core.utilities.days
|
||||
import net.corda.core.utilities.toNonEmptySet
|
||||
import net.corda.core.utilities.unwrap
|
||||
import net.corda.flows.TwoPartyTradeFlow.Buyer
|
||||
|
@ -6,7 +6,7 @@ import net.corda.core.crypto.generateKeyPair
|
||||
import net.corda.core.getOrThrow
|
||||
import net.corda.core.identity.Party
|
||||
import net.corda.core.node.services.ServiceInfo
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.transactions.WireTransaction
|
||||
import net.corda.core.flows.NotaryChangeFlow
|
||||
import net.corda.core.flows.StateReplacementException
|
||||
|
@ -1,7 +1,7 @@
|
||||
package net.corda.node.services.events
|
||||
|
||||
import net.corda.core.contracts.*
|
||||
import net.corda.core.days
|
||||
import net.corda.core.utilities.days
|
||||
import net.corda.core.flows.FlowLogic
|
||||
import net.corda.core.flows.FlowLogicRef
|
||||
import net.corda.core.flows.FlowLogicRefFactory
|
||||
|
@ -10,7 +10,7 @@ import net.corda.core.flows.NotaryException
|
||||
import net.corda.core.flows.NotaryFlow
|
||||
import net.corda.core.getOrThrow
|
||||
import net.corda.core.node.services.ServiceInfo
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.node.internal.AbstractNode
|
||||
import net.corda.node.services.network.NetworkMapService
|
||||
|
@ -8,12 +8,12 @@ import net.corda.contracts.asset.DUMMY_CASH_ISSUER
|
||||
import net.corda.core.contracts.*
|
||||
import net.corda.core.crypto.entropyToKeyPair
|
||||
import net.corda.core.crypto.toBase58String
|
||||
import net.corda.core.days
|
||||
import net.corda.core.utilities.days
|
||||
import net.corda.core.identity.Party
|
||||
import net.corda.core.node.services.*
|
||||
import net.corda.core.node.services.vault.*
|
||||
import net.corda.core.node.services.vault.QueryCriteria.*
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.core.utilities.OpaqueBytes
|
||||
import net.corda.core.utilities.NonEmptySet
|
||||
|
@ -6,6 +6,8 @@ import co.paralleluniverse.fibers.Suspendable
|
||||
import co.paralleluniverse.strands.Strand
|
||||
import com.google.common.util.concurrent.SettableFuture
|
||||
import net.corda.core.getOrThrow
|
||||
import net.corda.core.utilities.hours
|
||||
import net.corda.core.utilities.minutes
|
||||
import net.corda.testing.node.TestClock
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
@ -44,7 +46,7 @@ class ClockUtilsTest {
|
||||
|
||||
@Test
|
||||
fun `test waiting negative time for a deadline`() {
|
||||
assertFalse(stoppedClock.awaitWithDeadline(stoppedClock.instant().minus(Duration.ofHours(1))), "Should have reached deadline")
|
||||
assertFalse(stoppedClock.awaitWithDeadline(stoppedClock.instant().minus(1.hours)), "Should have reached deadline")
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -56,13 +58,13 @@ class ClockUtilsTest {
|
||||
@Test
|
||||
fun `test waiting negative time for a deadline with incomplete future`() {
|
||||
val future = SettableFuture.create<Boolean>()
|
||||
assertFalse(stoppedClock.awaitWithDeadline(stoppedClock.instant().minus(Duration.ofHours(1)), future), "Should have reached deadline")
|
||||
assertFalse(stoppedClock.awaitWithDeadline(stoppedClock.instant().minus(1.hours), future), "Should have reached deadline")
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
fun `test waiting for a deadline with future completed before wait`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val future = SettableFuture.create<Boolean>()
|
||||
completeNow(future)
|
||||
assertTrue(stoppedClock.awaitWithDeadline(advancedClock.instant(), future), "Should not have reached deadline")
|
||||
@ -70,7 +72,7 @@ class ClockUtilsTest {
|
||||
|
||||
@Test
|
||||
fun `test waiting for a deadline with future completed after wait`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val future = SettableFuture.create<Boolean>()
|
||||
completeAfterWaiting(future)
|
||||
assertTrue(stoppedClock.awaitWithDeadline(advancedClock.instant(), future), "Should not have reached deadline")
|
||||
@ -78,38 +80,38 @@ class ClockUtilsTest {
|
||||
|
||||
@Test
|
||||
fun `test waiting for a deadline with clock advance`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val testClock = TestClock(stoppedClock)
|
||||
advanceClockAfterWait(testClock, Duration.ofHours(1))
|
||||
advanceClockAfterWait(testClock, 1.hours)
|
||||
assertFalse(testClock.awaitWithDeadline(advancedClock.instant()), "Should have reached deadline")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `test waiting for a deadline with clock advance and incomplete future`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val testClock = TestClock(stoppedClock)
|
||||
val future = SettableFuture.create<Boolean>()
|
||||
advanceClockAfterWait(testClock, Duration.ofHours(1))
|
||||
advanceClockAfterWait(testClock, 1.hours)
|
||||
assertFalse(testClock.awaitWithDeadline(advancedClock.instant(), future), "Should have reached deadline")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `test waiting for a deadline with clock advance and complete future`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(2))
|
||||
val advancedClock = Clock.offset(stoppedClock, 2.hours)
|
||||
val testClock = TestClock(stoppedClock)
|
||||
val future = SettableFuture.create<Boolean>()
|
||||
advanceClockAfterWait(testClock, Duration.ofHours(1))
|
||||
advanceClockAfterWait(testClock, 1.hours)
|
||||
completeAfterWaiting(future)
|
||||
assertTrue(testClock.awaitWithDeadline(advancedClock.instant(), future), "Should not have reached deadline")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `test waiting for a deadline with multiple clock advance and incomplete future`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val testClock = TestClock(stoppedClock)
|
||||
val future = SettableFuture.create<Boolean>()
|
||||
for (advance in 1..6) {
|
||||
advanceClockAfterWait(testClock, Duration.ofMinutes(10))
|
||||
advanceClockAfterWait(testClock, 10.minutes)
|
||||
}
|
||||
assertFalse(testClock.awaitWithDeadline(advancedClock.instant(), future), "Should have reached deadline")
|
||||
}
|
||||
@ -126,7 +128,7 @@ class ClockUtilsTest {
|
||||
}
|
||||
|
||||
val testClock = TestClock(stoppedClock)
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(10))
|
||||
val advancedClock = Clock.offset(stoppedClock, 10.hours)
|
||||
|
||||
try {
|
||||
testClock.awaitWithDeadline(advancedClock.instant(), SettableFuture.create<Boolean>())
|
||||
@ -138,7 +140,7 @@ class ClockUtilsTest {
|
||||
@Test
|
||||
@Suspendable
|
||||
fun `test waiting for a deadline with multiple clock advance and incomplete JDK8 future on Fibers`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val testClock = TestClock(stoppedClock)
|
||||
val future = CompletableFuture<Boolean>()
|
||||
val scheduler = FiberExecutorScheduler("test", executor)
|
||||
@ -151,7 +153,7 @@ class ClockUtilsTest {
|
||||
while (fiber.state != Strand.State.TIMED_WAITING) {
|
||||
Strand.sleep(1)
|
||||
}
|
||||
testClock.advanceBy(Duration.ofMinutes(10))
|
||||
testClock.advanceBy(10.minutes)
|
||||
}).start()
|
||||
}
|
||||
assertFalse(future.getOrThrow(), "Should have reached deadline")
|
||||
@ -160,7 +162,7 @@ class ClockUtilsTest {
|
||||
@Test
|
||||
@Suspendable
|
||||
fun `test waiting for a deadline with multiple clock advance and incomplete Guava future on Fibers`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val testClock = TestClock(stoppedClock)
|
||||
val future = SettableFuture.create<Boolean>()
|
||||
val scheduler = FiberExecutorScheduler("test", executor)
|
||||
@ -173,7 +175,7 @@ class ClockUtilsTest {
|
||||
while (fiber.state != Strand.State.TIMED_WAITING) {
|
||||
Strand.sleep(1)
|
||||
}
|
||||
testClock.advanceBy(Duration.ofMinutes(10))
|
||||
testClock.advanceBy(10.minutes)
|
||||
}).start()
|
||||
}
|
||||
assertFalse(future.getOrThrow(), "Should have reached deadline")
|
||||
|
@ -5,6 +5,8 @@ import co.paralleluniverse.fibers.Suspendable
|
||||
import co.paralleluniverse.strands.Strand
|
||||
import net.corda.core.RetryableException
|
||||
import net.corda.core.getOrThrow
|
||||
import net.corda.core.utilities.hours
|
||||
import net.corda.core.utilities.minutes
|
||||
import net.corda.testing.node.TestClock
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
@ -50,7 +52,7 @@ class FiberBoxTest {
|
||||
|
||||
@Test
|
||||
fun `readWithDeadline with no wait`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
|
||||
mutex.write { integer = 1 }
|
||||
assertEquals(1, mutex.readWithDeadline(realClock, advancedClock.instant()) { integer })
|
||||
@ -58,7 +60,7 @@ class FiberBoxTest {
|
||||
|
||||
@Test
|
||||
fun `readWithDeadline with stopped clock and background write`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
|
||||
assertEquals(1, mutex.readWithDeadline(stoppedClock, advancedClock.instant()) {
|
||||
backgroundWrite()
|
||||
@ -68,22 +70,22 @@ class FiberBoxTest {
|
||||
|
||||
@Test(expected = TestRetryableException::class)
|
||||
fun `readWithDeadline with clock advanced`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val testClock = TestClock(stoppedClock)
|
||||
|
||||
assertEquals(1, mutex.readWithDeadline(testClock, advancedClock.instant()) {
|
||||
backgroundAdvanceClock(testClock, Duration.ofHours(1))
|
||||
backgroundAdvanceClock(testClock, 1.hours)
|
||||
if (integer == 1) 0 else throw TestRetryableException("Not 1")
|
||||
})
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `readWithDeadline with clock advanced 5x and background write`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val testClock = TestClock(stoppedClock)
|
||||
|
||||
assertEquals(5, mutex.readWithDeadline(testClock, advancedClock.instant()) {
|
||||
backgroundAdvanceClock(testClock, Duration.ofMinutes(10))
|
||||
backgroundAdvanceClock(testClock, 10.minutes)
|
||||
backgroundWrite()
|
||||
if (integer == 5) 5 else throw TestRetryableException("Not 5")
|
||||
})
|
||||
@ -97,7 +99,7 @@ class FiberBoxTest {
|
||||
@Test(expected = TestRetryableException::class)
|
||||
@Suspendable
|
||||
fun `readWithDeadline with clock advanced on Fibers`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val testClock = TestClock(stoppedClock)
|
||||
val future = CompletableFuture<Int>()
|
||||
val scheduler = FiberExecutorScheduler("test", executor)
|
||||
@ -116,7 +118,7 @@ class FiberBoxTest {
|
||||
while (fiber.state != Strand.State.TIMED_WAITING) {
|
||||
Strand.sleep(1)
|
||||
}
|
||||
testClock.advanceBy(Duration.ofMinutes(10))
|
||||
testClock.advanceBy(10.minutes)
|
||||
}).start()
|
||||
}
|
||||
assertEquals(2, future.getOrThrow())
|
||||
@ -130,7 +132,7 @@ class FiberBoxTest {
|
||||
@Test
|
||||
@Suspendable
|
||||
fun `readWithDeadline with background write on Fibers`() {
|
||||
val advancedClock = Clock.offset(stoppedClock, Duration.ofHours(1))
|
||||
val advancedClock = Clock.offset(stoppedClock, 1.hours)
|
||||
val testClock = TestClock(stoppedClock)
|
||||
val future = CompletableFuture<Int>()
|
||||
val scheduler = FiberExecutorScheduler("test", executor)
|
||||
|
@ -6,15 +6,16 @@ import net.corda.core.getOrThrow
|
||||
import net.corda.core.node.services.ServiceInfo
|
||||
import net.corda.core.toFuture
|
||||
import net.corda.core.utilities.NetworkHostAndPort
|
||||
import net.corda.testing.DUMMY_BANK_A
|
||||
import net.corda.testing.DUMMY_BANK_B
|
||||
import net.corda.testing.DUMMY_NOTARY
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.irs.api.NodeInterestRates
|
||||
import net.corda.irs.contract.InterestRateSwap
|
||||
import net.corda.irs.utilities.uploadFile
|
||||
import net.corda.node.services.config.FullNodeConfiguration
|
||||
import net.corda.node.services.transactions.SimpleNotaryService
|
||||
import net.corda.nodeapi.User
|
||||
import net.corda.testing.DUMMY_BANK_A
|
||||
import net.corda.testing.DUMMY_BANK_B
|
||||
import net.corda.testing.DUMMY_NOTARY
|
||||
import net.corda.testing.IntegrationTestCategory
|
||||
import net.corda.testing.driver.driver
|
||||
import net.corda.testing.http.HttpApi
|
||||
@ -25,13 +26,12 @@ import rx.Observable
|
||||
import java.net.URL
|
||||
import java.time.Duration
|
||||
import java.time.LocalDate
|
||||
import java.time.temporal.ChronoUnit
|
||||
|
||||
class IRSDemoTest : IntegrationTestCategory {
|
||||
val rpcUser = User("user", "password", emptySet())
|
||||
val currentDate: LocalDate = LocalDate.now()
|
||||
val futureDate: LocalDate = currentDate.plusMonths(6)
|
||||
val maxWaitTime: Duration = Duration.of(60, ChronoUnit.SECONDS)
|
||||
val maxWaitTime: Duration = 60.seconds
|
||||
|
||||
@Test
|
||||
fun `runs IRS demo`() {
|
||||
|
@ -12,7 +12,7 @@ import net.corda.core.flows.SchedulableFlow
|
||||
import net.corda.core.identity.Party
|
||||
import net.corda.core.node.NodeInfo
|
||||
import net.corda.core.node.services.ServiceType
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.serialization.CordaSerializable
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.core.transactions.TransactionBuilder
|
||||
|
@ -1,7 +1,11 @@
|
||||
package net.corda.irs.utilities
|
||||
|
||||
import net.corda.core.contracts.TimeWindow
|
||||
import java.time.*
|
||||
import net.corda.core.utilities.hours
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalTime
|
||||
import java.time.ZoneId
|
||||
import java.time.ZonedDateTime
|
||||
|
||||
/**
|
||||
* This whole file exists as short cuts to get demos working. In reality we'd have static data and/or rules engine
|
||||
@ -16,5 +20,5 @@ fun suggestInterestRateAnnouncementTimeWindow(index: String, source: String, dat
|
||||
// Here we apply a blanket announcement time of 11:45 London irrespective of source or index
|
||||
val time = LocalTime.of(11, 45)
|
||||
val zoneId = ZoneId.of("Europe/London")
|
||||
return TimeWindow.fromStartAndDuration(ZonedDateTime.of(date, time, zoneId).toInstant(), Duration.ofHours(24))
|
||||
return TimeWindow.fromStartAndDuration(ZonedDateTime.of(date, time, zoneId).toInstant(), 24.hours)
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ package net.corda.irs.contract
|
||||
|
||||
import net.corda.contracts.*
|
||||
import net.corda.core.contracts.*
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.testing.DUMMY_NOTARY
|
||||
import net.corda.testing.DUMMY_NOTARY_KEY
|
||||
|
@ -2,7 +2,7 @@ package net.corda.vega.flows
|
||||
|
||||
import net.corda.core.contracts.StateAndRef
|
||||
import net.corda.core.identity.Party
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.flows.AbstractStateReplacementFlow
|
||||
import net.corda.core.flows.StateReplacementException
|
||||
import net.corda.vega.contracts.RevisionedState
|
||||
|
@ -4,7 +4,7 @@ import com.google.common.util.concurrent.Futures
|
||||
import net.corda.client.rpc.CordaRPCClient
|
||||
import net.corda.core.contracts.DOLLARS
|
||||
import net.corda.core.getOrThrow
|
||||
import net.corda.core.millis
|
||||
import net.corda.core.utilities.millis
|
||||
import net.corda.core.node.services.ServiceInfo
|
||||
import net.corda.testing.DUMMY_BANK_A
|
||||
import net.corda.testing.DUMMY_BANK_B
|
||||
|
@ -5,7 +5,7 @@ import net.corda.contracts.CommercialPaper
|
||||
import net.corda.contracts.asset.DUMMY_CASH_ISSUER
|
||||
import net.corda.core.contracts.*
|
||||
import net.corda.core.crypto.SecureHash
|
||||
import net.corda.core.days
|
||||
import net.corda.core.utilities.days
|
||||
import net.corda.core.flows.FinalityFlow
|
||||
import net.corda.core.flows.FlowLogic
|
||||
import net.corda.core.flows.InitiatingFlow
|
||||
@ -14,7 +14,7 @@ import net.corda.core.identity.AbstractParty
|
||||
import net.corda.core.identity.AnonymousParty
|
||||
import net.corda.core.identity.Party
|
||||
import net.corda.core.node.NodeInfo
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.transactions.SignedTransaction
|
||||
import net.corda.core.utilities.ProgressTracker
|
||||
import net.corda.flows.TwoPartyTradeFlow
|
||||
|
@ -4,7 +4,7 @@ import net.corda.core.contracts.*
|
||||
import net.corda.testing.contracts.DummyContract
|
||||
import net.corda.core.crypto.SecureHash
|
||||
import net.corda.core.identity.Party
|
||||
import net.corda.core.seconds
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.core.transactions.TransactionBuilder
|
||||
import java.security.PublicKey
|
||||
import java.time.Duration
|
||||
|
@ -4,7 +4,7 @@ import com.google.common.util.concurrent.ListenableFuture
|
||||
import com.google.common.util.concurrent.RateLimiter
|
||||
import com.google.common.util.concurrent.SettableFuture
|
||||
import net.corda.core.catch
|
||||
import net.corda.core.minutes
|
||||
import net.corda.core.utilities.minutes
|
||||
import net.corda.core.until
|
||||
import net.corda.core.utilities.loggerFor
|
||||
import net.corda.demobench.model.NodeConfig
|
||||
|
Loading…
x
Reference in New Issue
Block a user