From f157533cda5fd43fd611bfb1ac0137bec8b3a0f1 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Mon, 21 Jun 2021 15:56:39 +0100 Subject: [PATCH 01/23] Updated to use onixlabs-corda-core 2.0.0 and onixlabs-corda-identity-framework 2.0.0 in preparation for v2 features. --- build.gradle | 14 +- onixlabs-corda-bnms-contract/build.gradle | 1 + .../bnms/contract/membership/Extensions.kt | 4 +- .../membership/MembershipAttestation.kt | 9 +- .../membership/MembershipAttestationSchema.kt | 11 +- .../bnms/contract/relationship/Extensions.kt | 4 +- .../relationship/RelationshipAttestation.kt | 9 +- .../RelationshipAttestationSchema.kt | 11 +- ...ip-attestation-schema.changelog-master.xml | 1 + ...ership-attestation-schema.changelog-v2.xml | 15 ++ ...ip-attestation-schema.changelog-master.xml | 1 + ...onship-attestation-schema.changelog-v2.xml | 15 ++ .../MembershipAttestationQueryService.kt | 132 ------------------ ...ice.kt => MembershipAttestationService.kt} | 2 +- .../integration/MembershipQueryService.kt | 100 ------------- ...CommandService.kt => MembershipService.kt} | 2 +- .../RelationshipAttestationQueryService.kt | 130 ----------------- ...e.kt => RelationshipAttestationService.kt} | 2 +- .../integration/RelationshipQueryService.kt | 92 ------------ ...mmandService.kt => RelationshipService.kt} | 2 +- .../integration/RevocationLockQueryService.kt | 42 ------ ...andService.kt => RevocationLockService.kt} | 2 +- .../bnms/workflow/Extensions.FlowLogic.kt | 80 +++++++---- .../FindMembershipAttestationFlow.kt | 86 ------------ .../FindMembershipAttestationsFlow.kt | 89 ------------ .../workflow/membership/FindMembershipFlow.kt | 67 --------- .../membership/FindMembershipsFlow.kt | 70 ---------- .../membership/SynchronizeMembershipFlow.kt | 16 +-- .../SynchronizeMembershipFlowHandler.kt | 28 ++-- .../FindRelationshipAttestationFlow.kt | 84 ----------- .../FindRelationshipAttestationsFlow.kt | 87 ------------ .../relationship/FindRelationshipFlow.kt | 63 --------- .../relationship/FindRelationshipsFlow.kt | 66 --------- .../RevokeRelationshipFlowHandler.kt | 6 +- .../revocation/FindRevocationLockFlow.kt | 49 ------- .../SynchronizeMembershipFlowTests.kt | 58 ++++---- 36 files changed, 170 insertions(+), 1280 deletions(-) create mode 100644 onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-v2.xml create mode 100644 onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-v2.xml delete mode 100644 onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationQueryService.kt rename onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/{MembershipAttestationCommandService.kt => MembershipAttestationService.kt} (98%) delete mode 100644 onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipQueryService.kt rename onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/{MembershipCommandService.kt => MembershipService.kt} (98%) delete mode 100644 onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationQueryService.kt rename onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/{RelationshipAttestationCommandService.kt => RelationshipAttestationService.kt} (98%) delete mode 100644 onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipQueryService.kt rename onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/{RelationshipCommandService.kt => RelationshipService.kt} (98%) delete mode 100644 onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockQueryService.kt rename onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/{RevocationLockCommandService.kt => RevocationLockService.kt} (96%) delete mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipAttestationFlow.kt delete mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipAttestationsFlow.kt delete mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipFlow.kt delete mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipsFlow.kt delete mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipAttestationFlow.kt delete mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipAttestationsFlow.kt delete mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipFlow.kt delete mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipsFlow.kt delete mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/FindRevocationLockFlow.kt diff --git a/build.gradle b/build.gradle index e1cde53..70ef458 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '1.2.0' - onixlabs_corda_idfx_release_version = '2.0.0-rc2' + onixlabs_corda_core_release_version = '2.0.0' + onixlabs_corda_idfx_release_version = '2.0.0' cordapp_platform_version = 8 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' @@ -46,7 +46,7 @@ buildscript { } group 'io.onixlabs' -version '1.0.0' +version '2.0.0-rc1' subprojects { repositories { @@ -57,14 +57,6 @@ subprojects { maven { url "$corda_artifactory_url/corda-releases" } maven { url "$corda_artifactory_url/corda-dependencies" } maven { url "https://repo.gradle.org/gradle/libs-releases" } - maven { - name = "GitHubPackagesCIF" - url = uri("https://maven.pkg.github.com/onix-labs/onixlabs-corda-identity-framework-beta") - credentials { - username = project.findProperty("gpr.user") ?: System.getenv("GITHUB_USERNAME") - password = project.findProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN") - } - } } configurations { diff --git a/onixlabs-corda-bnms-contract/build.gradle b/onixlabs-corda-bnms-contract/build.gradle index 07c9086..948485e 100644 --- a/onixlabs-corda-bnms-contract/build.gradle +++ b/onixlabs-corda-bnms-contract/build.gradle @@ -28,6 +28,7 @@ dependencies { // CorDapp Dependencies cordapp "$onixlabs_group:onixlabs-corda-core-contract:$onixlabs_corda_core_release_version" + cordapp "$onixlabs_group:onixlabs-corda-core-workflow:$onixlabs_corda_core_release_version" cordapp "$onixlabs_group:onixlabs-corda-identity-framework-contract:$onixlabs_corda_idfx_release_version" // Test Dependencies diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt index 2fa7296..ba95fbc 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt @@ -17,7 +17,7 @@ package io.onixlabs.corda.bnms.contract.membership import io.onixlabs.corda.identityframework.contract.AttestationStatus -import io.onixlabs.corda.identityframework.contract.toAttestationPointer +import io.onixlabs.corda.identityframework.contract.toStaticAttestationPointer import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UniqueIdentifier import net.corda.core.identity.AbstractParty @@ -54,7 +54,7 @@ fun StateAndRef.amend( membership: StateAndRef, status: AttestationStatus, metadata: Map = this.state.data.metadata -) = this.state.data.amend(ref, status, membership.toAttestationPointer(), metadata) +) = this.state.data.amend(ref, status, membership.toStaticAttestationPointer(), metadata) fun StateAndRef.accept( metadata: Map = this.state.data.metadata diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt index b5320a5..70795b0 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt @@ -23,7 +23,7 @@ import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema.Me import io.onixlabs.corda.identityframework.contract.Attestation import io.onixlabs.corda.identityframework.contract.AttestationPointer import io.onixlabs.corda.identityframework.contract.AttestationStatus -import io.onixlabs.corda.identityframework.contract.toAttestationPointer +import io.onixlabs.corda.identityframework.contract.toStaticAttestationPointer import net.corda.core.contracts.BelongsToContract import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.StateRef @@ -63,7 +63,7 @@ class MembershipAttestation internal constructor( membership.state.data.network, attestor, setOf(membership.state.data.holder), - membership.toAttestationPointer(), + membership.toStaticAttestationPointer(), status, metadata, linearId, @@ -103,9 +103,8 @@ class MembershipAttestation internal constructor( networkValue = network.value, networkOperator = network.operator, networkHash = network.hash.toString(), - pointerStateRef = pointer.stateRef.toString(), - pointerStateClass = pointer.stateClass.canonicalName, - pointerStateLinearId = pointer.stateLinearId!!.id, + pointer = pointer.statePointer.toString(), + pointerStateType = pointer.stateType.canonicalName, pointerHash = pointer.hash.toString(), status = status, previousStateRef = previousStateRef?.toString(), diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt index a29758e..5760a76 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt @@ -55,14 +55,11 @@ object MembershipAttestationSchema { @Column(name = "network_hash", nullable = false) val networkHash: String = "", - @Column(name = "pointer_state_ref", nullable = false) - val pointerStateRef: String = "", + @Column(name = "pointer", nullable = false) + val pointer: String = "", - @Column(name = "pointer_state_class", nullable = false) - val pointerStateClass: String = "", - - @Column(name = "pointer_state_linear_id", nullable = false) - val pointerStateLinearId: UUID = UUID.randomUUID(), + @Column(name = "pointer_state_type", nullable = false) + val pointerStateType: String = "", @Column(name = "pointer_hash", nullable = false) val pointerHash: String = "", diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt index 910ad34..a8ab564 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt @@ -17,7 +17,7 @@ package io.onixlabs.corda.bnms.contract.relationship import io.onixlabs.corda.identityframework.contract.AttestationStatus -import io.onixlabs.corda.identityframework.contract.toAttestationPointer +import io.onixlabs.corda.identityframework.contract.toStaticAttestationPointer import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UniqueIdentifier import net.corda.core.identity.AbstractParty @@ -54,7 +54,7 @@ fun StateAndRef.amend( relationship: StateAndRef, status: AttestationStatus, metadata: Map = this.state.data.metadata -) = this.state.data.amend(ref, status, relationship.toAttestationPointer(), metadata) +) = this.state.data.amend(ref, status, relationship.toStaticAttestationPointer(), metadata) fun StateAndRef.accept( metadata: Map = this.state.data.metadata diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt index e1e96e1..eb68363 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt @@ -23,7 +23,7 @@ import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestationSchem import io.onixlabs.corda.identityframework.contract.Attestation import io.onixlabs.corda.identityframework.contract.AttestationPointer import io.onixlabs.corda.identityframework.contract.AttestationStatus -import io.onixlabs.corda.identityframework.contract.toAttestationPointer +import io.onixlabs.corda.identityframework.contract.toStaticAttestationPointer import net.corda.core.contracts.BelongsToContract import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.StateRef @@ -63,7 +63,7 @@ class RelationshipAttestation internal constructor( relationship.state.data.network, attestor, relationship.state.data.participants.toSet(), - relationship.toAttestationPointer(), + relationship.toStaticAttestationPointer(), status, metadata, linearId, @@ -96,9 +96,8 @@ class RelationshipAttestation internal constructor( networkValue = network.value, networkOperator = network.operator, networkHash = network.hash.toString(), - pointerStateRef = pointer.stateRef.toString(), - pointerStateClass = pointer.stateClass.canonicalName, - pointerStateLinearId = pointer.stateLinearId!!.id, + pointer = pointer.statePointer.toString(), + pointerStateType = pointer.stateType.canonicalName, pointerHash = pointer.hash.toString(), status = status, previousStateRef = previousStateRef?.toString(), diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt index 29b0554..797bf96 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt @@ -52,14 +52,11 @@ object RelationshipAttestationSchema { @Column(name = "network_hash", nullable = false) val networkHash: String = "", - @Column(name = "pointer_state_ref", nullable = false) - val pointerStateRef: String = "", + @Column(name = "pointer", nullable = false) + val pointer: String = "", - @Column(name = "pointer_state_class", nullable = false) - val pointerStateClass: String = "", - - @Column(name = "pointer_state_linear_id", nullable = false) - val pointerStateLinearId: UUID = UUID.randomUUID(), + @Column(name = "pointer_state_type", nullable = false) + val pointerStateType: String = "", @Column(name = "pointer_hash", nullable = false) val pointerHash: String = "", diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-master.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-master.xml index e9930ab..8b969e6 100644 --- a/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-master.xml +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-master.xml @@ -3,4 +3,5 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> + \ No newline at end of file diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-v2.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-v2.xml new file mode 100644 index 0000000..03cf877 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-v2.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-master.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-master.xml index 388fa15..163dcb2 100644 --- a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-master.xml +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-master.xml @@ -3,4 +3,5 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> + \ No newline at end of file diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-v2.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-v2.xml new file mode 100644 index 0000000..1c7c447 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-v2.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationQueryService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationQueryService.kt deleted file mode 100644 index f344dfd..0000000 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationQueryService.kt +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.integration - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation -import io.onixlabs.corda.bnms.workflow.membership.FindMembershipAttestationFlow -import io.onixlabs.corda.bnms.workflow.membership.FindMembershipAttestationsFlow -import io.onixlabs.corda.core.integration.RPCService -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.identityframework.contract.AttestationPointer -import io.onixlabs.corda.identityframework.contract.AttestationStatus -import net.corda.core.contracts.StateAndRef -import net.corda.core.contracts.StateRef -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.identity.AbstractParty -import net.corda.core.messaging.CordaRPCOps -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.utilities.getOrThrow -import java.time.Duration - -class MembershipAttestationQueryService(rpc: CordaRPCOps) : RPCService(rpc) { - - fun findMembershipAttestation( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - attestor: AbstractParty? = null, - holder: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - pointer: AttestationPointer? = null, - pointerStateRef: StateRef? = null, - pointerStateLinearId: UniqueIdentifier? = null, - pointerHash: SecureHash? = null, - status: AttestationStatus? = null, - previousStateRef: StateRef? = null, - hash: SecureHash? = null, - membership: StateAndRef? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - flowTimeout: Duration = Duration.ofSeconds(30) - ): StateAndRef? { - return rpc.startFlowDynamic( - FindMembershipAttestationFlow::class.java, - linearId, - externalId, - attestor, - holder, - network, - networkValue, - networkOperator, - networkHash, - pointer, - pointerStateRef, - pointerStateLinearId, - pointerHash, - status, - previousStateRef, - hash, - membership, - stateStatus, - relevancyStatus, - pageSpecification - ).returnValue.getOrThrow(flowTimeout) - } - - fun findMembershipAttestations( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - attestor: AbstractParty? = null, - holder: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - pointer: AttestationPointer? = null, - pointerStateRef: StateRef? = null, - pointerStateLinearId: UniqueIdentifier? = null, - pointerHash: SecureHash? = null, - status: AttestationStatus? = null, - previousStateRef: StateRef? = null, - hash: SecureHash? = null, - membership: StateAndRef? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - flowTimeout: Duration = Duration.ofSeconds(30) - ): List> { - return rpc.startFlowDynamic( - FindMembershipAttestationsFlow::class.java, - linearId, - externalId, - attestor, - holder, - network, - networkValue, - networkOperator, - networkHash, - pointer, - pointerStateRef, - pointerStateLinearId, - pointerHash, - status, - previousStateRef, - hash, - membership, - stateStatus, - relevancyStatus, - pageSpecification - ).returnValue.getOrThrow(flowTimeout) - } -} diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationCommandService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt similarity index 98% rename from onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationCommandService.kt rename to onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt index bd7b08a..2fd14dc 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationCommandService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt @@ -32,7 +32,7 @@ import net.corda.core.messaging.* import net.corda.core.transactions.SignedTransaction import java.util.* -class MembershipAttestationCommandService(rpc: CordaRPCOps) : RPCService(rpc) { +class MembershipAttestationService(rpc: CordaRPCOps) : RPCService(rpc) { fun issueMembershipAttestation( membership: StateAndRef, diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipQueryService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipQueryService.kt deleted file mode 100644 index d0fd6fb..0000000 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipQueryService.kt +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.integration - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.workflow.membership.FindMembershipFlow -import io.onixlabs.corda.bnms.workflow.membership.FindMembershipsFlow -import io.onixlabs.corda.core.integration.RPCService -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import net.corda.core.contracts.StateAndRef -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.identity.AbstractParty -import net.corda.core.messaging.CordaRPCOps -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.utilities.getOrThrow -import java.time.Duration - -class MembershipQueryService(rpc: CordaRPCOps) : RPCService(rpc) { - - fun findMembership( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - holder: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - isNetworkOperator: Boolean? = null, - hash: SecureHash? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - flowTimeout: Duration = Duration.ofSeconds(30) - ): StateAndRef? { - return rpc.startFlowDynamic( - FindMembershipFlow::class.java, - linearId, - externalId, - holder, - network, - networkValue, - networkOperator, - networkHash, - isNetworkOperator, - hash, - stateStatus, - relevancyStatus, - pageSpecification - ).returnValue.getOrThrow(flowTimeout) - } - - fun findMemberships( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - holder: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - isNetworkOperator: Boolean? = null, - hash: SecureHash? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - flowTimeout: Duration = Duration.ofSeconds(30) - ): List> { - return rpc.startFlowDynamic( - FindMembershipsFlow::class.java, - linearId, - externalId, - holder, - network, - networkValue, - networkOperator, - networkHash, - isNetworkOperator, - hash, - stateStatus, - relevancyStatus, - pageSpecification - ).returnValue.getOrThrow(flowTimeout) - } -} diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipCommandService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt similarity index 98% rename from onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipCommandService.kt rename to onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt index 8e6c551..67c6bc1 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipCommandService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt @@ -32,7 +32,7 @@ import net.corda.core.messaging.* import net.corda.core.transactions.SignedTransaction import java.util.* -class MembershipCommandService(rpc: CordaRPCOps) : RPCService(rpc) { +class MembershipService(rpc: CordaRPCOps) : RPCService(rpc) { fun issueMembership( network: Network, diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationQueryService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationQueryService.kt deleted file mode 100644 index a1d3301..0000000 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationQueryService.kt +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.integration - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation -import io.onixlabs.corda.bnms.workflow.relationship.FindRelationshipAttestationFlow -import io.onixlabs.corda.bnms.workflow.relationship.FindRelationshipAttestationsFlow -import io.onixlabs.corda.core.integration.RPCService -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.identityframework.contract.AttestationPointer -import io.onixlabs.corda.identityframework.contract.AttestationStatus -import net.corda.core.contracts.StateAndRef -import net.corda.core.contracts.StateRef -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.identity.AbstractParty -import net.corda.core.messaging.CordaRPCOps -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.utilities.getOrThrow -import java.time.Duration - -class RelationshipAttestationQueryService(rpc: CordaRPCOps) : RPCService(rpc) { - - fun findRelationshipAttestation( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - attestor: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - pointer: AttestationPointer? = null, - pointerStateRef: StateRef? = null, - pointerStateLinearId: UniqueIdentifier? = null, - pointerHash: SecureHash? = null, - status: AttestationStatus? = null, - previousStateRef: StateRef? = null, - hash: SecureHash? = null, - membership: StateAndRef? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - flowTimeout: Duration = Duration.ofSeconds(30) - ): StateAndRef? { - return rpc.startFlowDynamic( - FindRelationshipAttestationFlow::class.java, - linearId, - externalId, - attestor, - network, - networkValue, - networkOperator, - networkHash, - pointer, - pointerStateRef, - pointerStateLinearId, - pointerHash, - status, - previousStateRef, - hash, - membership, - stateStatus, - relevancyStatus, - pageSpecification - ).returnValue.getOrThrow(flowTimeout) - } - - fun findRelationshipAttestations( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - attestor: AbstractParty? = null, - holder: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - pointer: AttestationPointer? = null, - pointerStateRef: StateRef? = null, - pointerStateLinearId: UniqueIdentifier? = null, - pointerHash: SecureHash? = null, - status: AttestationStatus? = null, - previousStateRef: StateRef? = null, - hash: SecureHash? = null, - membership: StateAndRef? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - flowTimeout: Duration = Duration.ofSeconds(30) - ): List> { - return rpc.startFlowDynamic( - FindRelationshipAttestationsFlow::class.java, - linearId, - externalId, - attestor, - holder, - network, - networkValue, - networkOperator, - networkHash, - pointer, - pointerStateRef, - pointerStateLinearId, - pointerHash, - status, - previousStateRef, - hash, - membership, - stateStatus, - relevancyStatus, - pageSpecification - ).returnValue.getOrThrow(flowTimeout) - } -} diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationCommandService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt similarity index 98% rename from onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationCommandService.kt rename to onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt index 3732a0e..29fa44a 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationCommandService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt @@ -32,7 +32,7 @@ import net.corda.core.messaging.* import net.corda.core.transactions.SignedTransaction import java.util.* -class RelationshipAttestationCommandService(rpc: CordaRPCOps) : RPCService(rpc) { +class RelationshipAttestationService(rpc: CordaRPCOps) : RPCService(rpc) { fun issueRelationshipAttestation( relationship: StateAndRef, diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipQueryService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipQueryService.kt deleted file mode 100644 index 3049209..0000000 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipQueryService.kt +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.integration - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.workflow.relationship.FindRelationshipFlow -import io.onixlabs.corda.bnms.workflow.relationship.FindRelationshipsFlow -import io.onixlabs.corda.core.integration.RPCService -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import net.corda.core.contracts.StateAndRef -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.identity.AbstractParty -import net.corda.core.messaging.CordaRPCOps -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.utilities.getOrThrow -import java.time.Duration - -class RelationshipQueryService(rpc: CordaRPCOps) : RPCService(rpc) { - - fun findRelationship( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - hash: SecureHash? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - flowTimeout: Duration = Duration.ofSeconds(30) - ): StateAndRef? { - return rpc.startFlowDynamic( - FindRelationshipFlow::class.java, - linearId, - externalId, - network, - networkValue, - networkOperator, - networkHash, - hash, - stateStatus, - relevancyStatus, - pageSpecification - ).returnValue.getOrThrow(flowTimeout) - } - - fun findRelationships( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - hash: SecureHash? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - flowTimeout: Duration = Duration.ofSeconds(30) - ): List> { - return rpc.startFlowDynamic( - FindRelationshipsFlow::class.java, - linearId, - externalId, - network, - networkValue, - networkOperator, - networkHash, - hash, - stateStatus, - relevancyStatus, - pageSpecification - ).returnValue.getOrThrow(flowTimeout) - } -} diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipCommandService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt similarity index 98% rename from onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipCommandService.kt rename to onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt index 2f23882..a95774f 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipCommandService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt @@ -31,7 +31,7 @@ import net.corda.core.messaging.* import net.corda.core.transactions.SignedTransaction import java.util.* -class RelationshipCommandService(rpc: CordaRPCOps) : RPCService(rpc) { +class RelationshipService(rpc: CordaRPCOps) : RPCService(rpc) { fun issueRelationship( network: Network, diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockQueryService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockQueryService.kt deleted file mode 100644 index 8e1a617..0000000 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockQueryService.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.integration - -import io.onixlabs.corda.bnms.workflow.revocation.FindRevocationLockFlow -import io.onixlabs.corda.core.contract.cast -import io.onixlabs.corda.core.integration.RPCService -import net.corda.core.contracts.LinearState -import net.corda.core.contracts.StateAndRef -import net.corda.core.identity.AbstractParty -import net.corda.core.messaging.CordaRPCOps -import net.corda.core.utilities.getOrThrow -import java.time.Duration - -class RevocationLockQueryService(rpc: CordaRPCOps) : RPCService(rpc) { - - inline fun findRevocationLock( - state: T, - owner: AbstractParty = ourIdentity, - flowTimeout: Duration = Duration.ofSeconds(30) - ): StateAndRef? { - return rpc.startFlowDynamic( - FindRevocationLockFlow::class.java, - owner, - state - ).returnValue.getOrThrow(flowTimeout)?.cast() - } -} diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockCommandService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt similarity index 96% rename from onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockCommandService.kt rename to onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt index 03ce223..fe0a6f8 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockCommandService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt @@ -28,7 +28,7 @@ import net.corda.core.messaging.* import net.corda.core.transactions.SignedTransaction import java.util.* -class RevocationLockCommandService(rpc: CordaRPCOps) : RPCService(rpc) { +class RevocationLockService(rpc: CordaRPCOps) : RPCService(rpc) { fun lock( state: T, diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt index 76932f9..4f20587 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt @@ -16,67 +16,89 @@ package io.onixlabs.corda.bnms.workflow +import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema +import io.onixlabs.corda.bnms.contract.membership.MembershipSchema import io.onixlabs.corda.bnms.contract.relationship.Relationship import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation -import io.onixlabs.corda.bnms.workflow.membership.FindMembershipAttestationFlow -import io.onixlabs.corda.bnms.workflow.membership.FindMembershipFlow -import net.corda.core.contracts.StateAndRef -import net.corda.core.flows.FlowException -import net.corda.core.flows.FlowLogic -import net.corda.core.node.services.Vault -import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.bnms.contract.revocation.RevocationLock +import io.onixlabs.corda.bnms.contract.revocation.RevocationLockSchema +import io.onixlabs.corda.core.services.any +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.singleOrNull +import io.onixlabs.corda.core.services.vaultServiceFor import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.contract.Attestation -import io.onixlabs.corda.identityframework.contract.CordaClaim import io.onixlabs.corda.identityframework.workflow.* +import net.corda.core.contracts.LinearState +import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* +import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party +import net.corda.core.node.services.Vault import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder import java.security.PublicKey +@Suspendable fun FlowLogic<*>.checkMembershipExists(membership: Membership) { - subFlow(FindMembershipFlow(hash = membership.hash))?.let { + val membershipExists = serviceHub.vaultServiceFor().any { + stateStatus(Vault.StateStatus.ALL) + expression(MembershipSchema.MembershipEntity::hash equalTo membership.hash.toString()) + } + + if (membershipExists) { throw FlowException("Membership state with the specified unique hash already exists: ${membership.hash}.") } } +@Suspendable fun FlowLogic<*>.checkMembershipsAndAttestations(relationship: Relationship) { val counterparties = relationship.participants .map { serviceHub.identityService.requireWellKnownPartyFromAnonymous(it) } .filter { it !in serviceHub.myInfo.legalIdentities } counterparties.forEach { - val findMembershipFlow = FindMembershipFlow( - holder = it, - network = relationship.network, - stateStatus = Vault.StateStatus.UNCONSUMED - ) - - val membership = subFlow(findMembershipFlow) ?: throw FlowException( - "Membership for specified holder and network could not be found, or has not been witnessed by this node." - ) - - val findAttestationFlow = FindMembershipAttestationFlow( - attestor = ourIdentity, - membership = membership, - stateStatus = Vault.StateStatus.UNCONSUMED - ) - - subFlow(findAttestationFlow) ?: throw FlowException( - "MembershipAttestation for specified membership could not be found, or has not been witnessed by this node." - ) + val membership = serviceHub.vaultServiceFor().singleOrNull { + expression(MembershipSchema.MembershipEntity::holder equalTo it) + expression(MembershipSchema.MembershipEntity::networkHash equalTo relationship.network.hash.toString()) + } ?: throw FlowException(buildString { + append("Membership for '$it' on network '${relationship.network}' ") + append("could not be found, or has not been witnessed by this node.") + }) + + serviceHub.vaultServiceFor().singleOrNull { + expression(MembershipAttestationSchema.MembershipAttestationEntity::attestor equalTo ourIdentity) + expression(MembershipAttestationSchema.MembershipAttestationEntity::pointer equalTo membership.ref.toString()) + } ?: throw FlowException(buildString { + append("MembershipAttestation for '${membership.state.data.holder}' ") + append("could not be found, or has not been witnessed by this node.") + }) } } +@Suspendable +fun FlowLogic<*>.checkRevocationLockExists(owner: AbstractParty, state: LinearState) { + val revocationLockExists = serviceHub.vaultServiceFor>().any { + expression(RevocationLockSchema.RevocationLockEntity::owner equalTo owner) + expression(RevocationLockSchema.RevocationLockEntity::pointerStateClass equalTo state.javaClass.canonicalName) + expression(RevocationLockSchema.RevocationLockEntity::pointerStateLinearId equalTo state.linearId.id) + } + + if(revocationLockExists) { + throw FlowException("Revocation of this relationship is locked by counter-party: $owner.") + } +} + +@Suspendable fun FlowLogic<*>.findMembershipForAttestation(attestation: MembershipAttestation): StateAndRef { return attestation.pointer.resolve(serviceHub) ?: throw FlowException( "Membership for the specified attestation could not be found, or has not been witnessed by this node." ) } +@Suspendable fun FlowLogic<*>.findRelationshipForAttestation(attestation: RelationshipAttestation): StateAndRef { return attestation.pointer.resolve(serviceHub) ?: throw FlowException( "Relationship for the specified attestation could not be found, or has not been witnessed by this node." diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipAttestationFlow.kt deleted file mode 100644 index ee8a9e8..0000000 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipAttestationFlow.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.workflow.membership - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation -import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema.MembershipAttestationEntity -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.core.workflow.FindStateFlow -import io.onixlabs.corda.core.workflow.andWithExpressions -import io.onixlabs.corda.identityframework.contract.AttestationPointer -import io.onixlabs.corda.identityframework.contract.AttestationStatus -import net.corda.core.contracts.StateAndRef -import net.corda.core.contracts.StateRef -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.flows.StartableByRPC -import net.corda.core.flows.StartableByService -import net.corda.core.identity.AbstractParty -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.Builder.equal -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.node.services.vault.QueryCriteria -import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria - -@StartableByRPC -@StartableByService -class FindMembershipAttestationFlow( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - attestor: AbstractParty? = null, - holder: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - pointer: AttestationPointer? = null, - pointerStateRef: StateRef? = null, - pointerStateLinearId: UniqueIdentifier? = null, - pointerHash: SecureHash? = null, - status: AttestationStatus? = null, - previousStateRef: StateRef? = null, - hash: SecureHash? = null, - membership: StateAndRef? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION -) : FindStateFlow() { - override val criteria: QueryCriteria = VaultQueryCriteria( - contractStateTypes = setOf(contractStateType), - relevancyStatus = relevancyStatus, - status = stateStatus - ).andWithExpressions( - linearId?.let { MembershipAttestationEntity::linearId.equal(it.id) }, - externalId?.let { MembershipAttestationEntity::externalId.equal(it) }, - attestor?.let { MembershipAttestationEntity::attestor.equal(it) }, - holder?.let { MembershipAttestationEntity::holder.equal(it) }, - network?.let { MembershipAttestationEntity::networkHash.equal(it.hash.toString()) }, - networkValue?.let { MembershipAttestationEntity::networkValue.equal(it) }, - networkOperator?.let { MembershipAttestationEntity::networkOperator.equal(it) }, - networkHash?.let { MembershipAttestationEntity::networkHash.equal(it.toString()) }, - pointer?.let { MembershipAttestationEntity::pointerHash.equal(it.hash.toString()) }, - pointerStateRef?.let { MembershipAttestationEntity::pointerStateRef.equal(it.toString()) }, - pointerStateLinearId?.let { MembershipAttestationEntity::pointerStateLinearId.equal(it.id) }, - pointerHash?.let { MembershipAttestationEntity::pointerHash.equal(it.toString()) }, - status?.let { MembershipAttestationEntity::status.equal(it) }, - previousStateRef?.let { MembershipAttestationEntity::previousStateRef.equal(it.toString()) }, - membership?.let { MembershipAttestationEntity::pointerStateRef.equal(it.ref.toString()) }, - hash?.let { MembershipAttestationEntity::hash.equal(it.toString()) } - ) -} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipAttestationsFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipAttestationsFlow.kt deleted file mode 100644 index 20c817b..0000000 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipAttestationsFlow.kt +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.workflow.membership - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation -import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema.MembershipAttestationEntity -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.core.workflow.DEFAULT_SORTING -import io.onixlabs.corda.core.workflow.FindStatesFlow -import io.onixlabs.corda.core.workflow.andWithExpressions -import io.onixlabs.corda.identityframework.contract.AttestationPointer -import io.onixlabs.corda.identityframework.contract.AttestationStatus -import net.corda.core.contracts.StateAndRef -import net.corda.core.contracts.StateRef -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.flows.StartableByRPC -import net.corda.core.flows.StartableByService -import net.corda.core.identity.AbstractParty -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.Builder.equal -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.node.services.vault.QueryCriteria -import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria -import net.corda.core.node.services.vault.Sort - -@StartableByRPC -@StartableByService -class FindMembershipAttestationsFlow( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - attestor: AbstractParty? = null, - holder: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - pointer: AttestationPointer? = null, - pointerStateRef: StateRef? = null, - pointerStateLinearId: UniqueIdentifier? = null, - pointerHash: SecureHash? = null, - status: AttestationStatus? = null, - previousStateRef: StateRef? = null, - hash: SecureHash? = null, - membership: StateAndRef? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - override val sorting: Sort = DEFAULT_SORTING -) : FindStatesFlow() { - override val criteria: QueryCriteria = VaultQueryCriteria( - contractStateTypes = setOf(contractStateType), - relevancyStatus = relevancyStatus, - status = stateStatus - ).andWithExpressions( - linearId?.let { MembershipAttestationEntity::linearId.equal(it.id) }, - externalId?.let { MembershipAttestationEntity::externalId.equal(it) }, - attestor?.let { MembershipAttestationEntity::attestor.equal(it) }, - holder?.let { MembershipAttestationEntity::holder.equal(it) }, - network?.let { MembershipAttestationEntity::networkHash.equal(it.hash.toString()) }, - networkValue?.let { MembershipAttestationEntity::networkValue.equal(it) }, - networkOperator?.let { MembershipAttestationEntity::networkOperator.equal(it) }, - networkHash?.let { MembershipAttestationEntity::networkHash.equal(it.toString()) }, - pointer?.let { MembershipAttestationEntity::pointerHash.equal(it.hash.toString()) }, - pointerStateRef?.let { MembershipAttestationEntity::pointerStateRef.equal(it.toString()) }, - pointerStateLinearId?.let { MembershipAttestationEntity::pointerStateLinearId.equal(it.id) }, - pointerHash?.let { MembershipAttestationEntity::pointerHash.equal(it.toString()) }, - status?.let { MembershipAttestationEntity::status.equal(it) }, - previousStateRef?.let { MembershipAttestationEntity::previousStateRef.equal(it.toString()) }, - membership?.let { MembershipAttestationEntity::pointerStateRef.equal(it.ref.toString()) }, - hash?.let { MembershipAttestationEntity::hash.equal(it.toString()) } - ) -} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipFlow.kt deleted file mode 100644 index 5634a06..0000000 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipFlow.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.workflow.membership - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.contract.membership.MembershipSchema.MembershipEntity -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.core.workflow.FindStateFlow -import io.onixlabs.corda.core.workflow.andWithExpressions -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.flows.StartableByRPC -import net.corda.core.flows.StartableByService -import net.corda.core.identity.AbstractParty -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.Builder.equal -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.node.services.vault.QueryCriteria -import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria - -@StartableByRPC -@StartableByService -class FindMembershipFlow( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - holder: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - isNetworkOperator: Boolean? = null, - hash: SecureHash? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION -) : FindStateFlow() { - override val criteria: QueryCriteria = VaultQueryCriteria( - contractStateTypes = setOf(contractStateType), - relevancyStatus = relevancyStatus, - status = stateStatus - ).andWithExpressions( - linearId?.let { MembershipEntity::linearId.equal(it.id) }, - externalId?.let { MembershipEntity::externalId.equal(it) }, - holder?.let { MembershipEntity::holder.equal(it) }, - network?.let { MembershipEntity::networkHash.equal(it.hash.toString()) }, - networkValue?.let { MembershipEntity::networkValue.equal(it) }, - networkOperator?.let { MembershipEntity::networkOperator.equal(it) }, - networkHash?.let { MembershipEntity::networkHash.equal(it.toString()) }, - isNetworkOperator?.let { MembershipEntity::isNetworkOperator.equal(it) }, - hash?.let { MembershipEntity::hash.equal(it.toString()) } - ) -} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipsFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipsFlow.kt deleted file mode 100644 index 97b47e7..0000000 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/FindMembershipsFlow.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.workflow.membership - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.contract.membership.MembershipSchema.MembershipEntity -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.core.workflow.DEFAULT_SORTING -import io.onixlabs.corda.core.workflow.FindStatesFlow -import io.onixlabs.corda.core.workflow.andWithExpressions -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.flows.StartableByRPC -import net.corda.core.flows.StartableByService -import net.corda.core.identity.AbstractParty -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.Builder.equal -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.node.services.vault.QueryCriteria -import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria -import net.corda.core.node.services.vault.Sort - -@StartableByRPC -@StartableByService -class FindMembershipsFlow( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - holder: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - isNetworkOperator: Boolean? = null, - hash: SecureHash? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - override val sorting: Sort = DEFAULT_SORTING -) : FindStatesFlow() { - override val criteria: QueryCriteria = VaultQueryCriteria( - contractStateTypes = setOf(contractStateType), - relevancyStatus = relevancyStatus, - status = stateStatus - ).andWithExpressions( - linearId?.let { MembershipEntity::linearId.equal(it.id) }, - externalId?.let { MembershipEntity::externalId.equal(it) }, - holder?.let { MembershipEntity::holder.equal(it) }, - network?.let { MembershipEntity::networkHash.equal(it.hash.toString()) }, - networkValue?.let { MembershipEntity::networkValue.equal(it) }, - networkOperator?.let { MembershipEntity::networkOperator.equal(it) }, - networkHash?.let { MembershipEntity::networkHash.equal(it.toString()) }, - isNetworkOperator?.let { MembershipEntity::isNetworkOperator.equal(it) }, - hash?.let { MembershipEntity::hash.equal(it.toString()) } - ) -} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlow.kt index 2760f4d..025eb33 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlow.kt @@ -3,12 +3,15 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.filter +import io.onixlabs.corda.core.services.vaultServiceFor import io.onixlabs.corda.core.workflow.currentStep import io.onixlabs.corda.identityframework.workflow.INITIALIZING import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.identity.Party -import net.corda.core.node.services.Vault import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.unwrap @@ -38,13 +41,10 @@ class SynchronizeMembershipFlow( throw FlowException("Membership synchronization can only occur when the membership is owned by this node.") } - val attestations = subFlow( - FindMembershipAttestationsFlow( - holder = holder, - network = network, - stateStatus = Vault.StateStatus.UNCONSUMED - ) - ) + val attestations = serviceHub.vaultServiceFor().filter { + expression(MembershipAttestationSchema.MembershipAttestationEntity::holder equalTo holder) + expression(MembershipAttestationSchema.MembershipAttestationEntity::networkHash equalTo network.hash.toString()) + }.toList() if (network.operator != null && attestations.size > 1) { throw FlowException("Only one membership attestation is required when a network operator is present.") diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowHandler.kt index 0682ab4..7f5489e 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowHandler.kt @@ -4,13 +4,18 @@ import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.Network import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema +import io.onixlabs.corda.bnms.contract.membership.MembershipSchema +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.filter +import io.onixlabs.corda.core.services.singleOrNull +import io.onixlabs.corda.core.services.vaultServiceFor import io.onixlabs.corda.core.workflow.currentStep import io.onixlabs.corda.identityframework.workflow.INITIALIZING import net.corda.core.contracts.StateAndRef import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.node.services.Vault import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.unwrap @@ -31,18 +36,18 @@ class SynchronizeMembershipFlowHandler( override fun call(): Pair, Set>>? { currentStep(INITIALIZING) val network = session.receive().unwrap { it } - val membership = subFlow(FindMembershipFlow(holder = ourIdentity, network = network)) + val membership = serviceHub.vaultServiceFor().singleOrNull { + expression(MembershipSchema.MembershipEntity::holder equalTo ourIdentity) + expression(MembershipSchema.MembershipEntity::networkHash equalTo network.hash.toString()) + } session.send(membership != null) if (membership != null) { - val attestations = subFlow( - FindMembershipAttestationsFlow( - holder = ourIdentity, - network = network, - stateStatus = Vault.StateStatus.UNCONSUMED - ) - ) + val attestations = serviceHub.vaultServiceFor().filter { + expression(MembershipAttestationSchema.MembershipAttestationEntity::holder equalTo ourIdentity) + expression(MembershipAttestationSchema.MembershipAttestationEntity::networkHash equalTo network.hash.toString()) + }.toList() currentStep(RECEIVING) val theirMembership = receiveTheirMembership() @@ -92,8 +97,9 @@ class SynchronizeMembershipFlowHandler( } @InitiatedBy(SynchronizeMembershipFlow.Initiator::class) - private class Handler(private val session: FlowSession) : - FlowLogic, Set>>?>() { + private class Handler( + private val session: FlowSession + ) : FlowLogic, Set>>?>() { private companion object { object SYNCHRONIZING : ProgressTracker.Step("Synchronizing membership.") { diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipAttestationFlow.kt deleted file mode 100644 index d48c07e..0000000 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipAttestationFlow.kt +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.workflow.relationship - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation -import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestationSchema.RelationshipAttestationEntity -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.core.workflow.FindStateFlow -import io.onixlabs.corda.core.workflow.andWithExpressions -import io.onixlabs.corda.identityframework.contract.AttestationPointer -import io.onixlabs.corda.identityframework.contract.AttestationStatus -import net.corda.core.contracts.StateAndRef -import net.corda.core.contracts.StateRef -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.flows.StartableByRPC -import net.corda.core.flows.StartableByService -import net.corda.core.identity.AbstractParty -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.Builder.equal -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.node.services.vault.QueryCriteria -import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria - -@StartableByRPC -@StartableByService -class FindRelationshipAttestationFlow( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - attestor: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - pointer: AttestationPointer? = null, - pointerStateRef: StateRef? = null, - pointerStateLinearId: UniqueIdentifier? = null, - pointerHash: SecureHash? = null, - status: AttestationStatus? = null, - previousStateRef: StateRef? = null, - hash: SecureHash? = null, - relationship: StateAndRef? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION -) : FindStateFlow() { - override val criteria: QueryCriteria = VaultQueryCriteria( - contractStateTypes = setOf(contractStateType), - relevancyStatus = relevancyStatus, - status = stateStatus - ).andWithExpressions( - linearId?.let { RelationshipAttestationEntity::linearId.equal(it.id) }, - externalId?.let { RelationshipAttestationEntity::externalId.equal(it) }, - attestor?.let { RelationshipAttestationEntity::attestor.equal(it) }, - network?.let { RelationshipAttestationEntity::networkHash.equal(it.hash.toString()) }, - networkValue?.let { RelationshipAttestationEntity::networkValue.equal(it) }, - networkOperator?.let { RelationshipAttestationEntity::networkOperator.equal(it) }, - networkHash?.let { RelationshipAttestationEntity::networkHash.equal(it.toString()) }, - pointer?.let { RelationshipAttestationEntity::pointerHash.equal(it.hash.toString()) }, - pointerStateRef?.let { RelationshipAttestationEntity::pointerStateRef.equal(it.toString()) }, - pointerStateLinearId?.let { RelationshipAttestationEntity::pointerStateLinearId.equal(it.id) }, - pointerHash?.let { RelationshipAttestationEntity::pointerHash.equal(it.toString()) }, - status?.let { RelationshipAttestationEntity::status.equal(it) }, - previousStateRef?.let { RelationshipAttestationEntity::previousStateRef.equal(it.toString()) }, - relationship?.let { RelationshipAttestationEntity::pointerStateRef.equal(it.ref.toString()) }, - hash?.let { RelationshipAttestationEntity::hash.equal(it.toString()) } - ) -} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipAttestationsFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipAttestationsFlow.kt deleted file mode 100644 index 0f5a54d..0000000 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipAttestationsFlow.kt +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.workflow.relationship - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation -import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestationSchema.RelationshipAttestationEntity -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.core.workflow.DEFAULT_SORTING -import io.onixlabs.corda.core.workflow.FindStatesFlow -import io.onixlabs.corda.core.workflow.andWithExpressions -import io.onixlabs.corda.identityframework.contract.AttestationPointer -import io.onixlabs.corda.identityframework.contract.AttestationStatus -import net.corda.core.contracts.StateAndRef -import net.corda.core.contracts.StateRef -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.flows.StartableByRPC -import net.corda.core.flows.StartableByService -import net.corda.core.identity.AbstractParty -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.Builder.equal -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.node.services.vault.QueryCriteria -import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria -import net.corda.core.node.services.vault.Sort - -@StartableByRPC -@StartableByService -class FindRelationshipAttestationsFlow( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - attestor: AbstractParty? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - pointer: AttestationPointer? = null, - pointerStateRef: StateRef? = null, - pointerStateLinearId: UniqueIdentifier? = null, - pointerHash: SecureHash? = null, - status: AttestationStatus? = null, - previousStateRef: StateRef? = null, - hash: SecureHash? = null, - relationship: StateAndRef? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - override val sorting: Sort = DEFAULT_SORTING -) : FindStatesFlow() { - override val criteria: QueryCriteria = VaultQueryCriteria( - contractStateTypes = setOf(contractStateType), - relevancyStatus = relevancyStatus, - status = stateStatus - ).andWithExpressions( - linearId?.let { RelationshipAttestationEntity::linearId.equal(it.id) }, - externalId?.let { RelationshipAttestationEntity::externalId.equal(it) }, - attestor?.let { RelationshipAttestationEntity::attestor.equal(it) }, - network?.let { RelationshipAttestationEntity::networkHash.equal(it.hash.toString()) }, - networkValue?.let { RelationshipAttestationEntity::networkValue.equal(it) }, - networkOperator?.let { RelationshipAttestationEntity::networkOperator.equal(it) }, - networkHash?.let { RelationshipAttestationEntity::networkHash.equal(it.toString()) }, - pointer?.let { RelationshipAttestationEntity::pointerHash.equal(it.hash.toString()) }, - pointerStateRef?.let { RelationshipAttestationEntity::pointerStateRef.equal(it.toString()) }, - pointerStateLinearId?.let { RelationshipAttestationEntity::pointerStateLinearId.equal(it.id) }, - pointerHash?.let { RelationshipAttestationEntity::pointerHash.equal(it.toString()) }, - status?.let { RelationshipAttestationEntity::status.equal(it) }, - previousStateRef?.let { RelationshipAttestationEntity::previousStateRef.equal(it.toString()) }, - relationship?.let { RelationshipAttestationEntity::pointerStateRef.equal(it.ref.toString()) }, - hash?.let { RelationshipAttestationEntity::hash.equal(it.toString()) } - ) -} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipFlow.kt deleted file mode 100644 index 1bc62ce..0000000 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipFlow.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.workflow.relationship - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.contract.relationship.RelationshipSchema.RelationshipEntity -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.core.workflow.FindStateFlow -import io.onixlabs.corda.core.workflow.andWithExpressions -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.flows.StartableByRPC -import net.corda.core.flows.StartableByService -import net.corda.core.identity.AbstractParty -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.Builder.equal -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.node.services.vault.QueryCriteria -import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria - -@StartableByRPC -@StartableByService -class FindRelationshipFlow( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - hash: SecureHash? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION -) : FindStateFlow() { - override val criteria: QueryCriteria = VaultQueryCriteria( - contractStateTypes = setOf(contractStateType), - relevancyStatus = relevancyStatus, - status = stateStatus - ).andWithExpressions( - linearId?.let { RelationshipEntity::linearId.equal(it.id) }, - externalId?.let { RelationshipEntity::externalId.equal(it) }, - network?.let { RelationshipEntity::networkHash.equal(it.hash.toString()) }, - networkValue?.let { RelationshipEntity::networkValue.equal(it) }, - networkOperator?.let { RelationshipEntity::networkOperator.equal(it) }, - networkHash?.let { RelationshipEntity::networkHash.equal(it.toString()) }, - hash?.let { RelationshipEntity::hash.equal(it.toString()) } - ) -} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipsFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipsFlow.kt deleted file mode 100644 index 16599d4..0000000 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/FindRelationshipsFlow.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.workflow.relationship - -import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.contract.relationship.RelationshipSchema.RelationshipEntity -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.core.workflow.DEFAULT_SORTING -import io.onixlabs.corda.core.workflow.FindStatesFlow -import io.onixlabs.corda.core.workflow.andWithExpressions -import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.SecureHash -import net.corda.core.flows.StartableByRPC -import net.corda.core.flows.StartableByService -import net.corda.core.identity.AbstractParty -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.Builder.equal -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.node.services.vault.QueryCriteria -import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria -import net.corda.core.node.services.vault.Sort - -@StartableByRPC -@StartableByService -class FindRelationshipsFlow( - linearId: UniqueIdentifier? = null, - externalId: String? = null, - network: Network? = null, - networkValue: String? = null, - networkOperator: AbstractParty? = null, - networkHash: SecureHash? = null, - hash: SecureHash? = null, - stateStatus: Vault.StateStatus = Vault.StateStatus.UNCONSUMED, - relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL, - override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION, - override val sorting: Sort = DEFAULT_SORTING -) : FindStatesFlow() { - override val criteria: QueryCriteria = VaultQueryCriteria( - contractStateTypes = setOf(contractStateType), - relevancyStatus = relevancyStatus, - status = stateStatus - ).andWithExpressions( - linearId?.let { RelationshipEntity::linearId.equal(it.id) }, - externalId?.let { RelationshipEntity::externalId.equal(it) }, - network?.let { RelationshipEntity::networkHash.equal(it.hash.toString()) }, - networkValue?.let { RelationshipEntity::networkValue.equal(it) }, - networkOperator?.let { RelationshipEntity::networkOperator.equal(it) }, - networkHash?.let { RelationshipEntity::networkHash.equal(it.toString()) }, - hash?.let { RelationshipEntity::hash.equal(it.toString()) } - ) -} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt index 68b5b34..ebcc4d9 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt @@ -18,7 +18,7 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.workflow.revocation.FindRevocationLockFlow +import io.onixlabs.corda.bnms.workflow.checkRevocationLockExists import io.onixlabs.corda.core.workflow.currentStep import io.onixlabs.corda.identityframework.workflow.FINALIZING import io.onixlabs.corda.identityframework.workflow.SIGNING @@ -47,9 +47,7 @@ class RevokeRelationshipFlowHandler( ) val relationship = serviceHub.toStateAndRef(relationshipStateRef) - subFlow(FindRevocationLockFlow(ourIdentity, relationship.state.data))?.let { - throw FlowException("Revocation of this relationship is locked by counter-party: $ourIdentity") - } + checkRevocationLockExists(ourIdentity, relationship.state.data) } }) diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/FindRevocationLockFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/FindRevocationLockFlow.kt deleted file mode 100644 index 42ab598..0000000 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/FindRevocationLockFlow.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.workflow.revocation - -import io.onixlabs.corda.bnms.contract.revocation.RevocationLock -import io.onixlabs.corda.bnms.contract.revocation.RevocationLockSchema.RevocationLockEntity -import io.onixlabs.corda.core.workflow.DEFAULT_PAGE_SPECIFICATION -import io.onixlabs.corda.core.workflow.FindStateFlow -import io.onixlabs.corda.core.workflow.andWithExpressions -import net.corda.core.contracts.LinearState -import net.corda.core.flows.StartableByRPC -import net.corda.core.flows.StartableByService -import net.corda.core.identity.AbstractParty -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.Builder.equal -import net.corda.core.node.services.vault.PageSpecification -import net.corda.core.node.services.vault.QueryCriteria -import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria - -@StartableByRPC -@StartableByService -class FindRevocationLockFlow(owner: AbstractParty, state: T) : FindStateFlow>() { - override val pageSpecification: PageSpecification = DEFAULT_PAGE_SPECIFICATION - - override val criteria: QueryCriteria = VaultQueryCriteria( - contractStateTypes = setOf(contractStateType), - relevancyStatus = Vault.RelevancyStatus.RELEVANT, - status = Vault.StateStatus.UNCONSUMED - ).andWithExpressions( - RevocationLockEntity::owner.equal(owner), - RevocationLockEntity::pointerStateLinearId.equal(state.linearId.id), - RevocationLockEntity::pointerStateExternalId.equal(state.linearId.externalId), - RevocationLockEntity::pointerStateClass.equal(state.javaClass.canonicalName) - ) -} diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowTests.kt index 474ed73..8dbea1b 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowTests.kt @@ -16,14 +16,16 @@ package io.onixlabs.corda.bnms.workflow.membership -import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation -import io.onixlabs.corda.bnms.contract.membership.accept +import io.onixlabs.corda.bnms.contract.membership.* import io.onixlabs.corda.bnms.workflow.FlowTest import io.onixlabs.corda.bnms.workflow.Pipeline +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.singleOrNull +import io.onixlabs.corda.core.services.vaultServiceFor import net.corda.core.contracts.StateAndRef import org.junit.jupiter.api.Test import org.junit.jupiter.api.fail +import kotlin.test.assertNotNull class SynchronizeMembershipFlowTests : FlowTest() { @@ -59,41 +61,43 @@ class SynchronizeMembershipFlowTests : FlowTest() { @Test fun `Party A has recorded Party C's Membership`() { - Pipeline - .create(network) - .run(nodeA) { - FindMembershipFlow(holder = partyC, network = NETWORK) - } - .finally { assert(it != null) } + val membership = nodeA.services.vaultServiceFor().singleOrNull { + expression(MembershipSchema.MembershipEntity::holder equalTo partyC) + expression(MembershipSchema.MembershipEntity::networkHash equalTo NETWORK.hash.toString()) + } + + assertNotNull(membership) } @Test fun `Party A has recorded Party B's MembershipAttestation for Party C`() { - Pipeline - .create(network) - .run(nodeA) { - FindMembershipAttestationFlow(holder = partyC, network = NETWORK, attestor = partyB) - } - .finally { assert(it != null) } + val attestation = nodeA.services.vaultServiceFor().singleOrNull { + expression(MembershipAttestationSchema.MembershipAttestationEntity::holder equalTo partyC) + expression(MembershipAttestationSchema.MembershipAttestationEntity::networkHash equalTo NETWORK.hash.toString()) + expression(MembershipAttestationSchema.MembershipAttestationEntity::attestor equalTo partyB) + } + + assertNotNull(attestation) } @Test fun `Party C has recorded Party A's Membership`() { - Pipeline - .create(network) - .run(nodeC) { - FindMembershipFlow(holder = partyA, network = NETWORK) - } - .finally { assert(it != null) } + val membership = nodeC.services.vaultServiceFor().singleOrNull { + expression(MembershipSchema.MembershipEntity::holder equalTo partyA) + expression(MembershipSchema.MembershipEntity::networkHash equalTo NETWORK.hash.toString()) + } + + assertNotNull(membership) } @Test fun `Party C has recorded Party B's MembershipAttestation for Party A`() { - Pipeline - .create(network) - .run(nodeA) { - FindMembershipAttestationFlow(holder = partyA, network = NETWORK, attestor = partyB) - } - .finally { assert(it != null) } + val attestation = nodeC.services.vaultServiceFor().singleOrNull { + expression(MembershipAttestationSchema.MembershipAttestationEntity::holder equalTo partyA) + expression(MembershipAttestationSchema.MembershipAttestationEntity::networkHash equalTo NETWORK.hash.toString()) + expression(MembershipAttestationSchema.MembershipAttestationEntity::attestor equalTo partyB) + } + + assertNotNull(attestation) } } From 864f1493a260a867ea8ce00ccb2384eae3338f8e Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Wed, 23 Jun 2021 10:51:02 +0100 Subject: [PATCH 02/23] Removed references to jcenter due to shutdown, and added maven package locations for ONIXLabs dependencies. --- build.gradle | 18 ++++++++++++++++-- gradle.properties | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 70ef458..9136f42 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,6 @@ buildscript { repositories { mavenLocal() mavenCentral() - jcenter() maven { url "$corda_artifactory_url/corda-releases" } maven { url "$corda_artifactory_url/corda-dependencies" } } @@ -52,11 +51,26 @@ subprojects { repositories { mavenLocal() mavenCentral() - jcenter() maven { url "https://jitpack.io" } maven { url "$corda_artifactory_url/corda-releases" } maven { url "$corda_artifactory_url/corda-dependencies" } maven { url "https://repo.gradle.org/gradle/libs-releases" } + maven { + name = "GitHubPackages-onixlabs-corda-core" + url = uri("https://maven.pkg.github.com/onix-labs/onixlabs-corda-core") + credentials { + username = project.findProperty("gpr.user") ?: System.getenv("GITHUB_USERNAME") + password = project.findProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN") + } + } + maven { + name = "GitHubPackages-onixlabs-corda-identity-framework" + url = uri("https://maven.pkg.github.com/onix-labs/onixlabs-corda-identity-framework") + credentials { + username = project.findProperty("gpr.user") ?: System.getenv("GITHUB_USERNAME") + password = project.findProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN") + } + } } configurations { diff --git a/gradle.properties b/gradle.properties index f3036f2..f73e6e1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,6 @@ name=onixlabs-corda-bnms group=io.onixlabs +version=2.0.0 kotlin.incremental=false kotlin.code.style=official From b8f81ec542cf2643bde3ef6fd2446d4927f66e3d Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Sat, 3 Jul 2021 15:13:54 +0100 Subject: [PATCH 03/23] Various updates in preparation for Version 2.0.0 - Updated the setting implementation - All settings now have a normalizedProperty - Sub-class StringSetting has normalizedProperty and normalizedValue - Role and Permission classes massively simplified. - Added Configuration class for implementing membership and relationship configurations. - Added RelationshipConfiguration which is a persistent configuration which may be resolved from a relationship. --- .../corda/bnms/contract/Configuration.kt | 330 ++++++++++++++++++ .../bnms/contract/ConfigurationBuilder.kt | 202 +++++++++++ ...s.kt => ConfigurationBuilderDslContext.kt} | 12 +- .../bnms/contract/Extensions.Iterable.kt | 29 ++ .../corda/bnms/contract/Extensions.Setting.kt | 106 ++++++ .../onixlabs/corda/bnms/contract/Network.kt | 18 +- .../corda/bnms/contract/NetworkState.kt | 10 +- .../corda/bnms/contract/Permission.kt | 11 +- .../io/onixlabs/corda/bnms/contract/Role.kt | 11 +- .../onixlabs/corda/bnms/contract/Setting.kt | 38 +- .../corda/bnms/contract/SettingTypeInfo.kt | 66 ++++ .../corda/bnms/contract/StringSetting.kt | 60 ++++ .../bnms/contract/membership/Membership.kt | 220 +++--------- .../MembershipAttestationContract.kt | 6 +- .../contract/membership/MembershipContract.kt | 33 +- .../contract/relationship/Relationship.kt | 128 ++++--- .../relationship/RelationshipConfiguration.kt | 88 +++++ .../RelationshipConfigurationContract.kt | 26 ++ .../RelationshipConfigurationSchema.kt | 64 ++++ .../relationship/RelationshipMember.kt | 42 --- .../onixlabs/corda/bnms/contract/MockData.kt | 3 +- .../MembershipContractAmendCommandTests.kt | 4 +- .../MembershipContractAmendCommandTests.kt | 4 +- .../general/MembershipPermissionTests.kt | 4 +- .../membership/general/MembershipRoleTests.kt | 4 +- .../general/MembershipSettingTests.kt | 24 +- .../settings/SettingExtensionTests.kt | 123 +++++++ .../bnms/integration/RelationshipService.kt | 12 +- .../onixlabs/corda/bnms/workflow/FlowTest.kt | 4 +- .../membership/AmendMembershipFlowTests.kt | 4 +- .../AmendRelationshipFlowTests.kt | 11 +- 31 files changed, 1373 insertions(+), 324 deletions(-) create mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt create mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt rename onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/{Extensions.kt => ConfigurationBuilderDslContext.kt} (72%) create mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Iterable.kt create mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt create mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt create mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt create mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt create mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationContract.kt create mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt delete mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipMember.kt create mode 100644 onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt new file mode 100644 index 0000000..1ba3c99 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt @@ -0,0 +1,330 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.contract + +import io.onixlabs.corda.core.contract.Hashable +import net.corda.core.crypto.SecureHash +import net.corda.core.serialization.CordaSerializable + +/** + * Represents a configuration consisting of a set of settings. + * + * @property settings The set of settings in this configuration. + * @property permissions The set of permissions in this configuration. + * @property roles The set of roles in this configuration. + * @property hash The unique hash of all settings in this configuration. + */ +@CordaSerializable +data class Configuration(val settings: Set> = emptySet()) : Hashable { + + val permissions: Set + get() = getSettingsByType() + + val roles: Set + get() = getSettingsByType() + + override val hash: SecureHash + get() = computeHash() + + /** + * Gets all settings by type and optionally by property. + * + * @param V The underlying setting value type. + * @param S the underlying setting type. + * @param settingType The setting type. + * @param valueType The setting's value type. + * @param property The setting's property. + * @param ignoreCase Determines whether to ignore case when filtering by property. + * @return Returns all settings matching the specified type and property. + */ + fun > getSettingsByType( + settingType: Class, + valueType: Class? = null, + property: String? = null, + ignoreCase: Boolean = false + ): Set { + val resultsFilteredByType = settings.filterByType(settingType, valueType) + return if (property != null) resultsFilteredByType.filterByProperty(property, ignoreCase).toSet() + else resultsFilteredByType.toSet() + } + + /** + * Gets all settings by type and optionally by property. + * + * @param T The underlying [Setting] type. + * @param property The setting's property. + * @param ignoreCase Determines whether to ignore case when filtering by property. + * @return Returns all settings matching the specified type and property. + */ + inline fun > getSettingsByType( + property: String? = null, + ignoreCase: Boolean = false + ): Set { + val resultsFilteredByType = settings.filterByType() + return if (property != null) resultsFilteredByType.filterByProperty(property, ignoreCase).toSet() + else resultsFilteredByType.toSet() + } + + /** + * Gets a single setting by type and optionally by property. + * + * @param T The underlying [Setting] type. + * @param settingType The setting type. + * @param valueType The setting's value type. + * @param property The setting's property. + * @param ignoreCase Determines whether to ignore case when filtering by property. + * @return Returns a single setting matching the specified type and property. + */ + fun > getSettingByType( + settingType: Class, + valueType: Class? = null, + property: String? = null, + ignoreCase: Boolean = false + ): S = getSettingsByType(settingType, valueType, property, ignoreCase).single() + + /** + * Gets a single setting by type and optionally by property. + * + * @param T The underlying [Setting] type. + * @param property The setting's property. + * @param ignoreCase Determines whether to ignore case when filtering by property. + * @return Returns a single setting matching the specified type and property. + */ + inline fun > getSettingByType( + property: String? = null, + ignoreCase: Boolean = false + ): T = getSettingsByType(property, ignoreCase).single() + + /** + * Gets a single setting by type and optionally by property, or null if no matching setting exists. + * + * @param T The underlying [Setting] type. + * @param settingType The setting type. + * @param valueType The setting's value type. + * @param property The setting's property. + * @param ignoreCase Determines whether to ignore case when filtering by property. + * @return Returns a single setting matching the specified type and property, or null if no matching setting exists. + */ + fun > getSettingByTypeOrNull( + settingType: Class, + valueType: Class? = null, + property: String? = null, + ignoreCase: Boolean = false + ): S? = getSettingsByType(settingType, valueType, property, ignoreCase).singleOrNull() + + /** + * Gets a single setting by type and optionally by property, or null if no matching setting exists. + * + * @param T The underlying [Setting] type. + * @param property The setting's property. + * @param ignoreCase Determines whether to ignore case when filtering by property. + * @return Returns a single setting matching the specified type and property, or null if no matching setting exists. + */ + inline fun > getSettingByTypeOrNull( + property: String? = null, + ignoreCase: Boolean = false + ): T? = getSettingsByType(property, ignoreCase).singleOrNull() + + /** + * Determines whether the specified setting is contained in this configuration. + * + * @param setting The setting to find in this configuration. + * @return Returns true if the specified setting is contained in this configuration; otherwise, false. + */ + fun hasSetting(setting: Setting<*>): Boolean { + return setting in settings + } + + /** + * Determines whether the specified setting is contained in this configuration. + * + * @param property The setting property to find in this configuration. + * @param ignoreCase Determines whether to ignore case when filtering by property. + * @return Returns true if the specified setting is contained in this configuration; otherwise, false. + */ + fun hasSetting(property: String, ignoreCase: Boolean = false): Boolean { + return settings.any { it.property.equals(property, ignoreCase) } + } + + /** + * Determines whether the specified role is contained in this configuration. + * + * @param role The role to find in this configuration. + * @return Returns true if the specified role is contained in this configuration; otherwise, false. + */ + fun hasRole(role: Role): Boolean { + return hasSetting(role) + } + + /** + * Determines whether the specified role is contained in this configuration. + * + * @param role The role to find in this configuration. + * @return Returns true if the specified role is contained in this configuration; otherwise, false. + */ + fun hasRole(role: String): Boolean { + return roles.any { it.normalizedValue == role.toUpperCase() } + } + + /** + * Determines whether the specified permission is contained in this configuration. + * + * @param permission The permission to find in this configuration. + * @return Returns true if the specified permission is contained in this configuration; otherwise, false. + */ + fun hasPermission(permission: Permission): Boolean { + return hasSetting(permission) + } + + /** + * Determines whether the specified permission is contained in this configuration. + * + * @param permission The permission to find in this configuration. + * @return Returns true if the specified permission is contained in this configuration; otherwise, false. + */ + fun hasPermission(permission: String): Boolean { + return permissions.any { it.normalizedValue == permission.toUpperCase() } + } + + /** + * Adds the specified settings to this configuration. + * + * @param settings The settings to add to this configuration. + * @return Returns a new configuration containing the existing and new settings. + */ + fun addSettings(settings: Iterable>): Configuration { + return copy(settings = this.settings + settings) + } + + /** + * Adds the specified settings to this configuration. + * + * @param settings The settings to add to this configuration. + * @return Returns a new configuration with the specified settings added. + */ + fun addSettings(vararg settings: Setting<*>): Configuration { + return addSettings(settings.toList()) + } + + /** + * Removes the specified settings from this configuration. + * + * @param settings The settings to remove from this configuration. + * @return Returns a new configuration with the specified settings removed. + */ + fun removeSettings(settings: Iterable>): Configuration { + return copy(settings = this.settings - settings) + } + + /** + * Removes the specified settings from this configuration. + * + * @param settings The settings to remove from this configuration. + * @return Returns a new configuration with the specified settings removed. + */ + fun removeSettings(vararg settings: Setting<*>): Configuration { + return removeSettings(settings.toList()) + } + + /** + * Adds the specified roles to this configuration. + * + * @param roles The roles to add to this configuration. + * @return Returns a new configuration with the specified roles added. + */ + fun addRoles(roles: Iterable): Configuration { + return copy(settings = this.settings + roles) + } + + /** + * Adds the specified roles to this configuration. + * + * @param roles The roles to add to this configuration. + * @return Returns a new configuration with the specified roles added. + */ + fun addRoles(vararg roles: Role): Configuration { + return addRoles(roles.toList()) + } + + /** + * Removes the specified roles from this configuration. + * + * @param roles The roles to remove from this configuration. + * @return Returns a new configuration with the specified roles removed. + */ + fun removeRoles(roles: Iterable): Configuration { + return copy(settings = this.settings - roles) + } + + /** + * Removes the specified roles from this configuration. + * + * @param roles The roles to remove from this configuration. + * @return Returns a new configuration with the specified roles removed. + */ + fun removeRoles(vararg roles: Role): Configuration { + return removeRoles(roles.toList()) + } + + /** + * Adds the specified permissions to this configuration. + * + * @param permissions The permissions to add to this configuration. + * @return Returns a new configuration with the specified permissions added. + */ + fun addPermissions(permissions: Iterable): Configuration { + return copy(settings = this.settings + permissions) + } + + /** + * Adds the specified permissions to this configuration. + * + * @param permissions The permissions to add to this configuration. + * @return Returns a new configuration with the specified permissions added. + */ + fun addPermissions(vararg permissions: Permission): Configuration { + return addPermissions(permissions.toList()) + } + + /** + * Removes the specified permissions from this configuration. + * + * @param permissions The permissions to remove from this configuration. + * @return Returns a new configuration with the specified permissions removed. + */ + fun removePermissions(permissions: Iterable): Configuration { + return copy(settings = this.settings - permissions) + } + + /** + * Removes the specified permissions from this configuration. + * + * @param permissions The permissions to remove from this configuration. + * @return Returns a new configuration with the specified permissions removed. + */ + fun removePermissions(vararg permissions: Permission): Configuration { + return removePermissions(permissions.toList()) + } + + /** + * Computes the hash of all settings. + */ + private fun computeHash(): SecureHash { + return if (settings.count() == 0) return SecureHash.zeroHash + else settings.map { it.hash }.sorted().reduce { lhs, rhs -> SecureHash.sha256("$lhs$rhs") } + } +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt new file mode 100644 index 0000000..80494f8 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt @@ -0,0 +1,202 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.contract + +class ConfigurationBuilder(private val settings: MutableSet>) { + + constructor(configuration: Configuration) : this(configuration.settings.toMutableSet()) + + /** + * Adds the specified setting to this configuration builder. + * + * @param property The property of the setting to add. + * @param value The value of the setting to add. + */ + @ConfigurationBuilderDslContext + fun addSetting(property: String, value: Any) { + addSettings(Setting(property, value)) + } + + /** + * Adds the specified settings to this configuration builder. + * + * @param settings The settings to add to this configuration builder. + */ + @ConfigurationBuilderDslContext + fun addSettings(settings: Iterable>) { + this.settings += settings + } + + /** + * Adds the specified settings to this configuration builder. + * + * @param settings The settings to add to this configuration builder. + */ + @ConfigurationBuilderDslContext + fun addSettings(vararg settings: Setting<*>) { + return addSettings(settings.toList()) + } + + /** + * Removes the specified settings from this configuration builder. + * + * @param settings The settings to remove from this configuration builder. + */ + @ConfigurationBuilderDslContext + fun removeSettings(settings: Iterable>) { + this.settings -= settings + } + + /** + * Removes the specified settings from this configuration builder. + * + * @param settings The settings to remove from this configuration builder. + */ + @ConfigurationBuilderDslContext + fun removeSettings(vararg settings: Setting<*>) { + return removeSettings(settings.toList()) + } + + /** + * Adds the specified roles to this configuration builder. + * + * @param roles The roles to add to this configuration builder. + */ + @ConfigurationBuilderDslContext + fun addRoles(roles: Iterable) { + this.settings += roles + } + + /** + * Adds the specified roles to this configuration builder. + * + * @param roles The roles to add to this configuration builder. + */ + @ConfigurationBuilderDslContext + fun addRoles(vararg roles: Role) { + return addRoles(roles.toList()) + } + + /** + * Adds the specified roles to this configuration builder. + * + * @param roles The roles to add to this configuration builder. + */ + @ConfigurationBuilderDslContext + fun addRoles(vararg roles: String) { + return addRoles(roles.map { Role(it) }) + } + + /** + * Removes the specified roles from this configuration builder. + * + * @param roles The roles to remove from this configuration builder. + */ + @ConfigurationBuilderDslContext + fun removeRoles(roles: Iterable) { + this.settings -= roles + } + + /** + * Removes the specified roles from this configuration builder. + * + * @param roles The roles to remove from this configuration builder. + */ + @ConfigurationBuilderDslContext + fun removeRoles(vararg roles: Role) { + return removeRoles(roles.toList()) + } + + /** + * Removes the specified roles from this configuration builder. + * + * @param roles The roles to remove from this configuration builder. + */ + @ConfigurationBuilderDslContext + fun removeRoles(vararg roles: String) { + return removeRoles(roles.map { Role(it) }) + } + + /** + * Adds the specified permissions to this configuration builder. + * + * @param permissions The permissions to add to this configuration builder. + */ + @ConfigurationBuilderDslContext + fun addPermissions(permissions: Iterable) { + this.settings += permissions + } + + /** + * Adds the specified permissions to this configuration builder. + * + * @param permissions The permissions to add to this configuration builder. + */ + @ConfigurationBuilderDslContext + fun addPermissions(vararg permissions: Permission) { + return addPermissions(permissions.toList()) + } + + /** + * Adds the specified permissions to this configuration builder. + * + * @param permissions The permissions to add to this configuration builder. + */ + @ConfigurationBuilderDslContext + fun addPermissions(vararg permissions: String) { + return addPermissions(permissions.map { Permission(it) }) + } + + /** + * Removes the specified permissions from this configuration builder. + * + * @param permissions The permissions to remove from this configuration builder. + */ + @ConfigurationBuilderDslContext + fun removePermissions(permissions: Iterable) { + this.settings -= permissions + } + + /** + * Removes the specified permissions from this configuration builder. + * + * @param permissions The permissions to remove from this configuration builder. + */ + @ConfigurationBuilderDslContext + fun removePermissions(vararg permissions: Permission) { + return removePermissions(permissions.toList()) + } + + /** + * Removes the specified permissions from this configuration builder. + * + * @param permissions The permissions to remove from this configuration builder. + */ + @ConfigurationBuilderDslContext + fun removePermissions(vararg permissions: String) { + return removePermissions(permissions.map { Permission(it) }) + } + + /** + * Converts this configuration builder to a configuration. + * + * @return Returns a configuration containing the settings built by this configuration builder. + */ + fun toConfiguration(): Configuration { + return Configuration(settings) + } +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilderDslContext.kt similarity index 72% rename from onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.kt rename to onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilderDslContext.kt index 214c4cb..9b49cf5 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilderDslContext.kt @@ -16,10 +16,8 @@ package io.onixlabs.corda.bnms.contract -inline fun Iterable.isDistinctBy(selector: (T) -> K): Boolean { - return count() == distinctBy(selector).count() -} - -inline fun Setting<*>.cast(): Setting { - return Setting(property, T::class.java.cast(value)) -} +/** + * Represents the marker for functions that belong to the configuration builder. + */ +@DslMarker +annotation class ConfigurationBuilderDslContext diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Iterable.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Iterable.kt new file mode 100644 index 0000000..6167f8b --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Iterable.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.contract + +/** + * Determines whether an [Iterable] is distinct by the specified selector. + * + * @param T The underlying [Iterable] type. + * @param K The underlying selected type. + * @param selector The selector to use to determine distinction. + * @return Returns true if the [Iterable] is distinct by the specified selector; otherwise, false. + */ +fun Iterable.isDistinctBy(selector: (T) -> K): Boolean { + return count() == distinctBy(selector).count() +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt new file mode 100644 index 0000000..3a76284 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt @@ -0,0 +1,106 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.contract + +/** + * Only declared so that I can fit method signatures on a single line. + */ +private typealias Settings = Iterable> + +/** + * Casts a [Setting] of an unknown value type to a [Setting] of type [T]. + * + * @param T The underlying value type of the cast [Setting]. + * @param type The value type to cast to. + * @return Returns a [Setting] of type [T]. + * @throws ClassCastException if the value type cannot be cast to type [T]. + */ +fun Setting<*>.cast(type: Class): Setting { + return Setting(property, type.cast(value)) +} + +/** + * Casts a [Setting] of an unknown value type to a [Setting] of type [T]. + * + * @param T The underlying value type of the cast [Setting]. + * @return Returns a [Setting] of type [T]. + * @throws ClassCastException if the value type cannot be cast to type [T]. + */ +inline fun Setting<*>.cast(): Setting { + return cast(T::class.java) +} + +/** + * Casts an [Iterable] of [Setting] of an unknown value type to an [Iterable] of [Setting] of type [T]. + * + * @param T The underlying value type of the cast [Setting]. + * @param type The value type to cast to. + * @return Returns an [Iterable] of [Setting] of type [T]. + * @throws ClassCastException if the value type cannot be cast to type [T]. + */ +fun Settings.cast(type: Class): List> { + return map { it.cast(type) } +} + +/** + * Casts an [Iterable] of [Setting] of an unknown value type to an [Iterable] of [Setting] of type [T]. + * + * @param T The underlying value type of the cast [Setting]. + * @return Returns an [Iterable] of [Setting] of type [T]. + * @throws ClassCastException if the value type cannot be cast to type [T]. + */ +inline fun Settings.cast(): List> { + return cast(T::class.java) +} + +/** + * Filters an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. + * + * @param V The underlying value type. + * @param S The underlying setting type. + * @param settingType The setting type. + * @param valueType The value type, or null if the setting type is derived, or the value type is unknown or a wildcard. + * @return Returns an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. + */ +fun > Settings.filterByType(settingType: Class, valueType: Class? = null): List { + val settingsFilteredBySettingType = filter { it.javaClass == settingType }.filterIsInstance(settingType) + return if (valueType != null) settingsFilteredBySettingType.filter { it.value?.javaClass == valueType } + else settingsFilteredBySettingType +} + +/** + * Filters an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. + * + * @param T The underlying setting type. + * @return Returns an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. + */ +inline fun > Iterable>.filterByType(): List { + val typeInfo = object : SettingTypeInfo() {} + return filterByType(typeInfo.settingType, typeInfo.valueType) +} + +/** + * Filters an [Iterable] of [Setting] by the specified property. + * + * @param T The underlying setting type. + * @param property The property to filter by. + * @param ignoreCase Determines whether to ignore the property case when filtering; for example when filtering by a normalized property. + * @return Returns an [Iterable] of [Setting] by the specified property. + */ +fun > Iterable.filterByProperty(property: String, ignoreCase: Boolean = false): List { + return filter { it.property.equals(property, ignoreCase) } +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt index ae6814e..b233711 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt @@ -16,15 +16,21 @@ package io.onixlabs.corda.bnms.contract -import io.onixlabs.corda.core.contract.Hashable import net.corda.core.crypto.SecureHash import net.corda.core.identity.AbstractParty -class Network( - value: String, - val operator: AbstractParty? = null -) : Setting(NETWORK, value.toUpperCase()), Hashable { +/** + * Represents a reference to a business network. + * + * @property property The property of the network setting, which is always "Network". + * @property normalizedProperty The normalized property of the network setting, which is always "NETWORK". + * @property value The value of the network, which is usually the name of the business network. + * @property normalizedValue The normalized value of the network. + * @property operator The business network operator, or null if the business network is decentralized. + * @property hash The hash that uniquely identifies the network reference. + */ +class Network(value: String, val operator: AbstractParty? = null) : StringSetting(NETWORK, value) { override val hash: SecureHash - get() = SecureHash.sha256("$value$operator") + get() = SecureHash.sha256("${super.hash}$operator") } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt index 964e2d7..48d51fa 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt @@ -16,10 +16,14 @@ package io.onixlabs.corda.bnms.contract -import io.onixlabs.corda.core.contract.ChainState import net.corda.core.contracts.LinearState import net.corda.core.schemas.QueryableState -interface NetworkState : ChainState, LinearState, QueryableState { +/** + * Defines a contract state that belongs to a business network. + * + * @property network The business network that the state belongs to. + */ +interface NetworkState : LinearState, QueryableState { val network: Network -} \ No newline at end of file +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt index be8c507..3a01da6 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt @@ -16,4 +16,13 @@ package io.onixlabs.corda.bnms.contract -class Permission(value: String) : Setting(PERMISSION, value.toUpperCase()) \ No newline at end of file +/** + * Represents a network permission. + * + * @property property The property of the permission, which is always "Permission". + * @property normalizedProperty The normalized property of the permission, which is always "PERMISSION". + * @property value The value of the permission. + * @property normalizedValue The normalized value of the permission. + * @property hash The hash that uniquely identifies the permission. + */ +class Permission(value: String) : StringSetting(PERMISSION, value) diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt index 071296b..74d0c5e 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt @@ -16,4 +16,13 @@ package io.onixlabs.corda.bnms.contract -class Role(value: String) : Setting(ROLE, value.toUpperCase()) \ No newline at end of file +/** + * Represents a network role. + * + * @property property The property of the role, which is always "Role". + * @property normalizedProperty The normalized property of the role, which is always "ROLE". + * @property value The value of the role. + * @property normalizedValue The normalized value of the role. + * @property hash The hash that uniquely identifies the role. + */ +class Role(value: String) : StringSetting(ROLE, value) \ No newline at end of file diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt index 0a70c08..fc83003 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt @@ -16,17 +16,40 @@ package io.onixlabs.corda.bnms.contract +import io.onixlabs.corda.core.contract.Hashable import io.onixlabs.corda.identityframework.contract.Claim +import net.corda.core.crypto.SecureHash import java.util.* -open class Setting(property: String, value: T) : Claim(property.toUpperCase(), value) { +/** + * Represents the base class for implementing settings. + * + * @property T The underlying setting value type. + * @property property The property of the setting. + * @property normalizedProperty The normalized property of the setting, which is an upper-case property. + * @property value The value of the setting. + * @property hash The hash that uniquely identifies the setting. + */ +open class Setting(property: String, value: T) : Claim(property, value), Hashable { internal companion object { - const val NETWORK = "NETWORK" - const val ROLE = "ROLE" - const val PERMISSION = "PERMISSION" + const val NETWORK = "Network" + const val ROLE = "Role" + const val PERMISSION = "Permission" } + val normalizedProperty: String + get() = property.toUpperCase() + + override val hash: SecureHash + get() = SecureHash.sha256("$normalizedProperty$value") + + /** + * Determines whether the specified object is equal to the current object. + * + * @param other The object to compare with the current object. + * @return Returns true if the specified object is equal to the current object; otherwise, false. + */ override fun equals(other: Any?): Boolean { return this === other || (other is Setting<*> && other.javaClass == javaClass @@ -34,7 +57,12 @@ open class Setting(property: String, value: T) : Claim(property.toUp && value == other.value) } + /** + * Serves as the default hash function. + * + * @return Returns a hash code for the current object. + */ override fun hashCode(): Int { return Objects.hash(property, value) } -} \ No newline at end of file +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt new file mode 100644 index 0000000..77d15da --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt @@ -0,0 +1,66 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.contract + +import io.onixlabs.corda.core.toClass +import io.onixlabs.corda.core.toTypedClass +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type +import java.lang.reflect.WildcardType + +/** + * Represents the base class for obtaining setting type information implementations. + * + * @param T The underlying setting type. + * @property settingType Obtains the most derived setting type in the type hierarchy. + * @property valueType Obtains the value type of the setting, or null if the value type was specified as a wildcard. + */ +@PublishedApi +internal abstract class SettingTypeInfo> : Comparable> { + + val settingType: Class + get() = getSettingTypeInternal().toTypedClass() + + val valueType: Class<*>? + get() = getValueTypeInternal() + + override fun compareTo(other: SettingTypeInfo): Int = 0 + + /** + * Gets the most derived setting type in the type hierarchy. + */ + private fun getSettingTypeInternal(): Type { + val superClass = javaClass.genericSuperclass + check(superClass !is Class<*>) { "Internal error: TypeReference constructed without actual type information" } + return (superClass as ParameterizedType).actualTypeArguments[0] + } + + /** + * Gets the value type of the setting, or null if the value type was specified as a wildcard. + * + * The reason for returning a nullable [Class] is because settings could be specified as: + * - Setting<*> - Settings of unknown value type, or settings regardless of value type. + * - Setting - Settings specifically of [Any] value type. + */ + private tailrec fun getValueTypeInternal(settingType: Type = getSettingTypeInternal()): Class<*>? { + return if (settingType.toClass() == Setting::class.java) { + val parameterizedType = settingType as ParameterizedType + val argument = parameterizedType.actualTypeArguments[0] + if (argument is WildcardType) null else argument.toClass() + } else getValueTypeInternal(settingType.toClass().genericSuperclass) + } +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt new file mode 100644 index 0000000..7fce287 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.contract + +import net.corda.core.crypto.SecureHash +import java.util.* + +/** + * Represents the base class for implementing string value settings. + * + * @property property The property of the setting. + * @property normalizedProperty The normalized property of the setting, which is an upper-case property. + * @property value The value of the setting. + * @property normalizedValue The normalized value of the setting, which is an upper-case value. + * @property hash The hash that uniquely identifies the setting. + */ +open class StringSetting(property: String, value: String) : Setting(property, value) { + + val normalizedValue: String + get() = value.toUpperCase() + + override val hash: SecureHash + get() = SecureHash.sha256("$normalizedProperty$normalizedValue") + + /** + * Determines whether the specified object is equal to the current object. + * + * @param other The object to compare with the current object. + * @return Returns true if the specified object is equal to the current object; otherwise, false. + */ + override fun equals(other: Any?): Boolean { + return this === other || (other is StringSetting + && other.javaClass == javaClass + && normalizedProperty == other.normalizedProperty + && normalizedValue == other.normalizedValue) + } + + /** + * Serves as the default hash function. + * + * @return Returns a hash code for the current object. + */ + override fun hashCode(): Int { + return Objects.hash(normalizedProperty, normalizedValue) + } +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt index ec083c9..c666af4 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt @@ -19,6 +19,7 @@ package io.onixlabs.corda.bnms.contract.membership import io.onixlabs.corda.bnms.contract.* import io.onixlabs.corda.bnms.contract.membership.MembershipSchema.MembershipEntity import io.onixlabs.corda.bnms.contract.membership.MembershipSchema.MembershipSchemaV1 +import io.onixlabs.corda.core.contract.ChainState import io.onixlabs.corda.core.contract.Hashable import io.onixlabs.corda.identityframework.contract.AbstractClaim import net.corda.core.contracts.BelongsToContract @@ -29,183 +30,65 @@ import net.corda.core.identity.AbstractParty import net.corda.core.schemas.MappedSchema import net.corda.core.schemas.PersistentState +/** + * Represents a membership to a business network. + * + * @property network The business network that this membership belongs to. + * @property holder The holder of the membership. + * @property identity The claims that represent the identity of the holder of the membership. + * @property configuration The configuration of the membership, including settings, roles and permissions. + * @property linearId The unique identifier of the membership. + * @property previousStateRef The state reference of the previous membership state in the chain. + * @property isNetworkOperator Determines whether this membership represents the business network operator. + * @property hash The unique hash that represents this membership. + * @property participants The participants of this membership; namely the holder and optionally the network operator. + */ @BelongsToContract(MembershipContract::class) data class Membership( override val network: Network, val holder: AbstractParty, val identity: Set> = emptySet(), - val settings: Set> = emptySet(), + val configuration: Configuration = Configuration(), override val linearId: UniqueIdentifier = UniqueIdentifier(), override val previousStateRef: StateRef? = null -) : NetworkState, Hashable { +) : NetworkState, ChainState, Hashable { + + constructor( + network: Network, + holder: AbstractParty, + identity: Set> = emptySet(), + settings: Set> = emptySet(), + linearId: UniqueIdentifier = UniqueIdentifier() + ) : this(network, holder, identity, Configuration(settings), linearId, null) val isNetworkOperator: Boolean get() = holder == network.operator - val roles: Set - get() = getSettingsByType() - - val permissions: Set - get() = getSettingsByType() - override val hash: SecureHash - get() = SecureHash.sha256("$network$holder$previousStateRef") + get() = SecureHash.sha256("$network$holder${configuration.hash}$previousStateRef") override val participants: List get() = setOf(holder, network.operator).filterNotNull() - fun hasSetting(setting: Setting<*>): Boolean { - return setting in settings - } - - fun hasSetting(property: String): Boolean { - return settings.any { it.property == property.toUpperCase() } - } - - fun > getSettingsByType(settingClass: Class, property: String? = null): Set { - return settings - .filter { it.javaClass == settingClass } - .filter { property?.toUpperCase()?.equals(it.property) ?: true } - .map { settingClass.cast(it) } - .toSet() - } - - inline fun > getSettingsByType(property: String? = null): Set { - return getSettingsByType(T::class.java, property) - } - - fun > getSettingByTypeOrNull(settingClass: Class, property: String? = null): T? { - return getSettingsByType(settingClass, property).singleOrNull() - } - - fun > getSettingByType(settingClass: Class, property: String? = null): T { - return getSettingsByType(settingClass, property).single() - } - - inline fun > getSettingByTypeOrNull(property: String? = null): T? { - return getSettingByTypeOrNull(T::class.java, property) - } - - inline fun > getSettingByType(property: String? = null): T { - return getSettingByType(T::class.java, property) - } - - fun getSettingsByValueType(valueClass: Class, property: String? = null): Set> { - return settings - .filter { it.value.javaClass == valueClass } - .filter { property?.toUpperCase()?.equals(it.property) ?: true } - .map { Setting(it.property, valueClass.cast(it.value)) } - .toSet() - } - - inline fun getSettingsByValueType(property: String? = null): Set> { - return getSettingsByValueType(T::class.java, property) - } - - fun getSettingByValueTypeOrNull(valueClass: Class, property: String? = null): Setting? { - return getSettingsByValueType(valueClass, property).singleOrNull() - } - - fun getSettingByValueType(valueClass: Class, property: String? = null): Setting { - return getSettingsByValueType(valueClass, property).single() - } - - inline fun getSettingByValueTypeOrNull(property: String? = null): Setting? { - return getSettingByValueTypeOrNull(T::class.java, property) - } - - inline fun getSettingByValueType(property: String? = null): Setting { - return getSettingByValueType(T::class.java, property) - } - - fun addSetting(property: String, value: T): Membership where T : Any { - return addSettings(Setting(property, value)) - } - - fun addSettings(settings: Set>): Membership where T : Any { - return copy(settings = this.settings + settings) - } - - fun addSettings(vararg settings: Setting): Membership where T : Any { - return addSettings(settings.toSet()) - } - - fun removeSetting(property: String, value: T): Membership where T : Any { - return removeSettings(Setting(property, value)) - } - - fun removeSettings(settings: Set>): Membership where T : Any { - return copy(settings = this.settings - settings) - } - - fun removeSettings(vararg settings: Setting): Membership where T : Any { - return removeSettings(settings.toSet()) - } - - fun hasRole(role: Role): Boolean { - return role in roles - } - - fun hasRole(role: String): Boolean { - return hasRole(Role(role)) - } - - fun addRoles(roles: Set): Membership { - return addSettings(roles) - } - - fun addRoles(vararg roles: Role): Membership { - return addRoles(roles.toSet()) - } - - fun addRoles(vararg roles: String): Membership { - return addRoles(roles.map { Role(it) }.toSet()) - } - - fun removeRoles(roles: Set): Membership { - return removeSettings(roles) - } - - fun removeRoles(vararg roles: Role): Membership { - return removeRoles(roles.toSet()) - } - - fun removeRoles(vararg roles: String): Membership { - return removeRoles(roles.map { Role(it) }.toSet()) - } - - fun hasPermission(permission: Permission): Boolean { - return permission in permissions - } - - fun hasPermission(permission: String): Boolean { - return hasPermission(Permission(permission)) - } - - fun addPermissions(permissions: Set): Membership { - return addSettings(permissions) - } - - fun addPermissions(vararg permissions: Permission): Membership { - return addPermissions(permissions.toSet()) - } - - fun addPermissions(vararg permissions: String): Membership { - return addPermissions(permissions.map { Permission(it) }.toSet()) - } - - fun removePermissions(permissions: Set): Membership { - return removeSettings(permissions) - } - - fun removePermissions(vararg permissions: Permission): Membership { - return removePermissions(permissions.toSet()) - } - - fun removePermissions(vararg permissions: String): Membership { - return removePermissions(permissions.map { Permission(it) }.toSet()) - } - + /** + * Configures this membership. + * + * @param action The action which will configure this membership. + * @return Returns a new membership state containing the updated configuration. + */ + @ConfigurationBuilderDslContext + fun configure(action: ConfigurationBuilder.() -> Unit): Membership { + val builder = ConfigurationBuilder(configuration) + action(builder) + return copy(configuration = builder.toConfiguration()) + } + + /** + * Generates a persistent state entity from this contract state. + * + * @param schema The mapped schema from which to generate a persistent state entity. + * @return Returns a persistent state entity. + */ override fun generateMappedObject(schema: MappedSchema): PersistentState = when (schema) { is MembershipSchemaV1 -> MembershipEntity( linearId = linearId.id, @@ -220,11 +103,24 @@ data class Membership( else -> throw IllegalArgumentException("Unrecognised schema: $schema.") } + /** + * Gets the supported schemas of this state. + * + * @return Returns the supported schemas of this state. + */ override fun supportedSchemas(): Iterable { return listOf(MembershipSchemaV1) } + /** + * Ensures that the immutable properties of this membership have not changed. + * + * @param other The membership to compare with the current membership. + * @return Returns true if the immutable properties have not changed; otherwise, false. + */ internal fun immutableEquals(other: Membership): Boolean { - return this === other || (network == other.network && holder == other.holder && linearId == other.linearId) + return this === other || (network == other.network + && holder == other.holder + && linearId == other.linearId) } } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt index 8132eff..e0b808a 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt @@ -16,6 +16,7 @@ package io.onixlabs.corda.bnms.contract.membership +import io.onixlabs.corda.core.contract.ContractID import io.onixlabs.corda.identityframework.contract.AttestationContract import net.corda.core.contracts.Contract import net.corda.core.contracts.ContractClassName @@ -25,10 +26,7 @@ import java.security.PublicKey class MembershipAttestationContract : AttestationContract(), Contract { - companion object { - @JvmStatic - val ID: ContractClassName = this::class.java.enclosingClass.canonicalName - } + companion object : ContractID internal object Issue { const val CONTRACT_RULE_REFERENCES = diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt index 0376010..b25e122 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt @@ -16,28 +16,25 @@ package io.onixlabs.corda.bnms.contract.membership -import net.corda.core.contracts.* +import io.onixlabs.corda.core.contract.ContractID +import io.onixlabs.corda.core.contract.VerifiedCommandData +import io.onixlabs.corda.core.contract.allowCommands +import net.corda.core.contracts.Contract +import net.corda.core.contracts.requireThat import net.corda.core.transactions.LedgerTransaction import java.security.PublicKey class MembershipContract : Contract { - companion object { - @JvmStatic - val ID: ContractClassName = this::class.java.enclosingClass.canonicalName - } + companion object : ContractID - override fun verify(tx: LedgerTransaction) { - val command = tx.commands.requireSingleCommand() - when (command.value) { - is Issue, is Amend, is Revoke -> command.value.verifyCommand(tx, command.signers.toSet()) - else -> throw IllegalArgumentException("Unrecognised command: ${command.value}") - } - } + override fun verify(tx: LedgerTransaction) = tx.allowCommands( + Issue::class.java, + Amend::class.java, + Revoke::class.java + ) - interface MembershipContractCommand : CommandData { - fun verifyCommand(transaction: LedgerTransaction, signers: Set) - } + interface MembershipContractCommand : VerifiedCommandData object Issue : MembershipContractCommand { @@ -53,7 +50,7 @@ class MembershipContract : Contract { internal const val CONTRACT_RULE_SIGNERS = "On membership issuing, either the holder or the network operator of the creates membership state must sign the transaction." - override fun verifyCommand(transaction: LedgerTransaction, signers: Set) = requireThat { + override fun verify(transaction: LedgerTransaction, signers: Set) = requireThat { val inputs = transaction.inputsOfType() val outputs = transaction.outputsOfType() @@ -84,7 +81,7 @@ class MembershipContract : Contract { internal const val CONTRACT_RULE_SIGNERS = "On membership amending, either the holder or the network operator of the created membership state must sign the transaction." - override fun verifyCommand(transaction: LedgerTransaction, signers: Set) = requireThat { + override fun verify(transaction: LedgerTransaction, signers: Set) = requireThat { val inputs = transaction.inRefsOfType() val outputs = transaction.outputsOfType() @@ -111,7 +108,7 @@ class MembershipContract : Contract { internal const val CONTRACT_RULE_SIGNERS = "On membership revoking, either the holder or the network operator of the consumed membership state must sign the transaction." - override fun verifyCommand(transaction: LedgerTransaction, signers: Set) = requireThat { + override fun verify(transaction: LedgerTransaction, signers: Set) = requireThat { val inputs = transaction.inRefsOfType() val outputs = transaction.outputsOfType() diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt index 788cac2..046be0a 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt @@ -17,49 +17,81 @@ package io.onixlabs.corda.bnms.contract.relationship import io.onixlabs.corda.bnms.contract.* +import io.onixlabs.corda.bnms.contract.relationship.RelationshipConfigurationSchema.RelationshipConfigurationEntity import io.onixlabs.corda.bnms.contract.relationship.RelationshipSchema.RelationshipEntity import io.onixlabs.corda.bnms.contract.relationship.RelationshipSchema.RelationshipSchemaV1 import io.onixlabs.corda.bnms.contract.revocation.RevocationLock -import io.onixlabs.corda.core.contract.Hashable -import io.onixlabs.corda.core.contract.participantHash -import net.corda.core.contracts.BelongsToContract -import net.corda.core.contracts.LinearPointer -import net.corda.core.contracts.StateRef -import net.corda.core.contracts.UniqueIdentifier +import io.onixlabs.corda.core.contract.* +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.vaultQuery +import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash import net.corda.core.identity.AbstractParty +import net.corda.core.node.services.vault.QueryCriteria import net.corda.core.schemas.MappedSchema import net.corda.core.schemas.PersistentState +/** + * Represents a multi-lateral relationship between participants of a business network. + * + * @property network The business network that this relationship belongs to. + * @property members The members of this relationship and their relationship configuration. + * @property linearId The unique identifier of the relationship. + * @property previousStateRef The state reference of the previous relationship state in the chain. + * @property configurations A resolver for all relationship configurations that belong to this relationship. + * @property hash The unique hash that represents this relationship. + * @property participants The participants of this relationship; namely the relationship members. + */ @BelongsToContract(RelationshipContract::class) data class Relationship( override val network: Network, - val members: Set, - val settings: Set> = emptySet(), + val members: Map = emptyMap(), override val linearId: UniqueIdentifier = UniqueIdentifier(), override val previousStateRef: StateRef? = null -) : NetworkState, Hashable { - - init { - check(members.isDistinctBy { it.member }) { - "Cannot create a relationship with duplicate members." - } +) : NetworkState, ChainState, Hashable { - check(settings.isDistinctBy { it.property }) { - "Cannot create a relationship with duplicate settings." - } - } + val configurations: PluralResolvable + get() = RelationshipConfigurationResolver(linearId) override val hash: SecureHash get() = SecureHash.sha256("$network${participants.participantHash}$previousStateRef") override val participants: List - get() = members.map { it.member }.distinct() + get() = members.map { it.key } + /** + * Creates revocation locks for each relationship participant. + * + * @return Returns a list of [RevocationLock] pointing to this relationship for each participant. + */ fun createRevocationLocks(): List> { - return members.map { RevocationLock(it.member, LinearPointer(this.linearId, this.javaClass, false)) } + return participants.map { RevocationLock(it, LinearPointer(this.linearId, this.javaClass, false)) } } + /** + * Configures this relationship for the specified participant. + * + * @param member The member of the relationship which will be configured. + * @param action The action which will configure this relationship. + * @return Returns a new relationship state containing the updated configuration. + */ + @ConfigurationBuilderDslContext + fun configure(member: AbstractParty, action: ConfigurationBuilder.() -> Unit): Relationship { + val configuration = members[member] + ?: throw IllegalArgumentException("The specified member was not found in this relationship: $member.") + val builder = ConfigurationBuilder(configuration) + action(builder) + val mutableMembers = members.toMutableMap() + mutableMembers[member] = builder.toConfiguration() + return copy(members = mutableMembers) + } + + /** + * Generates a persistent state entity from this contract state. + * + * @param schema The mapped schema from which to generate a persistent state entity. + * @return Returns a persistent state entity. + */ override fun generateMappedObject(schema: MappedSchema): PersistentState = when (schema) { is RelationshipSchemaV1 -> RelationshipEntity( linearId = linearId.id, @@ -72,31 +104,49 @@ data class Relationship( else -> throw IllegalArgumentException("Unrecognised schema: $schema.") } + /** + * Gets the supported schemas of this state. + * + * @return Returns the supported schemas of this state. + */ override fun supportedSchemas(): Iterable { return listOf(RelationshipSchemaV1) } - fun addSettings(vararg settings: Setting): Relationship { - return copy(settings = this.settings + settings) - } - - fun addSetting(property: String, value: T): Relationship { - return addSettings(Setting(property, value)) - } - - fun removeSettings(vararg settings: Setting): Relationship { - return copy(settings = this.settings - settings) - } - - inline fun > getSetting(property: String): T? { - return settings.filterIsInstance().singleOrNull { it.property == property.toUpperCase() } + /** + * Ensures that the immutable properties of this relationship have not changed. + * + * @param other The relationship to compare with the current relationship. + * @return Returns true if the immutable properties have not changed; otherwise, false. + */ + internal fun immutableEquals(other: Relationship): Boolean { + return this === other || (network == other.network && linearId == other.linearId) } - inline fun getSettingByValueType(property: String): Setting? { - return settings.singleOrNull { it.property == property.toUpperCase() }?.cast() - } + /** + * Represents the resolver which will be used to resolve relationship configurations for the specified relationship linear ID. + * + * @param relationshipLinearId The relationship linear ID for which to resolve relationship configurations. + */ + private class RelationshipConfigurationResolver( + private val relationshipLinearId: UniqueIdentifier + ) : AbstractPluralResolvable() { + + /** + * The vault query criteria which will be used to resolve relationship configurations. + */ + override val criteria: QueryCriteria = vaultQuery { + expression(RelationshipConfigurationEntity::relationshipLinearId equalTo relationshipLinearId.id) + } - internal fun immutableEquals(other: Relationship): Boolean { - return this === other || (network == other.network && linearId == other.linearId) + /** + * Determines whether this [PluralResolvable] is pointing to the specified [StateAndRef] instance. + * + * @param stateAndRef The [StateAndRef] to determine being pointed to. + * @return Returns true if this [PluralResolvable] is pointing to the specified [StateAndRef]; otherwise, false. + */ + override fun isPointingTo(stateAndRef: StateAndRef): Boolean { + return relationshipLinearId == stateAndRef.state.data.relationshipLinearId + } } } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt new file mode 100644 index 0000000..05a7949 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt @@ -0,0 +1,88 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.contract.relationship + +import io.onixlabs.corda.bnms.contract.Configuration +import io.onixlabs.corda.bnms.contract.Network +import io.onixlabs.corda.bnms.contract.NetworkState +import io.onixlabs.corda.bnms.contract.relationship.RelationshipConfigurationSchema.RelationshipConfigurationEntity +import io.onixlabs.corda.bnms.contract.relationship.RelationshipConfigurationSchema.RelationshipConfigurationSchemaV1 +import io.onixlabs.corda.core.contract.AbstractSingularResolvable +import io.onixlabs.corda.core.contract.Hashable +import io.onixlabs.corda.core.contract.SingularResolvable +import io.onixlabs.corda.core.services.vaultQuery +import net.corda.core.contracts.BelongsToContract +import net.corda.core.contracts.StateAndRef +import net.corda.core.contracts.UniqueIdentifier +import net.corda.core.crypto.SecureHash +import net.corda.core.identity.AbstractParty +import net.corda.core.node.services.vault.QueryCriteria +import net.corda.core.schemas.MappedSchema + +@BelongsToContract(RelationshipConfigurationContract::class) +class RelationshipConfiguration private constructor( + override val network: Network, + override val participants: List, + val configuration: Configuration, + val relationshipLinearId: UniqueIdentifier, + override val linearId: UniqueIdentifier +) : NetworkState, Hashable { + + constructor( + relationship: Relationship, + configuration: Configuration, + linearId: UniqueIdentifier = UniqueIdentifier() + ) : this(relationship.network, relationship.participants, configuration, relationship.linearId, linearId) + + val relationship: SingularResolvable + get() = RelationshipResolver(relationshipLinearId) + + override val hash: SecureHash + get() = SecureHash.sha256("${configuration.hash}$relationshipLinearId") + + override fun generateMappedObject(schema: MappedSchema) = when (schema) { + is RelationshipConfigurationSchemaV1 -> RelationshipConfigurationEntity( + linearId = linearId.id, + externalId = linearId.externalId, + relationshipLinearId = relationshipLinearId.id, + relationshipExternalId = relationshipLinearId.externalId, + networkValue = network.value, + networkOperator = network.operator, + networkHash = network.hash.toString(), + configurationHash = configuration.hash.toString(), + hash = hash.toString() + ) + else -> throw IllegalArgumentException("Unrecognised schema: $schema.") + } + + override fun supportedSchemas(): Iterable { + return listOf(RelationshipConfigurationSchemaV1) + } + + private class RelationshipResolver( + private val relationshipLinearId: UniqueIdentifier + ) : AbstractSingularResolvable() { + + override val criteria: QueryCriteria = vaultQuery { + linearIds(relationshipLinearId) + } + + override fun isPointingTo(stateAndRef: StateAndRef): Boolean { + return relationshipLinearId == stateAndRef.state.data.linearId + } + } +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationContract.kt new file mode 100644 index 0000000..c08b814 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationContract.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.contract.relationship + +import net.corda.core.contracts.Contract +import net.corda.core.transactions.LedgerTransaction + +class RelationshipConfigurationContract : Contract { + override fun verify(tx: LedgerTransaction) { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt new file mode 100644 index 0000000..abe5574 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.contract.relationship + +import net.corda.core.identity.AbstractParty +import net.corda.core.schemas.MappedSchema +import net.corda.core.schemas.PersistentState +import java.util.* +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.Table + +object RelationshipConfigurationSchema { + + object RelationshipConfigurationSchemaV1 : + MappedSchema(RelationshipSchema.javaClass, 1, listOf(RelationshipConfigurationEntity::class.java)) { + override val migrationResource = "relationship-configuration-schema.changelog-master" + } + + @Entity + @Table(name = "relationship_configuration_states") + class RelationshipConfigurationEntity( + @Column(name = "linear_id", nullable = false) + val linearId: UUID = UUID.randomUUID(), + + @Column(name = "external_id", nullable = true) + val externalId: String? = null, + + @Column(name = "relationship_linear_id", nullable = false) + val relationshipLinearId: UUID = UUID.randomUUID(), + + @Column(name = "relationship_external_id", nullable = true) + val relationshipExternalId: String? = null, + + @Column(name = "network_value", nullable = false) + val networkValue: String = "", + + @Column(name = "network_operator", nullable = true) + val networkOperator: AbstractParty? = null, + + @Column(name = "network_hash", nullable = false) + val networkHash: String = "", + + @Column(name = "configuration_hash", nullable = false) + val configurationHash: String = "", + + @Column(name = "hash", nullable = false) + val hash: String = "" + ) : PersistentState() +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipMember.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipMember.kt deleted file mode 100644 index f52af62..0000000 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipMember.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.contract.relationship - -import io.onixlabs.corda.bnms.contract.Setting -import io.onixlabs.corda.bnms.contract.cast -import io.onixlabs.corda.identityframework.contract.AbstractClaim -import net.corda.core.identity.AbstractParty -import net.corda.core.serialization.CordaSerializable - -@CordaSerializable -data class RelationshipMember( - val member: AbstractParty, - val settings: Set> = emptySet(), - val claims: Set> = emptySet() -) { - inline fun > getSetting(property: String): T? { - return settings.filterIsInstance().singleOrNull { it.property == property.toUpperCase() } - } - - inline fun getSettingByValueType(property: String): Setting? { - return settings.singleOrNull { it.property == property.toUpperCase() }?.cast() - } - - inline fun > getClaim(property: String): T? { - return claims.filterIsInstance().singleOrNull { it.property == property } - } -} \ No newline at end of file diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/MockData.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/MockData.kt index 303c101..e02eb3d 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/MockData.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/MockData.kt @@ -18,7 +18,6 @@ package io.onixlabs.corda.bnms.contract import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.contract.relationship.RelationshipMember import io.onixlabs.corda.bnms.contract.revocation.RevocationLock import net.corda.core.contracts.StateRef import net.corda.core.crypto.SecureHash @@ -53,7 +52,7 @@ val DECENTRALIZED_MEMBERSHIP_IDENTITY_A = Membership(DECENTRALIZED_NETWORK, IDEN val DECENTRALIZED_MEMBERSHIP_IDENTITY_B = Membership(DECENTRALIZED_NETWORK, IDENTITY_B.party) val DECENTRALIZED_MEMBERSHIP_IDENTITY_C = Membership(DECENTRALIZED_NETWORK, IDENTITY_C.party) -val MEMBERS = setOf(RelationshipMember(IDENTITY_A.party), RelationshipMember(IDENTITY_B.party)) +val MEMBERS = mapOf(IDENTITY_A.party to Configuration(), IDENTITY_B.party to Configuration()) val RELATIONSHIP = Relationship(CENTRALIZED_NETWORK, MEMBERS) val REVOCATION_LOCK = RevocationLock(IDENTITY_A.party, DummyLinearContract.State()) \ No newline at end of file diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractAmendCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractAmendCommandTests.kt index 5832e0c..3353aad 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractAmendCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractAmendCommandTests.kt @@ -29,7 +29,7 @@ class MembershipContractAmendCommandTests : ContractTest() { services.ledger { transaction { val issuedMembershipA = issue(CENTRALIZED_MEMBERSHIP_IDENTITY_A) - val amendedMembershipA = issuedMembershipA.getNextOutput().addRoles("Example") + val amendedMembershipA = issuedMembershipA.getNextOutput().configure { addRoles("Example") } input(issuedMembershipA.ref) output(MembershipContract.ID, amendedMembershipA) fails() @@ -59,7 +59,7 @@ class MembershipContractAmendCommandTests : ContractTest() { transaction { val issuedMembershipA = issue(CENTRALIZED_MEMBERSHIP_IDENTITY_A) val issuedMembershipB = CENTRALIZED_MEMBERSHIP_IDENTITY_B - val amendedMembershipA = issuedMembershipA.getNextOutput().addRoles("Example") + val amendedMembershipA = issuedMembershipA.getNextOutput().configure { addRoles("Example") } input(issuedMembershipA.ref) output(MembershipContract.ID, amendedMembershipA) output(MembershipContract.ID, issuedMembershipB) diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractAmendCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractAmendCommandTests.kt index 4bd467c..7f0659f 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractAmendCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractAmendCommandTests.kt @@ -29,7 +29,7 @@ class MembershipContractAmendCommandTests : ContractTest() { services.ledger { transaction { val issuedMembershipA = issue(DECENTRALIZED_MEMBERSHIP_IDENTITY_A) - val amendedMembershipA = issuedMembershipA.getNextOutput().addRoles("Example") + val amendedMembershipA = issuedMembershipA.getNextOutput().configure { addRoles("Example") } input(issuedMembershipA.ref) output(MembershipContract.ID, amendedMembershipA) fails() @@ -59,7 +59,7 @@ class MembershipContractAmendCommandTests : ContractTest() { transaction { val issuedMembershipA = issue(DECENTRALIZED_MEMBERSHIP_IDENTITY_A) val issuedMembershipB = DECENTRALIZED_MEMBERSHIP_IDENTITY_B - val amendedMembershipA = issuedMembershipA.getNextOutput().addRoles("Example") + val amendedMembershipA = issuedMembershipA.getNextOutput().configure { addRoles("Example") } input(issuedMembershipA.ref) output(MembershipContract.ID, amendedMembershipA) output(MembershipContract.ID, issuedMembershipB) diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipPermissionTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipPermissionTests.kt index 5e4ee96..f5b88e8 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipPermissionTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipPermissionTests.kt @@ -12,10 +12,10 @@ class MembershipPermissionTests { fun `Membership hasPermission should return true when the expected permission is present`() { // Arrange - val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).addPermissions("Test") + val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).configure { addPermissions("Test") } // Act - val result = membership.hasPermission("Test") + val result = membership.configuration.hasPermission("Test") // Assert assertTrue(result) diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipRoleTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipRoleTests.kt index 57596bc..d90731e 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipRoleTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipRoleTests.kt @@ -12,10 +12,10 @@ class MembershipRoleTests { fun `Membership hasRole should return true when the expected role is present`() { // Arrange - val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).addRoles("Test") + val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).configure { addRoles("Test") } // Act - val result = membership.hasRole("Test") + val result = membership.configuration.hasRole("Test") // Assert assertTrue(result) diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipSettingTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipSettingTests.kt index 651a867..2e5243d 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipSettingTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/general/MembershipSettingTests.kt @@ -12,10 +12,10 @@ class MembershipSettingTests { fun `Membership hasSetting should return true when the expected setting is present`() { // Arrange - val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).addSetting("Test", 123) + val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).configure { addSetting("Test", 123) } // Act - val result = membership.hasSetting(Setting("Test", 123)) + val result = membership.configuration.hasSetting(Setting("Test", 123)) // Assert assertTrue(result) @@ -25,10 +25,10 @@ class MembershipSettingTests { fun `Membership hasSetting should return true when the expected setting by property is present`() { // Arrange - val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).addSetting("Test", 123) + val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).configure { addSetting("Test", 123) } // Act - val result = membership.hasSetting("Test") + val result = membership.configuration.hasSetting("Test") // Assert assertTrue(result) @@ -49,10 +49,10 @@ class MembershipSettingTests { Permission("Example Permission 1"), Permission("Example Permission 2") ) - val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).addSettings(settings) + val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).configure { addSettings(settings) } // Act - val result = membership.getSettingsByType() + val result = membership.configuration.getSettingsByType() // Assert assertEquals(2, result.size) @@ -73,10 +73,10 @@ class MembershipSettingTests { Permission("Example Permission 1"), Permission("Example Permission 2") ) - val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).addSettings(settings) + val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).configure { addSettings(settings) } // Act - val result = membership.getSettingsByType>("Key1") + val result = membership.configuration.getSettingsByType>("Key1") // Assert assertEquals(2, result.size) @@ -97,10 +97,10 @@ class MembershipSettingTests { Permission("Example Permission 1"), Permission("Example Permission 2") ) - val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).addSettings(settings) + val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).configure { addSettings(settings) } // Act - val result = membership.getSettingsByValueType() + val result = membership.configuration.getSettingsByType>() // Assert assertEquals(2, result.size) @@ -121,10 +121,10 @@ class MembershipSettingTests { Permission("Example Permission 1"), Permission("Example Permission 2") ) - val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).addSettings(settings) + val membership = Membership(DECENTRALIZED_NETWORK, IDENTITY_A.party).configure { addSettings(settings) } // Act - val result = membership.getSettingsByType>("Key1") + val result = membership.configuration.getSettingsByType>("Key1") // Assert assertEquals(2, result.size) diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt new file mode 100644 index 0000000..cba4df8 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt @@ -0,0 +1,123 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.contract.settings + +import io.onixlabs.corda.bnms.contract.* +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + +class SettingExtensionTests { + + private val settings: Iterable> = listOf( + Setting("a", 123), + Setting("b", 456), + Setting("c", "Hello, World!"), + Setting("d", true), + Setting("e", false), + StringSetting("f", "abc"), + StringSetting("g", "xyz"), + Role("Admin"), + Role("Guest"), + Permission("CAN_DO_THIS"), + Permission("CAN_DO_THAT") + ) + + @Test + fun `filterByType should filter all settings of type Setting where the value type is unknown`() { + val result = settings.filterByType(Setting::class.java) + assertEquals(5, result.size) + } + + @Test + fun `filterByType should filter all settings of type Setting where the value type is Integer`() { + val result = settings.filterByType(Setting::class.java, Integer::class.java) + assertEquals(2, result.size) + } + + @Test + fun `filterByType should filter all settings of type Setting where the value type is String`() { + val result = settings.filterByType(Setting::class.java, String::class.java) + assertEquals(1, result.size) + } + + @Test + fun `filterByType should filter all settings of type Setting where the value type is Boolean`() { + val result = settings.filterByType(Setting::class.java, java.lang.Boolean::class.java) + assertEquals(2, result.size) + } + + @Test + fun `filterByType should filter all settings of type StringSetting`() { + val result = settings.filterByType(StringSetting::class.java) + assertEquals(2, result.size) + } + + @Test + fun `filterByType should filter all settings of type Role`() { + val result = settings.filterByType(Role::class.java) + assertEquals(2, result.size) + } + + @Test + fun `filterByType should filter all settings of type Permission`() { + val result = settings.filterByType(Permission::class.java) + assertEquals(2, result.size) + } + + + @Test + fun `inline filterByType should filter all settings of type Setting where the value type is unknown`() { + val result = settings.filterByType>() + assertEquals(5, result.size) + } + + @Test + fun `inline filterByType should filter all settings of type Setting where the value type is Integer`() { + val result = settings.filterByType>() + assertEquals(2, result.size) + } + + @Test + fun `inline filterByType should filter all settings of type Setting where the value type is String`() { + val result = settings.filterByType>() + assertEquals(1, result.size) + } + + @Test + fun `inline filterByType should filter all settings of type Setting where the value type is Boolean`() { + val result = settings.filterByType>() + assertEquals(2, result.size) + } + + @Test + fun `inline filterByType should filter all settings of type StringSetting`() { + val result = settings.filterByType() + assertEquals(2, result.size) + } + + @Test + fun `inline filterByType should filter all settings of type Role`() { + val result = settings.filterByType() + assertEquals(2, result.size) + } + + @Test + fun `inline filterByType should filter all settings of type Permission`() { + val result = settings.filterByType() + assertEquals(2, result.size) + } +} diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt index a95774f..dabcd9e 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt @@ -16,16 +16,17 @@ package io.onixlabs.corda.bnms.integration +import io.onixlabs.corda.bnms.contract.Configuration import io.onixlabs.corda.bnms.contract.Network import io.onixlabs.corda.bnms.contract.Setting import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.contract.relationship.RelationshipMember import io.onixlabs.corda.bnms.workflow.relationship.AmendRelationshipFlow import io.onixlabs.corda.bnms.workflow.relationship.IssueRelationshipFlow import io.onixlabs.corda.bnms.workflow.relationship.RevokeRelationshipFlow import io.onixlabs.corda.core.integration.RPCService import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UniqueIdentifier +import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.messaging.* import net.corda.core.transactions.SignedTransaction @@ -35,26 +36,25 @@ class RelationshipService(rpc: CordaRPCOps) : RPCService(rpc) { fun issueRelationship( network: Network, - members: Set = emptySet(), - settings: Set> = emptySet(), + members: Map = emptyMap(), linearId: UniqueIdentifier = UniqueIdentifier(), notary: Party? = null, checkMembership: Boolean = false ): FlowProgressHandle { - val relationship = Relationship(network, members, settings, linearId) + val relationship = Relationship(network, members, linearId) return issueRelationship(relationship, notary, checkMembership) } fun issueRelationship( network: Network, - members: Set = emptySet(), + members: Map = emptyMap(), settings: Set> = emptySet(), linearId: UniqueIdentifier = UniqueIdentifier(), notary: Party? = null, checkMembership: Boolean = false, clientId: String = UUID.randomUUID().toString() ): FlowHandleWithClientId { - val relationship = Relationship(network, members, settings, linearId) + val relationship = Relationship(network, members, linearId) return issueRelationship(relationship, notary, checkMembership, clientId) } diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt index bbfce39..a016514 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt @@ -16,10 +16,10 @@ package io.onixlabs.corda.bnms.workflow +import io.onixlabs.corda.bnms.contract.Configuration import io.onixlabs.corda.bnms.contract.Network import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.contract.relationship.RelationshipMember import io.onixlabs.corda.bnms.contract.revocation.RevocationLock import net.corda.core.identity.CordaX500Name import net.corda.core.identity.Party @@ -38,7 +38,7 @@ import org.junit.jupiter.api.TestInstance abstract class FlowTest { protected val NETWORK by lazy { Network("Example Network") } - protected val MEMBERS by lazy { setOf(RelationshipMember(partyA), RelationshipMember(partyB)) } + protected val MEMBERS by lazy { mapOf(partyA to Configuration(), partyB to Configuration()) } protected val MEMBERSHIP by lazy { Membership(NETWORK, partyA) } protected val RELATIONSHIP by lazy { Relationship(NETWORK, MEMBERS) } diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowTests.kt index a20f3dd..17a6b18 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowTests.kt @@ -38,7 +38,7 @@ class AmendMembershipFlowTests : FlowTest() { } .run(nodeA) { val oldMembership = it.tx.outRefsOfType().single() - membership = oldMembership.getNextOutput().addRoles("Administrator") + membership = oldMembership.getNextOutput().configure { addRoles("Administrator") } AmendMembershipFlow.Initiator(oldMembership, membership, observers = setOf(partyB)) } .finally { transaction = it } @@ -72,7 +72,7 @@ class AmendMembershipFlowTests : FlowTest() { ?: fail("Failed to find a recorded membership.") assertEquals(membership, recordedMembership) - assert(recordedMembership.hasRole("Administrator")) + assert(recordedMembership.configuration.hasRole("Administrator")) } } } diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowTests.kt index df4d529..3d84d34 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowTests.kt @@ -38,7 +38,9 @@ class AmendRelationshipFlowTests : FlowTest() { } .run(nodeB) { val oldRelationship = it.tx.outRefsOfType().single() - relationship = oldRelationship.getNextOutput().addSetting("TestValue", 123) + relationship = oldRelationship.getNextOutput().configure(partyA) { + addSetting("TestValue", 123) + } AmendRelationshipFlow.Initiator(oldRelationship, relationship, checkMembership = false) } .finally { transaction = it } @@ -77,9 +79,10 @@ class AmendRelationshipFlowTests : FlowTest() { ?: fail("Failed to find a recorded relationship.") assertEquals(relationship, recordedRelationship) - assertEquals(1, relationship.settings.size) - assertEquals("TESTVALUE", relationship.settings.single().property) - assertEquals(123, relationship.settings.single().value) + assertEquals(1, relationship.members[partyA]!!.settings.size) + assertEquals("TestValue", relationship.members[partyA]!!.settings.single().property) + assertEquals("TESTVALUE", relationship.members[partyA]!!.settings.single().normalizedProperty) + assertEquals(123, relationship.members[partyA]!!.settings.single().value) } } } From fbdb6ec2030edf482dd48df8cf202b260d7d33b2 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Sat, 3 Jul 2021 15:21:12 +0100 Subject: [PATCH 04/23] Added liquibase scripts for relationship configuration. --- ...-configuration-schema.changelog-master.xml | 6 +++ ...ship-configuration-schema.changelog-v1.xml | 39 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml create mode 100644 onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-v1.xml diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml new file mode 100644 index 0000000..473e0a8 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-v1.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-v1.xml new file mode 100644 index 0000000..4bf0c7f --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-v1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 4875f8341c7ec851925a15d21b901863cd8911c3 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Mon, 9 Aug 2021 11:25:03 +0100 Subject: [PATCH 05/23] BROKEN COMMIT: FIX OR REVERT! --- .../kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt | 5 ++--- .../src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt | 2 +- .../io/onixlabs/corda/bnms/contract/membership/Membership.kt | 4 +++- .../corda/bnms/contract/relationship/Relationship.kt | 3 ++- .../bnms/contract/relationship/RelationshipConfiguration.kt | 4 +++- .../corda/bnms/contract/settings/SettingExtensionTests.kt | 1 - 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt index 48d51fa..4ae7124 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt @@ -16,14 +16,13 @@ package io.onixlabs.corda.bnms.contract -import net.corda.core.contracts.LinearState -import net.corda.core.schemas.QueryableState +import net.corda.core.contracts.ContractState /** * Defines a contract state that belongs to a business network. * * @property network The business network that the state belongs to. */ -interface NetworkState : LinearState, QueryableState { +interface NetworkState : ContractState { val network: Network } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt index 74d0c5e..d7c7f50 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt @@ -25,4 +25,4 @@ package io.onixlabs.corda.bnms.contract * @property normalizedValue The normalized value of the role. * @property hash The hash that uniquely identifies the role. */ -class Role(value: String) : StringSetting(ROLE, value) \ No newline at end of file +class Role(value: String) : StringSetting(ROLE, value) diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt index c666af4..49d28e1 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt @@ -23,12 +23,14 @@ import io.onixlabs.corda.core.contract.ChainState import io.onixlabs.corda.core.contract.Hashable import io.onixlabs.corda.identityframework.contract.AbstractClaim import net.corda.core.contracts.BelongsToContract +import net.corda.core.contracts.LinearState import net.corda.core.contracts.StateRef import net.corda.core.contracts.UniqueIdentifier import net.corda.core.crypto.SecureHash import net.corda.core.identity.AbstractParty import net.corda.core.schemas.MappedSchema import net.corda.core.schemas.PersistentState +import net.corda.core.schemas.QueryableState /** * Represents a membership to a business network. @@ -51,7 +53,7 @@ data class Membership( val configuration: Configuration = Configuration(), override val linearId: UniqueIdentifier = UniqueIdentifier(), override val previousStateRef: StateRef? = null -) : NetworkState, ChainState, Hashable { +) : NetworkState, ChainState, LinearState, QueryableState, Hashable { constructor( network: Network, diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt index 046be0a..4fe25fb 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt @@ -30,6 +30,7 @@ import net.corda.core.identity.AbstractParty import net.corda.core.node.services.vault.QueryCriteria import net.corda.core.schemas.MappedSchema import net.corda.core.schemas.PersistentState +import net.corda.core.schemas.QueryableState /** * Represents a multi-lateral relationship between participants of a business network. @@ -48,7 +49,7 @@ data class Relationship( val members: Map = emptyMap(), override val linearId: UniqueIdentifier = UniqueIdentifier(), override val previousStateRef: StateRef? = null -) : NetworkState, ChainState, Hashable { +) : NetworkState, ChainState, LinearState, QueryableState, Hashable { val configurations: PluralResolvable get() = RelationshipConfigurationResolver(linearId) diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt index 05a7949..72409dd 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt @@ -26,12 +26,14 @@ import io.onixlabs.corda.core.contract.Hashable import io.onixlabs.corda.core.contract.SingularResolvable import io.onixlabs.corda.core.services.vaultQuery import net.corda.core.contracts.BelongsToContract +import net.corda.core.contracts.LinearState import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UniqueIdentifier import net.corda.core.crypto.SecureHash import net.corda.core.identity.AbstractParty import net.corda.core.node.services.vault.QueryCriteria import net.corda.core.schemas.MappedSchema +import net.corda.core.schemas.QueryableState @BelongsToContract(RelationshipConfigurationContract::class) class RelationshipConfiguration private constructor( @@ -40,7 +42,7 @@ class RelationshipConfiguration private constructor( val configuration: Configuration, val relationshipLinearId: UniqueIdentifier, override val linearId: UniqueIdentifier -) : NetworkState, Hashable { +) : NetworkState, LinearState, QueryableState, Hashable { constructor( relationship: Relationship, diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt index cba4df8..4c1798c 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt @@ -78,7 +78,6 @@ class SettingExtensionTests { assertEquals(2, result.size) } - @Test fun `inline filterByType should filter all settings of type Setting where the value type is unknown`() { val result = settings.filterByType>() From 99aad31b3257035ef0fe0c1bf58037593dec26dc Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Sat, 14 Aug 2021 21:29:20 +0100 Subject: [PATCH 06/23] [BROKEN] Updated to point to latest ONIXlabs dependencies. --- build.gradle | 16 +- gradle.properties | 4 - onixlabs-corda-bnms-contract/build.gradle | 1 + .../corda/bnms/contract/Configuration.kt | 2 + .../corda/bnms/contract/Extensions.Setting.kt | 212 +++++++++--------- .../onixlabs/corda/bnms/contract/Setting.kt | 2 +- .../corda/bnms/contract/SettingTypeInfo.kt | 132 +++++------ .../bnms/contract/membership/Extensions.kt | 2 +- .../bnms/contract/membership/Membership.kt | 3 +- .../membership/MembershipAttestation.kt | 7 +- .../MembershipAttestationContract.kt | 3 +- .../membership/MembershipAttestationSchema.kt | 5 +- .../contract/membership/MembershipSchema.kt | 3 + .../bnms/contract/relationship/Extensions.kt | 2 +- .../contract/relationship/Relationship.kt | 1 + .../relationship/RelationshipAttestation.kt | 7 +- .../RelationshipAttestationContract.kt | 2 +- .../RelationshipAttestationSchema.kt | 5 +- .../relationship/RelationshipSchema.kt | 3 + .../corda/bnms/contract/ContractTest.kt | 2 +- ...hipAttestationContractAmendCommandTests.kt | 2 +- ...hipAttestationContractIssueCommandTests.kt | 2 +- ...hipAttestationContractAmendCommandTests.kt | 2 +- ...hipAttestationContractIssueCommandTests.kt | 2 +- .../settings/SettingExtensionTests.kt | 122 ---------- onixlabs-corda-bnms-integration/build.gradle | 1 + onixlabs-corda-bnms-workflow/build.gradle | 1 + .../bnms/workflow/Extensions.FlowLogic.kt | 134 +++++------ 28 files changed, 290 insertions(+), 390 deletions(-) delete mode 100644 onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt diff --git a/build.gradle b/build.gradle index 9136f42..f7e413b 100644 --- a/build.gradle +++ b/build.gradle @@ -14,10 +14,10 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '2.0.0' - onixlabs_corda_idfx_release_version = '2.0.0' + onixlabs_corda_core_release_version = '3.0.0' + onixlabs_corda_idfx_release_version = '3.0.0' - cordapp_platform_version = 8 + cordapp_platform_version = 10 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' cordapp_workflow_name = 'ONIXLabs Corda BNMS Workflow' cordapp_vendor_name = 'ONIXLabs' @@ -44,8 +44,8 @@ buildscript { } } -group 'io.onixlabs' -version '2.0.0-rc1' +group getProperty('group') +version getProperty('version') subprojects { repositories { @@ -93,10 +93,16 @@ subprojects { } } + task sourceJar(type: Jar) { + from sourceSets.main.allSource + archiveClassifier = "sources" + } + jar { exclude '**/log4j2*.xml' } test { jvmArgs = ["-ea", "-javaagent:../lib/quasar.jar"] + maxHeapSize = "4096m" useJUnitPlatform() } } diff --git a/gradle.properties b/gradle.properties index f73e6e1..346a2cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,9 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs version=2.0.0 - -kotlin.incremental=false -kotlin.code.style=official - onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 diff --git a/onixlabs-corda-bnms-contract/build.gradle b/onixlabs-corda-bnms-contract/build.gradle index 948485e..1687d17 100644 --- a/onixlabs-corda-bnms-contract/build.gradle +++ b/onixlabs-corda-bnms-contract/build.gradle @@ -54,6 +54,7 @@ publishing { groupId = project.parent.group version = project.parent.version artifactId = 'onixlabs-corda-bnms-contract' + artifact sourceJar from components.java } } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt index 1ba3c99..68338ae 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt @@ -17,6 +17,8 @@ package io.onixlabs.corda.bnms.contract import io.onixlabs.corda.core.contract.Hashable +import io.onixlabs.corda.identityframework.contract.filterByProperty +import io.onixlabs.corda.identityframework.contract.filterByType import net.corda.core.crypto.SecureHash import net.corda.core.serialization.CordaSerializable diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt index 3a76284..7ad0243 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt @@ -1,106 +1,106 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.contract - -/** - * Only declared so that I can fit method signatures on a single line. - */ -private typealias Settings = Iterable> - -/** - * Casts a [Setting] of an unknown value type to a [Setting] of type [T]. - * - * @param T The underlying value type of the cast [Setting]. - * @param type The value type to cast to. - * @return Returns a [Setting] of type [T]. - * @throws ClassCastException if the value type cannot be cast to type [T]. - */ -fun Setting<*>.cast(type: Class): Setting { - return Setting(property, type.cast(value)) -} - -/** - * Casts a [Setting] of an unknown value type to a [Setting] of type [T]. - * - * @param T The underlying value type of the cast [Setting]. - * @return Returns a [Setting] of type [T]. - * @throws ClassCastException if the value type cannot be cast to type [T]. - */ -inline fun Setting<*>.cast(): Setting { - return cast(T::class.java) -} - -/** - * Casts an [Iterable] of [Setting] of an unknown value type to an [Iterable] of [Setting] of type [T]. - * - * @param T The underlying value type of the cast [Setting]. - * @param type The value type to cast to. - * @return Returns an [Iterable] of [Setting] of type [T]. - * @throws ClassCastException if the value type cannot be cast to type [T]. - */ -fun Settings.cast(type: Class): List> { - return map { it.cast(type) } -} - -/** - * Casts an [Iterable] of [Setting] of an unknown value type to an [Iterable] of [Setting] of type [T]. - * - * @param T The underlying value type of the cast [Setting]. - * @return Returns an [Iterable] of [Setting] of type [T]. - * @throws ClassCastException if the value type cannot be cast to type [T]. - */ -inline fun Settings.cast(): List> { - return cast(T::class.java) -} - -/** - * Filters an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. - * - * @param V The underlying value type. - * @param S The underlying setting type. - * @param settingType The setting type. - * @param valueType The value type, or null if the setting type is derived, or the value type is unknown or a wildcard. - * @return Returns an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. - */ -fun > Settings.filterByType(settingType: Class, valueType: Class? = null): List { - val settingsFilteredBySettingType = filter { it.javaClass == settingType }.filterIsInstance(settingType) - return if (valueType != null) settingsFilteredBySettingType.filter { it.value?.javaClass == valueType } - else settingsFilteredBySettingType -} - -/** - * Filters an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. - * - * @param T The underlying setting type. - * @return Returns an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. - */ -inline fun > Iterable>.filterByType(): List { - val typeInfo = object : SettingTypeInfo() {} - return filterByType(typeInfo.settingType, typeInfo.valueType) -} - -/** - * Filters an [Iterable] of [Setting] by the specified property. - * - * @param T The underlying setting type. - * @param property The property to filter by. - * @param ignoreCase Determines whether to ignore the property case when filtering; for example when filtering by a normalized property. - * @return Returns an [Iterable] of [Setting] by the specified property. - */ -fun > Iterable.filterByProperty(property: String, ignoreCase: Boolean = false): List { - return filter { it.property.equals(property, ignoreCase) } -} +///* +// * Copyright 2020-2021 ONIXLabs +// * +// * Licensed under the Apache License, Version 2.0 (the "License"); +// * you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, +// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// * See the License for the specific language governing permissions and +// * limitations under the License. +// */ +// +//package io.onixlabs.corda.bnms.contract +// +///** +// * Only declared so that I can fit method signatures on a single line. +// */ +//private typealias Settings = Iterable> +// +///** +// * Casts a [Setting] of an unknown value type to a [Setting] of type [T]. +// * +// * @param T The underlying value type of the cast [Setting]. +// * @param type The value type to cast to. +// * @return Returns a [Setting] of type [T]. +// * @throws ClassCastException if the value type cannot be cast to type [T]. +// */ +//fun Setting<*>.cast(type: Class): Setting { +// return Setting(property, type.cast(value)) +//} +// +///** +// * Casts a [Setting] of an unknown value type to a [Setting] of type [T]. +// * +// * @param T The underlying value type of the cast [Setting]. +// * @return Returns a [Setting] of type [T]. +// * @throws ClassCastException if the value type cannot be cast to type [T]. +// */ +//inline fun Setting<*>.cast(): Setting { +// return cast(T::class.java) +//} +// +///** +// * Casts an [Iterable] of [Setting] of an unknown value type to an [Iterable] of [Setting] of type [T]. +// * +// * @param T The underlying value type of the cast [Setting]. +// * @param type The value type to cast to. +// * @return Returns an [Iterable] of [Setting] of type [T]. +// * @throws ClassCastException if the value type cannot be cast to type [T]. +// */ +//fun Settings.cast(type: Class): List> { +// return map { it.cast(type) } +//} +// +///** +// * Casts an [Iterable] of [Setting] of an unknown value type to an [Iterable] of [Setting] of type [T]. +// * +// * @param T The underlying value type of the cast [Setting]. +// * @return Returns an [Iterable] of [Setting] of type [T]. +// * @throws ClassCastException if the value type cannot be cast to type [T]. +// */ +//inline fun Settings.cast(): List> { +// return cast(T::class.java) +//} +// +///** +// * Filters an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. +// * +// * @param V The underlying value type. +// * @param S The underlying setting type. +// * @param settingType The setting type. +// * @param valueType The value type, or null if the setting type is derived, or the value type is unknown or a wildcard. +// * @return Returns an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. +// */ +//fun > Settings.filterByType(settingType: Class, valueType: Class? = null): List { +// val settingsFilteredBySettingType = filter { it.javaClass == settingType }.filterIsInstance(settingType) +// return if (valueType != null) settingsFilteredBySettingType.filter { it.value?.javaClass == valueType } +// else settingsFilteredBySettingType +//} +// +///** +// * Filters an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. +// * +// * @param T The underlying setting type. +// * @return Returns an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. +// */ +//inline fun > Iterable>.filterByType(): List { +// val typeInfo = object : SettingTypeInfo() {} +// return filterByType(typeInfo.settingType, typeInfo.valueType) +//} +// +///** +// * Filters an [Iterable] of [Setting] by the specified property. +// * +// * @param T The underlying setting type. +// * @param property The property to filter by. +// * @param ignoreCase Determines whether to ignore the property case when filtering; for example when filtering by a normalized property. +// * @return Returns an [Iterable] of [Setting] by the specified property. +// */ +//fun > Iterable.filterByProperty(property: String, ignoreCase: Boolean = false): List { +// return filter { it.property.equals(property, ignoreCase) } +//} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt index fc83003..f003938 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt @@ -17,7 +17,7 @@ package io.onixlabs.corda.bnms.contract import io.onixlabs.corda.core.contract.Hashable -import io.onixlabs.corda.identityframework.contract.Claim +import io.onixlabs.corda.identityframework.contract.claims.Claim import net.corda.core.crypto.SecureHash import java.util.* diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt index 77d15da..839de02 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt @@ -1,66 +1,66 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.contract - -import io.onixlabs.corda.core.toClass -import io.onixlabs.corda.core.toTypedClass -import java.lang.reflect.ParameterizedType -import java.lang.reflect.Type -import java.lang.reflect.WildcardType - -/** - * Represents the base class for obtaining setting type information implementations. - * - * @param T The underlying setting type. - * @property settingType Obtains the most derived setting type in the type hierarchy. - * @property valueType Obtains the value type of the setting, or null if the value type was specified as a wildcard. - */ -@PublishedApi -internal abstract class SettingTypeInfo> : Comparable> { - - val settingType: Class - get() = getSettingTypeInternal().toTypedClass() - - val valueType: Class<*>? - get() = getValueTypeInternal() - - override fun compareTo(other: SettingTypeInfo): Int = 0 - - /** - * Gets the most derived setting type in the type hierarchy. - */ - private fun getSettingTypeInternal(): Type { - val superClass = javaClass.genericSuperclass - check(superClass !is Class<*>) { "Internal error: TypeReference constructed without actual type information" } - return (superClass as ParameterizedType).actualTypeArguments[0] - } - - /** - * Gets the value type of the setting, or null if the value type was specified as a wildcard. - * - * The reason for returning a nullable [Class] is because settings could be specified as: - * - Setting<*> - Settings of unknown value type, or settings regardless of value type. - * - Setting - Settings specifically of [Any] value type. - */ - private tailrec fun getValueTypeInternal(settingType: Type = getSettingTypeInternal()): Class<*>? { - return if (settingType.toClass() == Setting::class.java) { - val parameterizedType = settingType as ParameterizedType - val argument = parameterizedType.actualTypeArguments[0] - if (argument is WildcardType) null else argument.toClass() - } else getValueTypeInternal(settingType.toClass().genericSuperclass) - } -} +///* +// * Copyright 2020-2021 ONIXLabs +// * +// * Licensed under the Apache License, Version 2.0 (the "License"); +// * you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, +// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// * See the License for the specific language governing permissions and +// * limitations under the License. +// */ +// +//package io.onixlabs.corda.bnms.contract +// +//import io.onixlabs.corda.core.toClass +//import io.onixlabs.corda.core.toTypedClass +//import java.lang.reflect.ParameterizedType +//import java.lang.reflect.Type +//import java.lang.reflect.WildcardType +// +///** +// * Represents the base class for obtaining setting type information implementations. +// * +// * @param T The underlying setting type. +// * @property settingType Obtains the most derived setting type in the type hierarchy. +// * @property valueType Obtains the value type of the setting, or null if the value type was specified as a wildcard. +// */ +//@PublishedApi +//internal abstract class SettingTypeInfo> : Comparable> { +// +// val settingType: Class +// get() = getSettingTypeInternal().toTypedClass() +// +// val valueType: Class<*>? +// get() = getValueTypeInternal() +// +// override fun compareTo(other: SettingTypeInfo): Int = 0 +// +// /** +// * Gets the most derived setting type in the type hierarchy. +// */ +// private fun getSettingTypeInternal(): Type { +// val superClass = javaClass.genericSuperclass +// check(superClass !is Class<*>) { "Internal error: TypeReference constructed without actual type information" } +// return (superClass as ParameterizedType).actualTypeArguments[0] +// } +// +// /** +// * Gets the value type of the setting, or null if the value type was specified as a wildcard. +// * +// * The reason for returning a nullable [Class] is because settings could be specified as: +// * - Setting<*> - Settings of unknown value type, or settings regardless of value type. +// * - Setting - Settings specifically of [Any] value type. +// */ +// private tailrec fun getValueTypeInternal(settingType: Type = getSettingTypeInternal()): Class<*>? { +// return if (settingType.toClass() == Setting::class.java) { +// val parameterizedType = settingType as ParameterizedType +// val argument = parameterizedType.actualTypeArguments[0] +// if (argument is WildcardType) null else argument.toClass() +// } else getValueTypeInternal(settingType.toClass().genericSuperclass) +// } +//} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt index ba95fbc..425eaf2 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt @@ -16,7 +16,7 @@ package io.onixlabs.corda.bnms.contract.membership -import io.onixlabs.corda.identityframework.contract.AttestationStatus +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import io.onixlabs.corda.identityframework.contract.toStaticAttestationPointer import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UniqueIdentifier diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt index 49d28e1..57c4d5f 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt @@ -21,7 +21,7 @@ import io.onixlabs.corda.bnms.contract.membership.MembershipSchema.MembershipEnt import io.onixlabs.corda.bnms.contract.membership.MembershipSchema.MembershipSchemaV1 import io.onixlabs.corda.core.contract.ChainState import io.onixlabs.corda.core.contract.Hashable -import io.onixlabs.corda.identityframework.contract.AbstractClaim +import io.onixlabs.corda.identityframework.contract.claims.AbstractClaim import net.corda.core.contracts.BelongsToContract import net.corda.core.contracts.LinearState import net.corda.core.contracts.StateRef @@ -97,6 +97,7 @@ data class Membership( externalId = linearId.externalId, holder = holder, networkValue = network.value, + normalizedNetworkValue = network.normalizedValue, networkOperator = network.operator, networkHash = network.hash.toString(), isNetworkOperator = isNetworkOperator, diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt index 70795b0..aed7c2d 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt @@ -20,9 +20,9 @@ import io.onixlabs.corda.bnms.contract.Network import io.onixlabs.corda.bnms.contract.NetworkState import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema.MembershipAttestationEntity import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema.MembershipAttestationSchemaV1 -import io.onixlabs.corda.identityframework.contract.Attestation -import io.onixlabs.corda.identityframework.contract.AttestationPointer -import io.onixlabs.corda.identityframework.contract.AttestationStatus +import io.onixlabs.corda.identityframework.contract.attestations.Attestation +import io.onixlabs.corda.identityframework.contract.attestations.AttestationPointer +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import io.onixlabs.corda.identityframework.contract.toStaticAttestationPointer import net.corda.core.contracts.BelongsToContract import net.corda.core.contracts.StateAndRef @@ -101,6 +101,7 @@ class MembershipAttestation internal constructor( attestor = attestor, holder = holder, networkValue = network.value, + normalizedNetworkValue = network.normalizedValue, networkOperator = network.operator, networkHash = network.hash.toString(), pointer = pointer.statePointer.toString(), diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt index e0b808a..a25ba00 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt @@ -17,9 +17,8 @@ package io.onixlabs.corda.bnms.contract.membership import io.onixlabs.corda.core.contract.ContractID -import io.onixlabs.corda.identityframework.contract.AttestationContract +import io.onixlabs.corda.identityframework.contract.attestations.AttestationContract import net.corda.core.contracts.Contract -import net.corda.core.contracts.ContractClassName import net.corda.core.contracts.requireThat import net.corda.core.transactions.LedgerTransaction import java.security.PublicKey diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt index 5760a76..a10a95f 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt @@ -16,7 +16,7 @@ package io.onixlabs.corda.bnms.contract.membership -import io.onixlabs.corda.identityframework.contract.AttestationStatus +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import net.corda.core.crypto.NullKeys.NULL_PARTY import net.corda.core.identity.AbstractParty import net.corda.core.schemas.MappedSchema @@ -49,6 +49,9 @@ object MembershipAttestationSchema { @Column(name = "network_value", nullable = false) val networkValue: String = "", + @Column(name = "normalized_network_value", nullable = false) + val normalizedNetworkValue: String = "", + @Column(name = "network_operator", nullable = true) val networkOperator: AbstractParty? = null, diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt index 7e35f36..d81b7cc 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt @@ -47,6 +47,9 @@ object MembershipSchema { @Column(name = "network_value", nullable = false) val networkValue: String = "", + @Column(name = "normalized_network_value", nullable = false) + val normalizedNetworkValue: String = "", + @Column(name = "network_operator", nullable = true) val networkOperator: AbstractParty? = null, diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt index a8ab564..7cf6c61 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt @@ -16,7 +16,7 @@ package io.onixlabs.corda.bnms.contract.relationship -import io.onixlabs.corda.identityframework.contract.AttestationStatus +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import io.onixlabs.corda.identityframework.contract.toStaticAttestationPointer import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UniqueIdentifier diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt index 4fe25fb..7db4f3a 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt @@ -98,6 +98,7 @@ data class Relationship( linearId = linearId.id, externalId = linearId.externalId, networkValue = network.value, + normalizedNetworkValue = network.normalizedValue, networkOperator = network.operator, networkHash = network.hash.toString(), hash = hash.toString() diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt index eb68363..f80c2c6 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt @@ -20,9 +20,9 @@ import io.onixlabs.corda.bnms.contract.Network import io.onixlabs.corda.bnms.contract.NetworkState import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestationSchema.RelationshipAttestationEntity import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestationSchema.RelationshipAttestationSchemaV1 -import io.onixlabs.corda.identityframework.contract.Attestation -import io.onixlabs.corda.identityframework.contract.AttestationPointer -import io.onixlabs.corda.identityframework.contract.AttestationStatus +import io.onixlabs.corda.identityframework.contract.attestations.Attestation +import io.onixlabs.corda.identityframework.contract.attestations.AttestationPointer +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import io.onixlabs.corda.identityframework.contract.toStaticAttestationPointer import net.corda.core.contracts.BelongsToContract import net.corda.core.contracts.StateAndRef @@ -94,6 +94,7 @@ class RelationshipAttestation internal constructor( externalId = linearId.externalId, attestor = attestor, networkValue = network.value, + normalizedNetworkValue = network.normalizedValue, networkOperator = network.operator, networkHash = network.hash.toString(), pointer = pointer.statePointer.toString(), diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationContract.kt index 9ca557d..e9ea046 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationContract.kt @@ -16,7 +16,7 @@ package io.onixlabs.corda.bnms.contract.relationship -import io.onixlabs.corda.identityframework.contract.AttestationContract +import io.onixlabs.corda.identityframework.contract.attestations.AttestationContract import net.corda.core.contracts.Contract import net.corda.core.contracts.ContractClassName import net.corda.core.contracts.requireThat diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt index 797bf96..91622a8 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt @@ -16,7 +16,7 @@ package io.onixlabs.corda.bnms.contract.relationship -import io.onixlabs.corda.identityframework.contract.AttestationStatus +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import net.corda.core.crypto.NullKeys.NULL_PARTY import net.corda.core.identity.AbstractParty import net.corda.core.schemas.MappedSchema @@ -46,6 +46,9 @@ object RelationshipAttestationSchema { @Column(name = "network_value", nullable = false) val networkValue: String = "", + @Column(name = "normalized_network_value", nullable = false) + val normalizedNetworkValue: String = "", + @Column(name = "network_operator", nullable = true) val networkOperator: AbstractParty? = null, diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt index b9b1ab4..86ed022 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt @@ -43,6 +43,9 @@ object RelationshipSchema { @Column(name = "network_value", nullable = false) val networkValue: String = "", + @Column(name = "normalized_network_value", nullable = false) + val normalizedNetworkValue: String = "", + @Column(name = "network_operator", nullable = true) val networkOperator: AbstractParty? = null, diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt index 9727def..7231fbf 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt @@ -19,7 +19,7 @@ package io.onixlabs.corda.bnms.contract import io.onixlabs.corda.bnms.contract.membership.* import io.onixlabs.corda.bnms.contract.relationship.* import io.onixlabs.corda.bnms.contract.revocation.RevocationLockContract -import io.onixlabs.corda.identityframework.contract.AttestationContract +import io.onixlabs.corda.identityframework.contract.attestations.AttestationContract import net.corda.core.contracts.StateAndRef import net.corda.core.crypto.SecureHash import net.corda.core.identity.AbstractParty diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractAmendCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractAmendCommandTests.kt index edcb8d3..b98ec1e 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractAmendCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractAmendCommandTests.kt @@ -19,7 +19,7 @@ package io.onixlabs.corda.bnms.contract.attestation import io.onixlabs.corda.bnms.contract.* import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationContract import io.onixlabs.corda.bnms.contract.membership.reject -import io.onixlabs.corda.identityframework.contract.AttestationContract +import io.onixlabs.corda.identityframework.contract.attestations.AttestationContract import net.corda.testing.node.ledger import org.junit.jupiter.api.Test diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractIssueCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractIssueCommandTests.kt index 1b3cc08..467e0a2 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractIssueCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractIssueCommandTests.kt @@ -19,7 +19,7 @@ package io.onixlabs.corda.bnms.contract.attestation import io.onixlabs.corda.bnms.contract.* import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationContract import io.onixlabs.corda.bnms.contract.membership.accept -import io.onixlabs.corda.identityframework.contract.AttestationContract +import io.onixlabs.corda.identityframework.contract.attestations.AttestationContract import net.corda.testing.node.ledger import org.junit.jupiter.api.Test diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractAmendCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractAmendCommandTests.kt index 3965d38..4d8a968 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractAmendCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractAmendCommandTests.kt @@ -22,7 +22,7 @@ import io.onixlabs.corda.bnms.contract.RELATIONSHIP import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestationContract import io.onixlabs.corda.bnms.contract.relationship.reject import io.onixlabs.corda.bnms.contract.withWrongNetwork -import io.onixlabs.corda.identityframework.contract.AttestationContract +import io.onixlabs.corda.identityframework.contract.attestations.AttestationContract import net.corda.testing.node.ledger import org.junit.jupiter.api.Test diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractIssueCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractIssueCommandTests.kt index 107f44a..dfa97e2 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractIssueCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractIssueCommandTests.kt @@ -19,7 +19,7 @@ package io.onixlabs.corda.bnms.contract.attestation import io.onixlabs.corda.bnms.contract.* import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestationContract import io.onixlabs.corda.bnms.contract.relationship.accept -import io.onixlabs.corda.identityframework.contract.AttestationContract +import io.onixlabs.corda.identityframework.contract.attestations.AttestationContract import net.corda.testing.node.ledger import org.junit.jupiter.api.Test diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt deleted file mode 100644 index 4c1798c..0000000 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/settings/SettingExtensionTests.kt +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.contract.settings - -import io.onixlabs.corda.bnms.contract.* -import org.junit.jupiter.api.Test -import kotlin.test.assertEquals - -class SettingExtensionTests { - - private val settings: Iterable> = listOf( - Setting("a", 123), - Setting("b", 456), - Setting("c", "Hello, World!"), - Setting("d", true), - Setting("e", false), - StringSetting("f", "abc"), - StringSetting("g", "xyz"), - Role("Admin"), - Role("Guest"), - Permission("CAN_DO_THIS"), - Permission("CAN_DO_THAT") - ) - - @Test - fun `filterByType should filter all settings of type Setting where the value type is unknown`() { - val result = settings.filterByType(Setting::class.java) - assertEquals(5, result.size) - } - - @Test - fun `filterByType should filter all settings of type Setting where the value type is Integer`() { - val result = settings.filterByType(Setting::class.java, Integer::class.java) - assertEquals(2, result.size) - } - - @Test - fun `filterByType should filter all settings of type Setting where the value type is String`() { - val result = settings.filterByType(Setting::class.java, String::class.java) - assertEquals(1, result.size) - } - - @Test - fun `filterByType should filter all settings of type Setting where the value type is Boolean`() { - val result = settings.filterByType(Setting::class.java, java.lang.Boolean::class.java) - assertEquals(2, result.size) - } - - @Test - fun `filterByType should filter all settings of type StringSetting`() { - val result = settings.filterByType(StringSetting::class.java) - assertEquals(2, result.size) - } - - @Test - fun `filterByType should filter all settings of type Role`() { - val result = settings.filterByType(Role::class.java) - assertEquals(2, result.size) - } - - @Test - fun `filterByType should filter all settings of type Permission`() { - val result = settings.filterByType(Permission::class.java) - assertEquals(2, result.size) - } - - @Test - fun `inline filterByType should filter all settings of type Setting where the value type is unknown`() { - val result = settings.filterByType>() - assertEquals(5, result.size) - } - - @Test - fun `inline filterByType should filter all settings of type Setting where the value type is Integer`() { - val result = settings.filterByType>() - assertEquals(2, result.size) - } - - @Test - fun `inline filterByType should filter all settings of type Setting where the value type is String`() { - val result = settings.filterByType>() - assertEquals(1, result.size) - } - - @Test - fun `inline filterByType should filter all settings of type Setting where the value type is Boolean`() { - val result = settings.filterByType>() - assertEquals(2, result.size) - } - - @Test - fun `inline filterByType should filter all settings of type StringSetting`() { - val result = settings.filterByType() - assertEquals(2, result.size) - } - - @Test - fun `inline filterByType should filter all settings of type Role`() { - val result = settings.filterByType() - assertEquals(2, result.size) - } - - @Test - fun `inline filterByType should filter all settings of type Permission`() { - val result = settings.filterByType() - assertEquals(2, result.size) - } -} diff --git a/onixlabs-corda-bnms-integration/build.gradle b/onixlabs-corda-bnms-integration/build.gradle index 48452f5..53ed2db 100644 --- a/onixlabs-corda-bnms-integration/build.gradle +++ b/onixlabs-corda-bnms-integration/build.gradle @@ -36,6 +36,7 @@ publishing { groupId = project.parent.group version = project.parent.version artifactId = 'onixlabs-corda-bnms-integration' + artifact sourceJar from components.java } } diff --git a/onixlabs-corda-bnms-workflow/build.gradle b/onixlabs-corda-bnms-workflow/build.gradle index 7120e41..a9c1fe0 100644 --- a/onixlabs-corda-bnms-workflow/build.gradle +++ b/onixlabs-corda-bnms-workflow/build.gradle @@ -54,6 +54,7 @@ publishing { groupId = project.parent.group version = project.parent.version artifactId = 'onixlabs-corda-bnms-workflow' + artifact sourceJar from components.java } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt index 4f20587..db2af68 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt @@ -104,70 +104,70 @@ fun FlowLogic<*>.findRelationshipForAttestation(attestation: RelationshipAttesta "Relationship for the specified attestation could not be found, or has not been witnessed by this node." ) } - -/** - * Generates an unsigned transaction. - * - * @param notary The notary to assign to the transaction. - * @param action The context in which the [TransactionBuilder] will build the transaction. - * @return Returns an unsigned transaction. - */ -@Suspendable -internal fun FlowLogic<*>.transaction( - notary: Party, - action: TransactionBuilder.() -> TransactionBuilder -): TransactionBuilder { - currentStep(GENERATING) - return with(TransactionBuilder(notary)) { action(this) } -} - -/** - * Verifies and signs an unsigned transaction. - * - * @param builder The unsigned transaction to verify and sign. - * @param signingKey The initial signing ket for the transaction. - * @return Returns a verified and signed transaction. - */ -@Suspendable -internal fun FlowLogic<*>.verifyAndSign( - builder: TransactionBuilder, - signingKey: PublicKey -): SignedTransaction { - currentStep(VERIFYING) - builder.verify(serviceHub) - - currentStep(SIGNING) - return serviceHub.signInitialTransaction(builder, signingKey) -} - -/** - * Gathers counter-party signatures for a partially signed transaction. - * - * @param transaction The signed transaction for which to obtain additional signatures. - * @param sessions The flow sessions for the required signing counter-parties. - * @return Returns a signed transaction. - */ -@Suspendable -internal fun FlowLogic<*>.countersign( - transaction: SignedTransaction, - sessions: Set -): SignedTransaction { - currentStep(COUNTERSIGNING) - return subFlow(CollectSignaturesFlow(transaction, sessions, COUNTERSIGNING.childProgressTracker())) -} - -/** - * Finalizes and records a signed transaction to the vault. - * - * @param transaction The transaction to finalize and record. - * @param sessions The flow sessions for counter-parties who are expected to finalize and record the transaction. - * @return Returns a finalized and recorded transaction. - */ -@Suspendable -internal fun FlowLogic<*>.finalize( - transaction: SignedTransaction, - sessions: Set = emptySet() -): SignedTransaction { - currentStep(FINALIZING) - return subFlow(FinalityFlow(transaction, sessions, FINALIZING.childProgressTracker())) -} +// +///** +// * Generates an unsigned transaction. +// * +// * @param notary The notary to assign to the transaction. +// * @param action The context in which the [TransactionBuilder] will build the transaction. +// * @return Returns an unsigned transaction. +// */ +//@Suspendable +//internal fun FlowLogic<*>.transaction( +// notary: Party, +// action: TransactionBuilder.() -> TransactionBuilder +//): TransactionBuilder { +// currentStep(GENERATING) +// return with(TransactionBuilder(notary)) { action(this) } +//} +// +///** +// * Verifies and signs an unsigned transaction. +// * +// * @param builder The unsigned transaction to verify and sign. +// * @param signingKey The initial signing ket for the transaction. +// * @return Returns a verified and signed transaction. +// */ +//@Suspendable +//internal fun FlowLogic<*>.verifyAndSign( +// builder: TransactionBuilder, +// signingKey: PublicKey +//): SignedTransaction { +// currentStep(VERIFYING) +// builder.verify(serviceHub) +// +// currentStep(SIGNING) +// return serviceHub.signInitialTransaction(builder, signingKey) +//} +// +///** +// * Gathers counter-party signatures for a partially signed transaction. +// * +// * @param transaction The signed transaction for which to obtain additional signatures. +// * @param sessions The flow sessions for the required signing counter-parties. +// * @return Returns a signed transaction. +// */ +//@Suspendable +//internal fun FlowLogic<*>.countersign( +// transaction: SignedTransaction, +// sessions: Set +//): SignedTransaction { +// currentStep(COUNTERSIGNING) +// return subFlow(CollectSignaturesFlow(transaction, sessions, COUNTERSIGNING.childProgressTracker())) +//} +// +///** +// * Finalizes and records a signed transaction to the vault. +// * +// * @param transaction The transaction to finalize and record. +// * @param sessions The flow sessions for counter-parties who are expected to finalize and record the transaction. +// * @return Returns a finalized and recorded transaction. +// */ +//@Suspendable +//internal fun FlowLogic<*>.finalize( +// transaction: SignedTransaction, +// sessions: Set = emptySet() +//): SignedTransaction { +// currentStep(FINALIZING) +// return subFlow(FinalityFlow(transaction, sessions, FINALIZING.childProgressTracker())) +//} From 81b7f8bd6699e1c268b3a864d37a2e988a84d0c8 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Thu, 28 Oct 2021 11:32:06 +0100 Subject: [PATCH 07/23] Publishing version 2.0.0-rc1 --- build.gradle | 2 +- gradle.properties | 2 +- .../bnms/contract/Extensions.Iterable.kt | 29 ----- .../corda/bnms/contract/Extensions.Setting.kt | 106 ---------------- .../corda/bnms/contract/SettingTypeInfo.kt | 66 ---------- .../bnms/contract/membership/Extensions.kt | 72 +++++++++++ .../membership/MembershipAttestation.kt | 36 ++++++ .../MembershipAttestationContract.kt | 21 ++++ .../contract/membership/MembershipContract.kt | 2 +- .../MembershipAttestationService.kt | 2 +- .../bnms/integration/MembershipService.kt | 2 +- .../RelationshipAttestationService.kt | 2 +- .../bnms/integration/RelationshipService.kt | 2 - .../bnms/integration/RevocationLockService.kt | 28 ++++- .../bnms/workflow/Extensions.FlowLogic.kt | 115 +++++------------- ...xtensions.TransactionBuilder.Membership.kt | 53 ++++++++ ...ransactionBuilder.MembershipAttestation.kt | 53 ++++++++ ...ensions.TransactionBuilder.Relationship.kt | 52 ++++++++ ...nsactionBuilder.RelationshipAttestation.kt | 53 ++++++++ ...sions.TransactionBuilder.RevocationLock.kt | 39 ++++++ .../onixlabs/corda/bnms/workflow/FlowSteps.kt | 64 ++++++++++ .../AmendMembershipAttestationFlow.kt | 38 +++--- .../AmendMembershipAttestationFlowHandler.kt | 22 ++-- .../membership/AmendMembershipFlow.kt | 40 +++--- .../membership/AmendMembershipFlowHandler.kt | 27 ++-- .../IssueMembershipAttestationFlow.kt | 38 +++--- .../IssueMembershipAttestationFlowHandler.kt | 22 ++-- .../membership/IssueMembershipFlow.kt | 38 +++--- .../membership/IssueMembershipFlowHandler.kt | 27 ++-- .../PublishMembershipAttestationFlow.kt | 26 ++-- ...PublishMembershipAttestationFlowHandler.kt | 24 ++-- .../membership/PublishMembershipFlow.kt | 29 ++--- .../PublishMembershipFlowHandler.kt | 24 ++-- .../RevokeMembershipAttestationFlow.kt | 35 +++--- .../RevokeMembershipAttestationFlowHandler.kt | 22 ++-- .../membership/RevokeMembershipFlow.kt | 37 +++--- .../membership/RevokeMembershipFlowHandler.kt | 22 ++-- .../membership/SynchronizeMembershipFlow.kt | 40 +++--- .../SynchronizeMembershipFlowHandler.kt | 45 ++++--- .../AmendRelationshipAttestationFlow.kt | 40 +++--- ...AmendRelationshipAttestationFlowHandler.kt | 28 +++-- .../relationship/AmendRelationshipFlow.kt | 47 +++---- .../AmendRelationshipFlowHandler.kt | 58 +++++---- .../IssueRelationshipAttestationFlow.kt | 40 +++--- ...IssueRelationshipAttestationFlowHandler.kt | 28 +++-- .../relationship/IssueRelationshipFlow.kt | 56 ++++----- .../IssueRelationshipFlowHandler.kt | 53 ++++---- .../RevokeRelationshipAttestationFlow.kt | 38 +++--- ...evokeRelationshipAttestationFlowHandler.kt | 30 +++-- .../relationship/RevokeRelationshipFlow.kt | 47 +++---- .../RevokeRelationshipFlowHandler.kt | 46 +++---- .../revocation/LockRevocationLockFlow.kt | 29 +++-- .../revocation/UnlockRevocationLockFlow.kt | 33 +++-- .../onixlabs/corda/bnms/workflow/FlowTest.kt | 4 +- .../AmendMembershipAttestationFlowTests.kt | 4 +- .../AmendRelationshipAttestationFlowTests.kt | 2 +- 56 files changed, 1132 insertions(+), 808 deletions(-) delete mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Iterable.kt delete mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt delete mode 100644 onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Membership.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.MembershipAttestation.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Relationship.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RelationshipAttestation.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RevocationLock.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/FlowSteps.kt diff --git a/build.gradle b/build.gradle index f7e413b..b926bb6 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { corda_artifactory_url = 'https://software.r3.com/artifactory' corda_group = 'net.corda' - corda_release_version = '4.6' + corda_release_version = '4.8' corda_gradle_plugin_group = 'net.corda.plugins' corda_gradle_plugin_version = '5.0.4' diff --git a/gradle.properties b/gradle.properties index 346a2cb..d964950 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0 +version=2.0.0-rc1 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Iterable.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Iterable.kt deleted file mode 100644 index 6167f8b..0000000 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Iterable.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2020-2021 ONIXLabs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.onixlabs.corda.bnms.contract - -/** - * Determines whether an [Iterable] is distinct by the specified selector. - * - * @param T The underlying [Iterable] type. - * @param K The underlying selected type. - * @param selector The selector to use to determine distinction. - * @return Returns true if the [Iterable] is distinct by the specified selector; otherwise, false. - */ -fun Iterable.isDistinctBy(selector: (T) -> K): Boolean { - return count() == distinctBy(selector).count() -} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt deleted file mode 100644 index 7ad0243..0000000 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Extensions.Setting.kt +++ /dev/null @@ -1,106 +0,0 @@ -///* -// * Copyright 2020-2021 ONIXLabs -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -// -//package io.onixlabs.corda.bnms.contract -// -///** -// * Only declared so that I can fit method signatures on a single line. -// */ -//private typealias Settings = Iterable> -// -///** -// * Casts a [Setting] of an unknown value type to a [Setting] of type [T]. -// * -// * @param T The underlying value type of the cast [Setting]. -// * @param type The value type to cast to. -// * @return Returns a [Setting] of type [T]. -// * @throws ClassCastException if the value type cannot be cast to type [T]. -// */ -//fun Setting<*>.cast(type: Class): Setting { -// return Setting(property, type.cast(value)) -//} -// -///** -// * Casts a [Setting] of an unknown value type to a [Setting] of type [T]. -// * -// * @param T The underlying value type of the cast [Setting]. -// * @return Returns a [Setting] of type [T]. -// * @throws ClassCastException if the value type cannot be cast to type [T]. -// */ -//inline fun Setting<*>.cast(): Setting { -// return cast(T::class.java) -//} -// -///** -// * Casts an [Iterable] of [Setting] of an unknown value type to an [Iterable] of [Setting] of type [T]. -// * -// * @param T The underlying value type of the cast [Setting]. -// * @param type The value type to cast to. -// * @return Returns an [Iterable] of [Setting] of type [T]. -// * @throws ClassCastException if the value type cannot be cast to type [T]. -// */ -//fun Settings.cast(type: Class): List> { -// return map { it.cast(type) } -//} -// -///** -// * Casts an [Iterable] of [Setting] of an unknown value type to an [Iterable] of [Setting] of type [T]. -// * -// * @param T The underlying value type of the cast [Setting]. -// * @return Returns an [Iterable] of [Setting] of type [T]. -// * @throws ClassCastException if the value type cannot be cast to type [T]. -// */ -//inline fun Settings.cast(): List> { -// return cast(T::class.java) -//} -// -///** -// * Filters an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. -// * -// * @param V The underlying value type. -// * @param S The underlying setting type. -// * @param settingType The setting type. -// * @param valueType The value type, or null if the setting type is derived, or the value type is unknown or a wildcard. -// * @return Returns an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. -// */ -//fun > Settings.filterByType(settingType: Class, valueType: Class? = null): List { -// val settingsFilteredBySettingType = filter { it.javaClass == settingType }.filterIsInstance(settingType) -// return if (valueType != null) settingsFilteredBySettingType.filter { it.value?.javaClass == valueType } -// else settingsFilteredBySettingType -//} -// -///** -// * Filters an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. -// * -// * @param T The underlying setting type. -// * @return Returns an [Iterable] of [Setting] by the specified setting type, and optionally the setting value type. -// */ -//inline fun > Iterable>.filterByType(): List { -// val typeInfo = object : SettingTypeInfo() {} -// return filterByType(typeInfo.settingType, typeInfo.valueType) -//} -// -///** -// * Filters an [Iterable] of [Setting] by the specified property. -// * -// * @param T The underlying setting type. -// * @param property The property to filter by. -// * @param ignoreCase Determines whether to ignore the property case when filtering; for example when filtering by a normalized property. -// * @return Returns an [Iterable] of [Setting] by the specified property. -// */ -//fun > Iterable.filterByProperty(property: String, ignoreCase: Boolean = false): List { -// return filter { it.property.equals(property, ignoreCase) } -//} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt deleted file mode 100644 index 839de02..0000000 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/SettingTypeInfo.kt +++ /dev/null @@ -1,66 +0,0 @@ -///* -// * Copyright 2020-2021 ONIXLabs -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -// -//package io.onixlabs.corda.bnms.contract -// -//import io.onixlabs.corda.core.toClass -//import io.onixlabs.corda.core.toTypedClass -//import java.lang.reflect.ParameterizedType -//import java.lang.reflect.Type -//import java.lang.reflect.WildcardType -// -///** -// * Represents the base class for obtaining setting type information implementations. -// * -// * @param T The underlying setting type. -// * @property settingType Obtains the most derived setting type in the type hierarchy. -// * @property valueType Obtains the value type of the setting, or null if the value type was specified as a wildcard. -// */ -//@PublishedApi -//internal abstract class SettingTypeInfo> : Comparable> { -// -// val settingType: Class -// get() = getSettingTypeInternal().toTypedClass() -// -// val valueType: Class<*>? -// get() = getValueTypeInternal() -// -// override fun compareTo(other: SettingTypeInfo): Int = 0 -// -// /** -// * Gets the most derived setting type in the type hierarchy. -// */ -// private fun getSettingTypeInternal(): Type { -// val superClass = javaClass.genericSuperclass -// check(superClass !is Class<*>) { "Internal error: TypeReference constructed without actual type information" } -// return (superClass as ParameterizedType).actualTypeArguments[0] -// } -// -// /** -// * Gets the value type of the setting, or null if the value type was specified as a wildcard. -// * -// * The reason for returning a nullable [Class] is because settings could be specified as: -// * - Setting<*> - Settings of unknown value type, or settings regardless of value type. -// * - Setting - Settings specifically of [Any] value type. -// */ -// private tailrec fun getValueTypeInternal(settingType: Type = getSettingTypeInternal()): Class<*>? { -// return if (settingType.toClass() == Setting::class.java) { -// val parameterizedType = settingType as ParameterizedType -// val argument = parameterizedType.actualTypeArguments[0] -// if (argument is WildcardType) null else argument.toClass() -// } else getValueTypeInternal(settingType.toClass().genericSuperclass) -// } -//} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt index 425eaf2..1aa91a1 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt @@ -19,13 +19,28 @@ package io.onixlabs.corda.bnms.contract.membership import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import io.onixlabs.corda.identityframework.contract.toStaticAttestationPointer import net.corda.core.contracts.StateAndRef +import net.corda.core.contracts.StateRef import net.corda.core.contracts.UniqueIdentifier import net.corda.core.identity.AbstractParty +/** + * Gets the next [Membership] output, appending the previous [Membership] state's [StateRef]. + * + * @return Returns the next [Membership] output, appending the previous [Membership] state's [StateRef]. + */ fun StateAndRef.getNextOutput(): Membership { return state.data.copy(previousStateRef = ref) } +/** + * Creates a [MembershipAttestation] for the specified [Membership]. + * + * @param attestor The attestor who is attesting to the [Membership]. + * @param status The status of the attestation. + * @param metadata Any extra metadata that should be applied to the attestation. + * @param linearId The linear ID of the attestation. + * @return Returns a [MembershipAttestation] for the specified [Membership]. + */ fun StateAndRef.attest( attestor: AbstractParty, status: AttestationStatus, @@ -33,42 +48,99 @@ fun StateAndRef.attest( linearId: UniqueIdentifier = UniqueIdentifier() ) = MembershipAttestation(attestor, this, status, metadata, linearId) +/** + * Creates an accepted [MembershipAttestation] for the specified [Membership]. + * + * @param attestor The attestor who is attesting to the [Membership]. + * @param metadata Any extra metadata that should be applied to the attestation. + * @param linearId The linear ID of the attestation. + * @return Returns an accepted [MembershipAttestation] for the specified [Membership]. + */ fun StateAndRef.accept( attestor: AbstractParty, metadata: Map = emptyMap(), linearId: UniqueIdentifier = UniqueIdentifier() ) = attest(attestor, AttestationStatus.ACCEPTED, metadata, linearId) +/** + * Creates a rejected [MembershipAttestation] for the specified [Membership]. + * + * @param attestor The attestor who is attesting to the [Membership]. + * @param metadata Any extra metadata that should be applied to the attestation. + * @param linearId The linear ID of the attestation. + * @return Returns a rejected [MembershipAttestation] for the specified [Membership]. + */ fun StateAndRef.reject( attestor: AbstractParty, metadata: Map = emptyMap(), linearId: UniqueIdentifier = UniqueIdentifier() ) = attest(attestor, AttestationStatus.REJECTED, metadata, linearId) +/** + * Amends a [MembershipAttestation] pointing to the existing [Membership] state. + * + * @param status The amended status of the [MembershipAttestation]. + * @param metadata Any extra metadata that should be applied to the attestation. + * @return Returns an amended [MembershipAttestation] pointing to the existing [Membership] state. + */ fun StateAndRef.amend( status: AttestationStatus, metadata: Map = this.state.data.metadata ) = this.state.data.amend(ref, status, state.data.pointer, metadata) +/** + * Amends a [MembershipAttestation] pointing to an evolved [Membership] state. + * + * @param status The amended status of the [MembershipAttestation]. + * @param membership The evolved [Membership] state that the amended [MembershipAttestation] will point to. + * @param metadata Any extra metadata that should be applied to the attestation. + * @return Returns an amended [MembershipAttestation] pointing to an evolved [Membership] state. + */ fun StateAndRef.amend( membership: StateAndRef, status: AttestationStatus, metadata: Map = this.state.data.metadata ) = this.state.data.amend(ref, status, membership.toStaticAttestationPointer(), metadata) +/** + * Amends and accepts a [MembershipAttestation] pointing to the existing [Membership] state. + * + * @param metadata Any extra metadata that should be applied to the attestation. + * @return Returns an amended and accepted [MembershipAttestation] pointing to the existing [Membership] state. + */ fun StateAndRef.accept( metadata: Map = this.state.data.metadata ) = amend(AttestationStatus.ACCEPTED, metadata) +/** + * Amends and accepts a [MembershipAttestation] pointing to an evolved [Membership] state. + * + * @param membership The evolved [Membership] state that the amended [MembershipAttestation] will point to. + * @param metadata Any extra metadata that should be applied to the attestation. + * @return Returns an amended and accepted [MembershipAttestation] pointing to an evolved [Membership] state. + */ fun StateAndRef.accept( membership: StateAndRef, metadata: Map = this.state.data.metadata ) = amend(membership, AttestationStatus.ACCEPTED, metadata) +/** + * Amends and rejects a [MembershipAttestation] pointing to the existing [Membership] state. + * + * @param metadata Any extra metadata that should be applied to the attestation. + * @return Returns an amended and rejected [MembershipAttestation] pointing to the existing [Membership] state. + */ fun StateAndRef.reject( metadata: Map = this.state.data.metadata ) = amend(AttestationStatus.REJECTED, metadata) +/** + * Amends and rejects a [MembershipAttestation] pointing to an evolved [Membership] state. + * + * @param membership The evolved [Membership] state that the amended [MembershipAttestation] will point to. + * @param metadata Any extra metadata that should be applied to the attestation. + * @return Returns an amended and rejected [MembershipAttestation] pointing to an evolved [Membership] state. + */ fun StateAndRef.reject( membership: StateAndRef, metadata: Map = this.state.data.metadata diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt index aed7c2d..29116a1 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt @@ -32,6 +32,22 @@ import net.corda.core.identity.AbstractParty import net.corda.core.schemas.MappedSchema import net.corda.core.schemas.PersistentState +/** + * Represents a membership attestation; a proof that a particular [Membership] state has been witnessed. + * + * @property network The business network that this membership attestation belongs to. + * @property attestor The party who is attesting to the witnessed [Membership] state. + * @property attestees The parties of this attestation, usually the participants of the attested [Membership] state. + * @property pointer The pointer to the attested [Membership] state. + * @property status The status of the attestation. + * @property metadata Additional information about the attestation. + * @property linearId The unique identifier of the attestation. + * @property previousStateRef The state reference of the previous state in the chain. + * @property hash The unique hash which represents this attestation. + * @property participants The participants of this attestation; namely the attestor and attestees. + * @property holder A reference to the only attestee of the attestation; namely the [Membership] holder. + * @property isNetworkOperator Determines whether this membership attestation is attesting to the business network operator's [Membership] state. + */ @BelongsToContract(MembershipAttestationContract::class) class MembershipAttestation internal constructor( override val network: Network, @@ -76,6 +92,15 @@ class MembershipAttestation internal constructor( val isNetworkOperator: Boolean get() = holder == network.operator + /** + * Amends this attestation. + * + * @property previousStateRef The state reference of the previous state in the chain. + * @param status The amended attestation status. + * @param pointer The pointer to the attested state, if a new version of the state is being attested. + * @param metadata Additional information about the attestation. + * @return Returns a new, amended version of this attestation state. + */ override fun amend( previousStateRef: StateRef, status: AttestationStatus, @@ -94,6 +119,12 @@ class MembershipAttestation internal constructor( ) } + /** + * Generates a persistent state entity from this contract state. + * + * @param schema The mapped schema from which to generate a persistent state entity. + * @return Returns a persistent state entity. + */ override fun generateMappedObject(schema: MappedSchema): PersistentState = when (schema) { is MembershipAttestationSchemaV1 -> MembershipAttestationEntity( linearId = linearId.id, @@ -114,6 +145,11 @@ class MembershipAttestation internal constructor( else -> super.generateMappedObject(schema) } + /** + * Gets the supported schemas of this state. + * + * @return Returns the supported schemas of this state. + */ override fun supportedSchemas(): Iterable { return super.supportedSchemas() + MembershipAttestationSchemaV1 } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt index a25ba00..d8039a6 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt @@ -23,10 +23,16 @@ import net.corda.core.contracts.requireThat import net.corda.core.transactions.LedgerTransaction import java.security.PublicKey +/** + * Represents the smart contract for membership attestations. + */ class MembershipAttestationContract : AttestationContract(), Contract { companion object : ContractID + /** + * Represents the command rules to issue attestations. + */ internal object Issue { const val CONTRACT_RULE_REFERENCES = "On membership attestation issuing, only one membership state must be referenced." @@ -47,6 +53,9 @@ class MembershipAttestationContract : AttestationContract(), Contract { "On membership attestation issuing, if present, only the network operator can self-attest their membership state." } + /** + * Represents the command rules to amend attestations. + */ internal object Amend { const val CONTRACT_RULE_REFERENCES = "On membership attestation amending, only one membership state must be referenced." @@ -61,6 +70,12 @@ class MembershipAttestationContract : AttestationContract(), Contract { "On membership attestation amending, the attestation network must be equal to the membership network." } + /** + * Provides the extended contract constraints for issuing membership attestations. + * + * @param transaction The ledger transaction to verify. + * @param signers The signers of the transaction. + */ override fun onVerifyIssue(transaction: LedgerTransaction, signers: Set) = requireThat { val memberships = transaction.referenceInputRefsOfType() @@ -76,6 +91,12 @@ class MembershipAttestationContract : AttestationContract(), Contract { Issue.CONTRACT_RULE_SELF_ATTESTATION using (attestation.isNetworkOperator || attestation.attestor != attestation.holder) } + /** + * Provides the extended contract constraints for amending membership attestations. + * + * @param transaction The ledger transaction to verify. + * @param signers The signers of the transaction. + */ override fun onVerifyAmend(transaction: LedgerTransaction, signers: Set) = requireThat { val memberships = transaction.referenceInputRefsOfType() diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt index b25e122..7bd7666 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt @@ -48,7 +48,7 @@ class MembershipContract : Contract { "On membership issuing, the previous state reference of the created membership state must be null." internal const val CONTRACT_RULE_SIGNERS = - "On membership issuing, either the holder or the network operator of the creates membership state must sign the transaction." + "On membership issuing, either the holder or the network operator of the created membership state must sign the transaction." override fun verify(transaction: LedgerTransaction, signers: Set) = requireThat { val inputs = transaction.inputsOfType() diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt index 2fd14dc..9d437e8 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt @@ -23,7 +23,7 @@ import io.onixlabs.corda.bnms.workflow.membership.AmendMembershipAttestationFlow import io.onixlabs.corda.bnms.workflow.membership.IssueMembershipAttestationFlow import io.onixlabs.corda.bnms.workflow.membership.RevokeMembershipAttestationFlow import io.onixlabs.corda.core.integration.RPCService -import io.onixlabs.corda.identityframework.contract.AttestationStatus +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UniqueIdentifier import net.corda.core.identity.AbstractParty diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt index 67c6bc1..d4a493b 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt @@ -23,7 +23,7 @@ import io.onixlabs.corda.bnms.workflow.membership.AmendMembershipFlow import io.onixlabs.corda.bnms.workflow.membership.IssueMembershipFlow import io.onixlabs.corda.bnms.workflow.membership.RevokeMembershipFlow import io.onixlabs.corda.core.integration.RPCService -import io.onixlabs.corda.identityframework.contract.AbstractClaim +import io.onixlabs.corda.identityframework.contract.claims.AbstractClaim import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UniqueIdentifier import net.corda.core.identity.AbstractParty diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt index 29fa44a..8a089bb 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt @@ -23,7 +23,7 @@ import io.onixlabs.corda.bnms.workflow.relationship.AmendRelationshipAttestation import io.onixlabs.corda.bnms.workflow.relationship.IssueRelationshipAttestationFlow import io.onixlabs.corda.bnms.workflow.relationship.RevokeRelationshipAttestationFlow import io.onixlabs.corda.core.integration.RPCService -import io.onixlabs.corda.identityframework.contract.AttestationStatus +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UniqueIdentifier import net.corda.core.identity.AbstractParty diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt index dabcd9e..fc8febe 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt @@ -18,7 +18,6 @@ package io.onixlabs.corda.bnms.integration import io.onixlabs.corda.bnms.contract.Configuration import io.onixlabs.corda.bnms.contract.Network -import io.onixlabs.corda.bnms.contract.Setting import io.onixlabs.corda.bnms.contract.relationship.Relationship import io.onixlabs.corda.bnms.workflow.relationship.AmendRelationshipFlow import io.onixlabs.corda.bnms.workflow.relationship.IssueRelationshipFlow @@ -48,7 +47,6 @@ class RelationshipService(rpc: CordaRPCOps) : RPCService(rpc) { fun issueRelationship( network: Network, members: Map = emptyMap(), - settings: Set> = emptySet(), linearId: UniqueIdentifier = UniqueIdentifier(), notary: Party? = null, checkMembership: Boolean = false, diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt index fe0a6f8..2624261 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt @@ -36,7 +36,12 @@ class RevocationLockService(rpc: CordaRPCOps) : RPCService(rpc) { notary: Party? = null ): FlowProgressHandle { val lock = RevocationLock(owner, state) - return rpc.startTrackedFlow(::LockRevocationLockFlow, lock, notary) + return rpc.startTrackedFlow( + ::LockRevocationLockFlow, + lock, + notary, + LockRevocationLockFlow.tracker() + ) } fun lock( @@ -46,19 +51,34 @@ class RevocationLockService(rpc: CordaRPCOps) : RPCService(rpc) { clientId: String = UUID.randomUUID().toString() ): FlowHandleWithClientId { val lock = RevocationLock(owner, state) - return rpc.startFlowWithClientId(clientId, ::LockRevocationLockFlow, lock, notary) + return rpc.startFlowWithClientId( + clientId, + ::LockRevocationLockFlow, + lock, + notary, + LockRevocationLockFlow.tracker() + ) } fun unlock( lock: StateAndRef> ): FlowProgressHandle { - return rpc.startTrackedFlow(::UnlockRevocationLockFlow, lock) + return rpc.startTrackedFlow( + ::UnlockRevocationLockFlow, + lock, + UnlockRevocationLockFlow.tracker() + ) } fun unlock( lock: StateAndRef>, clientId: String = UUID.randomUUID().toString() ): FlowHandleWithClientId { - return rpc.startFlowWithClientId(clientId, ::UnlockRevocationLockFlow, lock) + return rpc.startFlowWithClientId( + clientId, + ::UnlockRevocationLockFlow, + lock, + UnlockRevocationLockFlow.tracker() + ) } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt index db2af68..71f0091 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt @@ -19,33 +19,44 @@ package io.onixlabs.corda.bnms.workflow import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation -import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema -import io.onixlabs.corda.bnms.contract.membership.MembershipSchema +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema.MembershipAttestationEntity +import io.onixlabs.corda.bnms.contract.membership.MembershipSchema.MembershipEntity import io.onixlabs.corda.bnms.contract.relationship.Relationship import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation import io.onixlabs.corda.bnms.contract.revocation.RevocationLock -import io.onixlabs.corda.bnms.contract.revocation.RevocationLockSchema +import io.onixlabs.corda.bnms.contract.revocation.RevocationLockSchema.RevocationLockEntity import io.onixlabs.corda.core.services.any import io.onixlabs.corda.core.services.equalTo import io.onixlabs.corda.core.services.singleOrNull import io.onixlabs.corda.core.services.vaultServiceFor import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.* import net.corda.core.contracts.LinearState import net.corda.core.contracts.StateAndRef -import net.corda.core.flows.* +import net.corda.core.flows.FlowException +import net.corda.core.flows.FlowLogic +import net.corda.core.flows.FlowSession import net.corda.core.identity.AbstractParty -import net.corda.core.identity.Party import net.corda.core.node.services.Vault -import net.corda.core.transactions.SignedTransaction -import net.corda.core.transactions.TransactionBuilder -import java.security.PublicKey +import net.corda.core.utilities.unwrap + +@Suspendable +fun FlowLogic<*>.checkMembership(checkMembership: Boolean, relationship: Relationship, sessions: Set) { + currentStep(SendCheckMembershipInstructionStep) + sessions.forEach { it.send(checkMembership) } + if (checkMembership) checkMembershipsAndAttestations(relationship) +} + +@Suspendable +fun FlowLogic<*>.checkMembershipHandler(session: FlowSession): Boolean { + currentStep(ReceiveCheckMembershipInstructionStep) + return session.receive().unwrap { it } +} @Suspendable fun FlowLogic<*>.checkMembershipExists(membership: Membership) { val membershipExists = serviceHub.vaultServiceFor().any { stateStatus(Vault.StateStatus.ALL) - expression(MembershipSchema.MembershipEntity::hash equalTo membership.hash.toString()) + expression(MembershipEntity::hash equalTo membership.hash.toString()) } if (membershipExists) { @@ -55,22 +66,23 @@ fun FlowLogic<*>.checkMembershipExists(membership: Membership) { @Suspendable fun FlowLogic<*>.checkMembershipsAndAttestations(relationship: Relationship) { + currentStep(CheckMembershipStep) val counterparties = relationship.participants .map { serviceHub.identityService.requireWellKnownPartyFromAnonymous(it) } .filter { it !in serviceHub.myInfo.legalIdentities } counterparties.forEach { val membership = serviceHub.vaultServiceFor().singleOrNull { - expression(MembershipSchema.MembershipEntity::holder equalTo it) - expression(MembershipSchema.MembershipEntity::networkHash equalTo relationship.network.hash.toString()) + expression(MembershipEntity::holder equalTo it) + expression(MembershipEntity::networkHash equalTo relationship.network.hash.toString()) } ?: throw FlowException(buildString { append("Membership for '$it' on network '${relationship.network}' ") append("could not be found, or has not been witnessed by this node.") }) serviceHub.vaultServiceFor().singleOrNull { - expression(MembershipAttestationSchema.MembershipAttestationEntity::attestor equalTo ourIdentity) - expression(MembershipAttestationSchema.MembershipAttestationEntity::pointer equalTo membership.ref.toString()) + expression(MembershipAttestationEntity::attestor equalTo ourIdentity) + expression(MembershipAttestationEntity::pointer equalTo membership.ref.toString()) } ?: throw FlowException(buildString { append("MembershipAttestation for '${membership.state.data.holder}' ") append("could not be found, or has not been witnessed by this node.") @@ -81,12 +93,12 @@ fun FlowLogic<*>.checkMembershipsAndAttestations(relationship: Relationship) { @Suspendable fun FlowLogic<*>.checkRevocationLockExists(owner: AbstractParty, state: LinearState) { val revocationLockExists = serviceHub.vaultServiceFor>().any { - expression(RevocationLockSchema.RevocationLockEntity::owner equalTo owner) - expression(RevocationLockSchema.RevocationLockEntity::pointerStateClass equalTo state.javaClass.canonicalName) - expression(RevocationLockSchema.RevocationLockEntity::pointerStateLinearId equalTo state.linearId.id) + expression(RevocationLockEntity::owner equalTo owner) + expression(RevocationLockEntity::pointerStateClass equalTo state.javaClass.canonicalName) + expression(RevocationLockEntity::pointerStateLinearId equalTo state.linearId.id) } - if(revocationLockExists) { + if (revocationLockExists) { throw FlowException("Revocation of this relationship is locked by counter-party: $owner.") } } @@ -104,70 +116,3 @@ fun FlowLogic<*>.findRelationshipForAttestation(attestation: RelationshipAttesta "Relationship for the specified attestation could not be found, or has not been witnessed by this node." ) } -// -///** -// * Generates an unsigned transaction. -// * -// * @param notary The notary to assign to the transaction. -// * @param action The context in which the [TransactionBuilder] will build the transaction. -// * @return Returns an unsigned transaction. -// */ -//@Suspendable -//internal fun FlowLogic<*>.transaction( -// notary: Party, -// action: TransactionBuilder.() -> TransactionBuilder -//): TransactionBuilder { -// currentStep(GENERATING) -// return with(TransactionBuilder(notary)) { action(this) } -//} -// -///** -// * Verifies and signs an unsigned transaction. -// * -// * @param builder The unsigned transaction to verify and sign. -// * @param signingKey The initial signing ket for the transaction. -// * @return Returns a verified and signed transaction. -// */ -//@Suspendable -//internal fun FlowLogic<*>.verifyAndSign( -// builder: TransactionBuilder, -// signingKey: PublicKey -//): SignedTransaction { -// currentStep(VERIFYING) -// builder.verify(serviceHub) -// -// currentStep(SIGNING) -// return serviceHub.signInitialTransaction(builder, signingKey) -//} -// -///** -// * Gathers counter-party signatures for a partially signed transaction. -// * -// * @param transaction The signed transaction for which to obtain additional signatures. -// * @param sessions The flow sessions for the required signing counter-parties. -// * @return Returns a signed transaction. -// */ -//@Suspendable -//internal fun FlowLogic<*>.countersign( -// transaction: SignedTransaction, -// sessions: Set -//): SignedTransaction { -// currentStep(COUNTERSIGNING) -// return subFlow(CollectSignaturesFlow(transaction, sessions, COUNTERSIGNING.childProgressTracker())) -//} -// -///** -// * Finalizes and records a signed transaction to the vault. -// * -// * @param transaction The transaction to finalize and record. -// * @param sessions The flow sessions for counter-parties who are expected to finalize and record the transaction. -// * @return Returns a finalized and recorded transaction. -// */ -//@Suspendable -//internal fun FlowLogic<*>.finalize( -// transaction: SignedTransaction, -// sessions: Set = emptySet() -//): SignedTransaction { -// currentStep(FINALIZING) -// return subFlow(FinalityFlow(transaction, sessions, FINALIZING.childProgressTracker())) -//} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Membership.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Membership.kt new file mode 100644 index 0000000..c2d9554 --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Membership.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.bnms.contract.membership.Membership +import io.onixlabs.corda.bnms.contract.membership.MembershipContract +import net.corda.core.contracts.StateAndRef +import net.corda.core.transactions.TransactionBuilder +import java.security.PublicKey + +@Suspendable +fun TransactionBuilder.addIssuedMembership( + state: Membership, + signingKey: PublicKey +): TransactionBuilder = apply { + addOutputState(state) + addCommand(MembershipContract.Issue, signingKey) +} + +@Suspendable +fun TransactionBuilder.addAmendedMembership( + oldMembership: StateAndRef, + newMembership: Membership, + signingKey: PublicKey +): TransactionBuilder = apply { + addInputState(oldMembership) + addOutputState(newMembership, MembershipContract.ID) + addCommand(MembershipContract.Amend, signingKey) +} + +@Suspendable +fun TransactionBuilder.addRevokedMembership( + membership: StateAndRef, + signingKey: PublicKey +): TransactionBuilder = apply { + addInputState(membership) + addCommand(MembershipContract.Revoke, signingKey) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.MembershipAttestation.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.MembershipAttestation.kt new file mode 100644 index 0000000..ffff5ff --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.MembershipAttestation.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.bnms.contract.membership.Membership +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation +import io.onixlabs.corda.identityframework.workflow.addAmendedAttestation +import io.onixlabs.corda.identityframework.workflow.addIssuedAttestation +import io.onixlabs.corda.identityframework.workflow.addRevokedAttestation +import net.corda.core.contracts.ReferencedStateAndRef +import net.corda.core.contracts.StateAndRef +import net.corda.core.transactions.TransactionBuilder + +@Suspendable +fun TransactionBuilder.addIssuedMembershipAttestation( + membershipAttestation: MembershipAttestation, + membership: ReferencedStateAndRef +): TransactionBuilder = apply { + addIssuedAttestation(membershipAttestation) + addReferenceState(membership) +} + +@Suspendable +fun TransactionBuilder.addAmendedMembershipAttestation( + oldMembershipAttestation: StateAndRef, + newMembershipAttestation: MembershipAttestation, + membership: ReferencedStateAndRef +): TransactionBuilder = apply { + addAmendedAttestation(oldMembershipAttestation, newMembershipAttestation) + addReferenceState(membership) +} + +@Suspendable +fun TransactionBuilder.addRevokedMembershipAttestation( + membershipAttestation: StateAndRef +): TransactionBuilder = apply { + addRevokedAttestation(membershipAttestation) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Relationship.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Relationship.kt new file mode 100644 index 0000000..db89fc8 --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Relationship.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.bnms.contract.relationship.Relationship +import io.onixlabs.corda.bnms.contract.relationship.RelationshipContract +import io.onixlabs.corda.bnms.contract.revocation.RevocationLockContract +import net.corda.core.contracts.StateAndRef +import net.corda.core.transactions.TransactionBuilder + +@Suspendable +fun TransactionBuilder.addIssuedRelationship( + relationship: Relationship +): TransactionBuilder = apply { + addOutputState(relationship, RelationshipContract.ID) + relationship.createRevocationLocks().forEach { addOutputState(it) } + addCommand(RelationshipContract.Issue, relationship.participants.map { it.owningKey }) + addCommand(RevocationLockContract.Lock, relationship.participants.map { it.owningKey }) +} + +@Suspendable +fun TransactionBuilder.addAmendedRelationship( + oldRelationship: StateAndRef, + newRelationship: Relationship +): TransactionBuilder = apply { + addInputState(oldRelationship) + addOutputState(newRelationship, RelationshipContract.ID) + addCommand(RelationshipContract.Amend, newRelationship.participants.map { it.owningKey }) +} + +@Suspendable +fun TransactionBuilder.addRevokedRelationship( + relationship: StateAndRef +): TransactionBuilder = apply { + addInputState(relationship) + addCommand(RelationshipContract.Revoke, relationship.state.data.participants.map { it.owningKey }) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RelationshipAttestation.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RelationshipAttestation.kt new file mode 100644 index 0000000..b4f715e --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RelationshipAttestation.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.bnms.contract.relationship.Relationship +import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation +import io.onixlabs.corda.identityframework.workflow.addAmendedAttestation +import io.onixlabs.corda.identityframework.workflow.addIssuedAttestation +import io.onixlabs.corda.identityframework.workflow.addRevokedAttestation +import net.corda.core.contracts.ReferencedStateAndRef +import net.corda.core.contracts.StateAndRef +import net.corda.core.transactions.TransactionBuilder + +@Suspendable +fun TransactionBuilder.addIssuedRelationshipAttestation( + relationshipAttestation: RelationshipAttestation, + relationship: ReferencedStateAndRef +): TransactionBuilder = apply { + addIssuedAttestation(relationshipAttestation) + addReferenceState(relationship) +} + +@Suspendable +fun TransactionBuilder.addAmendedRelationshipAttestation( + oldRelationshipAttestation: StateAndRef, + newRelationshipAttestation: RelationshipAttestation, + relationship: ReferencedStateAndRef +): TransactionBuilder = apply { + addAmendedAttestation(oldRelationshipAttestation, newRelationshipAttestation) + addReferenceState(relationship) +} + +@Suspendable +fun TransactionBuilder.addRevokedRelationshipAttestation( + relationshipAttestation: StateAndRef +): TransactionBuilder = apply { + addRevokedAttestation(relationshipAttestation) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RevocationLock.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RevocationLock.kt new file mode 100644 index 0000000..e2229b2 --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RevocationLock.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.bnms.contract.revocation.RevocationLock +import io.onixlabs.corda.bnms.contract.revocation.RevocationLockContract +import net.corda.core.contracts.StateAndRef +import net.corda.core.transactions.TransactionBuilder + +@Suspendable +fun TransactionBuilder.addLockedRevocationLock( + revocationLock: RevocationLock<*> +): TransactionBuilder = apply { + addOutputState(revocationLock, RevocationLockContract.ID) + addCommand(RevocationLockContract.Lock, revocationLock.owner.owningKey) +} + +@Suspendable +fun TransactionBuilder.addUnlockedRevocationLock( + revocationLock: StateAndRef> +): TransactionBuilder = apply { + addInputState(revocationLock) + addCommand(RevocationLockContract.Unlock, revocationLock.state.data.owner.owningKey) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/FlowSteps.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/FlowSteps.kt new file mode 100644 index 0000000..0639079 --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/FlowSteps.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2020-2021 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import net.corda.core.utilities.ProgressTracker.Step + +/** + * Represents a progress tracker step indicating that a membership transaction is being sent. + */ +object SendMembershipStep : Step("Sending membership transaction.") + +/** + * Represents a progress tracker step indicating that a membership transaction is being received. + */ +object ReceiveMembershipStep : Step("Receiving membership transaction.") + +/** + * Represents a progress tracker step indicating that a membership attestatopm transaction is being sent. + */ +object SendMembershipAttestationStep : Step("Sending membership attestation transaction.") + +/** + * Represents a progress tracker step indicating that a membership attestation transaction is being received. + */ +object ReceiveMembershipAttestationStep : Step("Receiving membership attestation transaction.") + +/** + * Represents a progress tracker step indicating that the local node's membership and attestations are being sent. + */ +object SendMembershipAndAttestationsStep : Step("Sending our (local) membership and attestations.") + +/** + * Represents a progress tracker step indicating that a counter-party node's membership and attestations are being received. + */ +object ReceiveMembershipAndAttestationsStep : Step("Receiving their (counter-party) membership and attestations.") + +/** + * Represents a progress tracker step indicating that counter-party nodes should check for membership and attestation states. + */ +object SendCheckMembershipInstructionStep : Step("Sending check membership instruction.") + +/** + * Represents a progress tracker step indicating that the local node should check for membership and attestation states. + */ +object ReceiveCheckMembershipInstructionStep : Step("Receiving check membership instruction.") + +/** + * Represents a progress tracker step indicating that the current node should check for membership and attestation states. + */ +object CheckMembershipStep : Step("Checking for membership and attestation states.") diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt index 2278c63..5f0a5d5 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt @@ -18,18 +18,15 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation +import io.onixlabs.corda.bnms.workflow.addAmendedMembershipAttestation import io.onixlabs.corda.bnms.workflow.findMembershipForAttestation -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.identity.Party import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.ProgressTracker.Step -import io.onixlabs.corda.bnms.workflow.* -import io.onixlabs.corda.core.workflow.checkSufficientSessions class AmendMembershipAttestationFlow( private val oldAttestation: StateAndRef, @@ -40,24 +37,31 @@ class AmendMembershipAttestationFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkSufficientSessions(sessions, newAttestation) + val membership = findMembershipForAttestation(newAttestation).referenced() - - val transaction = transaction(oldAttestation.state.notary) { - addAmendedAttestation(oldAttestation, newAttestation) - addReferenceState(findMembershipForAttestation(newAttestation).referenced()) + val transaction = buildTransaction(oldAttestation.state.notary) { + addAmendedMembershipAttestation(oldAttestation, newAttestation, membership) } - val signedTransaction = verifyAndSign(transaction, newAttestation.attestor.owningKey) - return finalize(signedTransaction, sessions) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, sessions) } @StartableByRPC @@ -70,16 +74,16 @@ class AmendMembershipAttestationFlow( ) : FlowLogic() { private companion object { - object AMENDING : Step("Amending membership attestation.") { + object AmendMembershipAttestationStep : Step("Amending membership attestation.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(AMENDING) + override val progressTracker = ProgressTracker(AmendMembershipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(AMENDING) + currentStep(AmendMembershipAttestationStep) val sessions = initiateFlows(observers, newAttestation) return subFlow( @@ -87,7 +91,7 @@ class AmendMembershipAttestationFlow( oldAttestation, newAttestation, sessions, - AMENDING.childProgressTracker() + AmendMembershipAttestationStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowHandler.kt index 2e32e36..49e7672 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowHandler.kt @@ -17,16 +17,18 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.core.workflow.ReceiveStatesToRecordStep +import io.onixlabs.corda.core.workflow.RecordFinalizedTransactionStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING +import io.onixlabs.corda.core.workflow.finalizeTransactionHandler import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveFinalityFlow import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class AmendMembershipAttestationFlowHandler( private val session: FlowSession, @@ -37,33 +39,35 @@ class AmendMembershipAttestationFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(FINALIZING) + fun tracker() = ProgressTracker( + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, expectedTransactionId, statesToRecord)) + return finalizeTransactionHandler(session, expectedTransactionId, statesToRecord) } @InitiatedBy(AmendMembershipAttestationFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : ProgressTracker.Step("Observing membership attestation amendment.") { + object HandleAmendMembershipAttestationStep : Step("Handling membership attestation amendment.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleAmendMembershipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) + currentStep(HandleAmendMembershipAttestationStep) return subFlow( AmendMembershipAttestationFlowHandler( session, - progressTracker = OBSERVING.childProgressTracker() + progressTracker = HandleAmendMembershipAttestationStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlow.kt index 1bfe492..d54cadd 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlow.kt @@ -18,15 +18,9 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.contract.membership.MembershipContract +import io.onixlabs.corda.bnms.workflow.addAmendedMembership import io.onixlabs.corda.bnms.workflow.checkMembershipExists -import io.onixlabs.corda.bnms.workflow.finalize -import io.onixlabs.corda.bnms.workflow.transaction -import io.onixlabs.corda.bnms.workflow.verifyAndSign -import io.onixlabs.corda.core.workflow.checkSufficientSessions -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.identity.Party @@ -43,25 +37,31 @@ class AmendMembershipFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkMembershipExists(newMembership) checkSufficientSessions(sessions, newMembership) - val transaction = transaction(oldMembership.state.notary) { - addInputState(oldMembership) - addOutputState(newMembership, MembershipContract.ID) - addCommand(MembershipContract.Amend, ourIdentity.owningKey) + val transaction = buildTransaction(oldMembership.state.notary) { + addAmendedMembership(oldMembership, newMembership, ourIdentity.owningKey) } - val signedTransaction = verifyAndSign(transaction, ourIdentity.owningKey) - return finalize(signedTransaction, sessions) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, sessions) } @StartableByRPC @@ -74,16 +74,16 @@ class AmendMembershipFlow( ) : FlowLogic() { private companion object { - object AMENDING : Step("Amending membership.") { + object AmendMembershipStep : Step("Amending membership.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(AMENDING) + override val progressTracker = ProgressTracker(AmendMembershipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(AMENDING) + currentStep(AmendMembershipStep) val sessions = initiateFlows(observers, newMembership) return subFlow( @@ -91,7 +91,7 @@ class AmendMembershipFlow( oldMembership, newMembership, sessions, - AMENDING.childProgressTracker() + AmendMembershipStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowHandler.kt index aea0381..b630e9c 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowHandler.kt @@ -17,16 +17,18 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.core.workflow.ReceiveStatesToRecordStep +import io.onixlabs.corda.core.workflow.RecordFinalizedTransactionStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING +import io.onixlabs.corda.core.workflow.finalizeTransactionHandler import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveFinalityFlow import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class AmendMembershipFlowHandler( private val session: FlowSession, @@ -37,30 +39,37 @@ class AmendMembershipFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(FINALIZING) + fun tracker() = ProgressTracker( + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, expectedTransactionId, statesToRecord)) + return finalizeTransactionHandler(session, expectedTransactionId, statesToRecord) } @InitiatedBy(AmendMembershipFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : ProgressTracker.Step("Observing membership amendment.") { + object HandleAmendedMembershipStep : Step("Handling membership amendment.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleAmendedMembershipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) - return subFlow(AmendMembershipFlowHandler(session, progressTracker = OBSERVING.childProgressTracker())) + currentStep(HandleAmendedMembershipStep) + return subFlow( + AmendMembershipFlowHandler( + session, + progressTracker = HandleAmendedMembershipStep.childProgressTracker() + ) + ) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt index ee93762..40be2d7 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt @@ -18,13 +18,9 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation +import io.onixlabs.corda.bnms.workflow.addIssuedMembershipAttestation import io.onixlabs.corda.bnms.workflow.findMembershipForAttestation -import io.onixlabs.corda.core.workflow.checkSufficientSessions -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.getPreferredNotary -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* -import io.onixlabs.corda.bnms.workflow.* +import io.onixlabs.corda.core.workflow.* import net.corda.core.flows.* import net.corda.core.identity.Party import net.corda.core.transactions.SignedTransaction @@ -40,23 +36,31 @@ class IssueMembershipAttestationFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkSufficientSessions(sessions, attestation) + val membership = findMembershipForAttestation(attestation).referenced() - val transaction = transaction(notary) { - addIssuedAttestation(attestation) - addReferenceState(findMembershipForAttestation(attestation).referenced()) + val transaction = buildTransaction(notary) { + addIssuedMembershipAttestation(attestation, membership) } - val signedTransaction = verifyAndSign(transaction, attestation.attestor.owningKey) - return finalize(signedTransaction, sessions) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, sessions) } @StartableByRPC @@ -69,16 +73,16 @@ class IssueMembershipAttestationFlow( ) : FlowLogic() { private companion object { - object ISSUING : Step("Issuing membership attestation.") { + object IssueMembershipAttestationStep : Step("Issuing membership attestation.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(ISSUING) + override val progressTracker = ProgressTracker(IssueMembershipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(ISSUING) + currentStep(IssueMembershipAttestationStep) val sessions = initiateFlows(observers, attestation) return subFlow( @@ -86,7 +90,7 @@ class IssueMembershipAttestationFlow( attestation, notary ?: getPreferredNotary(), sessions, - ISSUING.childProgressTracker() + IssueMembershipAttestationStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowHandler.kt index 26ad152..7ad478b 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowHandler.kt @@ -17,16 +17,18 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.core.workflow.ReceiveStatesToRecordStep +import io.onixlabs.corda.core.workflow.RecordFinalizedTransactionStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING +import io.onixlabs.corda.core.workflow.finalizeTransactionHandler import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveFinalityFlow import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class IssueMembershipAttestationFlowHandler( private val session: FlowSession, @@ -37,33 +39,35 @@ class IssueMembershipAttestationFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(FINALIZING) + fun tracker() = ProgressTracker( + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, expectedTransactionId, statesToRecord)) + return finalizeTransactionHandler(session, expectedTransactionId, statesToRecord) } @InitiatedBy(IssueMembershipAttestationFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : ProgressTracker.Step("Observing membership attestation issuance.") { + object HandleIssueMembershipAttestationStep : Step("Handling membership attestation issuance.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleIssueMembershipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) + currentStep(HandleIssueMembershipAttestationStep) return subFlow( IssueMembershipAttestationFlowHandler( session, - progressTracker = OBSERVING.childProgressTracker() + progressTracker = HandleIssueMembershipAttestationStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlow.kt index d05ca0c..95a94bf 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlow.kt @@ -18,14 +18,9 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.contract.membership.MembershipContract +import io.onixlabs.corda.bnms.workflow.addIssuedMembership import io.onixlabs.corda.bnms.workflow.checkMembershipExists -import io.onixlabs.corda.core.workflow.checkSufficientSessions -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.getPreferredNotary -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* -import io.onixlabs.corda.bnms.workflow.* +import io.onixlabs.corda.core.workflow.* import net.corda.core.flows.* import net.corda.core.identity.Party import net.corda.core.transactions.SignedTransaction @@ -41,24 +36,31 @@ class IssueMembershipFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkMembershipExists(membership) checkSufficientSessions(sessions, membership) - val transaction = transaction(notary) { - addOutputState(membership) - addCommand(MembershipContract.Issue, ourIdentity.owningKey) + val transaction = buildTransaction(notary) { + addIssuedMembership(membership, ourIdentity.owningKey) } - val signedTransaction = verifyAndSign(transaction, ourIdentity.owningKey) - return finalize(signedTransaction, sessions) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, sessions) } @StartableByRPC @@ -71,16 +73,16 @@ class IssueMembershipFlow( ) : FlowLogic() { private companion object { - object ISSUING : Step("Issuing membership.") { + object IssueMembershipStep : Step("Issuing membership.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(ISSUING) + override val progressTracker = ProgressTracker(IssueMembershipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(ISSUING) + currentStep(IssueMembershipStep) val sessions = initiateFlows(observers, membership) return subFlow( @@ -88,7 +90,7 @@ class IssueMembershipFlow( membership, notary ?: getPreferredNotary(), sessions, - ISSUING.childProgressTracker() + IssueMembershipStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowHandler.kt index ca7b966..eff9458 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowHandler.kt @@ -17,16 +17,18 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.core.workflow.ReceiveStatesToRecordStep +import io.onixlabs.corda.core.workflow.RecordFinalizedTransactionStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING +import io.onixlabs.corda.core.workflow.finalizeTransactionHandler import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveFinalityFlow import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class IssueMembershipFlowHandler( private val session: FlowSession, @@ -37,30 +39,37 @@ class IssueMembershipFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(FINALIZING) + fun tracker() = ProgressTracker( + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, expectedTransactionId, statesToRecord)) + return finalizeTransactionHandler(session, expectedTransactionId, statesToRecord) } @InitiatedBy(IssueMembershipFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : ProgressTracker.Step("Observing membership issuance.") { + object HandleIssuedMembershipStep : Step("Handling membership issuance.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleIssuedMembershipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) - return subFlow(IssueMembershipFlowHandler(session, progressTracker = OBSERVING.childProgressTracker())) + currentStep(HandleIssuedMembershipStep) + return subFlow( + IssueMembershipFlowHandler( + session, + progressTracker = HandleIssuedMembershipStep.childProgressTracker() + ) + ) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipAttestationFlow.kt index 2922af7..710c66d 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipAttestationFlow.kt @@ -1,13 +1,9 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable -import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.findTransaction -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.INITIALIZING -import io.onixlabs.corda.identityframework.workflow.SENDING +import io.onixlabs.corda.bnms.workflow.SendMembershipAttestationStep +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.identity.Party @@ -22,20 +18,16 @@ class PublishMembershipAttestationFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, SENDING) + fun tracker() = ProgressTracker(InitializeFlowStep, SendMembershipAttestationStep) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) val transaction = findTransaction(attestation) - - currentStep(SENDING) - sessions.forEach { subFlow(SendTransactionFlow(it, transaction)) } - - return transaction + return publishTransaction(transaction, sessions, SendMembershipAttestationStep) } @StartableByRPC @@ -47,21 +39,21 @@ class PublishMembershipAttestationFlow( ) : FlowLogic() { private companion object { - object PUBLISHING : ProgressTracker.Step("Publishing membership attestation transaction.") { + object PublishMembershipAttestationStep : ProgressTracker.Step("Publishing membership attestation.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(PUBLISHING) + override val progressTracker = ProgressTracker(PublishMembershipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(PUBLISHING) + currentStep(PublishMembershipAttestationStep) return subFlow( PublishMembershipAttestationFlow( attestation, initiateFlows(observers), - PUBLISHING.childProgressTracker() + PublishMembershipAttestationStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipAttestationFlowHandler.kt index 6fd49f0..771ba66 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipAttestationFlowHandler.kt @@ -1,15 +1,15 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.bnms.workflow.ReceiveMembershipAttestationStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.RECEIVING +import io.onixlabs.corda.core.workflow.publishTransactionHandler import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveTransactionFlow -import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class PublishMembershipAttestationFlowHandler( private val session: FlowSession, @@ -18,30 +18,34 @@ class PublishMembershipAttestationFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(RECEIVING) + fun tracker() = ProgressTracker(ReceiveMembershipAttestationStep) } @Suspendable override fun call(): SignedTransaction { - currentStep(RECEIVING) - return subFlow(ReceiveTransactionFlow(session, statesToRecord = StatesToRecord.ALL_VISIBLE)) + return publishTransactionHandler(session, progressTrackerStep = ReceiveMembershipAttestationStep) } @InitiatedBy(PublishMembershipAttestationFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object RECEIVING : ProgressTracker.Step("Receiving membership attestation transaction.") { + object HandlePublishedMembershipAttestationStep : Step("Handling membership attestation publication.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(RECEIVING) + override val progressTracker = ProgressTracker(HandlePublishedMembershipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(RECEIVING) - return subFlow(PublishMembershipAttestationFlowHandler(session, RECEIVING.childProgressTracker())) + currentStep(HandlePublishedMembershipAttestationStep) + return subFlow( + PublishMembershipAttestationFlowHandler( + session, + HandlePublishedMembershipAttestationStep.childProgressTracker() + ) + ) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipFlow.kt index 8e06b6a..e06a5b2 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipFlow.kt @@ -2,16 +2,14 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.findTransaction -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.INITIALIZING -import io.onixlabs.corda.identityframework.workflow.SENDING +import io.onixlabs.corda.bnms.workflow.SendMembershipStep +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.identity.Party import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class PublishMembershipFlow( private val membership: StateAndRef, @@ -21,20 +19,19 @@ class PublishMembershipFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, SENDING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + SendMembershipStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) val transaction = findTransaction(membership) - - currentStep(SENDING) - sessions.forEach { subFlow(SendTransactionFlow(it, transaction)) } - - return transaction + return publishTransaction(transaction, sessions, SendMembershipStep) } @StartableByRPC @@ -46,21 +43,21 @@ class PublishMembershipFlow( ) : FlowLogic() { private companion object { - object PUBLISHING : ProgressTracker.Step("Publishing membership transaction.") { + object PublishMembershipTransactionStep : Step("Publishing membership.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(PUBLISHING) + override val progressTracker = ProgressTracker(PublishMembershipTransactionStep) @Suspendable override fun call(): SignedTransaction { - currentStep(PUBLISHING) + currentStep(PublishMembershipTransactionStep) return subFlow( PublishMembershipFlow( membership, initiateFlows(observers), - PUBLISHING.childProgressTracker() + PublishMembershipTransactionStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipFlowHandler.kt index cd63360..6e1d076 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/PublishMembershipFlowHandler.kt @@ -1,15 +1,15 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.bnms.workflow.ReceiveMembershipStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.RECEIVING +import io.onixlabs.corda.core.workflow.publishTransactionHandler import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveTransactionFlow -import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class PublishMembershipFlowHandler( private val session: FlowSession, @@ -18,30 +18,34 @@ class PublishMembershipFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(RECEIVING) + fun tracker() = ProgressTracker(ReceiveMembershipStep) } @Suspendable override fun call(): SignedTransaction { - currentStep(RECEIVING) - return subFlow(ReceiveTransactionFlow(session, statesToRecord = StatesToRecord.ALL_VISIBLE)) + return publishTransactionHandler(session, progressTrackerStep = ReceiveMembershipStep) } @InitiatedBy(PublishMembershipFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object RECEIVING : ProgressTracker.Step("Receiving membership transaction.") { + object HandlePublishedMembershipTransactionStep : Step("Handling membership publication.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(RECEIVING) + override val progressTracker = ProgressTracker(HandlePublishedMembershipTransactionStep) @Suspendable override fun call(): SignedTransaction { - currentStep(RECEIVING) - return subFlow(PublishMembershipFlowHandler(session, RECEIVING.childProgressTracker())) + currentStep(HandlePublishedMembershipTransactionStep) + return subFlow( + PublishMembershipFlowHandler( + session, + HandlePublishedMembershipTransactionStep.childProgressTracker() + ) + ) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlow.kt index 80df2e4..a46fbdf 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlow.kt @@ -18,11 +18,8 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation -import io.onixlabs.corda.core.workflow.checkSufficientSessions -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* -import io.onixlabs.corda.bnms.workflow.* +import io.onixlabs.corda.bnms.workflow.addRevokedMembershipAttestation +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.identity.Party @@ -38,22 +35,30 @@ class RevokeMembershipAttestationFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkSufficientSessions(sessions, attestation.state.data) - val transaction = transaction(attestation.state.notary) { - addRevokedAttestation(attestation) + val transaction = buildTransaction(attestation.state.notary) { + addRevokedMembershipAttestation(attestation) } - val signedTransaction = verifyAndSign(transaction, attestation.state.data.attestor.owningKey) - return finalize(signedTransaction, sessions) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, sessions) } @StartableByRPC @@ -65,23 +70,23 @@ class RevokeMembershipAttestationFlow( ) : FlowLogic() { private companion object { - object REVOKING : Step("Revoking membership attestation.") { + object RevokeMembershipAttestationStep : Step("Revoking membership attestation.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(REVOKING) + override val progressTracker = ProgressTracker(RevokeMembershipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(REVOKING) + currentStep(RevokeMembershipAttestationStep) val sessions = initiateFlows(observers, attestation.state.data) return subFlow( RevokeMembershipAttestationFlow( attestation, sessions, - REVOKING.childProgressTracker() + RevokeMembershipAttestationStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowHandler.kt index cfa04cd..57020b4 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowHandler.kt @@ -17,16 +17,18 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.core.workflow.ReceiveStatesToRecordStep +import io.onixlabs.corda.core.workflow.RecordFinalizedTransactionStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING +import io.onixlabs.corda.core.workflow.finalizeTransactionHandler import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveFinalityFlow import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class RevokeMembershipAttestationFlowHandler( private val session: FlowSession, @@ -37,33 +39,35 @@ class RevokeMembershipAttestationFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(FINALIZING) + fun tracker() = ProgressTracker( + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, expectedTransactionId, statesToRecord)) + return finalizeTransactionHandler(session, expectedTransactionId, statesToRecord) } @InitiatedBy(RevokeMembershipAttestationFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : ProgressTracker.Step("Observing membership attestation revocation.") { + object HandleRevokedMembershipAttestationStep : Step("Handling membership attestation revocation.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleRevokedMembershipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) + currentStep(HandleRevokedMembershipAttestationStep) return subFlow( RevokeMembershipAttestationFlowHandler( session, - progressTracker = OBSERVING.childProgressTracker() + progressTracker = HandleRevokedMembershipAttestationStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlow.kt index 3c9cb60..383e687 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlow.kt @@ -18,12 +18,8 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.Membership -import io.onixlabs.corda.bnms.contract.membership.MembershipContract -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* -import io.onixlabs.corda.bnms.workflow.* -import io.onixlabs.corda.core.workflow.checkSufficientSessions +import io.onixlabs.corda.bnms.workflow.addRevokedMembership +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.identity.Party @@ -39,23 +35,30 @@ class RevokeMembershipFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkSufficientSessions(sessions, membership.state.data) - val transaction = transaction(membership.state.notary) { - addInputState(membership) - addCommand(MembershipContract.Revoke, ourIdentity.owningKey) + val transaction = buildTransaction(membership.state.notary) { + addRevokedMembership(membership, ourIdentity.owningKey) } - val signedTransaction = verifyAndSign(transaction, ourIdentity.owningKey) - return finalize(signedTransaction, sessions) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, sessions) } @StartableByRPC @@ -67,23 +70,23 @@ class RevokeMembershipFlow( ) : FlowLogic() { private companion object { - object REVOKING : Step("Revoking membership.") { + object RevokeMembershipStep : Step("Revoking membership.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(REVOKING) + override val progressTracker = ProgressTracker(RevokeMembershipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(REVOKING) + currentStep(RevokeMembershipStep) val sessions = initiateFlows(observers, membership.state.data) return subFlow( RevokeMembershipFlow( membership, sessions, - REVOKING.childProgressTracker() + RevokeMembershipStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowHandler.kt index 147703b..a247154 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowHandler.kt @@ -17,16 +17,18 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.core.workflow.ReceiveStatesToRecordStep +import io.onixlabs.corda.core.workflow.RecordFinalizedTransactionStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING +import io.onixlabs.corda.core.workflow.finalizeTransactionHandler import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveFinalityFlow import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class RevokeMembershipFlowHandler( private val session: FlowSession, @@ -37,33 +39,35 @@ class RevokeMembershipFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(FINALIZING) + fun tracker() = ProgressTracker( + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, expectedTransactionId, statesToRecord)) + return finalizeTransactionHandler(session, expectedTransactionId, statesToRecord) } @InitiatedBy(RevokeMembershipFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : ProgressTracker.Step("Observing membership revocation.") { + object HandleRevokedMembershipStep : Step("Handling membership revocation.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleRevokedMembershipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) + currentStep(HandleRevokedMembershipStep) return subFlow( RevokeMembershipFlowHandler( session, - progressTracker = OBSERVING.childProgressTracker() + progressTracker = HandleRevokedMembershipStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlow.kt index 025eb33..94c0db4 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlow.kt @@ -3,16 +3,21 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation -import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema.MembershipAttestationEntity +import io.onixlabs.corda.bnms.workflow.ReceiveMembershipAndAttestationsStep +import io.onixlabs.corda.bnms.workflow.SendMembershipAndAttestationsStep import io.onixlabs.corda.core.services.equalTo import io.onixlabs.corda.core.services.filter import io.onixlabs.corda.core.services.vaultServiceFor +import io.onixlabs.corda.core.workflow.InitializeFlowStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.INITIALIZING +import io.onixlabs.corda.identityframework.workflow.attestations.PublishAttestationFlow +import io.onixlabs.corda.identityframework.workflow.attestations.PublishAttestationFlowHandler import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.identity.Party import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step import net.corda.core.utilities.unwrap class SynchronizeMembershipFlow( @@ -23,17 +28,18 @@ class SynchronizeMembershipFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, SENDING, RECEIVING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + SendMembershipAndAttestationsStep, + ReceiveMembershipAndAttestationsStep + ) private const val FLOW_VERSION_1 = 1 - - private object SENDING : ProgressTracker.Step("Sending our membership and attestations.") - private object RECEIVING : ProgressTracker.Step("Receiving their membership and attestations.") } @Suspendable override fun call(): Pair, Set>>? { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) val network = ourMembership.state.data.network val holder = ourMembership.state.data.holder @@ -42,8 +48,8 @@ class SynchronizeMembershipFlow( } val attestations = serviceHub.vaultServiceFor().filter { - expression(MembershipAttestationSchema.MembershipAttestationEntity::holder equalTo holder) - expression(MembershipAttestationSchema.MembershipAttestationEntity::networkHash equalTo network.hash.toString()) + expression(MembershipAttestationEntity::holder equalTo holder) + expression(MembershipAttestationEntity::networkHash equalTo network.hash.toString()) }.toList() if (network.operator != null && attestations.size > 1) { @@ -53,11 +59,11 @@ class SynchronizeMembershipFlow( val isMemberOfNetwork = session.sendAndReceive(network).unwrap { it } if (isMemberOfNetwork) { - currentStep(SENDING) + currentStep(SendMembershipAndAttestationsStep) sendOurMembership() sendOurAttestations(attestations) - currentStep(RECEIVING) + currentStep(ReceiveMembershipAndAttestationsStep) val theirMembership = receiveTheirMembership() val theirAttestations = receiveTheirAttestations() @@ -77,7 +83,7 @@ class SynchronizeMembershipFlow( session.send(attestations.count()) for (attestation in attestations) { - subFlow(PublishMembershipAttestationFlow(attestation, setOf(session))) + subFlow(PublishAttestationFlow(attestation, setOf(session))) } } @@ -93,7 +99,7 @@ class SynchronizeMembershipFlow( val theirAttestationSize = session.receive().unwrap { it } for (index in 0 until theirAttestationSize) { - val transaction = subFlow(PublishMembershipAttestationFlowHandler(session)) + val transaction = subFlow(PublishAttestationFlowHandler(session)) val attestation = transaction.tx.outRefsOfType().single() attestations.add(attestation) } @@ -110,23 +116,23 @@ class SynchronizeMembershipFlow( ) : FlowLogic, Set>>?>() { private companion object { - object SYNCHRONIZING : ProgressTracker.Step("Synchronizing membership.") { + object SynchronizeMembershipAndAttestationsStep : Step("Synchronizing membership.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(SYNCHRONIZING) + override val progressTracker = ProgressTracker(SynchronizeMembershipAndAttestationsStep) @Suspendable override fun call(): Pair, Set>>? { - currentStep(SYNCHRONIZING) + currentStep(SynchronizeMembershipAndAttestationsStep) val session = initiateFlow(counterparty) return subFlow( SynchronizeMembershipFlow( ourMembership, session, - SYNCHRONIZING.childProgressTracker() + SynchronizeMembershipAndAttestationsStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowHandler.kt index 7f5489e..ab32289 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowHandler.kt @@ -4,19 +4,24 @@ import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.Network import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation -import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema.MembershipAttestationEntity import io.onixlabs.corda.bnms.contract.membership.MembershipSchema +import io.onixlabs.corda.bnms.workflow.ReceiveMembershipAndAttestationsStep +import io.onixlabs.corda.bnms.workflow.SendMembershipAndAttestationsStep import io.onixlabs.corda.core.services.equalTo import io.onixlabs.corda.core.services.filter import io.onixlabs.corda.core.services.singleOrNull import io.onixlabs.corda.core.services.vaultServiceFor +import io.onixlabs.corda.core.workflow.InitializeFlowStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.INITIALIZING +import io.onixlabs.corda.identityframework.workflow.attestations.PublishAttestationFlow +import io.onixlabs.corda.identityframework.workflow.attestations.PublishAttestationFlowHandler import net.corda.core.contracts.StateAndRef import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step import net.corda.core.utilities.unwrap class SynchronizeMembershipFlowHandler( @@ -26,15 +31,16 @@ class SynchronizeMembershipFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, RECEIVING, SENDING) - - private object RECEIVING : ProgressTracker.Step("Receiving their membership and attestations.") - private object SENDING : ProgressTracker.Step("Sending our membership and attestations.") + fun tracker() = ProgressTracker( + InitializeFlowStep, + ReceiveMembershipAndAttestationsStep, + SendMembershipAndAttestationsStep + ) } @Suspendable override fun call(): Pair, Set>>? { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) val network = session.receive().unwrap { it } val membership = serviceHub.vaultServiceFor().singleOrNull { expression(MembershipSchema.MembershipEntity::holder equalTo ourIdentity) @@ -45,15 +51,15 @@ class SynchronizeMembershipFlowHandler( if (membership != null) { val attestations = serviceHub.vaultServiceFor().filter { - expression(MembershipAttestationSchema.MembershipAttestationEntity::holder equalTo ourIdentity) - expression(MembershipAttestationSchema.MembershipAttestationEntity::networkHash equalTo network.hash.toString()) + expression(MembershipAttestationEntity::holder equalTo ourIdentity) + expression(MembershipAttestationEntity::networkHash equalTo network.hash.toString()) }.toList() - currentStep(RECEIVING) + currentStep(ReceiveMembershipAndAttestationsStep) val theirMembership = receiveTheirMembership() val theirAttestations = receiveTheirAttestations() - currentStep(SENDING) + currentStep(SendMembershipAndAttestationsStep) sendOurMembership(membership) sendOurAttestations(attestations) return theirMembership to theirAttestations @@ -72,7 +78,7 @@ class SynchronizeMembershipFlowHandler( session.send(attestations.count()) for (attestation in attestations) { - subFlow(PublishMembershipAttestationFlow(attestation, setOf(session))) + subFlow(PublishAttestationFlow(attestation, setOf(session))) } } @@ -88,7 +94,7 @@ class SynchronizeMembershipFlowHandler( val theirAttestationSize = session.receive().unwrap { it } for (index in 0 until theirAttestationSize) { - val transaction = subFlow(PublishMembershipAttestationFlowHandler(session)) + val transaction = subFlow(PublishAttestationFlowHandler(session)) val attestation = transaction.tx.outRefsOfType().single() attestations.add(attestation) } @@ -102,17 +108,22 @@ class SynchronizeMembershipFlowHandler( ) : FlowLogic, Set>>?>() { private companion object { - object SYNCHRONIZING : ProgressTracker.Step("Synchronizing membership.") { + object HandleSynchronizedMembershipAndAttestationsStep : Step("Handling membership synchronization.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(SYNCHRONIZING) + override val progressTracker = ProgressTracker(HandleSynchronizedMembershipAndAttestationsStep) @Suspendable override fun call(): Pair, Set>>? { - currentStep(SYNCHRONIZING) - return subFlow(SynchronizeMembershipFlowHandler(session, SYNCHRONIZING.childProgressTracker())) + currentStep(HandleSynchronizedMembershipAndAttestationsStep) + return subFlow( + SynchronizeMembershipFlowHandler( + session, + HandleSynchronizedMembershipAndAttestationsStep.childProgressTracker() + ) + ) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt index 0074ce7..7ab51f7 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt @@ -18,18 +18,14 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation -import io.onixlabs.corda.bnms.workflow.finalize +import io.onixlabs.corda.bnms.workflow.addAmendedRelationshipAttestation import io.onixlabs.corda.bnms.workflow.findRelationshipForAttestation -import io.onixlabs.corda.bnms.workflow.transaction -import io.onixlabs.corda.bnms.workflow.verifyAndSign -import io.onixlabs.corda.core.workflow.checkSufficientSessions -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class AmendRelationshipAttestationFlow( private val oldAttestation: StateAndRef, @@ -40,23 +36,31 @@ class AmendRelationshipAttestationFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkSufficientSessions(sessions, newAttestation, oldAttestation.state.data) + val relationship = findRelationshipForAttestation(newAttestation).referenced() - val transaction = transaction(oldAttestation.state.notary) { - addAmendedAttestation(oldAttestation, newAttestation) - addReferenceState(findRelationshipForAttestation(newAttestation).referenced()) + val transaction = buildTransaction(oldAttestation.state.notary) { + addAmendedRelationshipAttestation(oldAttestation, newAttestation, relationship) } - val signedTransaction = verifyAndSign(transaction, newAttestation.attestor.owningKey) - return finalize(signedTransaction, sessions) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, sessions) } @StartableByRPC @@ -68,16 +72,16 @@ class AmendRelationshipAttestationFlow( ) : FlowLogic() { private companion object { - object AMENDING : ProgressTracker.Step("Amending relationship attestation.") { + object AmendRelationshipAttestationStep : Step("Amending relationship attestation.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(AMENDING) + override val progressTracker = ProgressTracker(AmendRelationshipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(AMENDING) + currentStep(AmendRelationshipAttestationStep) val sessions = initiateFlows(emptyList(), newAttestation, oldAttestation.state.data) return subFlow( @@ -85,7 +89,7 @@ class AmendRelationshipAttestationFlow( oldAttestation, newAttestation, sessions, - AMENDING.childProgressTracker() + AmendRelationshipAttestationStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowHandler.kt index e5c8386..575261c 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowHandler.kt @@ -17,16 +17,18 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.core.workflow.ReceiveStatesToRecordStep +import io.onixlabs.corda.core.workflow.RecordFinalizedTransactionStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING +import io.onixlabs.corda.core.workflow.finalizeTransactionHandler import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveFinalityFlow import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class AmendRelationshipAttestationFlowHandler( private val session: FlowSession, @@ -36,30 +38,38 @@ class AmendRelationshipAttestationFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(FINALIZING) + fun tracker() = ProgressTracker( + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, expectedTransactionId, StatesToRecord.ONLY_RELEVANT)) + return finalizeTransactionHandler(session, expectedTransactionId, StatesToRecord.ONLY_RELEVANT) } @InitiatedBy(AmendRelationshipAttestationFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : ProgressTracker.Step("Observing relationship attestation amendment.") { + object HandlingAmendedRelationshipAttestationStep : Step("Handling relationship attestation amendment.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandlingAmendedRelationshipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) - return subFlow(AmendRelationshipAttestationFlowHandler(session, null, OBSERVING.childProgressTracker())) + currentStep(HandlingAmendedRelationshipAttestationStep) + return subFlow( + AmendRelationshipAttestationFlowHandler( + session, + null, + HandlingAmendedRelationshipAttestationStep.childProgressTracker() + ) + ) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlow.kt index 900905a..24aa8dd 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlow.kt @@ -19,12 +19,8 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.relationship.Relationship import io.onixlabs.corda.bnms.contract.relationship.RelationshipContract -import io.onixlabs.corda.bnms.workflow.checkMembershipsAndAttestations -import io.onixlabs.corda.core.workflow.checkSufficientSessions -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* import io.onixlabs.corda.bnms.workflow.* +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.transactions.SignedTransaction @@ -41,30 +37,35 @@ class AmendRelationshipFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, COUNTERSIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + SendCheckMembershipInstructionStep, + CheckMembershipStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + CollectTransactionSignaturesStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkSufficientSessions(sessions, newRelationship) - sessions.forEach { it.send(checkMembership) } + checkMembership(checkMembership, newRelationship, sessions) - if (checkMembership) { - checkMembershipsAndAttestations(newRelationship) + val transaction = buildTransaction(oldRelationship.state.notary) { + addAmendedRelationship(oldRelationship, newRelationship) } - val transaction = transaction(oldRelationship.state.notary) { - addInputState(oldRelationship) - addOutputState(newRelationship, RelationshipContract.ID) - addCommand(RelationshipContract.Amend, newRelationship.participants.map { it.owningKey }) - } - - val partiallySignedTransaction = verifyAndSign(transaction, ourIdentity.owningKey) - val fullySignedTransaction = countersign(partiallySignedTransaction, sessions) - return finalize(fullySignedTransaction, sessions) + verifyTransaction(transaction) + val partiallySignedTransaction = signTransaction(transaction) + val fullySignedTransaction = collectSignatures(partiallySignedTransaction, sessions) + return finalizeTransaction(fullySignedTransaction, sessions) } @StartableByRPC @@ -77,16 +78,16 @@ class AmendRelationshipFlow( ) : FlowLogic() { private companion object { - object AMENDING : Step("Amending relationship.") { + object AmendRelationshipStep : Step("Amending relationship.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(AMENDING) + override val progressTracker = ProgressTracker(AmendRelationshipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(AMENDING) + currentStep(AmendRelationshipStep) val sessions = initiateFlows(emptyList(), newRelationship, oldRelationship.state.data) return subFlow( @@ -95,7 +96,7 @@ class AmendRelationshipFlow( newRelationship, sessions, checkMembership, - AMENDING.childProgressTracker() + AmendRelationshipStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowHandler.kt index 1b3a9f4..6aefaf0 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowHandler.kt @@ -18,16 +18,19 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.relationship.Relationship +import io.onixlabs.corda.bnms.workflow.CheckMembershipStep +import io.onixlabs.corda.bnms.workflow.ReceiveCheckMembershipInstructionStep +import io.onixlabs.corda.bnms.workflow.checkMembershipHandler import io.onixlabs.corda.bnms.workflow.checkMembershipsAndAttestations -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING -import io.onixlabs.corda.identityframework.workflow.SIGNING -import net.corda.core.flows.* +import io.onixlabs.corda.core.workflow.* +import net.corda.core.flows.FlowException +import net.corda.core.flows.FlowLogic +import net.corda.core.flows.FlowSession +import net.corda.core.flows.InitiatedBy import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.ProgressTracker.Step -import net.corda.core.utilities.unwrap class AmendRelationshipFlowHandler( private val session: FlowSession, @@ -36,47 +39,50 @@ class AmendRelationshipFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(RECEIVING, SIGNING, FINALIZING) - - private object RECEIVING : Step("Receiving check membership instruction.") + fun tracker() = ProgressTracker( + ReceiveCheckMembershipInstructionStep, + SignTransactionStep, + CheckMembershipStep, + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(RECEIVING) - val checkMembership = session.receive().unwrap { it } - - currentStep(SIGNING) - val transaction = subFlow(object : SignTransactionFlow(session) { - override fun checkTransaction(stx: SignedTransaction) { - if (checkMembership) { - val relationship = stx.tx.outputsOfType().singleOrNull() - ?: throw FlowException("Failed to obtain a relationship from the transaction.") + val checkMembership = checkMembershipHandler(session) + val transaction = collectSignaturesHandler(session) { + if (checkMembership) { + val relationship = it.tx.outputsOfType().singleOrNull() + ?: throw FlowException("Failed to obtain a relationship from the transaction.") - checkMembershipsAndAttestations(relationship) - } + checkMembershipsAndAttestations(relationship) } - }) + } - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, transaction.id, StatesToRecord.ONLY_RELEVANT)) + return finalizeTransactionHandler(session, transaction?.id, StatesToRecord.ONLY_RELEVANT) } @InitiatedBy(AmendRelationshipFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : Step("Observing relationship amendment.") { + object HandleAmendedRelationshipStep : Step("Handling relationship amendment.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleAmendedRelationshipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) - return subFlow(AmendRelationshipFlowHandler(session, OBSERVING.childProgressTracker())) + currentStep(HandleAmendedRelationshipStep) + return subFlow( + AmendRelationshipFlowHandler( + session, + HandleAmendedRelationshipStep.childProgressTracker() + ) + ) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt index 84736fd..a432ba0 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt @@ -18,15 +18,9 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation -import io.onixlabs.corda.bnms.workflow.finalize +import io.onixlabs.corda.bnms.workflow.addIssuedRelationshipAttestation import io.onixlabs.corda.bnms.workflow.findRelationshipForAttestation -import io.onixlabs.corda.bnms.workflow.transaction -import io.onixlabs.corda.bnms.workflow.verifyAndSign -import io.onixlabs.corda.core.workflow.checkSufficientSessions -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.getPreferredNotary -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* +import io.onixlabs.corda.core.workflow.* import net.corda.core.flows.* import net.corda.core.identity.Party import net.corda.core.transactions.SignedTransaction @@ -42,23 +36,31 @@ class IssueRelationshipAttestationFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkSufficientSessions(sessions, attestation) + val relationship = findRelationshipForAttestation(attestation).referenced() - val transaction = transaction(notary) { - addIssuedAttestation(attestation) - addReferenceState(findRelationshipForAttestation(attestation).referenced()) + val transaction = buildTransaction(notary) { + addIssuedRelationshipAttestation(attestation, relationship) } - val signedTransaction = verifyAndSign(transaction, attestation.attestor.owningKey) - return finalize(signedTransaction, sessions) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, sessions) } @StartableByRPC @@ -70,16 +72,16 @@ class IssueRelationshipAttestationFlow( ) : FlowLogic() { private companion object { - object ISSUING : Step("Issuing relationship attestation.") { + object IssueRelationshipAttestationStep : Step("Issuing relationship attestation.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(ISSUING) + override val progressTracker = ProgressTracker(IssueRelationshipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(ISSUING) + currentStep(IssueRelationshipAttestationStep) val sessions = initiateFlows(emptyList(), attestation) return subFlow( @@ -87,7 +89,7 @@ class IssueRelationshipAttestationFlow( attestation, notary ?: getPreferredNotary(), sessions, - ISSUING.childProgressTracker() + IssueRelationshipAttestationStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowHandler.kt index 9a372f8..d7b46ae 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowHandler.kt @@ -17,16 +17,18 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.core.workflow.ReceiveStatesToRecordStep +import io.onixlabs.corda.core.workflow.RecordFinalizedTransactionStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING +import io.onixlabs.corda.core.workflow.finalizeTransactionHandler import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveFinalityFlow import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class IssueRelationshipAttestationFlowHandler( private val session: FlowSession, @@ -36,30 +38,38 @@ class IssueRelationshipAttestationFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(FINALIZING) + fun tracker() = ProgressTracker( + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, expectedTransactionId, StatesToRecord.ONLY_RELEVANT)) + return finalizeTransactionHandler(session, expectedTransactionId, StatesToRecord.ONLY_RELEVANT) } @InitiatedBy(IssueRelationshipAttestationFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : ProgressTracker.Step("Observing relationship attestation issuance.") { + object HandleIssuedRelationshipAttestationStep : Step("Handling relationship attestation issuance.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleIssuedRelationshipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) - return subFlow(IssueRelationshipAttestationFlowHandler(session, null, OBSERVING.childProgressTracker())) + currentStep(HandleIssuedRelationshipAttestationStep) + return subFlow( + IssueRelationshipAttestationFlowHandler( + session, + null, + HandleIssuedRelationshipAttestationStep.childProgressTracker() + ) + ) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlow.kt index 8002765..f5878d7 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlow.kt @@ -18,15 +18,11 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.contract.relationship.RelationshipContract -import io.onixlabs.corda.bnms.contract.revocation.RevocationLockContract -import io.onixlabs.corda.bnms.workflow.checkMembershipsAndAttestations -import io.onixlabs.corda.core.workflow.checkSufficientSessions -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.getPreferredNotary -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* -import io.onixlabs.corda.bnms.workflow.* +import io.onixlabs.corda.bnms.workflow.CheckMembershipStep +import io.onixlabs.corda.bnms.workflow.SendCheckMembershipInstructionStep +import io.onixlabs.corda.bnms.workflow.addIssuedRelationship +import io.onixlabs.corda.bnms.workflow.checkMembership +import io.onixlabs.corda.core.workflow.* import net.corda.core.flows.* import net.corda.core.identity.Party import net.corda.core.transactions.SignedTransaction @@ -43,31 +39,35 @@ class IssueRelationshipFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, COUNTERSIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + SendCheckMembershipInstructionStep, + CheckMembershipStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + CollectTransactionSignaturesStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkSufficientSessions(sessions, relationship) - sessions.forEach { it.send(checkMembership) } + checkMembership(checkMembership, relationship, sessions) - if (checkMembership) { - checkMembershipsAndAttestations(relationship) + val transaction = buildTransaction(notary) { + addIssuedRelationship(relationship) } - val transaction = transaction(notary) { - addOutputState(relationship, RelationshipContract.ID) - relationship.createRevocationLocks().forEach { addOutputState(it) } - addCommand(RelationshipContract.Issue, relationship.participants.map { it.owningKey }) - addCommand(RevocationLockContract.Lock, relationship.participants.map { it.owningKey }) - } - - val partiallySignedTransaction = verifyAndSign(transaction, ourIdentity.owningKey) - val fullySignedTransaction = countersign(partiallySignedTransaction, sessions) - return finalize(fullySignedTransaction, sessions) + verifyTransaction(transaction) + val partiallySignedTransaction = signTransaction(transaction) + val fullySignedTransaction = collectSignatures(partiallySignedTransaction, sessions) + return finalizeTransaction(fullySignedTransaction, sessions) } @StartableByRPC @@ -80,16 +80,16 @@ class IssueRelationshipFlow( ) : FlowLogic() { private companion object { - object ISSUING : Step("Issuing relationship.") { + object IssueRelationshipStep : Step("Issuing relationship.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(ISSUING) + override val progressTracker = ProgressTracker(IssueRelationshipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(ISSUING) + currentStep(IssueRelationshipStep) val sessions = initiateFlows(emptyList(), relationship) return subFlow( @@ -98,7 +98,7 @@ class IssueRelationshipFlow( notary ?: getPreferredNotary(), sessions, checkMembership, - ISSUING.childProgressTracker() + IssueRelationshipStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowHandler.kt index 3667528..7eec2a4 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowHandler.kt @@ -18,16 +18,19 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.relationship.Relationship +import io.onixlabs.corda.bnms.workflow.CheckMembershipStep +import io.onixlabs.corda.bnms.workflow.ReceiveCheckMembershipInstructionStep +import io.onixlabs.corda.bnms.workflow.checkMembershipHandler import io.onixlabs.corda.bnms.workflow.checkMembershipsAndAttestations -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING -import io.onixlabs.corda.identityframework.workflow.SIGNING -import net.corda.core.flows.* +import io.onixlabs.corda.core.workflow.* +import net.corda.core.flows.FlowException +import net.corda.core.flows.FlowLogic +import net.corda.core.flows.FlowSession +import net.corda.core.flows.InitiatedBy import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.ProgressTracker.Step -import net.corda.core.utilities.unwrap class IssueRelationshipFlowHandler( private val session: FlowSession, @@ -36,47 +39,45 @@ class IssueRelationshipFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(RECEIVING, SIGNING, FINALIZING) - - private object RECEIVING : Step("Receiving check membership instruction.") + fun tracker() = ProgressTracker( + ReceiveCheckMembershipInstructionStep, + SignTransactionStep, + CheckMembershipStep, + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(RECEIVING) - val checkMembership = session.receive().unwrap { it } - - currentStep(SIGNING) - val transaction = subFlow(object : SignTransactionFlow(session) { - override fun checkTransaction(stx: SignedTransaction) { - if (checkMembership) { - val relationship = stx.tx.outputsOfType().singleOrNull() - ?: throw FlowException("Failed to obtain a relationship from the transaction.") + val checkMembership = checkMembershipHandler(session) + val transaction = collectSignaturesHandler(session) { + if (checkMembership) { + val relationship = it.tx.outputsOfType().singleOrNull() + ?: throw FlowException("Failed to obtain a relationship from the transaction.") - checkMembershipsAndAttestations(relationship) - } + checkMembershipsAndAttestations(relationship) } - }) + } - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, transaction.id, StatesToRecord.ONLY_RELEVANT)) + return finalizeTransactionHandler(session, transaction?.id, StatesToRecord.ONLY_RELEVANT) } @InitiatedBy(IssueRelationshipFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : Step("Observing relationship issuance.") { + object HandleIssueRelationshipStep : Step("Handling relationship issuance.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleIssueRelationshipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) - return subFlow(IssueRelationshipFlowHandler(session, OBSERVING.childProgressTracker())) + currentStep(HandleIssueRelationshipStep) + return subFlow(IssueRelationshipFlowHandler(session, HandleIssueRelationshipStep.childProgressTracker())) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlow.kt index 6689162..11a888d 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlow.kt @@ -18,17 +18,13 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation -import io.onixlabs.corda.bnms.workflow.finalize -import io.onixlabs.corda.bnms.workflow.transaction -import io.onixlabs.corda.bnms.workflow.verifyAndSign -import io.onixlabs.corda.core.workflow.checkSufficientSessions -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* +import io.onixlabs.corda.bnms.workflow.addRevokedRelationshipAttestation +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class RevokeRelationshipAttestationFlow( private val attestation: StateAndRef, @@ -38,22 +34,30 @@ class RevokeRelationshipAttestationFlow( companion object { @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkSufficientSessions(sessions, attestation.state.data) - val transaction = transaction(attestation.state.notary) { - addRevokedAttestation(attestation) + val transaction = buildTransaction(attestation.state.notary) { + addRevokedRelationshipAttestation(attestation) } - val signedTransaction = verifyAndSign(transaction, attestation.state.data.attestor.owningKey) - return finalize(signedTransaction, sessions) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, sessions) } @StartableByRPC @@ -64,23 +68,23 @@ class RevokeRelationshipAttestationFlow( ) : FlowLogic() { private companion object { - object REVOKING : ProgressTracker.Step("Revoking relationship attestation.") { + object RevokeRelationshipAttestationStep : Step("Revoking relationship attestation.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(REVOKING) + override val progressTracker = ProgressTracker(RevokeRelationshipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(REVOKING) + currentStep(RevokeRelationshipAttestationStep) val sessions = initiateFlows(emptyList(), attestation.state.data) return subFlow( RevokeRelationshipAttestationFlow( attestation, sessions, - REVOKING.childProgressTracker() + RevokeRelationshipAttestationStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowHandler.kt index 96ac7f2..bcb7a36 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowHandler.kt @@ -17,16 +17,18 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable +import io.onixlabs.corda.core.workflow.ReceiveStatesToRecordStep +import io.onixlabs.corda.core.workflow.RecordFinalizedTransactionStep import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING +import io.onixlabs.corda.core.workflow.finalizeTransactionHandler import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowSession import net.corda.core.flows.InitiatedBy -import net.corda.core.flows.ReceiveFinalityFlow import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class RevokeRelationshipAttestationFlowHandler( private val session: FlowSession, @@ -36,30 +38,38 @@ class RevokeRelationshipAttestationFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(FINALIZING) + fun tracker() = ProgressTracker( + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, expectedTransactionId, StatesToRecord.ONLY_RELEVANT)) + return finalizeTransactionHandler(session, expectedTransactionId, StatesToRecord.ONLY_RELEVANT) } @InitiatedBy(RevokeRelationshipAttestationFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : ProgressTracker.Step("Observing relationship attestation revocation.") { - override fun childProgressTracker() = IssueRelationshipAttestationFlowHandler.tracker() + object HandleRevokeRelationshipAttestationStep : Step("Handle relationship attestation revocation.") { + override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleRevokeRelationshipAttestationStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) - return subFlow(IssueRelationshipAttestationFlowHandler(session, null, OBSERVING.childProgressTracker())) + currentStep(HandleRevokeRelationshipAttestationStep) + return subFlow( + IssueRelationshipAttestationFlowHandler( + session, + null, + HandleRevokeRelationshipAttestationStep.childProgressTracker() + ) + ) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlow.kt index 791bd2a..8ccc3b5 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlow.kt @@ -18,15 +18,8 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.relationship.Relationship -import io.onixlabs.corda.bnms.contract.relationship.RelationshipContract -import io.onixlabs.corda.bnms.workflow.countersign -import io.onixlabs.corda.bnms.workflow.finalize -import io.onixlabs.corda.bnms.workflow.transaction -import io.onixlabs.corda.bnms.workflow.verifyAndSign -import io.onixlabs.corda.core.workflow.checkSufficientSessions -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.core.workflow.initiateFlows -import io.onixlabs.corda.identityframework.workflow.* +import io.onixlabs.corda.bnms.workflow.addRevokedRelationship +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.transactions.SignedTransaction @@ -40,25 +33,33 @@ class RevokeRelationshipFlow( ) : FlowLogic() { companion object { - private const val FLOW_VERSION_1 = 1 - @JvmStatic - fun tracker() = ProgressTracker(INITIALIZING, GENERATING, VERIFYING, SIGNING, COUNTERSIGNING, FINALIZING) + fun tracker() = ProgressTracker( + InitializeFlowStep, + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + CollectTransactionSignaturesStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) + + private const val FLOW_VERSION_1 = 1 } @Suspendable override fun call(): SignedTransaction { - currentStep(INITIALIZING) + currentStep(InitializeFlowStep) checkSufficientSessions(sessions, relationship.state.data) - val transaction = transaction(relationship.state.notary) { - addInputState(relationship) - addCommand(RelationshipContract.Revoke, relationship.state.data.participants.map { it.owningKey }) + val transaction = buildTransaction(relationship.state.notary) { + addRevokedRelationship(relationship) } - val partiallySignedTransaction = verifyAndSign(transaction, ourIdentity.owningKey) - val fullySignedTransaction = countersign(partiallySignedTransaction, sessions) - return finalize(fullySignedTransaction, sessions) + verifyTransaction(transaction) + val partiallySignedTransaction = signTransaction(transaction) + val fullySignedTransaction = collectSignatures(partiallySignedTransaction, sessions) + return finalizeTransaction(fullySignedTransaction, sessions) } @StartableByRPC @@ -69,23 +70,23 @@ class RevokeRelationshipFlow( ) : FlowLogic() { private companion object { - object REVOKING : Step("Revoking relationship.") { + object RevokeRelationshipStep : Step("Revoking relationship.") { override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(REVOKING) + override val progressTracker = ProgressTracker(RevokeRelationshipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(REVOKING) + currentStep(RevokeRelationshipStep) val sessions = initiateFlows(emptyList(), relationship.state.data) return subFlow( RevokeRelationshipFlow( relationship, sessions, - REVOKING.childProgressTracker() + RevokeRelationshipStep.childProgressTracker() ) ) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt index ebcc4d9..26fd259 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt @@ -19,13 +19,15 @@ package io.onixlabs.corda.bnms.workflow.relationship import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.relationship.Relationship import io.onixlabs.corda.bnms.workflow.checkRevocationLockExists -import io.onixlabs.corda.core.workflow.currentStep -import io.onixlabs.corda.identityframework.workflow.FINALIZING -import io.onixlabs.corda.identityframework.workflow.SIGNING -import net.corda.core.flows.* +import io.onixlabs.corda.core.workflow.* +import net.corda.core.flows.FlowException +import net.corda.core.flows.FlowLogic +import net.corda.core.flows.FlowSession +import net.corda.core.flows.InitiatedBy import net.corda.core.node.StatesToRecord import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.ProgressTracker.Step class RevokeRelationshipFlowHandler( private val session: FlowSession, @@ -34,42 +36,42 @@ class RevokeRelationshipFlowHandler( companion object { @JvmStatic - fun tracker() = ProgressTracker(SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + SignTransactionStep, + ReceiveStatesToRecordStep, + RecordFinalizedTransactionStep + ) } @Suspendable override fun call(): SignedTransaction { - currentStep(SIGNING) - val transaction = subFlow(object : SignTransactionFlow(session) { - override fun checkTransaction(stx: SignedTransaction) { - val relationshipStateRef = stx.tx.inputs.singleOrNull() ?: throw FlowException( - "Failed to obtain a single state reference from the transaction." - ) + val transaction = collectSignaturesHandler(session) { + val relationshipStateRef = it.tx.inputs.singleOrNull() ?: throw FlowException( + "Failed to obtain a single state reference from the transaction." + ) - val relationship = serviceHub.toStateAndRef(relationshipStateRef) - checkRevocationLockExists(ourIdentity, relationship.state.data) - } - }) + val relationship = serviceHub.toStateAndRef(relationshipStateRef) + checkRevocationLockExists(ourIdentity, relationship.state.data) + } - currentStep(FINALIZING) - return subFlow(ReceiveFinalityFlow(session, transaction.id, StatesToRecord.ONLY_RELEVANT)) + return finalizeTransactionHandler(session, transaction?.id, StatesToRecord.ONLY_RELEVANT) } @InitiatedBy(RevokeRelationshipFlow.Initiator::class) private class Handler(private val session: FlowSession) : FlowLogic() { private companion object { - object OBSERVING : ProgressTracker.Step("Observing relationship revocation.") { - override fun childProgressTracker() = RevokeRelationshipFlowHandler.tracker() + object HandleRevokeRelationshipStep : Step("Handling relationship revocation.") { + override fun childProgressTracker() = tracker() } } - override val progressTracker = ProgressTracker(OBSERVING) + override val progressTracker = ProgressTracker(HandleRevokeRelationshipStep) @Suspendable override fun call(): SignedTransaction { - currentStep(OBSERVING) - return subFlow(RevokeRelationshipFlowHandler(session, OBSERVING.childProgressTracker())) + currentStep(HandleRevokeRelationshipStep) + return subFlow(RevokeRelationshipFlowHandler(session, HandleRevokeRelationshipStep.childProgressTracker())) } } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlow.kt index 8aa2c67..e10ddf4 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlow.kt @@ -18,10 +18,8 @@ package io.onixlabs.corda.bnms.workflow.revocation import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.revocation.RevocationLock -import io.onixlabs.corda.bnms.contract.revocation.RevocationLockContract -import io.onixlabs.corda.core.workflow.getPreferredNotary -import io.onixlabs.corda.identityframework.workflow.* -import io.onixlabs.corda.bnms.workflow.* +import io.onixlabs.corda.bnms.workflow.addLockedRevocationLock +import io.onixlabs.corda.core.workflow.* import net.corda.core.flows.FlowLogic import net.corda.core.flows.StartableByRPC import net.corda.core.flows.StartableByService @@ -33,24 +31,29 @@ import net.corda.core.utilities.ProgressTracker @StartableByService class LockRevocationLockFlow( private val revocationLock: RevocationLock<*>, - private val notary: Party? = null + private val notary: Party? = null, + override val progressTracker: ProgressTracker = tracker() ) : FlowLogic() { companion object { @JvmStatic - fun tracker() = ProgressTracker(GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) } - override val progressTracker = tracker() - @Suspendable override fun call(): SignedTransaction { - val transaction = transaction(notary ?: getPreferredNotary()) { - addOutputState(revocationLock, RevocationLockContract.ID) - addCommand(RevocationLockContract.Lock, revocationLock.owner.owningKey) + val transaction = buildTransaction(notary ?: getPreferredNotary()) { + addLockedRevocationLock(revocationLock) } - val signedTransaction = verifyAndSign(transaction, revocationLock.owner.owningKey) - return finalize(signedTransaction) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, emptyList()) } } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlow.kt index 5ae1886..1c34928 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlow.kt @@ -18,14 +18,8 @@ package io.onixlabs.corda.bnms.workflow.revocation import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.revocation.RevocationLock -import io.onixlabs.corda.bnms.contract.revocation.RevocationLockContract -import io.onixlabs.corda.bnms.workflow.finalize -import io.onixlabs.corda.bnms.workflow.transaction -import io.onixlabs.corda.bnms.workflow.verifyAndSign -import io.onixlabs.corda.identityframework.workflow.FINALIZING -import io.onixlabs.corda.identityframework.workflow.GENERATING -import io.onixlabs.corda.identityframework.workflow.SIGNING -import io.onixlabs.corda.identityframework.workflow.VERIFYING +import io.onixlabs.corda.bnms.workflow.addUnlockedRevocationLock +import io.onixlabs.corda.core.workflow.* import net.corda.core.contracts.StateAndRef import net.corda.core.flows.FlowLogic import net.corda.core.flows.StartableByRPC @@ -36,24 +30,29 @@ import net.corda.core.utilities.ProgressTracker @StartableByRPC @StartableByService class UnlockRevocationLockFlow( - private val revocationLock: StateAndRef> + private val revocationLock: StateAndRef>, + override val progressTracker: ProgressTracker = tracker() ) : FlowLogic() { companion object { @JvmStatic - fun tracker() = ProgressTracker(GENERATING, VERIFYING, SIGNING, FINALIZING) + fun tracker() = ProgressTracker( + BuildTransactionStep, + VerifyTransactionStep, + SignTransactionStep, + SendStatesToRecordStep, + FinalizeTransactionStep + ) } - override val progressTracker = tracker() - @Suspendable override fun call(): SignedTransaction { - val transaction = transaction(revocationLock.state.notary) { - addInputState(revocationLock) - addCommand(RevocationLockContract.Unlock, revocationLock.state.data.owner.owningKey) + val transaction = buildTransaction(revocationLock.state.notary) { + addUnlockedRevocationLock(revocationLock) } - val signedTransaction = verifyAndSign(transaction, revocationLock.state.data.owner.owningKey) - return finalize(signedTransaction) + verifyTransaction(transaction) + val signedTransaction = signTransaction(transaction) + return finalizeTransaction(signedTransaction, emptyList()) } } diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt index a016514..a48a4e9 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt @@ -79,13 +79,13 @@ abstract class FlowTest { private fun setup() { _network = MockNetwork( MockNetworkParameters( + networkParameters = testNetworkParameters(minimumPlatformVersion = 10), cordappsForAllNodes = listOf( TestCordapp.findCordapp("io.onixlabs.corda.identityframework.contract"), TestCordapp.findCordapp("io.onixlabs.corda.identityframework.workflow"), TestCordapp.findCordapp("io.onixlabs.corda.bnms.contract"), TestCordapp.findCordapp("io.onixlabs.corda.bnms.workflow") - ), - networkParameters = testNetworkParameters(minimumPlatformVersion = 4) + ) ) ) diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowTests.kt index 6ccbc5b..07782f5 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowTests.kt @@ -22,7 +22,7 @@ import io.onixlabs.corda.bnms.contract.membership.accept import io.onixlabs.corda.bnms.contract.membership.reject import io.onixlabs.corda.bnms.workflow.FlowTest import io.onixlabs.corda.bnms.workflow.Pipeline -import io.onixlabs.corda.identityframework.contract.AttestationStatus +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import net.corda.core.transactions.SignedTransaction import org.junit.jupiter.api.Test import org.junit.jupiter.api.fail @@ -84,4 +84,4 @@ class AmendMembershipAttestationFlowTests : FlowTest() { } } } -} \ No newline at end of file +} diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowTests.kt index 01ecaaa..d140b87 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowTests.kt @@ -22,7 +22,7 @@ import io.onixlabs.corda.bnms.contract.relationship.accept import io.onixlabs.corda.bnms.contract.relationship.reject import io.onixlabs.corda.bnms.workflow.FlowTest import io.onixlabs.corda.bnms.workflow.Pipeline -import io.onixlabs.corda.identityframework.contract.AttestationStatus +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus import net.corda.core.transactions.SignedTransaction import org.junit.jupiter.api.Test import org.junit.jupiter.api.fail From 2949e05cccc6ef416608ebfa72f657987cab6df6 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Wed, 3 Nov 2021 00:16:58 +0000 Subject: [PATCH 08/23] Added empty companion objects to settings classes. --- gradle.properties | 2 +- .../io/onixlabs/corda/bnms/contract/Configuration.kt | 2 ++ .../kotlin/io/onixlabs/corda/bnms/contract/Network.kt | 2 ++ .../kotlin/io/onixlabs/corda/bnms/contract/Permission.kt | 4 +++- .../main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt | 4 +++- .../kotlin/io/onixlabs/corda/bnms/contract/Setting.kt | 8 ++++---- .../io/onixlabs/corda/bnms/contract/StringSetting.kt | 2 ++ 7 files changed, 17 insertions(+), 7 deletions(-) diff --git a/gradle.properties b/gradle.properties index d964950..794251a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc1 +version=2.0.0-rc2 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt index 68338ae..06f9041 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt @@ -33,6 +33,8 @@ import net.corda.core.serialization.CordaSerializable @CordaSerializable data class Configuration(val settings: Set> = emptySet()) : Hashable { + companion object + val permissions: Set get() = getSettingsByType() diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt index b233711..51bb93e 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt @@ -31,6 +31,8 @@ import net.corda.core.identity.AbstractParty */ class Network(value: String, val operator: AbstractParty? = null) : StringSetting(NETWORK, value) { + companion object; + override val hash: SecureHash get() = SecureHash.sha256("${super.hash}$operator") } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt index 3a01da6..620bc8a 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt @@ -25,4 +25,6 @@ package io.onixlabs.corda.bnms.contract * @property normalizedValue The normalized value of the permission. * @property hash The hash that uniquely identifies the permission. */ -class Permission(value: String) : StringSetting(PERMISSION, value) +class Permission(value: String) : StringSetting(PERMISSION, value) { + companion object +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt index d7c7f50..2836d59 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt @@ -25,4 +25,6 @@ package io.onixlabs.corda.bnms.contract * @property normalizedValue The normalized value of the role. * @property hash The hash that uniquely identifies the role. */ -class Role(value: String) : StringSetting(ROLE, value) +class Role(value: String) : StringSetting(ROLE, value) { + companion object +} diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt index f003938..663d3e4 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt @@ -32,10 +32,10 @@ import java.util.* */ open class Setting(property: String, value: T) : Claim(property, value), Hashable { - internal companion object { - const val NETWORK = "Network" - const val ROLE = "Role" - const val PERMISSION = "Permission" + companion object { + internal const val NETWORK = "Network" + internal const val ROLE = "Role" + internal const val PERMISSION = "Permission" } val normalizedProperty: String diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt index 7fce287..03f8689 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt @@ -30,6 +30,8 @@ import java.util.* */ open class StringSetting(property: String, value: String) : Setting(property, value) { + companion object + val normalizedValue: String get() = value.toUpperCase() From b6e5a626a098dad8e98b2baa343d1e956b2d2359 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Wed, 24 Nov 2021 22:10:12 +0000 Subject: [PATCH 09/23] Version bump to support 3.1.0 dependencies. --- README.md | 2 +- build.gradle | 4 ++-- gradle.properties | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 40b9b4d..9337f72 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![ONIX Labs](https://raw.githubusercontent.com/onix-labs/onix-labs.github.io/master/content/logo/master_full_md.png) +![ONIX Labs](https://raw.githubusercontent.com/onix-labs/onixlabs-website/main/src/assets/images/logo/full/original/original-md.png) # ONIXLabs Corda BNMS diff --git a/build.gradle b/build.gradle index b926bb6..3ee188c 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '3.0.0' - onixlabs_corda_idfx_release_version = '3.0.0' + onixlabs_corda_core_release_version = '3.1.0' + onixlabs_corda_idfx_release_version = '3.1.0' cordapp_platform_version = 10 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' diff --git a/gradle.properties b/gradle.properties index 794251a..f571b28 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc2 +version=2.0.0-rc3 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 From ff31f3b08a60ce50da97d049aa705f0b02c45cd0 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Mon, 29 Nov 2021 19:42:27 +0000 Subject: [PATCH 10/23] Version bump to support 3.2.0 dependencies. --- build.gradle | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 3ee188c..dcf1e5d 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { onixlabs_group = 'io.onixlabs' onixlabs_corda_core_release_version = '3.1.0' - onixlabs_corda_idfx_release_version = '3.1.0' + onixlabs_corda_idfx_release_version = '3.2.0' cordapp_platform_version = 10 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' diff --git a/gradle.properties b/gradle.properties index f571b28..75fe42e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc3 +version=2.0.0-rc4 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 From bf046563db37062cc12dcda9d6f8cb29865858b9 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Fri, 3 Dec 2021 18:06:32 +0000 Subject: [PATCH 11/23] Version bump. --- build.gradle | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index dcf1e5d..002965f 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '3.1.0' - onixlabs_corda_idfx_release_version = '3.2.0' + onixlabs_corda_core_release_version = '3.2.0' + onixlabs_corda_idfx_release_version = '3.3.0' cordapp_platform_version = 10 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' diff --git a/gradle.properties b/gradle.properties index 75fe42e..b80e2bb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc4 +version=2.0.0-rc5 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 From 1f03ce4bbdca219bd3297a9574a9e2baa0e52478 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Thu, 16 Dec 2021 11:45:11 +0000 Subject: [PATCH 12/23] Version bump. --- build.gradle | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 002965f..3fdf4ef 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '3.2.0' - onixlabs_corda_idfx_release_version = '3.3.0' + onixlabs_corda_core_release_version = '4.0.0-rc1' + onixlabs_corda_idfx_release_version = '4.0.0-rc1' cordapp_platform_version = 10 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' diff --git a/gradle.properties b/gradle.properties index b80e2bb..bf832aa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc5 +version=2.0.0-rc7 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 From fe1bb040cc3b94c6a5937049fffaf9a92b06e040 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Thu, 16 Dec 2021 23:58:22 +0000 Subject: [PATCH 13/23] Version bump. --- build.gradle | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 3fdf4ef..e04dc1d 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { onixlabs_group = 'io.onixlabs' onixlabs_corda_core_release_version = '4.0.0-rc1' - onixlabs_corda_idfx_release_version = '4.0.0-rc1' + onixlabs_corda_idfx_release_version = '4.0.0-rc2' cordapp_platform_version = 10 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' diff --git a/gradle.properties b/gradle.properties index bf832aa..0d2967a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc7 +version=2.0.0-rc8 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 From c8e7cedaba2647a73f774c3ae4d9803c655cdaac Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Tue, 21 Dec 2021 10:04:20 +0000 Subject: [PATCH 14/23] Version bump. --- build.gradle | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index e04dc1d..110daa0 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '4.0.0-rc1' - onixlabs_corda_idfx_release_version = '4.0.0-rc2' + onixlabs_corda_core_release_version = '4.0.0-rc2' + onixlabs_corda_idfx_release_version = '4.0.0-rc3' cordapp_platform_version = 10 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' diff --git a/gradle.properties b/gradle.properties index 0d2967a..da2192b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc8 +version=2.0.0-rc9 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 From 1d0fb8b299ed63d4d254956566a9bc7837fb90a7 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Fri, 18 Feb 2022 00:15:21 +0000 Subject: [PATCH 15/23] Preparation for major version release 2.0.0 --- HEADER | 2 +- build.gradle | 4 ++-- gradle.properties | 2 +- .../kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt | 2 +- .../io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt | 2 +- .../corda/bnms/contract/ConfigurationBuilderDslContext.kt | 2 +- .../main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt | 2 +- .../kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt | 2 +- .../main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt | 2 +- .../src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt | 2 +- .../main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt | 2 +- .../kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt | 2 +- .../io/onixlabs/corda/bnms/contract/membership/Extensions.kt | 2 +- .../io/onixlabs/corda/bnms/contract/membership/Membership.kt | 2 +- .../corda/bnms/contract/membership/MembershipAttestation.kt | 2 +- .../bnms/contract/membership/MembershipAttestationContract.kt | 2 +- .../bnms/contract/membership/MembershipAttestationSchema.kt | 2 +- .../corda/bnms/contract/membership/MembershipContract.kt | 2 +- .../corda/bnms/contract/membership/MembershipSchema.kt | 2 +- .../onixlabs/corda/bnms/contract/relationship/Extensions.kt | 2 +- .../onixlabs/corda/bnms/contract/relationship/Relationship.kt | 2 +- .../bnms/contract/relationship/RelationshipAttestation.kt | 2 +- .../contract/relationship/RelationshipAttestationContract.kt | 2 +- .../contract/relationship/RelationshipAttestationSchema.kt | 2 +- .../bnms/contract/relationship/RelationshipConfiguration.kt | 2 +- .../relationship/RelationshipConfigurationContract.kt | 2 +- .../contract/relationship/RelationshipConfigurationSchema.kt | 2 +- .../corda/bnms/contract/relationship/RelationshipContract.kt | 2 +- .../corda/bnms/contract/relationship/RelationshipSchema.kt | 2 +- .../onixlabs/corda/bnms/contract/revocation/RevocationLock.kt | 2 +- .../corda/bnms/contract/revocation/RevocationLockContract.kt | 2 +- .../corda/bnms/contract/revocation/RevocationLockSchema.kt | 2 +- .../kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt | 2 +- .../test/kotlin/io/onixlabs/corda/bnms/contract/Extensions.kt | 2 +- .../test/kotlin/io/onixlabs/corda/bnms/contract/MockData.kt | 2 +- .../MembershipAttestationContractAmendCommandTests.kt | 2 +- .../MembershipAttestationContractIssueCommandTests.kt | 2 +- .../RelationshipAttestationContractAmendCommandTests.kt | 2 +- .../RelationshipAttestationContractIssueCommandTests.kt | 2 +- .../centralized/MembershipContractAmendCommandTests.kt | 2 +- .../centralized/MembershipContractIssueCommandTests.kt | 2 +- .../centralized/MembershipContractRevokeCommandTests.kt | 2 +- .../decentralized/MembershipContractAmendCommandTests.kt | 2 +- .../decentralized/MembershipContractIssueCommandTests.kt | 2 +- .../decentralized/MembershipContractRevokeCommandTests.kt | 2 +- .../relationship/RelationshipContractAmendCommandTests.kt | 2 +- .../relationship/RelationshipContractIssueCommandTests.kt | 2 +- .../relationship/RelationshipContractRevokeCommandTests.kt | 2 +- .../revocation/RevocationLockContractLockCommandTests.kt | 2 +- .../revocation/RevocationLockContractUnlockCommandTests.kt | 2 +- .../corda/bnms/integration/MembershipAttestationService.kt | 2 +- .../io/onixlabs/corda/bnms/integration/MembershipService.kt | 2 +- .../corda/bnms/integration/RelationshipAttestationService.kt | 2 +- .../io/onixlabs/corda/bnms/integration/RelationshipService.kt | 2 +- .../onixlabs/corda/bnms/integration/RevocationLockService.kt | 2 +- .../io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt | 2 +- .../bnms/workflow/Extensions.TransactionBuilder.Membership.kt | 2 +- .../Extensions.TransactionBuilder.MembershipAttestation.kt | 2 +- .../workflow/Extensions.TransactionBuilder.Relationship.kt | 2 +- .../Extensions.TransactionBuilder.RelationshipAttestation.kt | 2 +- .../workflow/Extensions.TransactionBuilder.RevocationLock.kt | 2 +- .../main/kotlin/io/onixlabs/corda/bnms/workflow/FlowSteps.kt | 2 +- .../workflow/membership/AmendMembershipAttestationFlow.kt | 4 ++-- .../membership/AmendMembershipAttestationFlowHandler.kt | 2 +- .../corda/bnms/workflow/membership/AmendMembershipFlow.kt | 4 ++-- .../bnms/workflow/membership/AmendMembershipFlowHandler.kt | 2 +- .../workflow/membership/IssueMembershipAttestationFlow.kt | 4 ++-- .../membership/IssueMembershipAttestationFlowHandler.kt | 2 +- .../corda/bnms/workflow/membership/IssueMembershipFlow.kt | 4 ++-- .../bnms/workflow/membership/IssueMembershipFlowHandler.kt | 2 +- .../workflow/membership/RevokeMembershipAttestationFlow.kt | 4 ++-- .../membership/RevokeMembershipAttestationFlowHandler.kt | 2 +- .../corda/bnms/workflow/membership/RevokeMembershipFlow.kt | 4 ++-- .../bnms/workflow/membership/RevokeMembershipFlowHandler.kt | 2 +- .../workflow/relationship/AmendRelationshipAttestationFlow.kt | 4 ++-- .../relationship/AmendRelationshipAttestationFlowHandler.kt | 2 +- .../corda/bnms/workflow/relationship/AmendRelationshipFlow.kt | 4 ++-- .../workflow/relationship/AmendRelationshipFlowHandler.kt | 2 +- .../workflow/relationship/IssueRelationshipAttestationFlow.kt | 4 ++-- .../relationship/IssueRelationshipAttestationFlowHandler.kt | 2 +- .../corda/bnms/workflow/relationship/IssueRelationshipFlow.kt | 4 ++-- .../workflow/relationship/IssueRelationshipFlowHandler.kt | 2 +- .../relationship/RevokeRelationshipAttestationFlow.kt | 4 ++-- .../relationship/RevokeRelationshipAttestationFlowHandler.kt | 2 +- .../bnms/workflow/relationship/RevokeRelationshipFlow.kt | 4 ++-- .../workflow/relationship/RevokeRelationshipFlowHandler.kt | 2 +- .../corda/bnms/workflow/revocation/LockRevocationLockFlow.kt | 2 +- .../bnms/workflow/revocation/UnlockRevocationLockFlow.kt | 2 +- .../test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt | 2 +- .../test/kotlin/io/onixlabs/corda/bnms/workflow/Pipeline.kt | 2 +- .../membership/AmendMembershipAttestationFlowTests.kt | 2 +- .../bnms/workflow/membership/AmendMembershipFlowTests.kt | 2 +- .../membership/IssueMembershipAttestationFlowTests.kt | 2 +- .../bnms/workflow/membership/IssueMembershipFlowTests.kt | 2 +- .../membership/RevokeMembershipAttestationFlowTests.kt | 2 +- .../bnms/workflow/membership/RevokeMembershipFlowTests.kt | 2 +- .../workflow/membership/SynchronizeMembershipFlowTests.kt | 2 +- .../relationship/AmendRelationshipAttestationFlowTests.kt | 2 +- .../bnms/workflow/relationship/AmendRelationshipFlowTests.kt | 2 +- .../relationship/IssueRelationshipAttestationFlowTests.kt | 2 +- .../bnms/workflow/relationship/IssueRelationshipFlowTests.kt | 2 +- .../IssueRelationshipFlowWithMembershipCheckingTests.kt | 2 +- .../relationship/RevokeRelationshipAttestationFlowTests.kt | 2 +- .../bnms/workflow/relationship/RevokeRelationshipFlowTests.kt | 2 +- .../bnms/workflow/revocation/LockRevocationLockFlowTests.kt | 2 +- .../bnms/workflow/revocation/UnlockRevocationLockFlowTests.kt | 2 +- 106 files changed, 119 insertions(+), 119 deletions(-) diff --git a/HEADER b/HEADER index 44349e8..abd9b84 100644 --- a/HEADER +++ b/HEADER @@ -1,4 +1,4 @@ -Copyright 2020-2021 ONIXLabs +Copyright 2020-2022 ONIXLabs Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/build.gradle b/build.gradle index 110daa0..9bd9634 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '4.0.0-rc2' - onixlabs_corda_idfx_release_version = '4.0.0-rc3' + onixlabs_corda_core_release_version = '4.0.0-rc3' + onixlabs_corda_idfx_release_version = '4.0.0-rc4' cordapp_platform_version = 10 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' diff --git a/gradle.properties b/gradle.properties index da2192b..0312858 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc9 +version=2.0.0-rc10 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt index 06f9041..cdd63a2 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Configuration.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt index 80494f8..da282d3 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilderDslContext.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilderDslContext.kt index 9b49cf5..0b0f381 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilderDslContext.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilderDslContext.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt index 51bb93e..862598f 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Network.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt index 4ae7124..f3fa8f0 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/NetworkState.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt index 620bc8a..458c118 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Permission.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt index 2836d59..ba8e474 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Role.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt index 663d3e4..8e7c907 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/Setting.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt index 03f8689..2d37f1b 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/StringSetting.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt index 1aa91a1..b315bc1 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Extensions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt index 57c4d5f..4cf35b6 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt index 29116a1..4e367d1 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt index d8039a6..26b93b4 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationContract.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt index a10a95f..f5e52a9 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt index 7bd7666..f92fa64 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipContract.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt index d81b7cc..8fdb4a5 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt index 7cf6c61..6876320 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Extensions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt index 7db4f3a..e675720 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt index f80c2c6..1ce9029 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationContract.kt index e9ea046..46f478e 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationContract.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt index 91622a8..fb1a616 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt index 72409dd..85496e9 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationContract.kt index c08b814..c4b2f44 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationContract.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt index abe5574..d4f696c 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContract.kt index 0e9d07f..58beac6 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContract.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt index 86ed022..2735d11 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLock.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLock.kt index 6d3bebe..54b3e57 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLock.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLock.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContract.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContract.kt index 978aaff..cccdb63 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContract.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContract.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockSchema.kt index ff25d15..e3826c6 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockSchema.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt index 7231fbf..cb8f6f5 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/Extensions.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/Extensions.kt index bb3bab4..508c4df 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/Extensions.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/Extensions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/MockData.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/MockData.kt index e02eb3d..fd99160 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/MockData.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/MockData.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractAmendCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractAmendCommandTests.kt index b98ec1e..8e18f2a 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractAmendCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractAmendCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractIssueCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractIssueCommandTests.kt index 467e0a2..e40fb13 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractIssueCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/MembershipAttestationContractIssueCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractAmendCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractAmendCommandTests.kt index 4d8a968..15fb9ac 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractAmendCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractAmendCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractIssueCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractIssueCommandTests.kt index dfa97e2..4f0a7be 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractIssueCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/attestation/RelationshipAttestationContractIssueCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractAmendCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractAmendCommandTests.kt index 3353aad..8b6562c 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractAmendCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractAmendCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractIssueCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractIssueCommandTests.kt index 0d1f6f1..4dd0003 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractIssueCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractIssueCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractRevokeCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractRevokeCommandTests.kt index ff3415a..d6261b6 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractRevokeCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/centralized/MembershipContractRevokeCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractAmendCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractAmendCommandTests.kt index 7f0659f..98121ef 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractAmendCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractAmendCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractIssueCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractIssueCommandTests.kt index 47ee956..9e21efe 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractIssueCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractIssueCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractRevokeCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractRevokeCommandTests.kt index a697264..93515fb 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractRevokeCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/membership/decentralized/MembershipContractRevokeCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractAmendCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractAmendCommandTests.kt index 69e7a2a..9694131 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractAmendCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractAmendCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractIssueCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractIssueCommandTests.kt index cf9b322..565a0c4 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractIssueCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractIssueCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractRevokeCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractRevokeCommandTests.kt index 8f9f498..3dd4219 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractRevokeCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipContractRevokeCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContractLockCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContractLockCommandTests.kt index 1e52a0c..20fa2df 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContractLockCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContractLockCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContractUnlockCommandTests.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContractUnlockCommandTests.kt index 2c808bc..16f186f 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContractUnlockCommandTests.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockContractUnlockCommandTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt index 9d437e8..d7e39d4 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipAttestationService.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt index d4a493b..b5a99c6 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/MembershipService.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt index 8a089bb..6274a76 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipAttestationService.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt index fc8febe..8a2c07d 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RelationshipService.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt index 2624261..a4732ba 100644 --- a/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt +++ b/onixlabs-corda-bnms-integration/src/main/kotlin/io/onixlabs/corda/bnms/integration/RevocationLockService.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt index 71f0091..259eb96 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Membership.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Membership.kt index c2d9554..77faf19 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Membership.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Membership.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.MembershipAttestation.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.MembershipAttestation.kt index ffff5ff..0114226 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.MembershipAttestation.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.MembershipAttestation.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Relationship.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Relationship.kt index db89fc8..3742856 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Relationship.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.Relationship.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RelationshipAttestation.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RelationshipAttestation.kt index b4f715e..75ed95a 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RelationshipAttestation.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RelationshipAttestation.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RevocationLock.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RevocationLock.kt index e2229b2..b7bd7ed 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RevocationLock.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.TransactionBuilder.RevocationLock.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/FlowSteps.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/FlowSteps.kt index 0639079..c13c1ee 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/FlowSteps.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/FlowSteps.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt index 5f0a5d5..558e6e7 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,7 +52,7 @@ class AmendMembershipAttestationFlow( @Suspendable override fun call(): SignedTransaction { currentStep(InitializeFlowStep) - checkSufficientSessions(sessions, newAttestation) + checkSufficientSessionsForContractStates(sessions, newAttestation) val membership = findMembershipForAttestation(newAttestation).referenced() val transaction = buildTransaction(oldAttestation.state.notary) { diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowHandler.kt index 49e7672..40e7672 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlow.kt index d54cadd..152b690 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,7 +53,7 @@ class AmendMembershipFlow( override fun call(): SignedTransaction { currentStep(InitializeFlowStep) checkMembershipExists(newMembership) - checkSufficientSessions(sessions, newMembership) + checkSufficientSessionsForContractStates(sessions, newMembership) val transaction = buildTransaction(oldMembership.state.notary) { addAmendedMembership(oldMembership, newMembership, ourIdentity.owningKey) diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowHandler.kt index b630e9c..614f5ae 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt index 40be2d7..b78d312 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,7 +51,7 @@ class IssueMembershipAttestationFlow( @Suspendable override fun call(): SignedTransaction { currentStep(InitializeFlowStep) - checkSufficientSessions(sessions, attestation) + checkSufficientSessionsForContractStates(sessions, attestation) val membership = findMembershipForAttestation(attestation).referenced() val transaction = buildTransaction(notary) { diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowHandler.kt index 7ad478b..d100629 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlow.kt index 95a94bf..4b657de 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,7 +52,7 @@ class IssueMembershipFlow( override fun call(): SignedTransaction { currentStep(InitializeFlowStep) checkMembershipExists(membership) - checkSufficientSessions(sessions, membership) + checkSufficientSessionsForContractStates(sessions, membership) val transaction = buildTransaction(notary) { addIssuedMembership(membership, ourIdentity.owningKey) diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowHandler.kt index eff9458..a75eac7 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlow.kt index a46fbdf..bdc2a33 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,7 @@ class RevokeMembershipAttestationFlow( @Suspendable override fun call(): SignedTransaction { currentStep(InitializeFlowStep) - checkSufficientSessions(sessions, attestation.state.data) + checkSufficientSessionsForContractStates(sessions, attestation.state.data) val transaction = buildTransaction(attestation.state.notary) { addRevokedMembershipAttestation(attestation) diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowHandler.kt index 57020b4..0d5f1a5 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlow.kt index 383e687..19fd840 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,7 @@ class RevokeMembershipFlow( @Suspendable override fun call(): SignedTransaction { currentStep(InitializeFlowStep) - checkSufficientSessions(sessions, membership.state.data) + checkSufficientSessionsForContractStates(sessions, membership.state.data) val transaction = buildTransaction(membership.state.notary) { addRevokedMembership(membership, ourIdentity.owningKey) diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowHandler.kt index a247154..15814ba 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt index 7ab51f7..dfa1172 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,7 +51,7 @@ class AmendRelationshipAttestationFlow( @Suspendable override fun call(): SignedTransaction { currentStep(InitializeFlowStep) - checkSufficientSessions(sessions, newAttestation, oldAttestation.state.data) + checkSufficientSessionsForContractStates(sessions, newAttestation, oldAttestation.state.data) val relationship = findRelationshipForAttestation(newAttestation).referenced() val transaction = buildTransaction(oldAttestation.state.notary) { diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowHandler.kt index 575261c..f7e57cc 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlow.kt index 24aa8dd..b4226cb 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,7 +55,7 @@ class AmendRelationshipFlow( @Suspendable override fun call(): SignedTransaction { currentStep(InitializeFlowStep) - checkSufficientSessions(sessions, newRelationship) + checkSufficientSessionsForContractStates(sessions, newRelationship) checkMembership(checkMembership, newRelationship, sessions) val transaction = buildTransaction(oldRelationship.state.notary) { diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowHandler.kt index 6aefaf0..37281e1 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt index a432ba0..567c364 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,7 +51,7 @@ class IssueRelationshipAttestationFlow( @Suspendable override fun call(): SignedTransaction { currentStep(InitializeFlowStep) - checkSufficientSessions(sessions, attestation) + checkSufficientSessionsForContractStates(sessions, attestation) val relationship = findRelationshipForAttestation(attestation).referenced() val transaction = buildTransaction(notary) { diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowHandler.kt index d7b46ae..8e49266 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlow.kt index f5878d7..fb8368b 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ class IssueRelationshipFlow( @Suspendable override fun call(): SignedTransaction { currentStep(InitializeFlowStep) - checkSufficientSessions(sessions, relationship) + checkSufficientSessionsForContractStates(sessions, relationship) checkMembership(checkMembership, relationship, sessions) val transaction = buildTransaction(notary) { diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowHandler.kt index 7eec2a4..82a145f 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlow.kt index 11a888d..95af41c 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,7 +49,7 @@ class RevokeRelationshipAttestationFlow( @Suspendable override fun call(): SignedTransaction { currentStep(InitializeFlowStep) - checkSufficientSessions(sessions, attestation.state.data) + checkSufficientSessionsForContractStates(sessions, attestation.state.data) val transaction = buildTransaction(attestation.state.notary) { addRevokedRelationshipAttestation(attestation) diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowHandler.kt index bcb7a36..9733a21 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlow.kt index 8ccc3b5..346a6ef 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,7 @@ class RevokeRelationshipFlow( @Suspendable override fun call(): SignedTransaction { currentStep(InitializeFlowStep) - checkSufficientSessions(sessions, relationship.state.data) + checkSufficientSessionsForContractStates(sessions, relationship.state.data) val transaction = buildTransaction(relationship.state.notary) { addRevokedRelationship(relationship) diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt index 26fd259..f574a2f 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlow.kt index e10ddf4..749a3b7 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlow.kt index 1c34928..5c54960 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlow.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt index a48a4e9..c33769d 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/Pipeline.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/Pipeline.kt index 98a7b01..8a98cec 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/Pipeline.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/Pipeline.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowTests.kt index 07782f5..05e79ec 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowTests.kt index 17a6b18..2245004 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowTests.kt index e7c85fe..fda6ebe 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowTests.kt index a6beb4d..9204543 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowTests.kt index 0768f3e..52ad100 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipAttestationFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowTests.kt index 614d8fa..42aea0a 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/RevokeMembershipFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowTests.kt index 8dbea1b..a5b045c 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/SynchronizeMembershipFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowTests.kt index d140b87..27385f3 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowTests.kt index 3d84d34..9eb2230 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowTests.kt index c9077f6..2d7d702 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowTests.kt index 89aa618..b57d34c 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowWithMembershipCheckingTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowWithMembershipCheckingTests.kt index a3c4c05..f772219 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowWithMembershipCheckingTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipFlowWithMembershipCheckingTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowTests.kt index 01c6498..2b335ac 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipAttestationFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowTests.kt index 38351a8..c1c4f5f 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/relationship/RevokeRelationshipFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlowTests.kt index 98a339a..223da94 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/revocation/LockRevocationLockFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlowTests.kt index e440c5d..9049400 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlowTests.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/revocation/UnlockRevocationLockFlowTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 ONIXLabs + * Copyright 2020-2022 ONIXLabs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 2f76b53d1cd14f682e1a1cf24f9eb8c5e0b03cb9 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Sun, 20 Feb 2022 21:03:16 +0000 Subject: [PATCH 16/23] Preparation for major version release 2.0.0 --- build.gradle | 2 +- gradle.properties | 2 +- .../corda/bnms/contract/membership/MembershipAttestation.kt | 2 +- .../bnms/workflow/membership/AmendMembershipAttestationFlow.kt | 3 +++ .../bnms/workflow/membership/IssueMembershipAttestationFlow.kt | 3 +++ .../workflow/relationship/AmendRelationshipAttestationFlow.kt | 3 +++ .../workflow/relationship/IssueRelationshipAttestationFlow.kt | 3 +++ 7 files changed, 15 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 9bd9634..f964538 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { onixlabs_group = 'io.onixlabs' onixlabs_corda_core_release_version = '4.0.0-rc3' - onixlabs_corda_idfx_release_version = '4.0.0-rc4' + onixlabs_corda_idfx_release_version = '4.0.0-rc5' cordapp_platform_version = 10 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' diff --git a/gradle.properties b/gradle.properties index 0312858..3c028f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc10 +version=2.0.0-rc11 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt index 4e367d1..1abd068 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt @@ -79,7 +79,7 @@ class MembershipAttestation internal constructor( membership.state.data.network, attestor, setOf(membership.state.data.holder), - membership.toStaticAttestationPointer(), + membership.toStaticAttestationPointer(identifier = membership.state.data.linearId.toString()), status, metadata, linearId, diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt index 558e6e7..37df9e3 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt @@ -21,6 +21,7 @@ import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation import io.onixlabs.corda.bnms.workflow.addAmendedMembershipAttestation import io.onixlabs.corda.bnms.workflow.findMembershipForAttestation import io.onixlabs.corda.core.workflow.* +import io.onixlabs.corda.identityframework.workflow.checkAttestationExistsForAmendment import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.identity.Party @@ -53,6 +54,8 @@ class AmendMembershipAttestationFlow( override fun call(): SignedTransaction { currentStep(InitializeFlowStep) checkSufficientSessionsForContractStates(sessions, newAttestation) + checkAttestationExistsForAmendment(newAttestation) + val membership = findMembershipForAttestation(newAttestation).referenced() val transaction = buildTransaction(oldAttestation.state.notary) { diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt index b78d312..1d43271 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt @@ -21,6 +21,7 @@ import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation import io.onixlabs.corda.bnms.workflow.addIssuedMembershipAttestation import io.onixlabs.corda.bnms.workflow.findMembershipForAttestation import io.onixlabs.corda.core.workflow.* +import io.onixlabs.corda.identityframework.workflow.checkAttestationExistsForIssuance import net.corda.core.flows.* import net.corda.core.identity.Party import net.corda.core.transactions.SignedTransaction @@ -52,6 +53,8 @@ class IssueMembershipAttestationFlow( override fun call(): SignedTransaction { currentStep(InitializeFlowStep) checkSufficientSessionsForContractStates(sessions, attestation) + checkAttestationExistsForIssuance(attestation) + val membership = findMembershipForAttestation(attestation).referenced() val transaction = buildTransaction(notary) { diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt index dfa1172..5a2d168 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/AmendRelationshipAttestationFlow.kt @@ -21,6 +21,7 @@ import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation import io.onixlabs.corda.bnms.workflow.addAmendedRelationshipAttestation import io.onixlabs.corda.bnms.workflow.findRelationshipForAttestation import io.onixlabs.corda.core.workflow.* +import io.onixlabs.corda.identityframework.workflow.checkAttestationExistsForAmendment import net.corda.core.contracts.StateAndRef import net.corda.core.flows.* import net.corda.core.transactions.SignedTransaction @@ -52,6 +53,8 @@ class AmendRelationshipAttestationFlow( override fun call(): SignedTransaction { currentStep(InitializeFlowStep) checkSufficientSessionsForContractStates(sessions, newAttestation, oldAttestation.state.data) + checkAttestationExistsForAmendment(newAttestation) + val relationship = findRelationshipForAttestation(newAttestation).referenced() val transaction = buildTransaction(oldAttestation.state.notary) { diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt index 567c364..de356bf 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/relationship/IssueRelationshipAttestationFlow.kt @@ -21,6 +21,7 @@ import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation import io.onixlabs.corda.bnms.workflow.addIssuedRelationshipAttestation import io.onixlabs.corda.bnms.workflow.findRelationshipForAttestation import io.onixlabs.corda.core.workflow.* +import io.onixlabs.corda.identityframework.workflow.checkAttestationExistsForIssuance import net.corda.core.flows.* import net.corda.core.identity.Party import net.corda.core.transactions.SignedTransaction @@ -52,6 +53,8 @@ class IssueRelationshipAttestationFlow( override fun call(): SignedTransaction { currentStep(InitializeFlowStep) checkSufficientSessionsForContractStates(sessions, attestation) + checkAttestationExistsForIssuance(attestation) + val relationship = findRelationshipForAttestation(attestation).referenced() val transaction = buildTransaction(notary) { From c977bd0ebefe0d0cf82a517821c96de9180bf36c Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Mon, 18 Apr 2022 12:04:46 +0100 Subject: [PATCH 17/23] Version bump to Corda 4.9 --- .editorconfig | 6 ++ build.gradle | 8 +- .../bnms/contract/ConfigurationBuilder.kt | 2 +- .../bnms/contract/membership/Membership.kt | 12 +-- .../membership/MembershipAttestation.kt | 32 +++---- .../membership/MembershipAttestationSchema.kt | 19 +++- .../contract/membership/MembershipSchema.kt | 14 ++- .../contract/relationship/Relationship.kt | 10 +- .../relationship/RelationshipAttestation.kt | 31 ++++--- .../RelationshipAttestationSchema.kt | 18 +++- .../relationship/RelationshipConfiguration.kt | 12 +-- .../RelationshipConfigurationSchema.kt | 18 +++- .../relationship/RelationshipSchema.kt | 12 ++- .../contract/revocation/RevocationLock.kt | 7 +- .../revocation/RevocationLockSchema.kt | 11 ++- ...ship-configuration-schema.changelog-v1.xml | 5 +- .../corda/bnms/contract/ContractTest.kt | 2 +- .../bnms/workflow/Extensions.FlowLogic.kt | 79 ++++++++++------ .../Extensions.QueryDsl.Membership.kt | 62 +++++++++++++ ...tensions.QueryDsl.MembershipAttestation.kt | 91 +++++++++++++++++++ .../Extensions.QueryDsl.Relationship.kt | 58 ++++++++++++ ...nsions.QueryDsl.RelationshipAttestation.kt | 86 ++++++++++++++++++ ...ions.QueryDsl.RelationshipConfiguration.kt | 69 ++++++++++++++ .../Extensions.QueryDsl.RevocationLock.kt | 48 ++++++++++ .../AmendMembershipAttestationFlow.kt | 3 +- .../IssueMembershipAttestationFlow.kt | 4 +- .../onixlabs/corda/bnms/workflow/FlowTest.kt | 2 +- ...DuplicateMembershipAttestationFlowTests.kt | 67 ++++++++++++++ ...DuplicateMembershipAttestationFlowTests.kt | 71 +++++++++++++++ 29 files changed, 747 insertions(+), 112 deletions(-) create mode 100644 .editorconfig create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.Membership.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.MembershipAttestation.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.Relationship.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RelationshipAttestation.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RelationshipConfiguration.kt create mode 100644 onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RevocationLock.kt create mode 100644 onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendDuplicateMembershipAttestationFlowTests.kt create mode 100644 onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueDuplicateMembershipAttestationFlowTests.kt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7f6e192 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,6 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +max_line_length = 140 \ No newline at end of file diff --git a/build.gradle b/build.gradle index f964538..d82ca5b 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { corda_artifactory_url = 'https://software.r3.com/artifactory' corda_group = 'net.corda' - corda_release_version = '4.8' + corda_release_version = '4.9' corda_gradle_plugin_group = 'net.corda.plugins' corda_gradle_plugin_version = '5.0.4' @@ -14,10 +14,10 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '4.0.0-rc3' - onixlabs_corda_idfx_release_version = '4.0.0-rc5' + onixlabs_corda_core_release_version = '4.0.1' + onixlabs_corda_idfx_release_version = '4.0.1' - cordapp_platform_version = 10 + cordapp_platform_version = 11 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' cordapp_workflow_name = 'ONIXLabs Corda BNMS Workflow' cordapp_vendor_name = 'ONIXLabs' diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt index da282d3..803bb54 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/ConfigurationBuilder.kt @@ -196,7 +196,7 @@ class ConfigurationBuilder(private val settings: MutableSet>) { * * @return Returns a configuration containing the settings built by this configuration builder. */ - fun toConfiguration(): Configuration { + internal fun toConfiguration(): Configuration { return Configuration(settings) } } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt index 4cf35b6..7df2b1a 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/Membership.kt @@ -92,17 +92,7 @@ data class Membership( * @return Returns a persistent state entity. */ override fun generateMappedObject(schema: MappedSchema): PersistentState = when (schema) { - is MembershipSchemaV1 -> MembershipEntity( - linearId = linearId.id, - externalId = linearId.externalId, - holder = holder, - networkValue = network.value, - normalizedNetworkValue = network.normalizedValue, - networkOperator = network.operator, - networkHash = network.hash.toString(), - isNetworkOperator = isNetworkOperator, - hash = hash.toString() - ) + is MembershipSchemaV1 -> MembershipEntity(this) else -> throw IllegalArgumentException("Unrecognised schema: $schema.") } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt index 1abd068..073d814 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestation.kt @@ -68,6 +68,19 @@ class MembershipAttestation internal constructor( previousStateRef ), NetworkState { + /** + * Represents a membership attestation; a proof that a particular [Membership] state has been witnessed. + * + * @param attestor The party who is attesting to the witnessed [Membership] state. + * @param membership The [Membership] state that is being witnessed and attested. + * @param status The status of the attestation. + * @param metadata Additional information about the attestation. + * @param linearId The unique identifier of the attestation. + * @param previousStateRef The state reference of the previous state in the chain. + * + * The primary constructor of the [MembershipAttestation] class is deliberately private + * to enforce static attestation pointers via the secondary constructor. + */ constructor( attestor: AbstractParty, membership: StateAndRef, @@ -79,7 +92,7 @@ class MembershipAttestation internal constructor( membership.state.data.network, attestor, setOf(membership.state.data.holder), - membership.toStaticAttestationPointer(identifier = membership.state.data.linearId.toString()), + membership.toStaticAttestationPointer(), status, metadata, linearId, @@ -126,22 +139,7 @@ class MembershipAttestation internal constructor( * @return Returns a persistent state entity. */ override fun generateMappedObject(schema: MappedSchema): PersistentState = when (schema) { - is MembershipAttestationSchemaV1 -> MembershipAttestationEntity( - linearId = linearId.id, - externalId = linearId.externalId, - attestor = attestor, - holder = holder, - networkValue = network.value, - normalizedNetworkValue = network.normalizedValue, - networkOperator = network.operator, - networkHash = network.hash.toString(), - pointer = pointer.statePointer.toString(), - pointerStateType = pointer.stateType.canonicalName, - pointerHash = pointer.hash.toString(), - status = status, - previousStateRef = previousStateRef?.toString(), - hash = hash.toString() - ) + is MembershipAttestationSchemaV1 -> MembershipAttestationEntity(this) else -> super.generateMappedObject(schema) } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt index f5e52a9..34fbbd1 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipAttestationSchema.kt @@ -76,5 +76,22 @@ object MembershipAttestationSchema { @Column(name = "hash", nullable = false, unique = true) val hash: String = "" - ) : PersistentState() + ) : PersistentState() { + constructor(attestation: MembershipAttestation) : this( + linearId = attestation.linearId.id, + externalId = attestation.linearId.externalId, + attestor = attestation.attestor, + holder = attestation.holder, + networkValue = attestation.network.value, + normalizedNetworkValue = attestation.network.normalizedValue, + networkOperator = attestation.network.operator, + networkHash = attestation.network.hash.toString(), + pointer = attestation.pointer.statePointer.toString(), + pointerStateType = attestation.pointer.stateType.canonicalName, + pointerHash = attestation.pointer.hash.toString(), + status = attestation.status, + previousStateRef = attestation.previousStateRef?.toString(), + hash = attestation.hash.toString() + ) + } } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt index 8fdb4a5..001db0d 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/membership/MembershipSchema.kt @@ -61,5 +61,17 @@ object MembershipSchema { @Column(name = "hash", nullable = false, unique = true) val hash: String = "" - ) : PersistentState() + ) : PersistentState() { + constructor(membership: Membership) : this( + linearId = membership.linearId.id, + externalId = membership.linearId.externalId, + holder = membership.holder, + networkValue = membership.network.value, + normalizedNetworkValue = membership.network.normalizedValue, + networkOperator = membership.network.operator, + networkHash = membership.network.hash.toString(), + isNetworkOperator = membership.isNetworkOperator, + hash = membership.hash.toString() + ) + } } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt index e675720..e7edba4 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt @@ -94,15 +94,7 @@ data class Relationship( * @return Returns a persistent state entity. */ override fun generateMappedObject(schema: MappedSchema): PersistentState = when (schema) { - is RelationshipSchemaV1 -> RelationshipEntity( - linearId = linearId.id, - externalId = linearId.externalId, - networkValue = network.value, - normalizedNetworkValue = network.normalizedValue, - networkOperator = network.operator, - networkHash = network.hash.toString(), - hash = hash.toString() - ) + is RelationshipSchemaV1 -> RelationshipEntity(this) else -> throw IllegalArgumentException("Unrecognised schema: $schema.") } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt index 1ce9029..791d673 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestation.kt @@ -18,6 +18,7 @@ package io.onixlabs.corda.bnms.contract.relationship import io.onixlabs.corda.bnms.contract.Network import io.onixlabs.corda.bnms.contract.NetworkState +import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestationSchema.RelationshipAttestationEntity import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestationSchema.RelationshipAttestationSchemaV1 import io.onixlabs.corda.identityframework.contract.attestations.Attestation @@ -32,6 +33,20 @@ import net.corda.core.identity.AbstractParty import net.corda.core.schemas.MappedSchema import net.corda.core.schemas.PersistentState +/** + * Represents a relationship attestation; a proof that a particular [Relationship] state has been witnessed. + * + * @property network The business network that this relationship attestation belongs to. + * @property attestor The party who is attesting to the witnessed [Relationship] state. + * @property attestees The parties of this attestation, usually the participants of the attested [Relationship] state. + * @property pointer The pointer to the attested [Relationship] state. + * @property status The status of the attestation. + * @property metadata Additional information about the attestation. + * @property linearId The unique identifier of the attestation. + * @property previousStateRef The state reference of the previous state in the chain. + * @property hash The unique hash which represents this attestation. + * @property participants The participants of this attestation; namely the attestor and attestees. + */ @BelongsToContract(RelationshipAttestationContract::class) class RelationshipAttestation internal constructor( override val network: Network, @@ -89,21 +104,7 @@ class RelationshipAttestation internal constructor( } override fun generateMappedObject(schema: MappedSchema): PersistentState = when (schema) { - is RelationshipAttestationSchemaV1 -> RelationshipAttestationEntity( - linearId = linearId.id, - externalId = linearId.externalId, - attestor = attestor, - networkValue = network.value, - normalizedNetworkValue = network.normalizedValue, - networkOperator = network.operator, - networkHash = network.hash.toString(), - pointer = pointer.statePointer.toString(), - pointerStateType = pointer.stateType.canonicalName, - pointerHash = pointer.hash.toString(), - status = status, - previousStateRef = previousStateRef?.toString(), - hash = hash.toString() - ) + is RelationshipAttestationSchemaV1 -> RelationshipAttestationEntity(this) else -> super.generateMappedObject(schema) } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt index fb1a616..1ecf507 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipAttestationSchema.kt @@ -73,5 +73,21 @@ object RelationshipAttestationSchema { @Column(name = "hash", nullable = false, unique = true) val hash: String = "" - ) : PersistentState() + ) : PersistentState() { + constructor(attestation: RelationshipAttestation) : this( + linearId = attestation.linearId.id, + externalId = attestation.linearId.externalId, + attestor = attestation.attestor, + networkValue = attestation.network.value, + normalizedNetworkValue = attestation.network.normalizedValue, + networkOperator = attestation.network.operator, + networkHash = attestation.network.hash.toString(), + pointer = attestation.pointer.statePointer.toString(), + pointerStateType = attestation.pointer.stateType.canonicalName, + pointerHash = attestation.pointer.hash.toString(), + status = attestation.status, + previousStateRef = attestation.previousStateRef?.toString(), + hash = attestation.hash.toString() + ) + } } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt index 85496e9..f8017e4 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt @@ -57,17 +57,7 @@ class RelationshipConfiguration private constructor( get() = SecureHash.sha256("${configuration.hash}$relationshipLinearId") override fun generateMappedObject(schema: MappedSchema) = when (schema) { - is RelationshipConfigurationSchemaV1 -> RelationshipConfigurationEntity( - linearId = linearId.id, - externalId = linearId.externalId, - relationshipLinearId = relationshipLinearId.id, - relationshipExternalId = relationshipLinearId.externalId, - networkValue = network.value, - networkOperator = network.operator, - networkHash = network.hash.toString(), - configurationHash = configuration.hash.toString(), - hash = hash.toString() - ) + is RelationshipConfigurationSchemaV1 -> RelationshipConfigurationEntity(this) else -> throw IllegalArgumentException("Unrecognised schema: $schema.") } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt index d4f696c..2f315b0 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfigurationSchema.kt @@ -49,6 +49,9 @@ object RelationshipConfigurationSchema { @Column(name = "network_value", nullable = false) val networkValue: String = "", + @Column(name = "normalized_network_value", nullable = false) + val normalizedNetworkValue: String = "", + @Column(name = "network_operator", nullable = true) val networkOperator: AbstractParty? = null, @@ -60,5 +63,18 @@ object RelationshipConfigurationSchema { @Column(name = "hash", nullable = false) val hash: String = "" - ) : PersistentState() + ) : PersistentState() { + constructor(configuration: RelationshipConfiguration) : this( + linearId = configuration.linearId.id, + externalId = configuration.linearId.externalId, + relationshipLinearId = configuration.relationshipLinearId.id, + relationshipExternalId = configuration.relationshipLinearId.externalId, + networkValue = configuration.network.value, + normalizedNetworkValue = configuration.network.normalizedValue, + networkOperator = configuration.network.operator, + networkHash = configuration.network.hash.toString(), + configurationHash = configuration.configuration.hash.toString(), + hash = configuration.hash.toString() + ) + } } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt index 2735d11..f50f8d0 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipSchema.kt @@ -54,5 +54,15 @@ object RelationshipSchema { @Column(name = "hash", nullable = false, unique = true) val hash: String = "" - ) : PersistentState() + ) : PersistentState() { + constructor(relationship: Relationship) : this( + linearId = relationship.linearId.id, + externalId = relationship.linearId.externalId, + networkValue = relationship.network.value, + normalizedNetworkValue = relationship.network.normalizedValue, + networkOperator = relationship.network.operator, + networkHash = relationship.network.hash.toString(), + hash = relationship.hash.toString() + ) + } } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLock.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLock.kt index 54b3e57..d44689d 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLock.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLock.kt @@ -40,12 +40,7 @@ data class RevocationLock( } override fun generateMappedObject(schema: MappedSchema): PersistentState = when (schema) { - is RevocationLockSchemaV1 -> RevocationLockEntity( - owner = owner, - pointerStateLinearId = pointer.pointer.id, - pointerStateExternalId = pointer.pointer.externalId, - pointerStateClass = pointer.type.canonicalName - ) + is RevocationLockSchemaV1 -> RevocationLockEntity(this) else -> throw IllegalArgumentException("Unrecognised schema: $schema.") } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockSchema.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockSchema.kt index e3826c6..f3612ac 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockSchema.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/revocation/RevocationLockSchema.kt @@ -46,5 +46,12 @@ object RevocationLockSchema { @Column(name = "pointer_state_class", nullable = false) val pointerStateClass: String = "" - ) : PersistentState() -} \ No newline at end of file + ) : PersistentState() { + constructor(revocationLock: RevocationLock<*>) : this( + owner = revocationLock.owner, + pointerStateLinearId = revocationLock.pointer.pointer.id, + pointerStateExternalId = revocationLock.pointer.pointer.externalId, + pointerStateClass = revocationLock.pointer.type.canonicalName + ) + } +} diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-v1.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-v1.xml index 4bf0c7f..3a0b79a 100644 --- a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-v1.xml +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-v1.xml @@ -21,6 +21,9 @@ + + + @@ -36,4 +39,4 @@ constraintName="PK_relationship_configuration_states" tableName="relationship_configuration_states"/> - \ No newline at end of file + diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt index cb8f6f5..be4dbf9 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt @@ -55,7 +55,7 @@ abstract class ContractTest { @BeforeEach private fun setup() { val networkParameters = testNetworkParameters( - minimumPlatformVersion = 5, + minimumPlatformVersion = 11, notaries = listOf(NotaryInfo(TestIdentity(DUMMY_NOTARY_NAME, 20).party, true)) ) _services = MockServices(cordapps, IDENTITY_A, networkParameters, IDENTITY_B, IDENTITY_C) diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt index 259eb96..defeaa0 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.FlowLogic.kt @@ -19,14 +19,10 @@ package io.onixlabs.corda.bnms.workflow import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.Membership import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation -import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema.MembershipAttestationEntity -import io.onixlabs.corda.bnms.contract.membership.MembershipSchema.MembershipEntity import io.onixlabs.corda.bnms.contract.relationship.Relationship import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation import io.onixlabs.corda.bnms.contract.revocation.RevocationLock -import io.onixlabs.corda.bnms.contract.revocation.RevocationLockSchema.RevocationLockEntity import io.onixlabs.corda.core.services.any -import io.onixlabs.corda.core.services.equalTo import io.onixlabs.corda.core.services.singleOrNull import io.onixlabs.corda.core.services.vaultServiceFor import io.onixlabs.corda.core.workflow.currentStep @@ -54,18 +50,43 @@ fun FlowLogic<*>.checkMembershipHandler(session: FlowSession): Boolean { @Suspendable fun FlowLogic<*>.checkMembershipExists(membership: Membership) { - val membershipExists = serviceHub.vaultServiceFor().any { + val existingMembership = serviceHub.vaultServiceFor().singleOrNull { stateStatus(Vault.StateStatus.ALL) - expression(MembershipEntity::hash equalTo membership.hash.toString()) + membershipHash(membership.hash) } - if (membershipExists) { - throw FlowException("Membership state with the specified unique hash already exists: ${membership.hash}.") + if (existingMembership != null) { + throw FlowException("The specified membership already exists: ${existingMembership.state.data}.") } } @Suspendable -fun FlowLogic<*>.checkMembershipsAndAttestations(relationship: Relationship) { +fun FlowLogic<*>.checkMembershipAttestationExistsForIssuance(attestation: MembershipAttestation) { + val existingAttestation = serviceHub.vaultServiceFor().singleOrNull { + membershipAttestationAttestor(attestation.attestor) + membershipAttestationHolder(attestation.holder) + membershipAttestationNetworkHash(attestation.network.hash) + } + + if (existingAttestation != null) { + throw FlowException("The specified membership attestation already exists and should be amended: ${existingAttestation.state.data}.") + } +} + +@Suspendable +fun FlowLogic<*>.checkMembershipAttestationExistsForAmendment(attestation: MembershipAttestation) { + val existingAttestation = serviceHub.vaultServiceFor().singleOrNull { + stateStatus(Vault.StateStatus.ALL) + membershipAttestationHash(attestation.hash) + } + + if (existingAttestation != null) { + throw FlowException("The specified membership attestation already exists: ${existingAttestation.state.data}.") + } +} + +@Suspendable +fun FlowLogic<*>.checkMembershipsAndAttestations(relationship: Relationship, ourAttestorIdentity: AbstractParty = ourIdentity) { currentStep(CheckMembershipStep) val counterparties = relationship.participants .map { serviceHub.identityService.requireWellKnownPartyFromAnonymous(it) } @@ -73,19 +94,22 @@ fun FlowLogic<*>.checkMembershipsAndAttestations(relationship: Relationship) { counterparties.forEach { val membership = serviceHub.vaultServiceFor().singleOrNull { - expression(MembershipEntity::holder equalTo it) - expression(MembershipEntity::networkHash equalTo relationship.network.hash.toString()) + membershipHolder(it) + membershipNetworkHash(relationship.network.hash) } ?: throw FlowException(buildString { - append("Membership for '$it' on network '${relationship.network}' ") - append("could not be found, or has not been witnessed by this node.") + append("Membership with the specified details could not be found, or has not been witnessed by this node: ") + append("Holder = $it, ") + append("Network = ${relationship.network}.") }) serviceHub.vaultServiceFor().singleOrNull { - expression(MembershipAttestationEntity::attestor equalTo ourIdentity) - expression(MembershipAttestationEntity::pointer equalTo membership.ref.toString()) + membershipAttestationAttestor(ourAttestorIdentity) + membershipAttestationPointer(membership.ref) } ?: throw FlowException(buildString { - append("MembershipAttestation for '${membership.state.data.holder}' ") - append("could not be found, or has not been witnessed by this node.") + append("Membership attestation with the specified details could not be found, or has not been witnessed by this node: ") + append("Holder = ${membership.state.data.holder}, ") + append("Attestor = $ourAttestorIdentity, ") + append("Network = ${membership.state.data.network}.") }) } } @@ -93,9 +117,9 @@ fun FlowLogic<*>.checkMembershipsAndAttestations(relationship: Relationship) { @Suspendable fun FlowLogic<*>.checkRevocationLockExists(owner: AbstractParty, state: LinearState) { val revocationLockExists = serviceHub.vaultServiceFor>().any { - expression(RevocationLockEntity::owner equalTo owner) - expression(RevocationLockEntity::pointerStateClass equalTo state.javaClass.canonicalName) - expression(RevocationLockEntity::pointerStateLinearId equalTo state.linearId.id) + revocationLockOwner(owner) + revocationLockPointerStateClass(state.javaClass) + revocationLockPointerStateLinearId(state.linearId.id) } if (revocationLockExists) { @@ -105,14 +129,17 @@ fun FlowLogic<*>.checkRevocationLockExists(owner: AbstractParty, state: LinearSt @Suspendable fun FlowLogic<*>.findMembershipForAttestation(attestation: MembershipAttestation): StateAndRef { - return attestation.pointer.resolve(serviceHub) ?: throw FlowException( - "Membership for the specified attestation could not be found, or has not been witnessed by this node." - ) + return attestation.pointer.resolve(serviceHub) ?: throw FlowException(buildString { + append("Membership with the specified details could not be found, or has not been witnessed by this node: ") + append("Holder = ${attestation.holder}, ") + append("Network = ${attestation.network}.") + }) } @Suspendable fun FlowLogic<*>.findRelationshipForAttestation(attestation: RelationshipAttestation): StateAndRef { - return attestation.pointer.resolve(serviceHub) ?: throw FlowException( - "Relationship for the specified attestation could not be found, or has not been witnessed by this node." - ) + return attestation.pointer.resolve(serviceHub) ?: throw FlowException(buildString { + append("Relationship with the specified details could not be found, or has not been witnessed by this node: ") + append("Network = ${attestation.network}.") + }) } diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.Membership.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.Membership.kt new file mode 100644 index 0000000..0acae10 --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.Membership.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2020-2022 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import io.onixlabs.corda.bnms.contract.membership.Membership +import io.onixlabs.corda.bnms.contract.membership.MembershipSchema.MembershipEntity +import io.onixlabs.corda.core.services.QueryDsl +import io.onixlabs.corda.core.services.QueryDslContext +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.isNull +import net.corda.core.crypto.SecureHash +import net.corda.core.identity.AbstractParty + +@QueryDslContext +fun QueryDsl.membershipHolder(value: AbstractParty) { + expression(MembershipEntity::holder equalTo value) +} + +@QueryDslContext +fun QueryDsl.membershipNetworkValue(value: String) { + expression(MembershipEntity::networkValue equalTo value) +} + +@QueryDslContext +fun QueryDsl.membershipNormalizedNetworkValue(value: String) { + expression(MembershipEntity::normalizedNetworkValue equalTo value.toUpperCase()) +} + +@QueryDslContext +fun QueryDsl.membershipNetworkOperator(value: AbstractParty?) { + if (value == null) expression(MembershipEntity::networkOperator.isNull()) + else expression(MembershipEntity::networkOperator equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.membershipNetworkHash(value: SecureHash) { + expression(MembershipEntity::networkHash equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.membershipIsNetworkOperator(value: Boolean) { + expression(MembershipEntity::isNetworkOperator equalTo value) +} + +@QueryDslContext +fun QueryDsl.membershipHash(value: SecureHash) { + expression(MembershipEntity::hash equalTo value.toString()) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.MembershipAttestation.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.MembershipAttestation.kt new file mode 100644 index 0000000..968f03f --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.MembershipAttestation.kt @@ -0,0 +1,91 @@ +/* + * Copyright 2020-2022 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema.MembershipAttestationEntity +import io.onixlabs.corda.core.services.QueryDsl +import io.onixlabs.corda.core.services.QueryDslContext +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.isNull +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus +import net.corda.core.contracts.ContractState +import net.corda.core.contracts.StateRef +import net.corda.core.crypto.SecureHash +import net.corda.core.identity.AbstractParty + +@QueryDslContext +fun QueryDsl.membershipAttestationAttestor(value: AbstractParty) { + expression(MembershipAttestationEntity::attestor equalTo value) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationHolder(value: AbstractParty) { + expression(MembershipAttestationEntity::holder equalTo value) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationNetworkValue(value: String) { + expression(MembershipAttestationEntity::networkValue equalTo value) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationNormalizedNetworkValue(value: String) { + expression(MembershipAttestationEntity::normalizedNetworkValue equalTo value.toUpperCase()) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationNetworkOperator(value: AbstractParty?) { + if (value == null) expression(MembershipAttestationEntity::networkOperator.isNull()) + else expression(MembershipAttestationEntity::networkOperator equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationNetworkHash(value: SecureHash) { + expression(MembershipAttestationEntity::networkHash equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationPointer(value: Any) { + expression(MembershipAttestationEntity::pointer equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationPointerStateType(value: Class) { + expression(MembershipAttestationEntity::pointerStateType equalTo value.canonicalName) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationPointerHash(value: SecureHash) { + expression(MembershipAttestationEntity::pointerHash equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationStatus(value: AttestationStatus) { + expression(MembershipAttestationEntity::status equalTo value) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationPreviousStateRef(value: StateRef?) { + if (value == null) expression(MembershipAttestationEntity::previousStateRef.isNull()) + else expression(MembershipAttestationEntity::previousStateRef equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.membershipAttestationHash(value: SecureHash) { + expression(MembershipAttestationEntity::hash equalTo value.toString()) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.Relationship.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.Relationship.kt new file mode 100644 index 0000000..b4cfa43 --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.Relationship.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2020-2022 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import io.onixlabs.corda.bnms.contract.membership.Membership +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestationSchema +import io.onixlabs.corda.bnms.contract.relationship.Relationship +import io.onixlabs.corda.bnms.contract.relationship.RelationshipSchema.RelationshipEntity +import io.onixlabs.corda.core.services.QueryDsl +import io.onixlabs.corda.core.services.QueryDslContext +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.isNull +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus +import net.corda.core.contracts.ContractState +import net.corda.core.contracts.StateRef +import net.corda.core.crypto.SecureHash +import net.corda.core.identity.AbstractParty + +@QueryDslContext +fun QueryDsl.relationshipNetworkValue(value: String) { + expression(RelationshipEntity::networkValue equalTo value) +} + +@QueryDslContext +fun QueryDsl.relationshipNormalizedNetworkValue(value: String) { + expression(RelationshipEntity::normalizedNetworkValue equalTo value.toUpperCase()) +} + +@QueryDslContext +fun QueryDsl.relationshipNetworkOperator(value: AbstractParty?) { + if (value == null) expression(RelationshipEntity::networkOperator.isNull()) + else expression(RelationshipEntity::networkOperator equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipNetworkHash(value: SecureHash) { + expression(RelationshipEntity::networkHash equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipHash(value: SecureHash) { + expression(RelationshipEntity::hash equalTo value.toString()) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RelationshipAttestation.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RelationshipAttestation.kt new file mode 100644 index 0000000..25e23a1 --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RelationshipAttestation.kt @@ -0,0 +1,86 @@ +/* + * Copyright 2020-2022 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestation +import io.onixlabs.corda.bnms.contract.relationship.RelationshipAttestationSchema.RelationshipAttestationEntity +import io.onixlabs.corda.core.services.QueryDsl +import io.onixlabs.corda.core.services.QueryDslContext +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.isNull +import io.onixlabs.corda.identityframework.contract.attestations.AttestationStatus +import net.corda.core.contracts.ContractState +import net.corda.core.contracts.StateRef +import net.corda.core.crypto.SecureHash +import net.corda.core.identity.AbstractParty + +@QueryDslContext +fun QueryDsl.relationshipAttestationAttestor(value: AbstractParty) { + expression(RelationshipAttestationEntity::attestor equalTo value) +} + +@QueryDslContext +fun QueryDsl.relationshipAttestationNetworkValue(value: String) { + expression(RelationshipAttestationEntity::networkValue equalTo value) +} + +@QueryDslContext +fun QueryDsl.relationshipAttestationNormalizedNetworkValue(value: String) { + expression(RelationshipAttestationEntity::normalizedNetworkValue equalTo value.toUpperCase()) +} + +@QueryDslContext +fun QueryDsl.relationshipAttestationNetworkOperator(value: AbstractParty?) { + if (value == null) expression(RelationshipAttestationEntity::networkOperator.isNull()) + else expression(RelationshipAttestationEntity::networkOperator equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipAttestationNetworkHash(value: SecureHash) { + expression(RelationshipAttestationEntity::networkHash equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipAttestationPointer(value: Any) { + expression(RelationshipAttestationEntity::pointer equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipAttestationPointerStateType(value: Class) { + expression(RelationshipAttestationEntity::pointerStateType equalTo value.canonicalName) +} + +@QueryDslContext +fun QueryDsl.relationshipAttestationPointerHash(value: SecureHash) { + expression(RelationshipAttestationEntity::pointerHash equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipAttestationStatus(value: AttestationStatus) { + expression(RelationshipAttestationEntity::status equalTo value) +} + +@QueryDslContext +fun QueryDsl.relationshipAttestationPreviousStateRef(value: StateRef?) { + if (value == null) expression(RelationshipAttestationEntity::previousStateRef.isNull()) + else expression(RelationshipAttestationEntity::previousStateRef equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipAttestationHash(value: SecureHash) { + expression(RelationshipAttestationEntity::hash equalTo value.toString()) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RelationshipConfiguration.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RelationshipConfiguration.kt new file mode 100644 index 0000000..7bee87a --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RelationshipConfiguration.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2020-2022 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import io.onixlabs.corda.bnms.contract.relationship.RelationshipConfiguration +import io.onixlabs.corda.bnms.contract.relationship.RelationshipConfigurationSchema.RelationshipConfigurationEntity +import io.onixlabs.corda.core.services.QueryDsl +import io.onixlabs.corda.core.services.QueryDslContext +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.isNull +import net.corda.core.crypto.SecureHash +import net.corda.core.identity.AbstractParty +import java.util.* + +@QueryDslContext +fun QueryDsl.relationshipConfigurationRelationshipLinearId(value: UUID) { + expression(RelationshipConfigurationEntity::relationshipLinearId equalTo value) +} + +@QueryDslContext +fun QueryDsl.relationshipConfigurationRelationshipExternalId(value: String?) { + if (value == null) expression(RelationshipConfigurationEntity::relationshipExternalId.isNull()) + else expression(RelationshipConfigurationEntity::relationshipExternalId equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipConfigurationNetworkValue(value: String) { + expression(RelationshipConfigurationEntity::networkValue equalTo value) +} + +@QueryDslContext +fun QueryDsl.relationshipConfigurationNormalizedNetworkValue(value: String) { + expression(RelationshipConfigurationEntity::normalizedNetworkValue equalTo value.toUpperCase()) +} + +@QueryDslContext +fun QueryDsl.relationshipConfigurationNetworkOperator(value: AbstractParty?) { + if (value == null) expression(RelationshipConfigurationEntity::networkOperator.isNull()) + else expression(RelationshipConfigurationEntity::networkOperator equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipConfigurationNormalizedNetworkHash(value: SecureHash) { + expression(RelationshipConfigurationEntity::networkHash equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipConfigurationConfigurationHash(value: SecureHash) { + expression(RelationshipConfigurationEntity::configurationHash equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl.relationshipConfigurationHash(value: SecureHash) { + expression(RelationshipConfigurationEntity::hash equalTo value.toString()) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RevocationLock.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RevocationLock.kt new file mode 100644 index 0000000..958b87e --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/Extensions.QueryDsl.RevocationLock.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2020-2022 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow + +import io.onixlabs.corda.bnms.contract.revocation.RevocationLock +import io.onixlabs.corda.bnms.contract.revocation.RevocationLockSchema.RevocationLockEntity +import io.onixlabs.corda.core.services.QueryDsl +import io.onixlabs.corda.core.services.QueryDslContext +import io.onixlabs.corda.core.services.equalTo +import io.onixlabs.corda.core.services.isNull +import net.corda.core.contracts.LinearState +import net.corda.core.identity.AbstractParty +import java.util.* + +@QueryDslContext +fun QueryDsl>.revocationLockOwner(value: AbstractParty) { + expression(RevocationLockEntity::owner equalTo value) +} + +@QueryDslContext +fun QueryDsl>.revocationLockPointerStateLinearId(value: UUID) { + expression(RevocationLockEntity::pointerStateLinearId equalTo value) +} + +@QueryDslContext +fun QueryDsl>.pointerStateExternalId(value: String?) { + if (value == null) expression(RevocationLockEntity::pointerStateExternalId.isNull()) + else expression(RevocationLockEntity::pointerStateExternalId equalTo value.toString()) +} + +@QueryDslContext +fun QueryDsl>.revocationLockPointerStateClass(value: Class) { + expression(RevocationLockEntity::pointerStateClass equalTo value.canonicalName) +} diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt index 37df9e3..0760e59 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendMembershipAttestationFlow.kt @@ -19,6 +19,7 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation import io.onixlabs.corda.bnms.workflow.addAmendedMembershipAttestation +import io.onixlabs.corda.bnms.workflow.checkMembershipAttestationExistsForAmendment import io.onixlabs.corda.bnms.workflow.findMembershipForAttestation import io.onixlabs.corda.core.workflow.* import io.onixlabs.corda.identityframework.workflow.checkAttestationExistsForAmendment @@ -54,7 +55,7 @@ class AmendMembershipAttestationFlow( override fun call(): SignedTransaction { currentStep(InitializeFlowStep) checkSufficientSessionsForContractStates(sessions, newAttestation) - checkAttestationExistsForAmendment(newAttestation) + checkMembershipAttestationExistsForAmendment(newAttestation) val membership = findMembershipForAttestation(newAttestation).referenced() diff --git a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt index 1d43271..b0f679f 100644 --- a/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt +++ b/onixlabs-corda-bnms-workflow/src/main/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueMembershipAttestationFlow.kt @@ -19,6 +19,8 @@ package io.onixlabs.corda.bnms.workflow.membership import co.paralleluniverse.fibers.Suspendable import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation import io.onixlabs.corda.bnms.workflow.addIssuedMembershipAttestation +import io.onixlabs.corda.bnms.workflow.checkMembershipAttestationExistsForAmendment +import io.onixlabs.corda.bnms.workflow.checkMembershipAttestationExistsForIssuance import io.onixlabs.corda.bnms.workflow.findMembershipForAttestation import io.onixlabs.corda.core.workflow.* import io.onixlabs.corda.identityframework.workflow.checkAttestationExistsForIssuance @@ -53,7 +55,7 @@ class IssueMembershipAttestationFlow( override fun call(): SignedTransaction { currentStep(InitializeFlowStep) checkSufficientSessionsForContractStates(sessions, attestation) - checkAttestationExistsForIssuance(attestation) + checkMembershipAttestationExistsForIssuance(attestation) val membership = findMembershipForAttestation(attestation).referenced() diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt index c33769d..df11639 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt @@ -79,7 +79,7 @@ abstract class FlowTest { private fun setup() { _network = MockNetwork( MockNetworkParameters( - networkParameters = testNetworkParameters(minimumPlatformVersion = 10), + networkParameters = testNetworkParameters(minimumPlatformVersion = 11), cordappsForAllNodes = listOf( TestCordapp.findCordapp("io.onixlabs.corda.identityframework.contract"), TestCordapp.findCordapp("io.onixlabs.corda.identityframework.workflow"), diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendDuplicateMembershipAttestationFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendDuplicateMembershipAttestationFlowTests.kt new file mode 100644 index 0000000..798e014 --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/AmendDuplicateMembershipAttestationFlowTests.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2020-2022 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow.membership + +import io.onixlabs.corda.bnms.contract.membership.Membership +import io.onixlabs.corda.bnms.contract.membership.MembershipAttestation +import io.onixlabs.corda.bnms.contract.membership.accept +import io.onixlabs.corda.bnms.workflow.FlowTest +import io.onixlabs.corda.bnms.workflow.Pipeline +import net.corda.core.contracts.StateAndRef +import net.corda.core.flows.FlowException +import net.corda.core.transactions.SignedTransaction +import org.junit.jupiter.api.Test +import kotlin.test.assertFailsWith + +class AmendDuplicateMembershipAttestationFlowTests : FlowTest() { + + private lateinit var membership: StateAndRef + private lateinit var oldAttestation: StateAndRef + private lateinit var newAttestation: MembershipAttestation + private lateinit var transaction: SignedTransaction + + override fun initialize() { + Pipeline + .create(network) + .run(nodeA) { + IssueMembershipFlow.Initiator(MEMBERSHIP, observers = setOf(partyB)) + } + .run(nodeB) { + membership = it.tx.outRefsOfType().single() + val attestation = membership.accept(partyB) + IssueMembershipAttestationFlow.Initiator(attestation) + } + .finally { + oldAttestation = it.tx.outRefsOfType().single() + transaction = it + } + } + + @Test + fun `AmendMembershipAttestationFlow should fail because an existing membership attestation already exists`() { + val exception = assertFailsWith { + Pipeline + .create(network) + .run(nodeB) { + newAttestation = oldAttestation.state.data + AmendMembershipAttestationFlow.Initiator(oldAttestation, newAttestation) + } + } + + assert(exception.message!!.startsWith("The specified membership attestation already exists:")) + } +} diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueDuplicateMembershipAttestationFlowTests.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueDuplicateMembershipAttestationFlowTests.kt new file mode 100644 index 0000000..55d153e --- /dev/null +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/membership/IssueDuplicateMembershipAttestationFlowTests.kt @@ -0,0 +1,71 @@ +/* + * Copyright 2020-2022 ONIXLabs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.onixlabs.corda.bnms.workflow.membership + +import io.onixlabs.corda.bnms.contract.membership.Membership +import io.onixlabs.corda.bnms.contract.membership.accept +import io.onixlabs.corda.bnms.contract.membership.getNextOutput +import io.onixlabs.corda.bnms.workflow.FlowTest +import io.onixlabs.corda.bnms.workflow.Pipeline +import net.corda.core.contracts.StateAndRef +import net.corda.core.flows.FlowException +import net.corda.core.transactions.SignedTransaction +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith + +class IssueDuplicateMembershipAttestationFlowTests : FlowTest() { + + private lateinit var oldMembership: StateAndRef + private lateinit var newMembership: StateAndRef + private lateinit var transaction: SignedTransaction + + override fun initialize() { + Pipeline + .create(network) + .run(nodeA) { + IssueMembershipFlow.Initiator(MEMBERSHIP, observers = setOf(partyB)) + } + .run(nodeB) { + oldMembership = it.tx.outRefsOfType().single() + val attestation = oldMembership.accept(partyB) + IssueMembershipAttestationFlow.Initiator(attestation) + } + .run(nodeA) { + val membership = oldMembership.getNextOutput().configure { addSetting("Test", "Test") } + AmendMembershipFlow.Initiator(oldMembership, membership, observers = setOf(partyB)) + } + .finally { + newMembership = it.tx.outRefsOfType().single() + transaction = it + } + } + + @Test + fun `IssueMembershipAttestationFlow should fail because an existing membership attestation already exists`() { + val exception = assertFailsWith { + Pipeline + .create(network) + .run(nodeB) { + val attestation = newMembership.accept(partyB) + IssueMembershipAttestationFlow.Initiator(attestation) + } + } + + assert(exception.message!!.startsWith("The specified membership attestation already exists and should be amended:")) + } +} From 2b2cda51ead8cea178fe93cd05822e00287c8c55 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Tue, 2 Aug 2022 18:05:59 +0100 Subject: [PATCH 18/23] One-off version reverting to Corda 4.8 for internal work. --- build.gradle | 8 ++++---- gradle.properties | 2 +- .../membership-attestation-schema.changelog-v2.xml | 7 ++++++- .../io/onixlabs/corda/bnms/contract/ContractTest.kt | 2 +- .../kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt | 2 +- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index d82ca5b..ac8de8d 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { corda_artifactory_url = 'https://software.r3.com/artifactory' corda_group = 'net.corda' - corda_release_version = '4.9' + corda_release_version = '4.8' corda_gradle_plugin_group = 'net.corda.plugins' corda_gradle_plugin_version = '5.0.4' @@ -14,10 +14,10 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '4.0.1' - onixlabs_corda_idfx_release_version = '4.0.1' + onixlabs_corda_core_release_version = '4.0.0' + onixlabs_corda_idfx_release_version = '4.0.0' - cordapp_platform_version = 11 + cordapp_platform_version = 10 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' cordapp_workflow_name = 'ONIXLabs Corda BNMS Workflow' cordapp_vendor_name = 'ONIXLabs' diff --git a/gradle.properties b/gradle.properties index 3c028f2..a8fef77 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc11 +version=2.0.0-rc12-pv10 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-v2.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-v2.xml index 03cf877..761760d 100644 --- a/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-v2.xml +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-attestation-schema.changelog-v2.xml @@ -5,6 +5,11 @@ + + + + + @@ -12,4 +17,4 @@ oldColumnName="pointer_state_class" newColumnName="pointer_state_type"/> - \ No newline at end of file + diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt index be4dbf9..d6a5fc9 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt @@ -55,7 +55,7 @@ abstract class ContractTest { @BeforeEach private fun setup() { val networkParameters = testNetworkParameters( - minimumPlatformVersion = 11, + minimumPlatformVersion = 10, notaries = listOf(NotaryInfo(TestIdentity(DUMMY_NOTARY_NAME, 20).party, true)) ) _services = MockServices(cordapps, IDENTITY_A, networkParameters, IDENTITY_B, IDENTITY_C) diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt index df11639..c33769d 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt @@ -79,7 +79,7 @@ abstract class FlowTest { private fun setup() { _network = MockNetwork( MockNetworkParameters( - networkParameters = testNetworkParameters(minimumPlatformVersion = 11), + networkParameters = testNetworkParameters(minimumPlatformVersion = 10), cordappsForAllNodes = listOf( TestCordapp.findCordapp("io.onixlabs.corda.identityframework.contract"), TestCordapp.findCordapp("io.onixlabs.corda.identityframework.workflow"), From 504e1595fc1dce3b3ea5ff036e4995a5f8ed2c3b Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Tue, 2 Aug 2022 19:19:43 +0100 Subject: [PATCH 19/23] One-off version reverting to Corda 4.8 for internal work. --- gradle.properties | 2 +- .../migration/membership-schema.changelog-v2.xml | 12 ++++++++++++ .../relationship-attestation-schema.changelog-v2.xml | 7 ++++++- .../migration/relationship-schema.changelog-v2.xml | 12 ++++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 onixlabs-corda-bnms-contract/src/main/resources/migration/membership-schema.changelog-v2.xml create mode 100644 onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-schema.changelog-v2.xml diff --git a/gradle.properties b/gradle.properties index a8fef77..4300fa0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc12-pv10 +version=2.0.0-rc13-pv10 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-schema.changelog-v2.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-schema.changelog-v2.xml new file mode 100644 index 0000000..7e23a75 --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-schema.changelog-v2.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-v2.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-v2.xml index 1c7c447..51e0635 100644 --- a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-v2.xml +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-attestation-schema.changelog-v2.xml @@ -5,6 +5,11 @@ + + + + + @@ -12,4 +17,4 @@ oldColumnName="pointer_state_class" newColumnName="pointer_state_type"/> - \ No newline at end of file + diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-schema.changelog-v2.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-schema.changelog-v2.xml new file mode 100644 index 0000000..e50141e --- /dev/null +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-schema.changelog-v2.xml @@ -0,0 +1,12 @@ + + + + + + + + + + From 0ef94c5a2f2e26361bf33574254466035ffd1b45 Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Wed, 3 Aug 2022 08:54:28 +0100 Subject: [PATCH 20/23] One-off version reverting to Corda 4.8 for internal work. --- gradle.properties | 2 +- .../resources/migration/membership-schema.changelog-master.xml | 3 ++- .../relationship-configuration-schema.changelog-master.xml | 3 ++- .../migration/relationship-schema.changelog-master.xml | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 4300fa0..78f5ff0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc13-pv10 +version=2.0.0-rc14-pv10 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-schema.changelog-master.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-schema.changelog-master.xml index 79af8cf..286bf3c 100644 --- a/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-schema.changelog-master.xml +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/membership-schema.changelog-master.xml @@ -3,4 +3,5 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> - \ No newline at end of file + + diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml index 473e0a8..5a59bb5 100644 --- a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml @@ -3,4 +3,5 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> - \ No newline at end of file + + diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-schema.changelog-master.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-schema.changelog-master.xml index 875f769..d869861 100644 --- a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-schema.changelog-master.xml +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-schema.changelog-master.xml @@ -3,4 +3,5 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> - \ No newline at end of file + + From 5dce6a003d20acb308263a455e4fe216632b545a Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Wed, 3 Aug 2022 09:10:20 +0100 Subject: [PATCH 21/23] One-off version reverting to Corda 4.8 for internal work. --- .../relationship-configuration-schema.changelog-master.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml index 5a59bb5..37ff2a4 100644 --- a/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml +++ b/onixlabs-corda-bnms-contract/src/main/resources/migration/relationship-configuration-schema.changelog-master.xml @@ -3,5 +3,4 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> - From 832f90f676bac8fe7be02fc3ad57c8ac8de9a19a Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Thu, 18 Aug 2022 23:22:05 +0100 Subject: [PATCH 22/23] Added `@Transient` annotation to criteria fields in resolvable implementations to prevent them being included in serialization. --- build.gradle | 8 ++++---- gradle.properties | 2 +- .../corda/bnms/contract/relationship/Relationship.kt | 1 + .../contract/relationship/RelationshipConfiguration.kt | 1 + .../io/onixlabs/corda/bnms/contract/ContractTest.kt | 2 +- .../kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index ac8de8d..500c2dc 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { corda_artifactory_url = 'https://software.r3.com/artifactory' corda_group = 'net.corda' - corda_release_version = '4.8' + corda_release_version = '4.9' corda_gradle_plugin_group = 'net.corda.plugins' corda_gradle_plugin_version = '5.0.4' @@ -14,10 +14,10 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '4.0.0' - onixlabs_corda_idfx_release_version = '4.0.0' + onixlabs_corda_core_release_version = '4.0.2' + onixlabs_corda_idfx_release_version = '4.0.2' - cordapp_platform_version = 10 + cordapp_platform_version = 11 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' cordapp_workflow_name = 'ONIXLabs Corda BNMS Workflow' cordapp_vendor_name = 'ONIXLabs' diff --git a/gradle.properties b/gradle.properties index 78f5ff0..5fe3d24 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc14-pv10 +version=2.0.0-rc15 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt index e7edba4..2a32486 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt @@ -129,6 +129,7 @@ data class Relationship( /** * The vault query criteria which will be used to resolve relationship configurations. */ + @Transient override val criteria: QueryCriteria = vaultQuery { expression(RelationshipConfigurationEntity::relationshipLinearId equalTo relationshipLinearId.id) } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt index f8017e4..a5f1e10 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt @@ -69,6 +69,7 @@ class RelationshipConfiguration private constructor( private val relationshipLinearId: UniqueIdentifier ) : AbstractSingularResolvable() { + @Transient override val criteria: QueryCriteria = vaultQuery { linearIds(relationshipLinearId) } diff --git a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt index d6a5fc9..be4dbf9 100644 --- a/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt +++ b/onixlabs-corda-bnms-contract/src/test/kotlin/io/onixlabs/corda/bnms/contract/ContractTest.kt @@ -55,7 +55,7 @@ abstract class ContractTest { @BeforeEach private fun setup() { val networkParameters = testNetworkParameters( - minimumPlatformVersion = 10, + minimumPlatformVersion = 11, notaries = listOf(NotaryInfo(TestIdentity(DUMMY_NOTARY_NAME, 20).party, true)) ) _services = MockServices(cordapps, IDENTITY_A, networkParameters, IDENTITY_B, IDENTITY_C) diff --git a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt index c33769d..df11639 100644 --- a/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt +++ b/onixlabs-corda-bnms-workflow/src/test/kotlin/io/onixlabs/corda/bnms/workflow/FlowTest.kt @@ -79,7 +79,7 @@ abstract class FlowTest { private fun setup() { _network = MockNetwork( MockNetworkParameters( - networkParameters = testNetworkParameters(minimumPlatformVersion = 10), + networkParameters = testNetworkParameters(minimumPlatformVersion = 11), cordappsForAllNodes = listOf( TestCordapp.findCordapp("io.onixlabs.corda.identityframework.contract"), TestCordapp.findCordapp("io.onixlabs.corda.identityframework.workflow"), From f032ae0898ff3bec5538854115abfd51f232a77c Mon Sep 17 00:00:00 2001 From: Matthew Layton Date: Fri, 19 Aug 2022 10:13:28 +0100 Subject: [PATCH 23/23] Replaced `@Transient` annotation with `get()` to criteria fields in resolvable implementations to prevent them being included in serialization. --- build.gradle | 4 ++-- gradle.properties | 2 +- .../onixlabs/corda/bnms/contract/relationship/Relationship.kt | 3 +-- .../bnms/contract/relationship/RelationshipConfiguration.kt | 3 +-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 500c2dc..4a4ba16 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ buildscript { junit_version = '5.3.1' onixlabs_group = 'io.onixlabs' - onixlabs_corda_core_release_version = '4.0.2' - onixlabs_corda_idfx_release_version = '4.0.2' + onixlabs_corda_core_release_version = '4.0.3' + onixlabs_corda_idfx_release_version = '4.0.3' cordapp_platform_version = 11 cordapp_contract_name = 'ONIXLabs Corda BNMS Contract' diff --git a/gradle.properties b/gradle.properties index 5fe3d24..2414572 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ name=onixlabs-corda-bnms group=io.onixlabs -version=2.0.0-rc15 +version=2.0.0-rc16 onixlabs.development.jarsign.keystore=../lib/onixlabs.development.pkcs12 onixlabs.development.jarsign.password=5891f47942424d2acbe108691fdb5ba258712fca7e4762be4327241ebf3dbfa3 diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt index 2a32486..b5e0c5e 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/Relationship.kt @@ -129,8 +129,7 @@ data class Relationship( /** * The vault query criteria which will be used to resolve relationship configurations. */ - @Transient - override val criteria: QueryCriteria = vaultQuery { + override val criteria: QueryCriteria get() = vaultQuery { expression(RelationshipConfigurationEntity::relationshipLinearId equalTo relationshipLinearId.id) } diff --git a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt index a5f1e10..4140594 100644 --- a/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt +++ b/onixlabs-corda-bnms-contract/src/main/kotlin/io/onixlabs/corda/bnms/contract/relationship/RelationshipConfiguration.kt @@ -69,8 +69,7 @@ class RelationshipConfiguration private constructor( private val relationshipLinearId: UniqueIdentifier ) : AbstractSingularResolvable() { - @Transient - override val criteria: QueryCriteria = vaultQuery { + override val criteria: QueryCriteria get() = vaultQuery { linearIds(relationshipLinearId) }