From 642b951baeef2a803548c3e2c7b4b1d8bd050c7f Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Mon, 9 May 2016 16:54:31 +0100 Subject: [PATCH] Rename PartyReference to PartyAndReference --- .../kotlin/contracts/AnotherDummyContract.kt | 2 +- .../kotlin/core/node/DummyContractBackdoor.kt | 2 +- .../java/contracts/ICommercialPaperState.java | 2 +- .../java/contracts/JavaCommercialPaper.java | 10 +++++----- contracts/src/main/kotlin/contracts/Cash.kt | 4 ++-- .../main/kotlin/contracts/CommercialPaper.kt | 6 +++--- .../src/main/kotlin/contracts/CrowdFund.kt | 2 +- .../main/kotlin/contracts/DummyContract.kt | 2 +- core/src/main/kotlin/core/Structures.kt | 4 ++-- .../core/node/AttachmentClassLoaderTests.kt | 2 +- src/test/resources/core/node/isolated.jar | Bin 6707 -> 6455 bytes 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/contracts/isolated/src/main/kotlin/contracts/AnotherDummyContract.kt b/contracts/isolated/src/main/kotlin/contracts/AnotherDummyContract.kt index bfad79a036..8f6a79e0d0 100644 --- a/contracts/isolated/src/main/kotlin/contracts/AnotherDummyContract.kt +++ b/contracts/isolated/src/main/kotlin/contracts/AnotherDummyContract.kt @@ -34,7 +34,7 @@ class AnotherDummyContract : Contract, core.node.DummyContractBackdoor { // The "empty contract" override val legalContractReference: SecureHash = SecureHash.sha256("https://anotherdummy.org") - override fun generateInitial(owner: PartyReference, magicNumber: Int) : TransactionBuilder { + override fun generateInitial(owner: PartyAndReference, magicNumber: Int) : TransactionBuilder { val state = State(magicNumber) return TransactionBuilder().withItems( state, Command(Commands.Create(), owner.party.owningKey) ) } diff --git a/contracts/isolated/src/main/kotlin/core/node/DummyContractBackdoor.kt b/contracts/isolated/src/main/kotlin/core/node/DummyContractBackdoor.kt index 4349a295c9..5dea3865f6 100644 --- a/contracts/isolated/src/main/kotlin/core/node/DummyContractBackdoor.kt +++ b/contracts/isolated/src/main/kotlin/core/node/DummyContractBackdoor.kt @@ -1,7 +1,7 @@ package core.node interface DummyContractBackdoor { - fun generateInitial(owner: core.PartyReference, magicNumber: Int) : core.TransactionBuilder + fun generateInitial(owner: core.PartyAndReference, magicNumber: Int) : core.TransactionBuilder fun inspectState(state: core.ContractState) : Int } \ No newline at end of file diff --git a/contracts/src/main/java/contracts/ICommercialPaperState.java b/contracts/src/main/java/contracts/ICommercialPaperState.java index 75f8ce0e2c..9c08b81539 100644 --- a/contracts/src/main/java/contracts/ICommercialPaperState.java +++ b/contracts/src/main/java/contracts/ICommercialPaperState.java @@ -13,7 +13,7 @@ import java.time.*; public interface ICommercialPaperState extends ContractState { ICommercialPaperState withOwner(PublicKey newOwner); - ICommercialPaperState withIssuance(PartyReference newIssuance); + ICommercialPaperState withIssuance(PartyAndReference newIssuance); ICommercialPaperState withFaceValue(Amount newFaceValue); diff --git a/contracts/src/main/java/contracts/JavaCommercialPaper.java b/contracts/src/main/java/contracts/JavaCommercialPaper.java index b891b41a9e..466a058ca9 100644 --- a/contracts/src/main/java/contracts/JavaCommercialPaper.java +++ b/contracts/src/main/java/contracts/JavaCommercialPaper.java @@ -23,7 +23,7 @@ public class JavaCommercialPaper implements Contract { public static Contract JCP_PROGRAM_ID = new JavaCommercialPaper(); public static class State implements ContractState, ICommercialPaperState { - private PartyReference issuance; + private PartyAndReference issuance; private PublicKey owner; private Amount faceValue; private Instant maturityDate; @@ -31,7 +31,7 @@ public class JavaCommercialPaper implements Contract { public State() { } // For serialization - public State(PartyReference issuance, PublicKey owner, Amount faceValue, Instant maturityDate) { + public State(PartyAndReference issuance, PublicKey owner, Amount faceValue, Instant maturityDate) { this.issuance = issuance; this.owner = owner; this.faceValue = faceValue; @@ -46,7 +46,7 @@ public class JavaCommercialPaper implements Contract { return new State(this.issuance, newOwner, this.faceValue, this.maturityDate); } - public ICommercialPaperState withIssuance(PartyReference newIssuance) { + public ICommercialPaperState withIssuance(PartyAndReference newIssuance) { return new State(newIssuance, this.owner, this.faceValue, this.maturityDate); } @@ -58,7 +58,7 @@ public class JavaCommercialPaper implements Contract { return new State(this.issuance, this.owner, this.faceValue, newMaturityDate); } - public PartyReference getIssuance() { + public PartyAndReference getIssuance() { return issuance; } @@ -215,7 +215,7 @@ public class JavaCommercialPaper implements Contract { return SecureHash.sha256("https://en.wikipedia.org/wiki/Commercial_paper"); } - public TransactionBuilder generateIssue(@NotNull PartyReference issuance, @NotNull Amount faceValue, @Nullable Instant maturityDate) { + public TransactionBuilder generateIssue(@NotNull PartyAndReference issuance, @NotNull Amount faceValue, @Nullable Instant maturityDate) { State state = new State(issuance, issuance.getParty().getOwningKey(), faceValue, maturityDate); return new TransactionBuilder().withItems(state, new Command(new Commands.Issue(), issuance.getParty().getOwningKey())); } diff --git a/contracts/src/main/kotlin/contracts/Cash.kt b/contracts/src/main/kotlin/contracts/Cash.kt index 067cf7308a..6960e2dfd3 100644 --- a/contracts/src/main/kotlin/contracts/Cash.kt +++ b/contracts/src/main/kotlin/contracts/Cash.kt @@ -48,7 +48,7 @@ class Cash : Contract { /** A state representing a cash claim against some party */ data class State( /** Where the underlying currency backing this ledger entry can be found (propagated) */ - val deposit: PartyReference, + val deposit: PartyAndReference, val amount: Amount, @@ -147,7 +147,7 @@ class Cash : Contract { /** * Puts together an issuance transaction for the specified amount that starts out being owned by the given pubkey. */ - fun generateIssue(tx: TransactionBuilder, amount: Amount, at: PartyReference, owner: PublicKey) { + fun generateIssue(tx: TransactionBuilder, amount: Amount, at: PartyAndReference, owner: PublicKey) { check(tx.inputStates().isEmpty()) check(tx.outputStates().sumCashOrNull() == null) tx.addOutputState(Cash.State(at, amount, owner)) diff --git a/contracts/src/main/kotlin/contracts/CommercialPaper.kt b/contracts/src/main/kotlin/contracts/CommercialPaper.kt index 776587efb5..51c45e4c2a 100644 --- a/contracts/src/main/kotlin/contracts/CommercialPaper.kt +++ b/contracts/src/main/kotlin/contracts/CommercialPaper.kt @@ -38,7 +38,7 @@ class CommercialPaper : Contract { override val legalContractReference: SecureHash = SecureHash.sha256("https://en.wikipedia.org/wiki/Commercial_paper") data class State( - val issuance: PartyReference, + val issuance: PartyAndReference, override val owner: PublicKey, val faceValue: Amount, val maturityDate: Instant @@ -52,7 +52,7 @@ class CommercialPaper : Contract { // Although kotlin is smart enough not to need these, as we are using the ICommercialPaperState, we need to declare them explicitly for use later, override fun withOwner(newOwner: PublicKey): ICommercialPaperState = copy(owner = newOwner) - override fun withIssuance(newIssuance: PartyReference): ICommercialPaperState = copy(issuance = newIssuance) + override fun withIssuance(newIssuance: PartyAndReference): ICommercialPaperState = copy(issuance = newIssuance) override fun withFaceValue(newFaceValue: Amount): ICommercialPaperState = copy(faceValue = newFaceValue) override fun withMaturityDate(newMaturityDate: Instant): ICommercialPaperState = copy(maturityDate = newMaturityDate) } @@ -129,7 +129,7 @@ class CommercialPaper : Contract { * an existing transaction because you aren't able to issue multiple pieces of CP in a single transaction * at the moment: this restriction is not fundamental and may be lifted later. */ - fun generateIssue(issuance: PartyReference, faceValue: Amount, maturityDate: Instant): TransactionBuilder { + fun generateIssue(issuance: PartyAndReference, faceValue: Amount, maturityDate: Instant): TransactionBuilder { val state = State(issuance, issuance.party.owningKey, faceValue, maturityDate) return TransactionBuilder().withItems(state, Command(Commands.Issue(), issuance.party.owningKey)) } diff --git a/contracts/src/main/kotlin/contracts/CrowdFund.kt b/contracts/src/main/kotlin/contracts/CrowdFund.kt index ac3f0ceafd..f18e8c3cd2 100644 --- a/contracts/src/main/kotlin/contracts/CrowdFund.kt +++ b/contracts/src/main/kotlin/contracts/CrowdFund.kt @@ -136,7 +136,7 @@ class CrowdFund : Contract { * Returns a transaction that registers a crowd-funding campaing, owned by the issuing institution's key. Does not update * an existing transaction because it's not possible to register multiple campaigns in a single transaction */ - fun generateRegister(owner: PartyReference, fundingTarget: Amount, fundingName: String, closingTime: Instant): TransactionBuilder { + fun generateRegister(owner: PartyAndReference, fundingTarget: Amount, fundingName: String, closingTime: Instant): TransactionBuilder { val campaign = Campaign(owner = owner.party.owningKey, name = fundingName, target = fundingTarget, closingTime = closingTime) val state = State(campaign) return TransactionBuilder().withItems(state, Command(Commands.Register(), owner.party.owningKey)) diff --git a/contracts/src/main/kotlin/contracts/DummyContract.kt b/contracts/src/main/kotlin/contracts/DummyContract.kt index d51debdeee..a1be678dd9 100644 --- a/contracts/src/main/kotlin/contracts/DummyContract.kt +++ b/contracts/src/main/kotlin/contracts/DummyContract.kt @@ -23,7 +23,7 @@ class DummyContract : Contract { // The "empty contract" override val legalContractReference: SecureHash = SecureHash.sha256("") - fun generateInitial(owner: PartyReference, magicNumber: Int) : TransactionBuilder { + fun generateInitial(owner: PartyAndReference, magicNumber: Int) : TransactionBuilder { val state = State(magicNumber) return TransactionBuilder().withItems( state, Command(Commands.Create(), owner.party.owningKey) ) } diff --git a/core/src/main/kotlin/core/Structures.kt b/core/src/main/kotlin/core/Structures.kt index f6ab805168..0ce94f7115 100644 --- a/core/src/main/kotlin/core/Structures.kt +++ b/core/src/main/kotlin/core/Structures.kt @@ -73,7 +73,7 @@ inline fun List>.filterSt data class Party(val name: String, val owningKey: PublicKey) { override fun toString() = name - fun ref(bytes: OpaqueBytes) = PartyReference(this, bytes) + fun ref(bytes: OpaqueBytes) = PartyAndReference(this, bytes) fun ref(vararg bytes: Byte) = ref(OpaqueBytes.of(*bytes)) } @@ -81,7 +81,7 @@ data class Party(val name: String, val owningKey: PublicKey) { * Reference to something being stored or issued by a party e.g. in a vault or (more likely) on their normal * ledger. The reference is intended to be encrypted so it's meaningless to anyone other than the party. */ -data class PartyReference(val party: Party, val reference: OpaqueBytes) { +data class PartyAndReference(val party: Party, val reference: OpaqueBytes) { override fun toString() = "${party.name}$reference" } diff --git a/src/test/kotlin/core/node/AttachmentClassLoaderTests.kt b/src/test/kotlin/core/node/AttachmentClassLoaderTests.kt index 92c9eb5437..d75cbc4522 100644 --- a/src/test/kotlin/core/node/AttachmentClassLoaderTests.kt +++ b/src/test/kotlin/core/node/AttachmentClassLoaderTests.kt @@ -19,7 +19,7 @@ import kotlin.test.assertFailsWith import kotlin.test.assertNotNull interface DummyContractBackdoor { - fun generateInitial(owner: PartyReference, magicNumber: Int): TransactionBuilder + fun generateInitial(owner: PartyAndReference, magicNumber: Int): TransactionBuilder fun inspectState(state: ContractState): Int } diff --git a/src/test/resources/core/node/isolated.jar b/src/test/resources/core/node/isolated.jar index a4166fdd4d7ca38c30ddf27ca630b11687a6134f..5f8a093238383da60a757137f1c9d2ef039cc06f 100644 GIT binary patch literal 6455 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 literal 6707 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