From 64fc9009a1bb8eb7521703a5ded612f78ca94a97 Mon Sep 17 00:00:00 2001 From: Tudor Malene Date: Thu, 4 Oct 2018 16:30:45 +0100 Subject: [PATCH] CORDA-1297 - revert column nullability (#4030) * CORDA-1297 revert column nullability * CORDA-1297 address code review comments * CORDA-1297 address code review comments --- .ci/api-current.txt | 16 +++++---- .../net/corda/core/schemas/CommonSchema.kt | 8 ++--- .../net/corda/core/schemas/PersistentTypes.kt | 8 ++--- docs/source/changelog.rst | 6 ---- docs/source/upgrade-notes.rst | 34 ------------------- .../net/corda/finance/schemas/CashSchemaV1.kt | 10 +++--- .../schemas/CommercialPaperSchemaV1.kt | 16 ++++----- .../finance/schemas/SampleCashSchemaV1.kt | 10 +++--- .../finance/schemas/SampleCashSchemaV2.kt | 4 +-- .../finance/schemas/SampleCashSchemaV3.kt | 10 +++--- .../schemas/SampleCommercialPaperSchemaV1.kt | 16 ++++----- .../schemas/SampleCommercialPaperSchemaV2.kt | 8 ++--- .../node/internal/schemas/NodeInfoSchema.kt | 18 +++++----- .../services/events/NodeSchedulerService.kt | 9 ++--- .../identity/PersistentIdentityService.kt | 8 ++--- .../keys/PersistentKeyManagementService.kt | 6 ++-- .../services/messaging/P2PMessagingClient.kt | 6 ++-- .../persistence/DBCheckpointStorage.kt | 2 +- .../DBTransactionMappingStorage.kt | 4 +-- .../persistence/DBTransactionStorage.kt | 4 +-- .../persistence/NodeAttachmentService.kt | 10 +++--- .../NodePropertiesPersistentStore.kt | 4 +-- .../BFTNonValidatingNotaryService.kt | 4 +-- .../PersistentUniquenessProvider.kt | 13 +++---- .../transactions/RaftUniquenessProvider.kt | 6 ++-- .../upgrade/ContractUpgradeServiceImpl.kt | 4 +-- .../corda/node/services/vault/VaultSchema.kt | 26 +++++++------- .../vault/DummyLinearStateSchemaV1.kt | 10 +++--- .../vault/DummyLinearStateSchemaV2.kt | 8 ++--- 29 files changed, 126 insertions(+), 162 deletions(-) diff --git a/.ci/api-current.txt b/.ci/api-current.txt index c0fb3db19e..6dbf664872 100644 --- a/.ci/api-current.txt +++ b/.ci/api-current.txt @@ -4447,19 +4447,21 @@ public class net.corda.core.schemas.PersistentState extends java.lang.Object imp @Embeddable public class net.corda.core.schemas.PersistentStateRef extends java.lang.Object implements java.io.Serializable public () - public (String, int) + public (String, Integer) public (net.corda.core.contracts.StateRef) - @NotNull + @Nullable public final String component1() - public final int component2() + @Nullable + public final Integer component2() @NotNull - public final net.corda.core.schemas.PersistentStateRef copy(String, int) + public final net.corda.core.schemas.PersistentStateRef copy(String, Integer) public boolean equals(Object) - public int getIndex() - @NotNull + @Nullable + public Integer getIndex() + @Nullable public String getTxId() public int hashCode() - public void setIndex(int) + public void setIndex(Integer) public void setTxId(String) public String toString() ## diff --git a/core/src/main/kotlin/net/corda/core/schemas/CommonSchema.kt b/core/src/main/kotlin/net/corda/core/schemas/CommonSchema.kt index 1b9a551063..e7770667d3 100644 --- a/core/src/main/kotlin/net/corda/core/schemas/CommonSchema.kt +++ b/core/src/main/kotlin/net/corda/core/schemas/CommonSchema.kt @@ -54,7 +54,7 @@ object CommonSchemaV1 : MappedSchema(schemaFamily = CommonSchema.javaClass, vers /** [OwnableState] attributes */ /** X500Name of owner party **/ - @Column(name = "owner_name", nullable = true) + @Column(name = "owner_name") var owner: AbstractParty, /** [FungibleAsset] attributes @@ -64,16 +64,16 @@ object CommonSchemaV1 : MappedSchema(schemaFamily = CommonSchema.javaClass, vers */ /** Amount attributes */ - @Column(name = "quantity", nullable = false) + @Column(name = "quantity") var quantity: Long, /** Issuer attributes */ /** X500Name of issuer party **/ - @Column(name = "issuer_name", nullable = true) + @Column(name = "issuer_name") var issuer: AbstractParty, - @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) + @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE) @Type(type = "corda-wrapper-binary") var issuerRef: ByteArray ) : PersistentState() diff --git a/core/src/main/kotlin/net/corda/core/schemas/PersistentTypes.kt b/core/src/main/kotlin/net/corda/core/schemas/PersistentTypes.kt index 986c7b3c26..fbf9b3ccf9 100644 --- a/core/src/main/kotlin/net/corda/core/schemas/PersistentTypes.kt +++ b/core/src/main/kotlin/net/corda/core/schemas/PersistentTypes.kt @@ -57,11 +57,11 @@ open class MappedSchema(schemaFamily: Class<*>, */ @Embeddable data class PersistentStateRef( - @Column(name = "transaction_id", length = 64, nullable = false) - var txId: String, + @Column(name = "transaction_id", length = 64) + var txId: String? = null, - @Column(name = "output_index", nullable = false) - var index: Int + @Column(name = "output_index") + var index: Int? = null ) : Serializable { constructor(stateRef: StateRef) : this(stateRef.txhash.bytes.toHexString(), stateRef.index) } diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 38fdb4c132..60e65b723e 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -60,12 +60,6 @@ Unreleased * Fix CORDA-1229. Setter-based serialization was broken with generic types when the property was stored as the raw type, List for example. -* API change: ``net.corda.core.schemas.PersistentStateRef`` fields (index and txId) are now non-nullable. - The fields were always effectively non-nullable - values were set from non-nullable fields of other objects. - The class is used as database Primary Key columns of other entities and databases already impose those columns as non-nullable - (even if JPA annotation nullable=false was absent). - In case your Cordapps use this entity class to persist data in own custom tables as non Primary Key columns refer to :doc:`upgrade-notes` for upgrade instructions. - * Table name with a typo changed from ``NODE_ATTCHMENTS_CONTRACTS`` to ``NODE_ATTACHMENTS_CONTRACTS``. .. _changelog_v3.2: diff --git a/docs/source/upgrade-notes.rst b/docs/source/upgrade-notes.rst index 0de909ea6b..1520576869 100644 --- a/docs/source/upgrade-notes.rst +++ b/docs/source/upgrade-notes.rst @@ -33,40 +33,6 @@ UNRELEASED <<< Fill this in >>> -* API change: ``net.corda.core.schemas.PersistentStateRef`` fields (``index`` and ``txId``) incorrectly marked as nullable are now non-nullable, - :doc:`changelog` contains the explanation. - - H2 database upgrade action: - - For Cordapps persisting custom entities with ``PersistentStateRef`` used as non Primary Key column, the backing table needs to be updated, - In SQL replace ``your_transaction_id``/``your_output_index`` column names with your custom names, if entity didn't used JPA ``@AttributeOverrides`` - then default names are ``transaction_id`` and ``output_index``. - - .. sourcecode:: sql - - SELECT count(*) FROM [YOUR_PersistentState_TABLE_NAME] WHERE your_transaction_id IS NULL OR your_output_index IS NULL; - - In case your table already contains rows with NULL columns, and the logic doesn't distinguish between NULL and an empty string, - all NULL column occurrences can be changed to an empty string: - - .. sourcecode:: sql - - UPDATE [YOUR_PersistentState_TABLE_NAME] SET your_transaction_id="" WHERE your_transaction_id IS NULL; - UPDATE [YOUR_PersistentState_TABLE_NAME] SET your_output_index="" WHERE your_output_index IS NULL; - - If all rows have NON NULL ``transaction_ids`` and ``output_idx`` or you have assigned empty string values, then it's safe to update the table: - - .. sourcecode:: sql - - ALTER TABLE [YOUR_PersistentState_TABLE_NAME] ALTER COLUMN your_transaction_id SET NOT NULL; - ALTER TABLE [YOUR_PersistentState_TABLE_NAME] ALTER COLUMN your_output_index SET NOT NULL; - - If the table already contains rows with NULL values, and the logic caters differently between NULL and an empty string, - and the logic has to be preserved you would need to create copy of ``PersistentStateRef`` class with different name and use the new class in your entity. - - No action is needed for default node tables as ``PersistentStateRef`` is used as Primary Key only and the backing columns are automatically not nullable - or custom Cordapp entities using ``PersistentStateRef`` as Primary Key. - v3.1 to v3.2 ------------ diff --git a/finance/src/main/kotlin/net/corda/finance/schemas/CashSchemaV1.kt b/finance/src/main/kotlin/net/corda/finance/schemas/CashSchemaV1.kt index dfa936798c..351dcc0c70 100644 --- a/finance/src/main/kotlin/net/corda/finance/schemas/CashSchemaV1.kt +++ b/finance/src/main/kotlin/net/corda/finance/schemas/CashSchemaV1.kt @@ -26,19 +26,19 @@ object CashSchemaV1 : MappedSchema(schemaFamily = CashSchema.javaClass, version Index(name = "pennies_idx", columnList = "pennies"))) class PersistentCashState( /** X500Name of owner party **/ - @Column(name = "owner_name", nullable = true) + @Column(name = "owner_name") var owner: AbstractParty, - @Column(name = "pennies", nullable = false) + @Column(name = "pennies") var pennies: Long, - @Column(name = "ccy_code", length = 3, nullable = false) + @Column(name = "ccy_code", length = 3) var currency: String, - @Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE) var issuerPartyHash: String, - @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) + @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE) @Type(type = "corda-wrapper-binary") var issuerRef: ByteArray ) : PersistentState() diff --git a/finance/src/main/kotlin/net/corda/finance/schemas/CommercialPaperSchemaV1.kt b/finance/src/main/kotlin/net/corda/finance/schemas/CommercialPaperSchemaV1.kt index e4b6d638d8..701630514c 100644 --- a/finance/src/main/kotlin/net/corda/finance/schemas/CommercialPaperSchemaV1.kt +++ b/finance/src/main/kotlin/net/corda/finance/schemas/CommercialPaperSchemaV1.kt @@ -29,29 +29,29 @@ object CommercialPaperSchemaV1 : MappedSchema(schemaFamily = CommercialPaperSche Index(name = "maturity_index", columnList = "maturity_instant"), Index(name = "face_value_index", columnList = "face_value"))) class PersistentCommercialPaperState( - @Column(name = "issuance_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "issuance_key_hash", length = MAX_HASH_HEX_SIZE) var issuancePartyHash: String, - @Column(name = "issuance_ref", nullable = false) + @Column(name = "issuance_ref") @Type(type = "corda-wrapper-binary") var issuanceRef: ByteArray, - @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE) var ownerHash: String, - @Column(name = "maturity_instant", nullable = false) + @Column(name = "maturity_instant") var maturity: Instant, - @Column(name = "face_value", nullable = false) + @Column(name = "face_value") var faceValue: Long, - @Column(name = "ccy_code", length = 3, nullable = false) + @Column(name = "ccy_code", length = 3) var currency: String, - @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE) var faceValueIssuerPartyHash: String, - @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) + @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE) @Type(type = "corda-wrapper-binary") var faceValueIssuerRef: ByteArray ) : PersistentState() diff --git a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV1.kt b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV1.kt index 0c6d104e53..7b9b76e1b4 100644 --- a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV1.kt +++ b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV1.kt @@ -25,19 +25,19 @@ object SampleCashSchemaV1 : MappedSchema(schemaFamily = CashSchema.javaClass, ve indexes = arrayOf(Index(name = "ccy_code_idx1", columnList = "ccy_code"), Index(name = "pennies_idx1", columnList = "pennies"))) class PersistentCashState( - @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE) var ownerHash: String, - @Column(name = "pennies", nullable = false) + @Column(name = "pennies") var pennies: Long, - @Column(name = "ccy_code", length = 3, nullable = false) + @Column(name = "ccy_code", length = 3) var currency: String, - @Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE) var issuerPartyHash: String, - @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) + @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE) @Type(type = "corda-wrapper-binary") var issuerRef: ByteArray ) : PersistentState() diff --git a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV2.kt b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV2.kt index 09cb2dab95..7d893206c6 100644 --- a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV2.kt +++ b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV2.kt @@ -16,7 +16,7 @@ object SampleCashSchemaV2 : MappedSchema(schemaFamily = CashSchema.javaClass, ve indexes = arrayOf(Index(name = "ccy_code_idx2", columnList = "ccy_code"))) class PersistentCashState( /** product type */ - @Column(name = "ccy_code", length = 3, nullable = false) + @Column(name = "ccy_code", length = 3) var currency: String, participants: Set, owner: AbstractParty, @@ -26,7 +26,7 @@ object SampleCashSchemaV2 : MappedSchema(schemaFamily = CashSchema.javaClass, ve ) : CommonSchemaV1.FungibleState(participants.toMutableSet(), owner, quantity, issuerParty, issuerRef.bytes) { @ElementCollection - @Column(name = "participants", nullable = true) + @Column(name = "participants") @CollectionTable(name="cash_states_v2_participants", joinColumns = arrayOf( JoinColumn(name = "output_index", referencedColumnName = "output_index"), JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"))) diff --git a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV3.kt b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV3.kt index 85a6c63de2..0a6c0cc289 100644 --- a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV3.kt +++ b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV3.kt @@ -26,20 +26,20 @@ object SampleCashSchemaV3 : MappedSchema(schemaFamily = CashSchema.javaClass, ve var participants: MutableSet? = null, /** X500Name of owner party **/ - @Column(name = "owner_name", nullable = true) + @Column(name = "owner_name") var owner: AbstractParty, - @Column(name = "pennies", nullable = false) + @Column(name = "pennies") var pennies: Long, - @Column(name = "ccy_code", length = 3, nullable = false) + @Column(name = "ccy_code", length = 3) var currency: String, /** X500Name of issuer party **/ - @Column(name = "issuer_name", nullable = true) + @Column(name = "issuer_name") var issuer: AbstractParty, - @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) + @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE) @Type(type = "corda-wrapper-binary") var issuerRef: ByteArray ) : PersistentState() diff --git a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV1.kt b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV1.kt index 16696571eb..e3080952f4 100644 --- a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV1.kt +++ b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV1.kt @@ -27,29 +27,29 @@ object SampleCommercialPaperSchemaV1 : MappedSchema(schemaFamily = CommercialPap Index(name = "maturity_index", columnList = "maturity_instant"), Index(name = "face_value_index", columnList = "face_value"))) class PersistentCommercialPaperState( - @Column(name = "issuance_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "issuance_key_hash", length = MAX_HASH_HEX_SIZE) var issuancePartyHash: String, - @Column(name = "issuance_ref", nullable = false) + @Column(name = "issuance_ref") @Type(type = "corda-wrapper-binary") var issuanceRef: ByteArray, - @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE) var ownerHash: String, - @Column(name = "maturity_instant", nullable = false) + @Column(name = "maturity_instant") var maturity: Instant, - @Column(name = "face_value", nullable = false) + @Column(name = "face_value") var faceValue: Long, - @Column(name = "ccy_code", length = 3, nullable = false) + @Column(name = "ccy_code", length = 3) var currency: String, - @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE) var faceValueIssuerPartyHash: String, - @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) + @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE) @Type(type = "corda-wrapper-binary") var faceValueIssuerRef: ByteArray ) : PersistentState() diff --git a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV2.kt b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV2.kt index dd1357aa76..84a2547259 100644 --- a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV2.kt +++ b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV2.kt @@ -21,16 +21,16 @@ object SampleCommercialPaperSchemaV2 : MappedSchema(schemaFamily = CommercialPap indexes = arrayOf(Index(name = "ccy_code_index2", columnList = "ccy_code"), Index(name = "maturity_index2", columnList = "maturity_instant"))) class PersistentCommercialPaperState( - @Column(name = "maturity_instant", nullable = false) + @Column(name = "maturity_instant") var maturity: Instant, - @Column(name = "ccy_code", length = 3, nullable = false) + @Column(name = "ccy_code", length = 3) var currency: String, - @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE) var faceValueIssuerPartyHash: String, - @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) + @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE) @Type(type = "corda-wrapper-binary") var faceValueIssuerRef: ByteArray, diff --git a/node/src/main/kotlin/net/corda/node/internal/schemas/NodeInfoSchema.kt b/node/src/main/kotlin/net/corda/node/internal/schemas/NodeInfoSchema.kt index 2d2d504d4c..3e0386b149 100644 --- a/node/src/main/kotlin/net/corda/node/internal/schemas/NodeInfoSchema.kt +++ b/node/src/main/kotlin/net/corda/node/internal/schemas/NodeInfoSchema.kt @@ -25,25 +25,25 @@ object NodeInfoSchemaV1 : MappedSchema( class PersistentNodeInfo( @Id @GeneratedValue - @Column(name = "node_info_id", nullable = false) + @Column(name = "node_info_id") var id: Int, - @Column(name = "node_info_hash", length = 64, nullable = false) + @Column(name="node_info_hash", length = 64) val hash: String, - @Column(name = "addresses", nullable = false) + @Column(name = "addresses") @OneToMany(cascade = arrayOf(CascadeType.ALL), orphanRemoval = true) @JoinColumn(name = "node_info_id", foreignKey = ForeignKey(name = "FK__info_hosts__infos")) val addresses: List, - @Column(name = "legal_identities_certs", nullable = false) + @Column(name = "legal_identities_certs") @ManyToMany(cascade = arrayOf(CascadeType.ALL)) @JoinTable(name = "node_link_nodeinfo_party", joinColumns = arrayOf(JoinColumn(name = "node_info_id", foreignKey = ForeignKey(name = "FK__link_nodeinfo_party__infos"))), inverseJoinColumns = arrayOf(JoinColumn(name = "party_name", foreignKey = ForeignKey(name = "FK__link_ni_p__info_p_cert")))) val legalIdentitiesAndCerts: List, - @Column(name = "platform_version", nullable = false) + @Column(name = "platform_version") val platformVersion: Int, /** @@ -51,7 +51,7 @@ object NodeInfoSchemaV1 : MappedSchema( * Not expected to be sequential, but later versions of the registration must have higher values * Similar to the serial number on DNS records. */ - @Column(name = "serial", nullable = false) + @Column(name = "serial") val serial: Long ) : Serializable { fun toNodeInfo(): NodeInfo { @@ -69,7 +69,7 @@ object NodeInfoSchemaV1 : MappedSchema( data class DBHostAndPort( @Id @GeneratedValue - @Column(name = "hosts_id", nullable = false) + @Column(name = "hosts_id") var id: Int, val host: String? = null, val port: Int? = null @@ -95,11 +95,11 @@ object NodeInfoSchemaV1 : MappedSchema( @Column(name = "party_name", nullable = false) val name: String, - @Column(name = "owning_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "owning_key_hash", length = MAX_HASH_HEX_SIZE) val owningKeyHash: String, @Lob - @Column(name = "party_cert_binary", nullable = false) + @Column(name = "party_cert_binary") val partyCertBinary: ByteArray, diff --git a/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt b/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt index 4ca0384cc1..be5a44091a 100644 --- a/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt +++ b/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt @@ -114,13 +114,14 @@ class NodeSchedulerService(private val clock: CordaClock, toPersistentEntityKey = { PersistentStateRef(it.txhash.toString(), it.index) }, fromPersistentEntity = { //TODO null check will become obsolete after making DB/JPA columns not nullable - val txId = it.output.txId - val index = it.output.index + val txId = it.output.txId ?: throw IllegalStateException("DB returned null SecureHash transactionId") + val index = it.output.index ?: throw IllegalStateException("DB returned null SecureHash index") Pair(StateRef(SecureHash.parse(txId), index), ScheduledStateRef(StateRef(SecureHash.parse(txId), index), it.scheduledAt)) }, toPersistentEntity = { key: StateRef, value: ScheduledStateRef -> - PersistentScheduledState(PersistentStateRef(key.txhash.toString(), key.index)).apply { + PersistentScheduledState().apply { + output = PersistentStateRef(key.txhash.toString(), key.index) scheduledAt = value.scheduledAt } }, @@ -151,7 +152,7 @@ class NodeSchedulerService(private val clock: CordaClock, @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}scheduled_states") class PersistentScheduledState( @EmbeddedId - var output: PersistentStateRef, + var output: PersistentStateRef = PersistentStateRef(), @Column(name = "scheduled_at", nullable = false) var scheduledAt: Instant = Instant.now() diff --git a/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt b/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt index eb525fb792..a6fb506c86 100644 --- a/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt +++ b/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt @@ -69,11 +69,11 @@ class PersistentIdentityService(override val trustRoot: X509Certificate, @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}identities") class PersistentIdentity( @Id - @Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE) var publicKeyHash: String = "", @Lob - @Column(name = "identity_value", nullable = false) + @Column(name = "identity_value") var identity: ByteArray = ByteArray(0) ) : Serializable @@ -81,10 +81,10 @@ class PersistentIdentityService(override val trustRoot: X509Certificate, @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}named_identities") class PersistentIdentityNames( @Id - @Column(name = "name", length = 128, nullable = false) + @Column(name = "name", length = 128) var name: String = "", - @Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE) var publicKeyHash: String = "" ) : Serializable diff --git a/node/src/main/kotlin/net/corda/node/services/keys/PersistentKeyManagementService.kt b/node/src/main/kotlin/net/corda/node/services/keys/PersistentKeyManagementService.kt index 0860e1443c..6249a01212 100644 --- a/node/src/main/kotlin/net/corda/node/services/keys/PersistentKeyManagementService.kt +++ b/node/src/main/kotlin/net/corda/node/services/keys/PersistentKeyManagementService.kt @@ -33,15 +33,15 @@ class PersistentKeyManagementService(val identityService: IdentityService, class PersistentKey( @Id - @Column(name = "public_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) + @Column(name = "public_key_hash", length = MAX_HASH_HEX_SIZE) var publicKeyHash: String, @Lob - @Column(name = "public_key", nullable = false) + @Column(name = "public_key") var publicKey: ByteArray = ByteArray(0), @Lob - @Column(name = "private_key", nullable = false) + @Column(name = "private_key") var privateKey: ByteArray = ByteArray(0) ) : Serializable { constructor(publicKey: PublicKey, privateKey: PrivateKey) diff --git a/node/src/main/kotlin/net/corda/node/services/messaging/P2PMessagingClient.kt b/node/src/main/kotlin/net/corda/node/services/messaging/P2PMessagingClient.kt index ac960379c2..a2c3c61717 100644 --- a/node/src/main/kotlin/net/corda/node/services/messaging/P2PMessagingClient.kt +++ b/node/src/main/kotlin/net/corda/node/services/messaging/P2PMessagingClient.kt @@ -202,15 +202,15 @@ class P2PMessagingClient(private val config: NodeConfiguration, @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}message_retry") class RetryMessage( @Id - @Column(name = "message_id", length = 64, nullable = false) + @Column(name = "message_id", length = 64) var key: Long = 0, @Lob - @Column(nullable = false) + @Column var message: ByteArray = ByteArray(0), @Lob - @Column(nullable = false) + @Column var recipients: ByteArray = ByteArray(0) ) : Serializable diff --git a/node/src/main/kotlin/net/corda/node/services/persistence/DBCheckpointStorage.kt b/node/src/main/kotlin/net/corda/node/services/persistence/DBCheckpointStorage.kt index 8515ed9fe6..4db96c1e22 100644 --- a/node/src/main/kotlin/net/corda/node/services/persistence/DBCheckpointStorage.kt +++ b/node/src/main/kotlin/net/corda/node/services/persistence/DBCheckpointStorage.kt @@ -20,7 +20,7 @@ class DBCheckpointStorage : CheckpointStorage { @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}checkpoints") class DBCheckpoint( @Id - @Column(name = "checkpoint_id", length = 64, nullable = false) + @Column(name = "checkpoint_id", length = 64) var checkpointId: String = "", @Column(name = "checkpoint_value") diff --git a/node/src/main/kotlin/net/corda/node/services/persistence/DBTransactionMappingStorage.kt b/node/src/main/kotlin/net/corda/node/services/persistence/DBTransactionMappingStorage.kt index 2825ada9af..9e9137cf03 100644 --- a/node/src/main/kotlin/net/corda/node/services/persistence/DBTransactionMappingStorage.kt +++ b/node/src/main/kotlin/net/corda/node/services/persistence/DBTransactionMappingStorage.kt @@ -29,10 +29,10 @@ class DBTransactionMappingStorage : StateMachineRecordedTransactionMappingStorag @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}transaction_mappings") class DBTransactionMapping( @Id - @Column(name = "tx_id", length = 64, nullable = false) + @Column(name = "tx_id", length = 64) var txId: String = "", - @Column(name = "state_machine_run_id", length = 36, nullable = false) + @Column(name = "state_machine_run_id", length = 36) var stateMachineRunId: String = "" ) : Serializable diff --git a/node/src/main/kotlin/net/corda/node/services/persistence/DBTransactionStorage.kt b/node/src/main/kotlin/net/corda/node/services/persistence/DBTransactionStorage.kt index 6b420bf2a4..880047f765 100644 --- a/node/src/main/kotlin/net/corda/node/services/persistence/DBTransactionStorage.kt +++ b/node/src/main/kotlin/net/corda/node/services/persistence/DBTransactionStorage.kt @@ -30,11 +30,11 @@ class DBTransactionStorage(cacheSizeBytes: Long) : WritableTransactionStorage, S @Table(name = "${NODE_DATABASE_PREFIX}transactions") class DBTransaction( @Id - @Column(name = "tx_id", length = 64, nullable = false) + @Column(name = "tx_id", length = 64) var txId: String = "", @Lob - @Column(name = "transaction_value", nullable = false) + @Column(name = "transaction_value") var transaction: ByteArray = ByteArray(0) ) : Serializable diff --git a/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt b/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt index 3e501131b0..83cfbf5c8a 100644 --- a/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt +++ b/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt @@ -75,24 +75,24 @@ class NodeAttachmentService( indexes = arrayOf(Index(name = "att_id_idx", columnList = "att_id"))) class DBAttachment( @Id - @Column(name = "att_id", nullable = false) + @Column(name = "att_id") var attId: String, - @Column(name = "content", nullable = false) + @Column(name = "content") @Lob var content: ByteArray, @Column(name = "insertion_date", nullable = false, updatable = false) var insertionDate: Instant = Instant.now(), - @Column(name = "uploader", updatable = false, nullable = true) + @Column(name = "uploader", updatable = false) var uploader: String? = null, - @Column(name = "filename", updatable = false, nullable = true) + @Column(name = "filename", updatable = false) var filename: String? = null, @ElementCollection - @Column(name = "contract_class_name", nullable = false) + @Column(name = "contract_class_name") @CollectionTable(name = "${NODE_DATABASE_PREFIX}attachments_contracts", joinColumns = arrayOf( JoinColumn(name = "att_id", referencedColumnName = "att_id")), foreignKey = ForeignKey(name = "FK__ctr_class__attachments")) diff --git a/node/src/main/kotlin/net/corda/node/services/persistence/NodePropertiesPersistentStore.kt b/node/src/main/kotlin/net/corda/node/services/persistence/NodePropertiesPersistentStore.kt index 89039b5706..28a6aaab95 100644 --- a/node/src/main/kotlin/net/corda/node/services/persistence/NodePropertiesPersistentStore.kt +++ b/node/src/main/kotlin/net/corda/node/services/persistence/NodePropertiesPersistentStore.kt @@ -30,10 +30,10 @@ class NodePropertiesPersistentStore(readPhysicalNodeId: () -> String, persistenc @Table(name = "${NODE_DATABASE_PREFIX}properties") class DBNodeProperty( @Id - @Column(name = "property_key", nullable = false) + @Column(name = "property_key") val key: String = "", - @Column(name = "property_value", nullable = true) + @Column(name = "property_value") var value: String? = "" ) : Serializable } diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt b/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt index 5aeac561c2..4602088edd 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt @@ -107,8 +107,8 @@ class BFTNonValidatingNotaryService( toPersistentEntityKey = { PersistentStateRef(it.txhash.toString(), it.index) }, fromPersistentEntity = { //TODO null check will become obsolete after making DB/JPA columns not nullable - val txId = it.id.txId - val index = it.id.index + val txId = it.id.txId ?: throw IllegalStateException("DB returned null SecureHash transactionId") + val index = it.id.index ?: throw IllegalStateException("DB returned null SecureHash index") Pair(StateRef(txhash = SecureHash.parse(txId), index = index), UniquenessProvider.ConsumingTx( id = SecureHash.parse(it.consumingTxHash), diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/PersistentUniquenessProvider.kt b/node/src/main/kotlin/net/corda/node/services/transactions/PersistentUniquenessProvider.kt index 5f37b27ce0..7fd3bf01a9 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/PersistentUniquenessProvider.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/PersistentUniquenessProvider.kt @@ -29,12 +29,12 @@ class PersistentUniquenessProvider : UniquenessProvider, SingletonSerializeAsTok @MappedSuperclass open class PersistentUniqueness( @EmbeddedId - var id: PersistentStateRef, + var id: PersistentStateRef = PersistentStateRef(), - @Column(name = "consuming_transaction_id", nullable = false) + @Column(name = "consuming_transaction_id") var consumingTxHash: String = "", - @Column(name = "consuming_input_index", length = 36, nullable = false) + @Column(name = "consuming_input_index", length = 36) var consumingIndex: Int = 0, @Embedded @@ -43,10 +43,10 @@ class PersistentUniquenessProvider : UniquenessProvider, SingletonSerializeAsTok @Embeddable data class PersistentParty( - @Column(name = "requesting_party_name", nullable = false) + @Column(name = "requesting_party_name") var name: String = "", - @Column(name = "requesting_party_key", length = 255, nullable = false) + @Column(name = "requesting_party_key", length = 255) @Type(type = "corda-wrapper-binary") var owningKey: ByteArray = ByteArray(0) ) : Serializable @@ -71,7 +71,8 @@ class PersistentUniquenessProvider : UniquenessProvider, SingletonSerializeAsTok fromPersistentEntity = { //TODO null check will become obsolete after making DB/JPA columns not nullable val txId = it.id.txId - val index = it.id.index + ?: throw IllegalStateException("DB returned null SecureHash transactionId") + val index = it.id.index ?: throw IllegalStateException("DB returned null SecureHash index") Pair(StateRef(txhash = SecureHash.parse(txId), index = index), UniquenessProvider.ConsumingTx( id = SecureHash.parse(it.consumingTxHash), diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt b/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt index 1aa9bdca3b..8a659e7621 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt @@ -75,14 +75,14 @@ class RaftUniquenessProvider(private val transportConfiguration: NodeSSLConfigur @Table(name = "${NODE_DATABASE_PREFIX}raft_committed_states") class RaftState( @Id - @Column(name = "id", nullable = false) + @Column(name = "id") var key: String = "", @Lob - @Column(name = "state_value", nullable = false) + @Column(name = "state_value") var value: ByteArray = ByteArray(0), - @Column(name = "state_index", nullable = false) + @Column(name = "state_index") var index: Long = 0 ) : Serializable diff --git a/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt b/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt index f5ad410ea2..68f0854770 100644 --- a/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt +++ b/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt @@ -18,11 +18,11 @@ class ContractUpgradeServiceImpl : ContractUpgradeService, SingletonSerializeAsT @Table(name = "${NODE_DATABASE_PREFIX}contract_upgrades") class DBContractUpgrade( @Id - @Column(name = "state_ref", length = 96, nullable = false) + @Column(name = "state_ref", length = 96) var stateRef: String = "", /** refers to the UpgradedContract class name*/ - @Column(name = "contract_class_name", nullable = false) + @Column(name = "contract_class_name") var upgradedContractClassName: String = "" ) : Serializable diff --git a/node/src/main/kotlin/net/corda/node/services/vault/VaultSchema.kt b/node/src/main/kotlin/net/corda/node/services/vault/VaultSchema.kt index a76237f4fe..5dceb42bab 100644 --- a/node/src/main/kotlin/net/corda/node/services/vault/VaultSchema.kt +++ b/node/src/main/kotlin/net/corda/node/services/vault/VaultSchema.kt @@ -36,19 +36,19 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio // TODO: create a distinct table to hold serialized state data (once DBTransactionStore is encrypted) /** refers to the X500Name of the notary a state is attached to */ - @Column(name = "notary_name", nullable = false) + @Column(name = "notary_name") var notary: Party, /** references a concrete ContractState that is [QueryableState] and has a [MappedSchema] */ - @Column(name = "contract_state_class_name", nullable = false) + @Column(name = "contract_state_class_name") var contractStateClassName: String, /** state lifecycle: unconsumed, consumed */ - @Column(name = "state_status", nullable = false) + @Column(name = "state_status") var stateStatus: Vault.StateStatus, /** refers to timestamp recorded upon entering UNCONSUMED state */ - @Column(name = "recorded_timestamp", nullable = false) + @Column(name = "recorded_timestamp") var recordedTime: Instant, /** refers to timestamp recorded upon entering CONSUMED state */ @@ -87,7 +87,7 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio /** * Represents a [LinearState] [UniqueIdentifier] */ - @Column(name = "external_id", nullable = true) + @Column(name = "external_id") var externalId: String?, @Column(name = "uuid", nullable = false) @@ -112,13 +112,13 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio JoinColumn(name = "output_index", referencedColumnName = "output_index"), JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id")), foreignKey = ForeignKey(name = "FK__fung_st_parts__fung_st")) - @Column(name = "participants", nullable = true) + @Column(name = "participants") var participants: MutableSet? = null, /** [OwnableState] attributes */ /** X500Name of owner party **/ - @Column(name = "owner_name", nullable = true) + @Column(name = "owner_name") var owner: AbstractParty, /** [FungibleAsset] attributes @@ -128,16 +128,16 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio */ /** Amount attributes */ - @Column(name = "quantity", nullable = false) + @Column(name = "quantity") var quantity: Long, /** Issuer attributes */ /** X500Name of issuer party **/ - @Column(name = "issuer_name", nullable = true) + @Column(name = "issuer_name") var issuer: AbstractParty, - @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) + @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE) @Type(type = "corda-wrapper-binary") var issuerRef: ByteArray ) : PersistentState() { @@ -156,13 +156,13 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio class VaultTxnNote( @Id @GeneratedValue - @Column(name = "seq_no", nullable = false) + @Column(name = "seq_no") var seqNo: Int, - @Column(name = "transaction_id", length = 64, nullable = false) + @Column(name = "transaction_id", length = 64) var txId: String, - @Column(name = "note", nullable = false) + @Column(name = "note") var note: String ) : Serializable { constructor(txId: String, note: String) : this(0, txId, note) diff --git a/testing/test-utils/src/main/kotlin/net/corda/testing/internal/vault/DummyLinearStateSchemaV1.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/internal/vault/DummyLinearStateSchemaV1.kt index b271e98443..d2ff099848 100644 --- a/testing/test-utils/src/main/kotlin/net/corda/testing/internal/vault/DummyLinearStateSchemaV1.kt +++ b/testing/test-utils/src/main/kotlin/net/corda/testing/internal/vault/DummyLinearStateSchemaV1.kt @@ -33,7 +33,7 @@ object DummyLinearStateSchemaV1 : MappedSchema(schemaFamily = DummyLinearStateSc /** * UniqueIdentifier */ - @Column(name = "external_id", nullable = true) + @Column(name = "external_id") var externalId: String?, @Column(name = "uuid", nullable = false) @@ -43,16 +43,16 @@ object DummyLinearStateSchemaV1 : MappedSchema(schemaFamily = DummyLinearStateSc /** * Dummy attributes */ - @Column(name = "linear_string", nullable = false) + @Column(name = "linear_string") var linearString: String, - @Column(name = "linear_number", nullable = false) + @Column(name = "linear_number") var linearNumber: Long, - @Column(name = "linear_timestamp", nullable = false) + @Column(name = "linear_timestamp") var linearTimestamp: Instant, - @Column(name = "linear_boolean", nullable = false) + @Column(name = "linear_boolean") var linearBoolean: Boolean ) : PersistentState() } diff --git a/testing/test-utils/src/main/kotlin/net/corda/testing/internal/vault/DummyLinearStateSchemaV2.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/internal/vault/DummyLinearStateSchemaV2.kt index 78ac579e03..ea0feb4f63 100644 --- a/testing/test-utils/src/main/kotlin/net/corda/testing/internal/vault/DummyLinearStateSchemaV2.kt +++ b/testing/test-utils/src/main/kotlin/net/corda/testing/internal/vault/DummyLinearStateSchemaV2.kt @@ -23,13 +23,13 @@ object DummyLinearStateSchemaV2 : MappedSchema(schemaFamily = DummyLinearStateSc JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"))) override var participants: MutableSet? = null, - @Column(name = "linear_string", nullable = false) var linearString: String, + @Column(name = "linear_string") var linearString: String, - @Column(name = "linear_number", nullable = false) var linearNumber: Long, + @Column(name = "linear_number") var linearNumber: Long, - @Column(name = "linear_timestamp", nullable = false) var linearTimestamp: java.time.Instant, + @Column(name = "linear_timestamp") var linearTimestamp: java.time.Instant, - @Column(name = "linear_boolean", nullable = false) var linearBoolean: Boolean, + @Column(name = "linear_boolean") var linearBoolean: Boolean, @Transient val uid: UniqueIdentifier