Skip to content

Commit 5959d84

Browse files
Bugfixing find claim flows.
1 parent ff0ca6a commit 5959d84

File tree

11 files changed

+173
-58
lines changed

11 files changed

+173
-58
lines changed

onixlabs-corda-identity-framework-integration/src/main/kotlin/io/onixlabs/corda/identityframework/integration/ClaimQueryService.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package io.onixlabs.corda.identityframework.integration
1818

19-
import io.onixlabs.corda.core.contract.cast
2019
import io.onixlabs.corda.core.integration.RPCService
2120
import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION
2221
import io.onixlabs.corda.identityframework.contract.CordaClaim
@@ -54,7 +53,9 @@ class ClaimQueryService(rpc: CordaRPCOps) : RPCService(rpc) {
5453
* @param flowTimeout The amount of time that the flow will be allowed to execute before failing.
5554
* @return Returns a claim that matches the query, or null if no claim was found.
5655
*/
57-
inline fun <reified T : CordaClaim<*>> findClaim(
56+
fun findClaim(
57+
claimClass: Class<out CordaClaim<*>> = CordaClaim::class.java,
58+
valueClass: Class<*>? = null,
5859
linearId: UniqueIdentifier? = null,
5960
externalId: String? = null,
6061
issuer: AbstractParty? = null,
@@ -68,9 +69,11 @@ class ClaimQueryService(rpc: CordaRPCOps) : RPCService(rpc) {
6869
relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL,
6970
pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION,
7071
flowTimeout: Duration = Duration.ofSeconds(30)
71-
): StateAndRef<T>? {
72+
): StateAndRef<CordaClaim<*>>? {
7273
return rpc.startFlowDynamic(
7374
FindClaimFlow::class.java,
75+
claimClass,
76+
valueClass,
7477
linearId,
7578
externalId,
7679
issuer,
@@ -83,7 +86,7 @@ class ClaimQueryService(rpc: CordaRPCOps) : RPCService(rpc) {
8386
stateStatus,
8487
relevancyStatus,
8588
pageSpecification
86-
).returnValue.getOrThrow(flowTimeout)?.cast()
89+
).returnValue.getOrThrow(flowTimeout)
8790
}
8891

8992
/**
@@ -105,7 +108,9 @@ class ClaimQueryService(rpc: CordaRPCOps) : RPCService(rpc) {
105108
* @param flowTimeout The amount of time that the flow will be allowed to execute before failing.
106109
* @return Returns claims that matches the query, or null if no claims are found.
107110
*/
108-
inline fun <reified T : CordaClaim<*>> findClaims(
111+
fun findClaims(
112+
claimClass: Class<out CordaClaim<*>> = CordaClaim::class.java,
113+
valueClass: Class<*>? = null,
109114
linearId: UniqueIdentifier? = null,
110115
externalId: String? = null,
111116
issuer: AbstractParty? = null,
@@ -119,9 +124,11 @@ class ClaimQueryService(rpc: CordaRPCOps) : RPCService(rpc) {
119124
relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL,
120125
pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION,
121126
flowTimeout: Duration = Duration.ofSeconds(30)
122-
): List<StateAndRef<T>> {
127+
): List<StateAndRef<CordaClaim<*>>> {
123128
return rpc.startFlowDynamic(
124129
FindClaimsFlow::class.java,
130+
claimClass,
131+
valueClass,
125132
linearId,
126133
externalId,
127134
issuer,
@@ -134,6 +141,6 @@ class ClaimQueryService(rpc: CordaRPCOps) : RPCService(rpc) {
134141
stateStatus,
135142
relevancyStatus,
136143
pageSpecification
137-
).returnValue.getOrThrow(flowTimeout).map { it.cast<T>() }
144+
).returnValue.getOrThrow(flowTimeout)
138145
}
139146
}

onixlabs-corda-identity-framework-integration/src/test/kotlin/io/onixlabs/corda/identityframework/integration/AttestationIntegrationTests.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package io.onixlabs.corda.identityframework.integration
1818

19+
import io.onixlabs.corda.core.contract.cast
1920
import io.onixlabs.corda.identityframework.contract.Attestation
2021
import io.onixlabs.corda.identityframework.contract.AttestationStatus
2122
import io.onixlabs.corda.identityframework.contract.CordaClaim
@@ -38,10 +39,10 @@ class AttestationIntegrationTests : IntegrationTest() {
3839
).returnValue.getOrThrow()
3940

4041
// Find the issued claim
41-
val issuedClaim = nodeC.claims.queryService.findClaim<CordaClaim<String>>(
42+
val issuedClaim = nodeC.claims.queryService.findClaim(
4243
linearId = ID,
4344
stateStatus = Vault.StateStatus.UNCONSUMED
44-
) ?: fail("Failed to find issued claim.")
45+
)?.cast<CordaClaim<String>>() ?: fail("Failed to find issued claim.")
4546

4647
// Issue an attestation
4748
nodeC.attestations.commandService.issueAttestation(

onixlabs-corda-identity-framework-integration/src/test/kotlin/io/onixlabs/corda/identityframework/integration/ClaimIntegrationTests.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package io.onixlabs.corda.identityframework.integration
1818

19+
import io.onixlabs.corda.core.contract.cast
1920
import io.onixlabs.corda.identityframework.contract.CordaClaim
2021
import net.corda.core.node.services.Vault
2122
import net.corda.core.utilities.getOrThrow
@@ -36,10 +37,10 @@ class ClaimIntegrationTests : IntegrationTest() {
3637
).returnValue.getOrThrow()
3738

3839
// Find the issued claim
39-
val issuedClaim = nodeA.claims.queryService.findClaim<CordaClaim<String>>(
40+
val issuedClaim = nodeA.claims.queryService.findClaim(
4041
linearId = ID,
4142
stateStatus = Vault.StateStatus.UNCONSUMED
42-
) ?: fail("Failed to find issued claim.")
43+
)?.cast<CordaClaim<String>>() ?: fail("Failed to find issued claim.")
4344

4445
// Amend the claim
4546
nodeA.claims.commandService.amendClaim(
@@ -48,10 +49,10 @@ class ClaimIntegrationTests : IntegrationTest() {
4849
).returnValue.getOrThrow()
4950

5051
// Find the amended claim
51-
val amendedClaim = nodeA.claims.queryService.findClaim<CordaClaim<String>>(
52+
val amendedClaim = nodeA.claims.queryService.findClaim(
5253
linearId = ID,
5354
stateStatus = Vault.StateStatus.UNCONSUMED
54-
) ?: fail("Failed to find amended claim.")
55+
)?.cast<CordaClaim<String>>() ?: fail("Failed to find amended claim.")
5556

5657
// Publish the amended claim
5758
nodeA.claims.commandService.publishClaim(
@@ -61,10 +62,10 @@ class ClaimIntegrationTests : IntegrationTest() {
6162

6263
// Find the published claim
6364
listOf(nodeA, nodeB, nodeC).forEach {
64-
it.claims.queryService.findClaim<CordaClaim<String>>(
65+
it.claims.queryService.findClaim(
6566
linearId = ID,
6667
stateStatus = Vault.StateStatus.UNCONSUMED
67-
) ?: fail("Failed to find sent claim.")
68+
)?.cast<CordaClaim<String>>() ?: fail("Failed to find sent claim.")
6869
}
6970

7071
// Revoke the claim

onixlabs-corda-identity-framework-workflow/src/main/kotlin/io/onixlabs/corda/identityframework/workflow/FindClaimFlow.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import io.onixlabs.corda.identityframework.contract.CordaClaimSchema.CordaClaimE
2424
import net.corda.core.contracts.StateRef
2525
import net.corda.core.contracts.UniqueIdentifier
2626
import net.corda.core.crypto.SecureHash
27+
import net.corda.core.flows.FlowException
2728
import net.corda.core.flows.StartableByRPC
2829
import net.corda.core.flows.StartableByService
2930
import net.corda.core.identity.AbstractParty
@@ -51,7 +52,9 @@ import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria
5152
*/
5253
@StartableByRPC
5354
@StartableByService
54-
class FindClaimFlow<T : CordaClaim<*>>(
55+
open class FindClaimFlow(
56+
claimClass: Class<out CordaClaim<*>> = CordaClaim::class.java,
57+
valueClass: Class<*>? = null,
5558
linearId: UniqueIdentifier? = null,
5659
externalId: String? = null,
5760
issuer: AbstractParty? = null,
@@ -64,9 +67,9 @@ class FindClaimFlow<T : CordaClaim<*>>(
6467
stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED,
6568
relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL,
6669
override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION
67-
) : FindStateFlow<T>() {
70+
) : FindStateFlow<CordaClaim<*>>() {
6871
override val criteria: QueryCriteria = VaultQueryCriteria(
69-
contractStateTypes = setOf(contractStateType),
72+
contractStateTypes = setOf(claimClass),
7073
relevancyStatus = relevancyStatus,
7174
status = stateStatus
7275
).andWithExpressions(
@@ -76,6 +79,8 @@ class FindClaimFlow<T : CordaClaim<*>>(
7679
holder?.let { CordaClaimEntity::holder.equal(it) },
7780
property?.let { CordaClaimEntity::property.equal(it) },
7881
value?.let { CordaClaimEntity::value.equal(it.toString()) },
82+
value?.let { CordaClaimEntity::valueClass.equal(it.javaClass.canonicalName) },
83+
valueClass?.let { CordaClaimEntity::valueClass.equal(it.canonicalName) },
7984
previousStateRef?.let { CordaClaimEntity::previousStateRef.equal(it.toString()) },
8085
isSelfIssued?.let { CordaClaimEntity::isSelfIssued.equal(it) },
8186
hash?.let { CordaClaimEntity::hash.equal(it.toString()) }

onixlabs-corda-identity-framework-workflow/src/main/kotlin/io/onixlabs/corda/identityframework/workflow/FindClaimsFlow.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ import net.corda.core.node.services.vault.Sort
5353
*/
5454
@StartableByRPC
5555
@StartableByService
56-
class FindClaimsFlow<T : CordaClaim<*>>(
56+
class FindClaimsFlow(
57+
claimClass: Class<out CordaClaim<*>> = CordaClaim::class.java,
58+
valueClass: Class<*>? = null,
5759
linearId: UniqueIdentifier? = null,
5860
externalId: String? = null,
5961
issuer: AbstractParty? = null,
@@ -67,9 +69,9 @@ class FindClaimsFlow<T : CordaClaim<*>>(
6769
relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL,
6870
override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION,
6971
override val sorting: Sort = DEFAULT_SORTING
70-
) : FindStatesFlow<T>() {
72+
) : FindStatesFlow<CordaClaim<*>>() {
7173
override val criteria: QueryCriteria = VaultQueryCriteria(
72-
contractStateTypes = setOf(contractStateType),
74+
contractStateTypes = setOf(claimClass),
7375
relevancyStatus = relevancyStatus,
7476
status = stateStatus
7577
).andWithExpressions(
@@ -79,6 +81,8 @@ class FindClaimsFlow<T : CordaClaim<*>>(
7981
holder?.let { CordaClaimEntity::holder.equal(it) },
8082
property?.let { CordaClaimEntity::property.equal(it) },
8183
value?.let { CordaClaimEntity::value.equal(it.toString()) },
84+
value?.let { CordaClaimEntity::valueClass.equal(it.javaClass.canonicalName) },
85+
valueClass?.let { CordaClaimEntity::valueClass.equal(it.canonicalName) },
8286
previousStateRef?.let { CordaClaimEntity::previousStateRef.equal(it.toString()) },
8387
isSelfIssued?.let { CordaClaimEntity::isSelfIssued.equal(it) },
8488
hash?.let { CordaClaimEntity::hash.equal(it.toString()) }

onixlabs-corda-identity-framework-workflow/src/main/kotlin/io/onixlabs/corda/identityframework/workflow/FlowLogicExtensions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ fun FlowLogic<*>.checkHasAttestedStateBeenWitnessed(attestation: Attestation<*>)
6060
* @throws FlowException if the claim already exists.
6161
*/
6262
fun FlowLogic<*>.checkClaimExists(claim: CordaClaim<*>) {
63-
if (subFlow(FindClaimsFlow<CordaClaim<*>>(hash = claim.hash)).isNotEmpty()) {
63+
if (subFlow(FindClaimsFlow(claimClass = claim.javaClass, hash = claim.hash)).isNotEmpty()) {
6464
throw FlowException("A claim with the specified hash already exists: ${claim.hash}.")
6565
}
6666
}

onixlabs-corda-identity-framework-workflow/src/test/kotlin/io/onixlabs/corda/identityframework/workflow/claims/FindClaimFlowTests.kt

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ class FindClaimFlowTests : FlowTest() {
4949
Pipeline
5050
.create(network)
5151
.run(it) {
52-
FindClaimFlow<CordaClaim<String>>(
52+
FindClaimFlow(
53+
valueClass = String::class.java,
5354
linearId = claim.state.data.linearId,
5455
stateStatus = Vault.StateStatus.UNCONSUMED
5556
)
@@ -66,7 +67,8 @@ class FindClaimFlowTests : FlowTest() {
6667
Pipeline
6768
.create(network)
6869
.run(it) {
69-
FindClaimFlow<CordaClaim<String>>(
70+
FindClaimFlow(
71+
valueClass = String::class.java,
7072
externalId = claim.state.data.linearId.externalId,
7173
stateStatus = Vault.StateStatus.UNCONSUMED
7274
)
@@ -83,7 +85,8 @@ class FindClaimFlowTests : FlowTest() {
8385
Pipeline
8486
.create(network)
8587
.run(it) {
86-
FindClaimFlow<CordaClaim<String>>(
88+
FindClaimFlow(
89+
valueClass = String::class.java,
8790
issuer = claim.state.data.issuer,
8891
stateStatus = Vault.StateStatus.UNCONSUMED
8992
)
@@ -100,7 +103,8 @@ class FindClaimFlowTests : FlowTest() {
100103
Pipeline
101104
.create(network)
102105
.run(it) {
103-
FindClaimFlow<CordaClaim<String>>(
106+
FindClaimFlow(
107+
valueClass = String::class.java,
104108
holder = claim.state.data.holder,
105109
stateStatus = Vault.StateStatus.UNCONSUMED
106110
)
@@ -117,7 +121,8 @@ class FindClaimFlowTests : FlowTest() {
117121
Pipeline
118122
.create(network)
119123
.run(it) {
120-
FindClaimFlow<CordaClaim<String>>(
124+
FindClaimFlow(
125+
valueClass = String::class.java,
121126
property = claim.state.data.property,
122127
stateStatus = Vault.StateStatus.UNCONSUMED
123128
)
@@ -134,7 +139,8 @@ class FindClaimFlowTests : FlowTest() {
134139
Pipeline
135140
.create(network)
136141
.run(it) {
137-
FindClaimFlow<CordaClaim<String>>(
142+
FindClaimFlow(
143+
valueClass = String::class.java,
138144
value = claim.state.data.value,
139145
stateStatus = Vault.StateStatus.UNCONSUMED
140146
)
@@ -151,7 +157,8 @@ class FindClaimFlowTests : FlowTest() {
151157
Pipeline
152158
.create(network)
153159
.run(it) {
154-
FindClaimFlow<CordaClaim<String>>(
160+
FindClaimFlow(
161+
valueClass = String::class.java,
155162
previousStateRef = claim.state.data.previousStateRef,
156163
stateStatus = Vault.StateStatus.UNCONSUMED
157164
)
@@ -168,7 +175,8 @@ class FindClaimFlowTests : FlowTest() {
168175
Pipeline
169176
.create(network)
170177
.run(it) {
171-
FindClaimFlow<CordaClaim<String>>(
178+
FindClaimFlow(
179+
valueClass = String::class.java,
172180
isSelfIssued = claim.state.data.isSelfIssued,
173181
stateStatus = Vault.StateStatus.UNCONSUMED
174182
)
@@ -185,7 +193,8 @@ class FindClaimFlowTests : FlowTest() {
185193
Pipeline
186194
.create(network)
187195
.run(it) {
188-
FindClaimFlow<CordaClaim<String>>(
196+
FindClaimFlow(
197+
valueClass = String::class.java,
189198
hash = claim.state.data.hash,
190199
stateStatus = Vault.StateStatus.UNCONSUMED
191200
)

onixlabs-corda-identity-framework-workflow/src/test/kotlin/io/onixlabs/corda/identityframework/workflow/claims/FindClaimsFlowTests.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class FindClaimsFlowTests : FlowTest() {
8181
Pipeline
8282
.create(network)
8383
.run(it) {
84-
FindClaimsFlow<CordaClaim<*>>(
84+
FindClaimsFlow(
8585
linearId = CLAIM_1.linearId,
8686
stateStatus = Vault.StateStatus.ALL
8787
)
@@ -98,7 +98,7 @@ class FindClaimsFlowTests : FlowTest() {
9898
Pipeline
9999
.create(network)
100100
.run(it) {
101-
FindClaimsFlow<CordaClaim<*>>(
101+
FindClaimsFlow(
102102
externalId = CLAIM_1.linearId.externalId,
103103
stateStatus = Vault.StateStatus.ALL
104104
)
@@ -115,7 +115,7 @@ class FindClaimsFlowTests : FlowTest() {
115115
Pipeline
116116
.create(network)
117117
.run(it) {
118-
FindClaimsFlow<CordaClaim<*>>(
118+
FindClaimsFlow(
119119
issuer = CLAIM_1.issuer,
120120
stateStatus = Vault.StateStatus.ALL
121121
)
@@ -132,7 +132,7 @@ class FindClaimsFlowTests : FlowTest() {
132132
Pipeline
133133
.create(network)
134134
.run(it) {
135-
FindClaimsFlow<CordaClaim<*>>(
135+
FindClaimsFlow(
136136
holder = CLAIM_1.holder,
137137
stateStatus = Vault.StateStatus.ALL
138138
)
@@ -149,7 +149,7 @@ class FindClaimsFlowTests : FlowTest() {
149149
Pipeline
150150
.create(network)
151151
.run(it) {
152-
FindClaimsFlow<CordaClaim<*>>(
152+
FindClaimsFlow(
153153
property = CLAIM_1.property,
154154
stateStatus = Vault.StateStatus.ALL
155155
)
@@ -166,7 +166,7 @@ class FindClaimsFlowTests : FlowTest() {
166166
Pipeline
167167
.create(network)
168168
.run(it) {
169-
FindClaimsFlow<CordaClaim<*>>(
169+
FindClaimsFlow(
170170
value = CLAIM_1.value,
171171
stateStatus = Vault.StateStatus.ALL
172172
)
@@ -183,7 +183,7 @@ class FindClaimsFlowTests : FlowTest() {
183183
Pipeline
184184
.create(network)
185185
.run(it) {
186-
FindClaimsFlow<CordaClaim<*>>(
186+
FindClaimsFlow(
187187
previousStateRef = claim.state.data.previousStateRef,
188188
stateStatus = Vault.StateStatus.ALL
189189
)
@@ -200,7 +200,7 @@ class FindClaimsFlowTests : FlowTest() {
200200
Pipeline
201201
.create(network)
202202
.run(it) {
203-
FindClaimsFlow<CordaClaim<*>>(
203+
FindClaimsFlow(
204204
isSelfIssued = true,
205205
stateStatus = Vault.StateStatus.ALL
206206
)
@@ -217,7 +217,7 @@ class FindClaimsFlowTests : FlowTest() {
217217
Pipeline
218218
.create(network)
219219
.run(it) {
220-
FindClaimsFlow<CordaClaim<*>>(
220+
FindClaimsFlow(
221221
hash = CLAIM_1.hash,
222222
stateStatus = Vault.StateStatus.ALL
223223
)

0 commit comments

Comments
 (0)