Skip to content

Commit 18a547a

Browse files
Using flow logic extensions for test CorDapp.
1 parent 62a66cf commit 18a547a

File tree

10 files changed

+275
-105
lines changed

10 files changed

+275
-105
lines changed

onixlabs-corda-test-workflow/src/main/kotlin/io/onixlabs/corda/test/workflow/AmendCustomerFlow.kt

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,44 @@
1717
package io.onixlabs.corda.test.workflow
1818

1919
import co.paralleluniverse.fibers.Suspendable
20-
import io.onixlabs.corda.core.workflow.firstNotary
21-
import io.onixlabs.corda.core.workflow.getPreferredNotary
22-
import io.onixlabs.corda.core.workflow.initiateFlows
20+
import io.onixlabs.corda.core.workflow.*
2321
import io.onixlabs.corda.test.contract.Customer
2422
import io.onixlabs.corda.test.contract.CustomerContract
2523
import net.corda.core.contracts.StateAndRef
2624
import net.corda.core.flows.*
2725
import net.corda.core.identity.Party
2826
import net.corda.core.transactions.SignedTransaction
29-
import net.corda.core.transactions.TransactionBuilder
27+
import net.corda.core.utilities.ProgressTracker
3028

3129
class AmendCustomerFlow(
3230
private val oldCustomer: StateAndRef<Customer>,
3331
private val newCustomer: Customer,
3432
private val notary: Party,
35-
private val sessions: Set<FlowSession> = emptySet()
33+
private val sessions: Set<FlowSession> = emptySet(),
34+
override val progressTracker: ProgressTracker = tracker()
3635
) : FlowLogic<SignedTransaction>() {
3736

37+
companion object {
38+
@JvmStatic
39+
fun tracker() = ProgressTracker(
40+
BuildingTransactionStep,
41+
VerifyingTransactionStep,
42+
SigningTransactionStep,
43+
FinalizingTransactionStep
44+
)
45+
}
46+
3847
@Suspendable
3948
override fun call(): SignedTransaction {
40-
val transaction = with(TransactionBuilder(notary)) {
49+
val transaction = buildTransaction(notary) {
4150
addInputState(oldCustomer)
4251
addOutputState(newCustomer)
4352
addCommand(CustomerContract.Amend, newCustomer.owner.owningKey)
4453
}
4554

46-
transaction.verify(serviceHub)
47-
val signedTransaction = serviceHub.signInitialTransaction(transaction, newCustomer.owner.owningKey)
48-
return subFlow(FinalityFlow(signedTransaction, sessions))
55+
verifyTransaction(transaction)
56+
val signedTransaction = signTransaction(transaction)
57+
return finalizeTransaction(signedTransaction, sessions)
4958
}
5059

5160
@StartableByRPC
@@ -58,15 +67,24 @@ class AmendCustomerFlow(
5867
private val observers: Set<Party> = emptySet()
5968
) : FlowLogic<SignedTransaction>() {
6069

70+
private companion object {
71+
object AmendingCustomerStep : ProgressTracker.Step("Amended customer.") {
72+
override fun childProgressTracker() = tracker()
73+
}
74+
}
75+
76+
override val progressTracker = ProgressTracker(AmendingCustomerStep)
77+
6178
@Suspendable
6279
override fun call(): SignedTransaction {
63-
val sessions = initiateFlows(observers)
80+
currentStep(AmendingCustomerStep)
6481
return subFlow(
6582
AmendCustomerFlow(
6683
oldCustomer,
6784
newCustomer,
6885
notary ?: getPreferredNotary { firstNotary },
69-
sessions
86+
initiateFlows(observers, oldCustomer.state.data, newCustomer),
87+
AmendingCustomerStep.childProgressTracker()
7088
)
7189
)
7290
}

onixlabs-corda-test-workflow/src/main/kotlin/io/onixlabs/corda/test/workflow/AmendCustomerFlowHandler.kt

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,46 @@
1717
package io.onixlabs.corda.test.workflow
1818

1919
import co.paralleluniverse.fibers.Suspendable
20+
import io.onixlabs.corda.core.workflow.RecordingFinalizedTransactionStep
21+
import io.onixlabs.corda.core.workflow.currentStep
22+
import io.onixlabs.corda.core.workflow.finalizeTransactionHandler
2023
import net.corda.core.flows.FlowLogic
2124
import net.corda.core.flows.FlowSession
2225
import net.corda.core.flows.InitiatedBy
23-
import net.corda.core.flows.ReceiveFinalityFlow
2426
import net.corda.core.node.StatesToRecord
2527
import net.corda.core.transactions.SignedTransaction
28+
import net.corda.core.utilities.ProgressTracker
2629

27-
class AmendCustomerFlowHandler(private val session: FlowSession) : FlowLogic<SignedTransaction>() {
30+
class AmendCustomerFlowHandler(
31+
private val session: FlowSession,
32+
override val progressTracker: ProgressTracker = tracker()
33+
) : FlowLogic<SignedTransaction>() {
34+
35+
companion object {
36+
@JvmStatic
37+
fun tracker() = ProgressTracker(RecordingFinalizedTransactionStep)
38+
}
2839

2940
@Suspendable
3041
override fun call(): SignedTransaction {
31-
return subFlow(ReceiveFinalityFlow(session, statesToRecord = StatesToRecord.ALL_VISIBLE))
42+
return finalizeTransactionHandler(session, statesToRecord = StatesToRecord.ALL_VISIBLE)
3243
}
3344

3445
@InitiatedBy(AmendCustomerFlow.Initiator::class)
3546
private class Handler(private val session: FlowSession) : FlowLogic<SignedTransaction>() {
3647

48+
private companion object {
49+
object ObservingAmendedCustomerStep : ProgressTracker.Step("Observing amended customer.") {
50+
override fun childProgressTracker() = tracker()
51+
}
52+
}
53+
54+
override val progressTracker = ProgressTracker(ObservingAmendedCustomerStep)
55+
3756
@Suspendable
3857
override fun call(): SignedTransaction {
39-
return subFlow(AmendCustomerFlowHandler(session))
58+
currentStep(ObservingAmendedCustomerStep)
59+
return subFlow(AmendCustomerFlowHandler(session, ObservingAmendedCustomerStep.childProgressTracker()))
4060
}
4161
}
4262
}

onixlabs-corda-test-workflow/src/main/kotlin/io/onixlabs/corda/test/workflow/IssueCustomerFlow.kt

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,41 @@
1717
package io.onixlabs.corda.test.workflow
1818

1919
import co.paralleluniverse.fibers.Suspendable
20-
import io.onixlabs.corda.core.workflow.firstNotary
21-
import io.onixlabs.corda.core.workflow.getPreferredNotary
22-
import io.onixlabs.corda.core.workflow.initiateFlows
20+
import io.onixlabs.corda.core.workflow.*
2321
import io.onixlabs.corda.test.contract.Customer
2422
import io.onixlabs.corda.test.contract.CustomerContract
2523
import net.corda.core.flows.*
2624
import net.corda.core.identity.Party
2725
import net.corda.core.transactions.SignedTransaction
28-
import net.corda.core.transactions.TransactionBuilder
26+
import net.corda.core.utilities.ProgressTracker
2927

3028
class IssueCustomerFlow(
3129
private val customer: Customer,
3230
private val notary: Party,
33-
private val sessions: Set<FlowSession> = emptySet()
31+
private val sessions: Set<FlowSession> = emptySet(),
32+
override val progressTracker: ProgressTracker = tracker()
3433
) : FlowLogic<SignedTransaction>() {
3534

35+
companion object {
36+
@JvmStatic
37+
fun tracker() = ProgressTracker(
38+
BuildingTransactionStep,
39+
VerifyingTransactionStep,
40+
SigningTransactionStep,
41+
FinalizingTransactionStep
42+
)
43+
}
44+
3645
@Suspendable
3746
override fun call(): SignedTransaction {
38-
val transaction = with(TransactionBuilder(notary)) {
47+
val transaction = buildTransaction(notary) {
3948
addOutputState(customer)
4049
addCommand(CustomerContract.Issue, customer.owner.owningKey)
4150
}
4251

43-
transaction.verify(serviceHub)
44-
val signedTransaction = serviceHub.signInitialTransaction(transaction, customer.owner.owningKey)
45-
return subFlow(FinalityFlow(signedTransaction, sessions))
52+
verifyTransaction(transaction)
53+
val signedTransaction = signTransaction(transaction)
54+
return finalizeTransaction(signedTransaction, sessions)
4655
}
4756

4857
@StartableByRPC
@@ -54,14 +63,23 @@ class IssueCustomerFlow(
5463
private val observers: Set<Party> = emptySet()
5564
) : FlowLogic<SignedTransaction>() {
5665

66+
private companion object {
67+
object IssuingCustomerStep : ProgressTracker.Step("Issuing customer.") {
68+
override fun childProgressTracker() = tracker()
69+
}
70+
}
71+
72+
override val progressTracker = ProgressTracker(IssuingCustomerStep)
73+
5774
@Suspendable
5875
override fun call(): SignedTransaction {
59-
val sessions = initiateFlows(observers)
76+
currentStep(IssuingCustomerStep)
6077
return subFlow(
6178
IssueCustomerFlow(
6279
customer,
6380
notary ?: getPreferredNotary { firstNotary },
64-
sessions
81+
initiateFlows(observers, customer),
82+
IssuingCustomerStep.childProgressTracker()
6583
)
6684
)
6785
}

onixlabs-corda-test-workflow/src/main/kotlin/io/onixlabs/corda/test/workflow/IssueCustomerFlowHandler.kt

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,46 @@
1717
package io.onixlabs.corda.test.workflow
1818

1919
import co.paralleluniverse.fibers.Suspendable
20+
import io.onixlabs.corda.core.workflow.RecordingFinalizedTransactionStep
21+
import io.onixlabs.corda.core.workflow.currentStep
22+
import io.onixlabs.corda.core.workflow.finalizeTransactionHandler
2023
import net.corda.core.flows.FlowLogic
2124
import net.corda.core.flows.FlowSession
2225
import net.corda.core.flows.InitiatedBy
23-
import net.corda.core.flows.ReceiveFinalityFlow
2426
import net.corda.core.node.StatesToRecord
2527
import net.corda.core.transactions.SignedTransaction
28+
import net.corda.core.utilities.ProgressTracker
2629

27-
class IssueCustomerFlowHandler(private val session: FlowSession) : FlowLogic<SignedTransaction>() {
30+
class IssueCustomerFlowHandler(
31+
private val session: FlowSession,
32+
override val progressTracker: ProgressTracker = tracker()
33+
) : FlowLogic<SignedTransaction>() {
34+
35+
companion object {
36+
@JvmStatic
37+
fun tracker() = ProgressTracker(RecordingFinalizedTransactionStep)
38+
}
2839

2940
@Suspendable
3041
override fun call(): SignedTransaction {
31-
return subFlow(ReceiveFinalityFlow(session, statesToRecord = StatesToRecord.ALL_VISIBLE))
42+
return finalizeTransactionHandler(session, statesToRecord = StatesToRecord.ALL_VISIBLE)
3243
}
3344

3445
@InitiatedBy(IssueCustomerFlow.Initiator::class)
3546
private class Handler(private val session: FlowSession) : FlowLogic<SignedTransaction>() {
3647

48+
private companion object {
49+
object ObservingIssuedCustomerStep : ProgressTracker.Step("Observing issued customer.") {
50+
override fun childProgressTracker() = tracker()
51+
}
52+
}
53+
54+
override val progressTracker = ProgressTracker(ObservingIssuedCustomerStep)
55+
3756
@Suspendable
3857
override fun call(): SignedTransaction {
39-
return subFlow(IssueCustomerFlowHandler(session))
58+
currentStep(ObservingIssuedCustomerStep)
59+
return subFlow(IssueCustomerFlowHandler(session, ObservingIssuedCustomerStep.childProgressTracker()))
4060
}
4161
}
4262
}

onixlabs-corda-test-workflow/src/main/kotlin/io/onixlabs/corda/test/workflow/IssueRewardFlow.kt

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,42 +20,48 @@ import co.paralleluniverse.fibers.Suspendable
2020
import io.onixlabs.corda.core.contract.SignatureData
2121
import io.onixlabs.corda.core.contract.owningKeys
2222
import io.onixlabs.corda.core.contract.resolveOrThrow
23-
import io.onixlabs.corda.core.workflow.firstNotary
24-
import io.onixlabs.corda.core.workflow.getPreferredNotary
25-
import io.onixlabs.corda.core.workflow.initiateFlows
23+
import io.onixlabs.corda.core.workflow.*
2624
import io.onixlabs.corda.test.contract.Reward
2725
import io.onixlabs.corda.test.contract.RewardContract
2826
import net.corda.core.contracts.hash
2927
import net.corda.core.flows.*
3028
import net.corda.core.identity.Party
3129
import net.corda.core.transactions.SignedTransaction
32-
import net.corda.core.transactions.TransactionBuilder
30+
import net.corda.core.utilities.ProgressTracker
3331

3432
class IssueRewardFlow(
3533
private val reward: Reward,
3634
private val notary: Party,
37-
private val sessions: Set<FlowSession> = emptySet()
35+
private val sessions: Set<FlowSession> = emptySet(),
36+
override val progressTracker: ProgressTracker = tracker()
3837
) : FlowLogic<SignedTransaction>() {
3938

39+
companion object {
40+
@JvmStatic
41+
fun tracker() = ProgressTracker(
42+
BuildingTransactionStep,
43+
VerifyingTransactionStep,
44+
SigningTransactionStep,
45+
CollectTransactionSignaturesStep,
46+
FinalizingTransactionStep
47+
)
48+
}
49+
4050
@Suspendable
4151
override fun call(): SignedTransaction {
4252
val customer = reward.customer.resolveOrThrow(serviceHub)
4353
val signature = SignatureData.create(reward.hash().bytes, reward.issuer.owningKey, serviceHub)
4454

45-
val transaction = with(TransactionBuilder(notary)) {
55+
val transaction = buildTransaction(notary) {
4656
addOutputState(reward)
4757
addReferenceState(customer.referenced())
4858
addCommand(RewardContract.Issue(signature), reward.participants.owningKeys.toList())
4959
}
5060

51-
transaction.verify(serviceHub)
52-
val partiallySignedTransaction = serviceHub.signInitialTransaction(transaction, reward.issuer.owningKey)
53-
54-
sessions.forEach { it.send(it.counterparty.owningKey in reward.participants.owningKeys) }
55-
val signingSessions = sessions.filter { it.counterparty.owningKey in reward.participants.owningKeys }
56-
val fullySignedTransaction = subFlow(CollectSignaturesFlow(partiallySignedTransaction, signingSessions))
57-
58-
return subFlow(FinalityFlow(fullySignedTransaction, sessions))
61+
verifyTransaction(transaction)
62+
val partiallySignedTransaction = signTransaction(transaction)
63+
val fullySignedTransaction = collectSignatures(partiallySignedTransaction, sessions)
64+
return finalizeTransaction(fullySignedTransaction, sessions)
5965
}
6066

6167
@StartableByRPC
@@ -67,14 +73,23 @@ class IssueRewardFlow(
6773
private val observers: Set<Party> = emptySet()
6874
) : FlowLogic<SignedTransaction>() {
6975

76+
private companion object {
77+
object IssuingRewardStep : ProgressTracker.Step("Issuing reward.") {
78+
override fun childProgressTracker() = tracker()
79+
}
80+
}
81+
82+
override val progressTracker = ProgressTracker(IssuingRewardStep)
83+
7084
@Suspendable
7185
override fun call(): SignedTransaction {
72-
val sessions = initiateFlows(observers, reward)
86+
currentStep(IssuingRewardStep)
7387
return subFlow(
7488
IssueRewardFlow(
7589
reward,
7690
notary ?: getPreferredNotary { firstNotary },
77-
sessions
91+
initiateFlows(observers, reward),
92+
IssuingRewardStep.childProgressTracker()
7893
)
7994
)
8095
}

0 commit comments

Comments
 (0)