From a63e08d94cf465e21b64edfd948853129537f41a Mon Sep 17 00:00:00 2001 From: szymonsztuka Date: Fri, 25 May 2018 17:38:34 +0200 Subject: [PATCH 1/6] Add example in docs for node SSH server port configuration option. (#3236) --- docs/source/corda-configuration-file.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/corda-configuration-file.rst b/docs/source/corda-configuration-file.rst index 5e073f2970..7c5c00234b 100644 --- a/docs/source/corda-configuration-file.rst +++ b/docs/source/corda-configuration-file.rst @@ -195,7 +195,7 @@ absolute path to the node's base directory. :sshd: If provided, node will start internal SSH server which will provide a management shell. It uses the same credentials and permissions as RPC subsystem. It has one required parameter. - :port: The port to start SSH server on + :port: The port to start SSH server on e.g. ``sshd { port = 2222 }``. :jmxMonitoringHttpPort: If set, will enable JMX metrics reporting via the Jolokia HTTP/JSON agent on the corresponding port. Default Jolokia access url is http://127.0.0.1:port/jolokia/ From d772bc8b7f20d9b02f96b6473c5a067711c68155 Mon Sep 17 00:00:00 2001 From: Shams Asari Date: Fri, 25 May 2018 17:07:19 +0100 Subject: [PATCH 2/6] Added back support for parsing OpaqueBytes as UTF-8 strings in JacksonSupport (#3240) --- .../kotlin/net/corda/client/jackson/JacksonSupport.kt | 3 ++- .../net/corda/client/jackson/JacksonSupportTest.kt | 10 ++++++++-- docs/source/shell.rst | 6 +++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt b/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt index d360997fbf..af64d56aa4 100644 --- a/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt +++ b/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt @@ -39,6 +39,7 @@ import net.corda.core.utilities.toBase58String import org.bouncycastle.asn1.x509.KeyPurposeId import java.lang.reflect.Modifier import java.math.BigDecimal +import java.nio.charset.StandardCharsets.UTF_8 import java.security.PublicKey import java.security.cert.CertPath import java.security.cert.CertificateFactory @@ -416,7 +417,7 @@ object JacksonSupport { @Deprecated("This is an internal class, do not use") object OpaqueBytesDeserializer : JsonDeserializer() { override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): OpaqueBytes { - return OpaqueBytes(parser.binaryValue) + return OpaqueBytes(parser.text?.toByteArray(UTF_8) ?: parser.binaryValue) } } diff --git a/client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt b/client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt index 4283523a33..86c50a4160 100644 --- a/client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt +++ b/client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt @@ -39,6 +39,7 @@ import org.junit.runner.RunWith import org.junit.runners.Parameterized import org.junit.runners.Parameterized.Parameters import java.math.BigInteger +import java.nio.charset.StandardCharsets.* import java.security.PublicKey import java.security.cert.CertPath import java.security.cert.X509Certificate @@ -103,12 +104,17 @@ class JacksonSupportTest(@Suppress("unused") private val name: String, factory: } @Test - fun OpaqueBytes() { + fun `OpaqueBytes serialization`() { val opaqueBytes = OpaqueBytes(secureRandomBytes(128)) val json = mapper.valueToTree(opaqueBytes) assertThat(json.binaryValue()).isEqualTo(opaqueBytes.bytes) assertThat(json.asText()).isEqualTo(opaqueBytes.bytes.toBase64()) - assertThat(mapper.convertValue(json)).isEqualTo(opaqueBytes) + } + + @Test + fun `OpaqueBytes deserialization`() { + assertThat(mapper.convertValue(TextNode("1234"))).isEqualTo(OpaqueBytes("1234".toByteArray(UTF_8))) + assertThat(mapper.convertValue(BinaryNode(byteArrayOf(1, 2, 3, 4)))).isEqualTo(OpaqueBytes.of(1, 2, 3, 4)) } @Test diff --git a/docs/source/shell.rst b/docs/source/shell.rst index b03bf70601..a83c018655 100644 --- a/docs/source/shell.rst +++ b/docs/source/shell.rst @@ -267,9 +267,9 @@ SecureHash ~~~~~~~~~~ A parameter of type ``SecureHash`` can be written as a hexadecimal string: ``F69A7626ACC27042FEEAE187E6BFF4CE666E6F318DC2B32BE9FAF87DF687930C`` -OpaqueBytes and SerializedBytes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -A parameter of type ``OpaqueBytes`` can be provided as a string in Base64. +OpaqueBytes +~~~~~~~~~~~ +A parameter of type ``OpaqueBytes`` can be provided as a UTF-8 string. PublicKey and CompositeKey ~~~~~~~~~~~~~~~~~~~~~~~~~~ From 8504b65e7b14a95fc4486c82d1e3e77d1c4e3562 Mon Sep 17 00:00:00 2001 From: Katarzyna Streich Date: Fri, 25 May 2018 17:14:00 +0100 Subject: [PATCH 3/6] ENT-1933: make NetworkParameters serialization compatible (#3234) * ENT-1933: make NetworkParameters serialization compatible --- .../net/corda/core/node/NetworkParameters.kt | 23 ++++++++++++++++-- .../serialization-default-evolution.rst | 3 +-- .../net/corda/node/internal/AbstractNode.kt | 6 ++--- .../node/internal/NetworkParametersReader.kt | 22 +++++++++-------- .../services/network/NetworkMapUpdater.kt | 2 +- .../network/NetworkParametersReaderTest.kt | 13 ++++++++++ .../network-compatibility/network-parameters | Bin 0 -> 3976 bytes .../internal/amqp/EvolutionSerializer.kt | 2 +- 8 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 node/src/test/resources/network-compatibility/network-parameters diff --git a/core/src/main/kotlin/net/corda/core/node/NetworkParameters.kt b/core/src/main/kotlin/net/corda/core/node/NetworkParameters.kt index becd7e9d29..4747c9aece 100644 --- a/core/src/main/kotlin/net/corda/core/node/NetworkParameters.kt +++ b/core/src/main/kotlin/net/corda/core/node/NetworkParameters.kt @@ -3,6 +3,7 @@ package net.corda.core.node import net.corda.core.identity.Party import net.corda.core.node.services.AttachmentId import net.corda.core.serialization.CordaSerializable +import net.corda.core.serialization.DeprecatedConstructorForDeserialization import net.corda.core.utilities.days import java.time.Duration import java.time.Instant @@ -23,7 +24,7 @@ import java.time.Instant * during this period */ @CordaSerializable -data class NetworkParameters @JvmOverloads constructor( +data class NetworkParameters( val minimumPlatformVersion: Int, val notaries: List, val maxMessageSize: Int, @@ -31,8 +32,26 @@ data class NetworkParameters @JvmOverloads constructor( val modifiedTime: Instant, val epoch: Int, val whitelistedContractImplementations: Map>, - val eventHorizon: Duration = Int.MAX_VALUE.days + val eventHorizon: Duration ) { + @DeprecatedConstructorForDeserialization(1) + constructor (minimumPlatformVersion: Int, + notaries: List, + maxMessageSize: Int, + maxTransactionSize: Int, + modifiedTime: Instant, + epoch: Int, + whitelistedContractImplementations: Map> + ) : this(minimumPlatformVersion, + notaries, + maxMessageSize, + maxTransactionSize, + modifiedTime, + epoch, + whitelistedContractImplementations, + Int.MAX_VALUE.days + ) + init { require(minimumPlatformVersion > 0) { "minimumPlatformVersion must be at least 1" } require(notaries.distinctBy { it.identity } == notaries) { "Duplicate notary identities" } diff --git a/docs/source/serialization-default-evolution.rst b/docs/source/serialization-default-evolution.rst index 282ca452b8..1f4923a357 100644 --- a/docs/source/serialization-default-evolution.rst +++ b/docs/source/serialization-default-evolution.rst @@ -64,7 +64,7 @@ above. A sensible default for the missing value is provided for instantiation of order, see the discussion below. As before, instances of the class at version A will be able to deserialize serialized forms of example B as it -will simply treat them as if the property has been removed (as from its perspective, they will have been.) +will simply treat them as if the property has been removed (as from its perspective, they will have been). Constructor Versioning @@ -144,7 +144,6 @@ be: // The third alteration, and how it currently exists, property e added data class Example3 (val a: Int, val b: Int, val c: Int, val d: Int, val: Int e) { - // NOTE: version number purposefully omitted from annotation for demonstration purposes @DeprecatedConstructorForDeserialization(1) constructor (a: Int, b: Int) : this(a, b, -1, -1, -1) // alt constructor 1 @DeprecatedConstructorForDeserialization(2) diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index 755913f54b..759fcade4a 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -283,8 +283,8 @@ abstract class AbstractNode(val configuration: NodeConfiguration, val identityService = makeIdentityService(identity.certificate) networkMapClient = configuration.networkServices?.let { NetworkMapClient(it.networkMapURL, identityService.trustRoot) } - - val networkParameters = NetworkParametersReader(identityService.trustRoot, networkMapClient, configuration.baseDirectory).networkParameters + val networkParameteresReader = NetworkParametersReader(identityService.trustRoot, networkMapClient, configuration.baseDirectory) + val networkParameters = networkParameteresReader.networkParameters check(networkParameters.minimumPlatformVersion <= versionInfo.platformVersion) { "Node's platform version is lower than network's required minimumPlatformVersion" } @@ -354,7 +354,7 @@ abstract class AbstractNode(val configuration: NodeConfiguration, networkMapUpdater = NetworkMapUpdater(services.networkMapCache, NodeInfoWatcher(configuration.baseDirectory, getRxIoScheduler(), Duration.ofMillis(configuration.additionalNodeInfoPollingFrequencyMsec)), networkMapClient, - networkParameters.serialize().hash, + networkParameteresReader.hash, services.myInfo.serialize().hash, configuration.baseDirectory, configuration.extraNetworkMapKeys) diff --git a/node/src/main/kotlin/net/corda/node/internal/NetworkParametersReader.kt b/node/src/main/kotlin/net/corda/node/internal/NetworkParametersReader.kt index fb565e149e..8b1a7001d6 100644 --- a/node/src/main/kotlin/net/corda/node/internal/NetworkParametersReader.kt +++ b/node/src/main/kotlin/net/corda/node/internal/NetworkParametersReader.kt @@ -21,11 +21,14 @@ class NetworkParametersReader(private val trustRoot: X509Certificate, private val logger = contextLogger() } + private data class NetworkParamsAndHash(val networkParameters: NetworkParameters, val hash: SecureHash) private val networkParamsFile = baseDirectory / NETWORK_PARAMS_FILE_NAME private val parametersUpdateFile = baseDirectory / NETWORK_PARAMS_UPDATE_FILE_NAME - val networkParameters by lazy { retrieveNetworkParameters() } + private val netParamsAndHash by lazy { retrieveNetworkParameters() } + val networkParameters get() = netParamsAndHash.networkParameters + val hash get() = netParamsAndHash.hash - private fun retrieveNetworkParameters(): NetworkParameters { + private fun retrieveNetworkParameters(): NetworkParamsAndHash { val advertisedParametersHash = try { networkMapClient?.getNetworkMap()?.payload?.networkParameterHash } catch (e: Exception) { @@ -43,17 +46,17 @@ class NetworkParametersReader(private val trustRoot: X509Certificate, // on the other we have parameters update process - it needs to be unified. Say you start the node, you don't have matching parameters, // you get them from network map, but you have to run the approval step. if (signedParametersFromFile == null) { // Node joins for the first time. - downloadParameters(trustRoot, advertisedParametersHash) + downloadParameters(advertisedParametersHash) } else if (signedParametersFromFile.raw.hash == advertisedParametersHash) { // Restarted with the same parameters. - signedParametersFromFile.verifiedNetworkMapCert(trustRoot) + signedParametersFromFile } else { // Update case. - readParametersUpdate(advertisedParametersHash, signedParametersFromFile.raw.hash).verifiedNetworkMapCert(trustRoot) + readParametersUpdate(advertisedParametersHash, signedParametersFromFile.raw.hash) } } else { // No compatibility zone configured. Node should proceed with parameters from file. - signedParametersFromFile?.verifiedNetworkMapCert(trustRoot) ?: throw IllegalArgumentException("Couldn't find network parameters file and compatibility zone wasn't configured/isn't reachable") + signedParametersFromFile ?: throw IllegalArgumentException("Couldn't find network parameters file and compatibility zone wasn't configured/isn't reachable") } logger.info("Loaded network parameters: $parameters") - return parameters + return NetworkParamsAndHash(parameters.verifiedNetworkMapCert(trustRoot), parameters.raw.hash) } private fun readParametersUpdate(advertisedParametersHash: SecureHash, previousParametersHash: SecureHash): SignedNetworkParameters { @@ -74,14 +77,13 @@ class NetworkParametersReader(private val trustRoot: X509Certificate, } // Used only when node joins for the first time. - private fun downloadParameters(trustRoot: X509Certificate, parametersHash: SecureHash): NetworkParameters { + private fun downloadParameters(parametersHash: SecureHash): SignedNetworkParameters { logger.info("No network-parameters file found. Expecting network parameters to be available from the network map.") val networkMapClient = checkNotNull(networkMapClient) { "Node hasn't been configured to connect to a network map from which to get the network parameters" } val signedParams = networkMapClient.getNetworkParameters(parametersHash) - val verifiedParams = signedParams.verifiedNetworkMapCert(trustRoot) signedParams.serialize().open().copyTo(baseDirectory / NETWORK_PARAMS_FILE_NAME) - return verifiedParams + return signedParams } } diff --git a/node/src/main/kotlin/net/corda/node/services/network/NetworkMapUpdater.kt b/node/src/main/kotlin/net/corda/node/services/network/NetworkMapUpdater.kt index ce0bb7c4dd..2541a527ba 100644 --- a/node/src/main/kotlin/net/corda/node/services/network/NetworkMapUpdater.kt +++ b/node/src/main/kotlin/net/corda/node/services/network/NetworkMapUpdater.kt @@ -181,7 +181,7 @@ The node will shutdown now.""") val (update, signedNewNetParams) = requireNotNull(newNetworkParameters) { "Couldn't find parameters update for the hash: $parametersHash" } // We should check that we sign the right data structure hash. val newNetParams = signedNewNetParams.verifiedNetworkMapCert(networkMapClient.trustedRoot) - val newParametersHash = newNetParams.serialize().hash + val newParametersHash = signedNewNetParams.raw.hash if (parametersHash == newParametersHash) { // The latest parameters have priority. signedNewNetParams.serialize() diff --git a/node/src/test/kotlin/net/corda/node/services/network/NetworkParametersReaderTest.kt b/node/src/test/kotlin/net/corda/node/services/network/NetworkParametersReaderTest.kt index 975b2e077d..cfd1e6825c 100644 --- a/node/src/test/kotlin/net/corda/node/services/network/NetworkParametersReaderTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/network/NetworkParametersReaderTest.kt @@ -6,6 +6,8 @@ import net.corda.core.internal.createDirectories import net.corda.core.internal.div import net.corda.core.internal.exists import net.corda.core.internal.readObject +import net.corda.core.serialization.deserialize +import net.corda.core.utilities.days import net.corda.core.utilities.seconds import net.corda.node.internal.NetworkParametersReader import net.corda.nodeapi.internal.network.* @@ -23,6 +25,7 @@ import java.net.URL import java.nio.file.FileSystem import kotlin.test.assertEquals import kotlin.test.assertFalse +import kotlin.test.assertNotNull class NetworkParametersReaderTest { @Rule @@ -73,4 +76,14 @@ class NetworkParametersReaderTest { val parameters = NetworkParametersReader(DEV_ROOT_CA.certificate, networkMapClient, baseDirectory).networkParameters assertThat(parameters).isEqualTo(fileParameters) } + + @Test + fun `serialized parameters compatibility`() { + // Network parameters file from before eventHorizon extension + val inputStream = javaClass.classLoader.getResourceAsStream("network-compatibility/network-parameters") + assertNotNull(inputStream) + val inByteArray: ByteArray = inputStream.readBytes() + val parameters = inByteArray.deserialize() + assertThat(parameters.verified().eventHorizon).isEqualTo(Int.MAX_VALUE.days) + } } \ No newline at end of file diff --git a/node/src/test/resources/network-compatibility/network-parameters b/node/src/test/resources/network-compatibility/network-parameters new file mode 100644 index 0000000000000000000000000000000000000000..7eac063459cbf36264758bc36ca7acd782eede16 GIT binary patch literal 3976 zcmb_f3uqhX9lty2?(F!r#Hk(9I8`3*NSw%@?8+}}PY&QB2w}q~RF*eqY(XM4||C1B> zBwIFt3M9Vo?)UxQ|KI;pSXLq&Nf5-Tn<4lm2=X@sQ8fn(8?m%o!kRN|B045B>4izP zaeS<8K}(JL64Q?+Bw@6x3((~+1DeW1E6tCF)xnWzF5_Dmjih^($+?)aj4nNDDtU<@ zO2@O33w4)vt_IwS;3R*6V#NlxmMpHK?(u==HisTM{Pj7x{tcYae`!Z{uPUNi{Y&$TuGf_?qWq zfV-TJlVXu{NNbrL8%Kg$l3XpxXj`i(&%tu$9BZ!q0AI2UJ zv9zneTNQ@^t7V)c$&kQ@2XSWc0NRge#@2unwq3-YzyD>&r_FEG)*k)sJCz?b-@G+4 z|Mly%zW4pTuB#WQ+aYhBr&Hmki2;8cx6d|m-iAj~{3FvX5_s?$B<^0#P*4TzJOtG& z9#)1$N$wpDkEmLBMCIKFj+$R<9Jf`9oM$xfl-e3%Cey7prdp;JCs` zDi_vxSy~5N&+0WIFY#hh91%DzDl6h7I0c7_NdGFUmy2?QkMcM&4t1(;URAOIPrl^= zRxgpvGT^bQllu)9sXMcWk{T~Khj>-%Tr<+y%ITM)a(98ic~;+@j`JE8;4F^#Wl2-O z(|$1_U=d3iXF8o#H9+dUE2<80iB45hcqw+kvGQ~+1Hwusp~=pmS(>pRzvmIb~_LlGMA7(A6T%WgD6!uSXT61q~aE6{fD zg%esp%M|7sif>bj6Zi<^K#J*XNR|c6NdcXXa)OGjg+Uwd&>Ki!$CYAC^Qp@UWSWZI6WGs+8rr8GR7vwNx5z@aR zCJ(a%Xh2qCoW!fyZYzd!u=-c5xCx2ZEZ98L9smY}nWq)8oiWZbUtTu{beqT}a^WlN zlwxDVk|xHG7#-a&k9am>fpBnkVJ@W3CI^tV&>NIpvkfz;bXS)}Gi|&=>yCoHTt!)y z1BKp&TH8nPA>WYNH=k_sHZ^B@rpGuK-yS1m%Z0>lmZalYrU-yI(Sv&@nFU+5*cgB-|t-I3ph zVXSCQXybN2EMPi?p^jdHBWKVP)Jgb0xM-tDiYh_RT>168WwxKAtxU=ObA4}j*=^L_ zm5pT4F;^KXWo#36rka`vx;CRKbHi4b4CAz88V0|s5|x{e%BtxsbGT|i66`lsSBy0~ z`eXsdkz;7cfA6`ix+05njLEX*@O#nD+6q@2a=Xy-XQsBI3AU*9?iNM9Gz+$)ZKh?m z>dng*3@=|@954p0_p889f0r7)&i$d)SM$P{`}5w!zMiXRk4z{xvL-0)Gp$}PREUX-}zqjlZA`@w|{(INnT!>KSICpdDXd(Hl4Wk$(BXW zk3t_D30%76ox1+9E_{4)!2SH(A8#cmVe`pli5y_h(5 z@Qd<`?LYkR8?>{G`Q^*cm*<+&yt-0J=mqoYN(r!7X;|9$H?8l_HOTU%74DK)kvPE_ zcXG=R&?9+Bi?&w=L^Lq1fL-kFlG~Wn@E| mq>Y>O{d=~KS;c75V;r$2$I0qcD5LM*m?!h2xS>NPZ~q@4qT}uW literal 0 HcmV?d00001 diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt index 7a99b142ff..d5a71f5ac4 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt @@ -120,7 +120,7 @@ abstract class EvolutionSerializer( this.resultsIndex = it.index } ?: if (!it.value.type.isMarkedNullable) { throw NotSerializableException( - "New parameter ${it.value.name} is mandatory, should be nullable for evolution to worK") + "New parameter ${it.value.name} is mandatory, should be nullable for evolution to work") } } return EvolutionSerializerViaConstructor(new.type, factory, readersAsSerialized, constructor, constructorArgs) From 380ab22917b98f72adb2f3b625790cc41a789cdb Mon Sep 17 00:00:00 2001 From: guyho Date: Fri, 25 May 2018 12:48:56 -0400 Subject: [PATCH 4/6] Update contributors (#3241) changed Guy Hochstetler org from IBM to R3 --- CONTRIBUTORS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 5cdaa2e867..9722f81219 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -76,7 +76,7 @@ see changes to this list. * George Smetana (Bradesco) * Giulio Katis (Westpac) * Giuseppe Cardone (Intesa Sanpaolo) -* Guy Hochstetler (IBM) +* Guy Hochstetler (R3) * Ian Cusden (UBS) * Ian Grigg (R3) * Igor Nitto (R3) From 7d69bc664ad04b471dc4e80d6348cdd755de7241 Mon Sep 17 00:00:00 2001 From: Maksymilian Pawlak Date: Fri, 25 May 2018 18:03:24 +0100 Subject: [PATCH 5/6] [CORDA-1297] Columns nullability (#3112) JPA/Hibernate entities need to impose the correct NULL/NOT NULL constraints on the database - whatever these correct values actually are. API change: net.corda.core.schemas.PersistentStateRef fields (index and txId) are now non-nullable. Rationale: The fields were always effectively non-nullable - values were set from non-nullable fields of other objects. The class is used in context of database table Primary Key of for other entities and a database already imposes those columns as non-nullable (even if JPA annotation nullable=false was absent). --- .ci/api-current.txt | 18 +++++----- .../net/corda/core/schemas/CommonSchema.kt | 8 ++--- .../net/corda/core/schemas/PersistentTypes.kt | 8 ++--- docs/source/changelog.rst | 7 ++++ docs/source/upgrade-notes.rst | 34 +++++++++++++++++++ .../net/corda/finance/schemas/CashSchemaV1.kt | 10 +++--- .../schemas/CommercialPaperSchemaV1.kt | 16 ++++----- .../finance/contracts/CommercialPaperTests.kt | 2 +- .../finance/contracts/asset/CashTests.kt | 5 +-- .../finance/schemas/SampleCashSchemaV1.kt | 12 +++---- .../finance/schemas/SampleCashSchemaV2.kt | 4 +-- .../finance/schemas/SampleCashSchemaV3.kt | 10 +++--- .../schemas/SampleCommercialPaperSchemaV1.kt | 16 ++++----- .../schemas/SampleCommercialPaperSchemaV2.kt | 8 ++--- .../net/corda/testMessage/MessageState.kt | 4 +-- .../node/internal/schemas/NodeInfoSchema.kt | 18 +++++----- .../services/events/NodeSchedulerService.kt | 2 +- .../PersistentScheduledFlowRepository.kt | 4 +-- .../identity/PersistentIdentityService.kt | 8 ++--- .../keys/PersistentKeyManagementService.kt | 6 ++-- .../messaging/P2PMessageDeduplicator.kt | 8 ++--- .../services/messaging/P2PMessagingClient.kt | 6 ++-- .../persistence/DBCheckpointStorage.kt | 4 +-- .../DBTransactionMappingStorage.kt | 4 +-- .../persistence/DBTransactionStorage.kt | 4 +-- .../persistence/NodeAttachmentService.kt | 10 +++--- .../NodePropertiesPersistentStore.kt | 4 +-- .../BFTNonValidatingNotaryService.kt | 3 +- .../PersistentUniquenessProvider.kt | 14 ++++---- .../transactions/RaftUniquenessProvider.kt | 7 ++-- .../upgrade/ContractUpgradeServiceImpl.kt | 4 +-- .../corda/node/services/vault/VaultSchema.kt | 26 +++++++------- .../vault/DummyLinearStateSchemaV1.kt | 10 +++--- .../vault/DummyLinearStateSchemaV2.kt | 8 ++--- 34 files changed, 175 insertions(+), 137 deletions(-) diff --git a/.ci/api-current.txt b/.ci/api-current.txt index 7225772d13..87874e2381 100644 --- a/.ci/api-current.txt +++ b/.ci/api-current.txt @@ -4339,21 +4339,19 @@ 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, Integer) + public (String, int) public (net.corda.core.contracts.StateRef) - @Nullable - public final String component1() - @Nullable - public final Integer component2() @NotNull - public final net.corda.core.schemas.PersistentStateRef copy(String, Integer) + public final String component1() + public final int component2() + @NotNull + public final net.corda.core.schemas.PersistentStateRef copy(String, int) public boolean equals(Object) - @Nullable - public Integer getIndex() - @Nullable + public int getIndex() + @NotNull public String getTxId() public int hashCode() - public void setIndex(Integer) + public void setIndex(int) 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 ca7834bdba..be1928ad87 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") + @Column(name = "owner_name", nullable = true) var owner: AbstractParty, /** [FungibleAsset] attributes @@ -64,16 +64,16 @@ object CommonSchemaV1 : MappedSchema(schemaFamily = CommonSchema.javaClass, vers */ /** Amount attributes */ - @Column(name = "quantity") + @Column(name = "quantity", nullable = false) var quantity: Long, /** Issuer attributes */ /** X500Name of issuer party **/ - @Column(name = "issuer_name") + @Column(name = "issuer_name", nullable = true) var issuer: AbstractParty, - @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE) + @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @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 2632f97629..8d4d48cc49 100644 --- a/core/src/main/kotlin/net/corda/core/schemas/PersistentTypes.kt +++ b/core/src/main/kotlin/net/corda/core/schemas/PersistentTypes.kt @@ -78,11 +78,11 @@ class PersistentState(@EmbeddedId var stateRef: PersistentStateRef? = null) : St */ @Embeddable data class PersistentStateRef( - @Column(name = "transaction_id", length = 64) - var txId: String? = null, + @Column(name = "transaction_id", length = 64, nullable = false) + var txId: String, - @Column(name = "output_index") - var index: Int? = null + @Column(name = "output_index", nullable = false) + var index: Int ) : Serializable { constructor(stateRef: StateRef) : this(stateRef.txhash.bytes.toHexString(), stateRef.index) } diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index d352f1c7bb..3f3003b840 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -96,6 +96,12 @@ Unreleased * Node can be shut down abruptly by ``shutdown`` function in `CordaRPCOps` or gracefully (draining flows first) through ``gracefulShutdown`` command from shell. +* 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. + .. _changelog_v3.1: Version 3.1 @@ -118,6 +124,7 @@ Version 3.1 * Fixed node's behaviour on startup when there is no connectivity to network map. Node continues to work normally if it has all the needed network data, waiting in the background for network map to become available. + .. _changelog_v3: Version 3.0 diff --git a/docs/source/upgrade-notes.rst b/docs/source/upgrade-notes.rst index e063af7652..223ee0fad8 100644 --- a/docs/source/upgrade-notes.rst +++ b/docs/source/upgrade-notes.rst @@ -33,6 +33,40 @@ 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.0 to v3.1 ------------ 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 6c661a09b8..8ae6d96cd6 100644 --- a/finance/src/main/kotlin/net/corda/finance/schemas/CashSchemaV1.kt +++ b/finance/src/main/kotlin/net/corda/finance/schemas/CashSchemaV1.kt @@ -24,19 +24,19 @@ object CashSchemaV1 : MappedSchema(schemaFamily = CashSchema.javaClass, version @Table(name = "contract_cash_states", indexes = [Index(name = "ccy_code_idx", columnList = "ccy_code"), Index(name = "pennies_idx", columnList = "pennies")]) class PersistentCashState( /** X500Name of owner party **/ - @Column(name = "owner_name") + @Column(name = "owner_name", nullable = true) var owner: AbstractParty, - @Column(name = "pennies") + @Column(name = "pennies", nullable = false) var pennies: Long, - @Column(name = "ccy_code", length = 3) + @Column(name = "ccy_code", length = 3, nullable = false) var currency: String, - @Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE) + @Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var issuerPartyHash: String, - @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE) + @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @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 80ce2d8700..73f725573f 100644 --- a/finance/src/main/kotlin/net/corda/finance/schemas/CommercialPaperSchemaV1.kt +++ b/finance/src/main/kotlin/net/corda/finance/schemas/CommercialPaperSchemaV1.kt @@ -26,29 +26,29 @@ object CommercialPaperSchemaV1 : MappedSchema(schemaFamily = CommercialPaperSche @Entity @Table(name = "cp_states", indexes = [Index(name = "ccy_code_index", columnList = "ccy_code"), 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) + @Column(name = "issuance_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var issuancePartyHash: String, - @Column(name = "issuance_ref") + @Column(name = "issuance_ref", nullable = false) @Type(type = "corda-wrapper-binary") var issuanceRef: ByteArray, - @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE) + @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var ownerHash: String, - @Column(name = "maturity_instant") + @Column(name = "maturity_instant", nullable = false) var maturity: Instant, - @Column(name = "face_value") + @Column(name = "face_value", nullable = false) var faceValue: Long, - @Column(name = "ccy_code", length = 3) + @Column(name = "ccy_code", length = 3, nullable = false) var currency: String, - @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE) + @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var faceValueIssuerPartyHash: String, - @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE) + @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Type(type = "corda-wrapper-binary") var faceValueIssuerRef: ByteArray ) : PersistentState() diff --git a/finance/src/test/kotlin/net/corda/finance/contracts/CommercialPaperTests.kt b/finance/src/test/kotlin/net/corda/finance/contracts/CommercialPaperTests.kt index 93793659df..5c133b9020 100644 --- a/finance/src/test/kotlin/net/corda/finance/contracts/CommercialPaperTests.kt +++ b/finance/src/test/kotlin/net/corda/finance/contracts/CommercialPaperTests.kt @@ -244,7 +244,7 @@ class CommercialPaperTestsGeneric { // MegaCorp will issue some commercial paper and Alice will buy it, using cash issued to her in the name // of the dummy cash issuer. - val allIdentities = arrayOf(megaCorp.identity, miniCorp.identity, dummyCashIssuer.identity, dummyNotary.identity) + val allIdentities = arrayOf(megaCorp.identity, alice.identity, dummyCashIssuer.identity, dummyNotary.identity) val notaryServices = MockServices(dummyNotary) val issuerServices = MockServices(dummyCashIssuer, dummyNotary) val (aliceDatabase, aliceServices) = makeTestDatabaseAndMockServices( diff --git a/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt b/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt index a2fa76e92c..83faeb168f 100644 --- a/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt +++ b/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt @@ -82,10 +82,11 @@ class CashTests { LogHelper.setLevel(NodeVaultService::class) megaCorpServices = MockServices(megaCorp) miniCorpServices = MockServices(miniCorp) + val myself = TestIdentity(CordaX500Name("Me", "London", "GB")) val databaseAndServices = makeTestDatabaseAndMockServices( listOf("net.corda.finance.contracts.asset"), - makeTestIdentityService(megaCorp.identity, miniCorp.identity, dummyCashIssuer.identity, dummyNotary.identity), - TestIdentity(CordaX500Name("Me", "London", "GB")) + makeTestIdentityService(megaCorp.identity, miniCorp.identity, dummyCashIssuer.identity, dummyNotary.identity, myself.identity), + myself ) database = databaseAndServices.first ourServices = databaseAndServices.second 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 2018dcb27d..1eec85c0b3 100644 --- a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV1.kt +++ b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV1.kt @@ -21,21 +21,21 @@ object CashSchema */ object SampleCashSchemaV1 : MappedSchema(schemaFamily = CashSchema.javaClass, version = 1, mappedTypes = listOf(PersistentCashState::class.java)) { @Entity - @Table(name = "contract_cash_states", indexes = [Index(name = "ccy_code_idx", columnList = "ccy_code"), Index(name = "pennies_idx", columnList = "pennies")]) + @Table(name = "contract_cash_states_v1", indexes = [Index(name = "ccy_code_idx", columnList = "ccy_code"), Index(name = "pennies_idx", columnList = "pennies")]) class PersistentCashState( - @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE) + @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var ownerHash: String, - @Column(name = "pennies") + @Column(name = "pennies", nullable = false) var pennies: Long, - @Column(name = "ccy_code", length = 3) + @Column(name = "ccy_code", length = 3, nullable = false) var currency: String, - @Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE) + @Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var issuerPartyHash: String, - @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE) + @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @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 fda31169e3..dacef2cfa8 100644 --- a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV2.kt +++ b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCashSchemaV2.kt @@ -15,7 +15,7 @@ object SampleCashSchemaV2 : MappedSchema(schemaFamily = CashSchema.javaClass, ve @Table(name = "cash_states_v2", indexes = [Index(name = "ccy_code_idx2", columnList = "ccy_code")]) class PersistentCashState( /** product type */ - @Column(name = "ccy_code", length = 3) + @Column(name = "ccy_code", length = 3, nullable = false) var currency: String, participants: Set, owner: AbstractParty, @@ -25,7 +25,7 @@ object SampleCashSchemaV2 : MappedSchema(schemaFamily = CashSchema.javaClass, ve ) : CommonSchemaV1.FungibleState(participants.toMutableSet(), owner, quantity, issuerParty, issuerRef.bytes) { @ElementCollection - @Column(name = "participants") + @Column(name = "participants", nullable = true) @CollectionTable(name = "cash_states_v2_participants", joinColumns = [JoinColumn(name = "output_index", referencedColumnName = "output_index"), JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id")]) override var participants: MutableSet? = null } 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 0a6c0cc289..85a6c63de2 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") + @Column(name = "owner_name", nullable = true) var owner: AbstractParty, - @Column(name = "pennies") + @Column(name = "pennies", nullable = false) var pennies: Long, - @Column(name = "ccy_code", length = 3) + @Column(name = "ccy_code", length = 3, nullable = false) var currency: String, /** X500Name of issuer party **/ - @Column(name = "issuer_name") + @Column(name = "issuer_name", nullable = true) var issuer: AbstractParty, - @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE) + @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @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 40a8c3d774..236d96fdd5 100644 --- a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV1.kt +++ b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV1.kt @@ -24,29 +24,29 @@ object SampleCommercialPaperSchemaV1 : MappedSchema(schemaFamily = CommercialPap @Entity @Table(name = "cp_states", indexes = [Index(name = "ccy_code_index", columnList = "ccy_code"), 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) + @Column(name = "issuance_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var issuancePartyHash: String, - @Column(name = "issuance_ref") + @Column(name = "issuance_ref", nullable = false) @Type(type = "corda-wrapper-binary") var issuanceRef: ByteArray, - @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE) + @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var ownerHash: String, - @Column(name = "maturity_instant") + @Column(name = "maturity_instant", nullable = false) var maturity: Instant, - @Column(name = "face_value") + @Column(name = "face_value", nullable = false) var faceValue: Long, - @Column(name = "ccy_code", length = 3) + @Column(name = "ccy_code", length = 3, nullable = false) var currency: String, - @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE) + @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var faceValueIssuerPartyHash: String, - @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE) + @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @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 2d9f9f625c..ab862ce600 100644 --- a/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV2.kt +++ b/finance/src/test/kotlin/net/corda/finance/schemas/SampleCommercialPaperSchemaV2.kt @@ -19,16 +19,16 @@ object SampleCommercialPaperSchemaV2 : MappedSchema(schemaFamily = CommercialPap @Entity @Table(name = "cp_states_v2", indexes = [Index(name = "ccy_code_index2", columnList = "ccy_code"), Index(name = "maturity_index2", columnList = "maturity_instant")]) class PersistentCommercialPaperState( - @Column(name = "maturity_instant") + @Column(name = "maturity_instant", nullable = false) var maturity: Instant, - @Column(name = "ccy_code", length = 3) + @Column(name = "ccy_code", length = 3, nullable = false) var currency: String, - @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE) + @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var faceValueIssuerPartyHash: String, - @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE) + @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Type(type = "corda-wrapper-binary") var faceValueIssuerRef: ByteArray, diff --git a/node/src/integration-test/kotlin/net/corda/testMessage/MessageState.kt b/node/src/integration-test/kotlin/net/corda/testMessage/MessageState.kt index a965a857aa..372dc2870b 100644 --- a/node/src/integration-test/kotlin/net/corda/testMessage/MessageState.kt +++ b/node/src/integration-test/kotlin/net/corda/testMessage/MessageState.kt @@ -40,10 +40,10 @@ object MessageSchemaV1 : MappedSchema( @Entity @Table(name = "messages") class PersistentMessage( - @Column(name = "message_by") + @Column(name = "message_by", nullable = false) var by: String, - @Column(name = "message_value") + @Column(name = "message_value", nullable = false) var value: String ) : PersistentState() } 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 6769b35ff9..53fbf54a64 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") + @Column(name = "node_info_id", nullable = false) var id: Int, - @Column(name = "node_info_hash", length = 64) + @Column(name = "node_info_hash", length = 64, nullable = false) val hash: String, - @Column(name = "addresses") + @Column(name = "addresses", nullable = false) @OneToMany(cascade = [(CascadeType.ALL)], orphanRemoval = true) @JoinColumn(name = "node_info_id", foreignKey = ForeignKey(name = "FK__info_hosts__infos")) val addresses: List, - @Column(name = "legal_identities_certs") + @Column(name = "legal_identities_certs", nullable = false) @ManyToMany(cascade = [(CascadeType.ALL)]) @JoinTable(name = "node_link_nodeinfo_party", joinColumns = [(JoinColumn(name = "node_info_id", foreignKey = ForeignKey(name = "FK__link_nodeinfo_party__infos")))], inverseJoinColumns = [(JoinColumn(name = "party_name", foreignKey = ForeignKey(name = "FK__link_ni_p__info_p_cert")))]) val legalIdentitiesAndCerts: List, - @Column(name = "platform_version") + @Column(name = "platform_version", nullable = false) 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") + @Column(name = "serial", nullable = false) val serial: Long ) : Serializable { fun toNodeInfo(): NodeInfo { @@ -69,7 +69,7 @@ object NodeInfoSchemaV1 : MappedSchema( data class DBHostAndPort( @Id @GeneratedValue - @Column(name = "hosts_id") + @Column(name = "hosts_id", nullable = false) 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) + @Column(name = "owning_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) val owningKeyHash: String, @Lob - @Column(name = "party_cert_binary") + @Column(name = "party_cert_binary", nullable = false) val partyCertBinary: ByteArray, val isMain: Boolean, 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 a57b2b0f05..30eba4850c 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 @@ -132,7 +132,7 @@ class NodeSchedulerService(private val clock: CordaClock, @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}scheduled_states") class PersistentScheduledState( @EmbeddedId - var output: PersistentStateRef = PersistentStateRef(), + var output: PersistentStateRef, @Column(name = "scheduled_at", nullable = false) var scheduledAt: Instant = Instant.now() diff --git a/node/src/main/kotlin/net/corda/node/services/events/PersistentScheduledFlowRepository.kt b/node/src/main/kotlin/net/corda/node/services/events/PersistentScheduledFlowRepository.kt index d5cb3a94d8..10624f9c96 100644 --- a/node/src/main/kotlin/net/corda/node/services/events/PersistentScheduledFlowRepository.kt +++ b/node/src/main/kotlin/net/corda/node/services/events/PersistentScheduledFlowRepository.kt @@ -18,8 +18,8 @@ class PersistentScheduledFlowRepository(val database: CordaPersistence) : Schedu } private fun toPersistentEntity(key: StateRef, value: ScheduledStateRef): NodeSchedulerService.PersistentScheduledState { - return NodeSchedulerService.PersistentScheduledState().apply { - output = PersistentStateRef(key.txhash.toString(), key.index) + val output = PersistentStateRef(key.txhash.toString(), key.index) + return NodeSchedulerService.PersistentScheduledState(output).apply { scheduledAt = value.scheduledAt } } 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 9164c27e98..6445d351dc 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 @@ -78,11 +78,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) + @Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var publicKeyHash: String = "", @Lob - @Column(name = "identity_value") + @Column(name = "identity_value", nullable = false) var identity: ByteArray = EMPTY_BYTE_ARRAY ) : Serializable @@ -90,10 +90,10 @@ class PersistentIdentityService(override val trustRoot: X509Certificate, @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}named_identities") class PersistentIdentityNames( @Id - @Column(name = "name", length = 128) + @Column(name = "name", length = 128, nullable = false) var name: String = "", - @Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE) + @Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE, nullable = false) 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 4609add1a3..b86b30c54f 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 @@ -34,14 +34,14 @@ class PersistentKeyManagementService(val identityService: IdentityService, class PersistentKey( @Id - @Column(name = "public_key_hash", length = MAX_HASH_HEX_SIZE) + @Column(name = "public_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) var publicKeyHash: String, @Lob - @Column(name = "public_key") + @Column(name = "public_key", nullable = false) var publicKey: ByteArray = EMPTY_BYTE_ARRAY, @Lob - @Column(name = "private_key") + @Column(name = "private_key", nullable = false) var privateKey: ByteArray = EMPTY_BYTE_ARRAY ) : Serializable { constructor(publicKey: PublicKey, privateKey: PrivateKey) diff --git a/node/src/main/kotlin/net/corda/node/services/messaging/P2PMessageDeduplicator.kt b/node/src/main/kotlin/net/corda/node/services/messaging/P2PMessageDeduplicator.kt index dd666f51a3..4ffe2f660c 100644 --- a/node/src/main/kotlin/net/corda/node/services/messaging/P2PMessageDeduplicator.kt +++ b/node/src/main/kotlin/net/corda/node/services/messaging/P2PMessageDeduplicator.kt @@ -86,16 +86,16 @@ class P2PMessageDeduplicator(private val database: CordaPersistence) { @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}message_ids") class ProcessedMessage( @Id - @Column(name = "message_id", length = 64) + @Column(name = "message_id", length = 64, nullable = false) var id: String = "", - @Column(name = "insertion_time") + @Column(name = "insertion_time", nullable = false) var insertionTime: Instant = Instant.now(), - @Column(name = "sender", length = 64) + @Column(name = "sender", length = 64, nullable = true) var hash: String? = "", - @Column(name = "sequence_number") + @Column(name = "sequence_number", nullable = true) var seqNo: Long? = null ) : Serializable 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 84b9f19490..84d16edbe4 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 @@ -176,14 +176,14 @@ class P2PMessagingClient(val config: NodeConfiguration, @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}message_retry") class RetryMessage( @Id - @Column(name = "message_id", length = 64) + @Column(name = "message_id", length = 64, nullable = false) var key: Long = 0, @Lob - @Column + @Column(nullable = false) var message: ByteArray = EMPTY_BYTE_ARRAY, @Lob - @Column + @Column(nullable = false) var recipients: ByteArray = EMPTY_BYTE_ARRAY ) : 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 73105d598e..91385d481c 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 @@ -28,11 +28,11 @@ class DBCheckpointStorage : CheckpointStorage { @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}checkpoints") class DBCheckpoint( @Id - @Column(name = "checkpoint_id", length = 64) + @Column(name = "checkpoint_id", length = 64, nullable = false) var checkpointId: String = "", @Lob - @Column(name = "checkpoint_value") + @Column(name = "checkpoint_value", nullable = false) var checkpoint: ByteArray = EMPTY_BYTE_ARRAY ) : Serializable 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 96e8520607..d7aba410e0 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) + @Column(name = "tx_id", length = 64, nullable = false) var txId: String = "", - @Column(name = "state_machine_run_id", length = 36) + @Column(name = "state_machine_run_id", length = 36, nullable = false) 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 05b99bc25b..d4ada13f9f 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 @@ -34,11 +34,11 @@ class DBTransactionStorage(cacheSizeBytes: Long) : WritableTransactionStorage, S @Table(name = "${NODE_DATABASE_PREFIX}transactions") class DBTransaction( @Id - @Column(name = "tx_id", length = 64) + @Column(name = "tx_id", length = 64, nullable = false) var txId: String = "", @Lob - @Column(name = "transaction_value") + @Column(name = "transaction_value", nullable = false) var transaction: ByteArray = EMPTY_BYTE_ARRAY ) : 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 659c4c43b3..171c249b83 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 @@ -79,24 +79,24 @@ class NodeAttachmentService( @Table(name = "${NODE_DATABASE_PREFIX}attachments", indexes = [Index(name = "att_id_idx", columnList = "att_id")]) class DBAttachment( @Id - @Column(name = "att_id") + @Column(name = "att_id", nullable = false) var attId: String, - @Column(name = "content") + @Column(name = "content", nullable = false) @Lob var content: ByteArray, @Column(name = "insertion_date", nullable = false, updatable = false) var insertionDate: Instant = Instant.now(), - @Column(name = "uploader", updatable = false) + @Column(name = "uploader", updatable = false, nullable = true) var uploader: String? = null, - @Column(name = "filename", updatable = false) + @Column(name = "filename", updatable = false, nullable = true) var filename: String? = null, @ElementCollection - @Column(name = "contract_class_name") + @Column(name = "contract_class_name", nullable = false) @CollectionTable(name = "node_attchments_contracts", joinColumns = [(JoinColumn(name = "att_id", referencedColumnName = "att_id"))], foreignKey = ForeignKey(name = "FK__ctr_class__attachments")) var contractClassNames: List? = null 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 28a6aaab95..89039b5706 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") + @Column(name = "property_key", nullable = false) val key: String = "", - @Column(name = "property_value") + @Column(name = "property_value", nullable = true) 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 bd6b16544f..e6c739a9f0 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 @@ -106,8 +106,7 @@ class BFTNonValidatingNotaryService( fromPersistentEntity = { //TODO null check will become obsolete after making DB/JPA columns not nullable val txId = it.id.txId - ?: throw IllegalStateException("DB returned null SecureHash transactionId") - val index = it.id.index ?: throw IllegalStateException("DB returned null SecureHash index") + val index = it.id.index Pair( StateRef(txhash = SecureHash.parse(txId), index = index), 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 63988a1c8d..d6ede5cd4a 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 @@ -37,7 +37,7 @@ class PersistentUniquenessProvider(val clock: Clock) : UniquenessProvider, Singl @EmbeddedId val id: PersistentStateRef, - @Column(name = "consuming_transaction_id") + @Column(name = "consuming_transaction_id", nullable = false) val consumingTxHash: String ) : Serializable @@ -47,19 +47,20 @@ class PersistentUniquenessProvider(val clock: Clock) : UniquenessProvider, Singl class Request( @Id @GeneratedValue + @Column(nullable = true) val id: Int? = null, - @Column(name = "consuming_transaction_id") + @Column(name = "consuming_transaction_id", nullable = false) val consumingTxHash: String, - @Column(name = "requesting_party_name") + @Column(name = "requesting_party_name", nullable = false) var partyName: String, @Lob - @Column(name = "request_signature") + @Column(name = "request_signature", nullable = false) val requestSignature: ByteArray, - @Column(name = "request_timestamp") + @Column(name = "request_timestamp", nullable = false) var requestDate: Instant ) : Serializable @@ -81,8 +82,7 @@ class PersistentUniquenessProvider(val clock: Clock) : UniquenessProvider, Singl fromPersistentEntity = { //TODO null check will become obsolete after making DB/JPA columns not nullable val txId = it.id.txId - ?: throw IllegalStateException("DB returned null SecureHash transactionId") - val index = it.id.index ?: throw IllegalStateException("DB returned null SecureHash index") + val index = it.id.index Pair( StateRef(txhash = SecureHash.parse(txId), index = index), 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 71d5cf9e4e..1d8d12acf4 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 @@ -65,8 +65,7 @@ class RaftUniquenessProvider( toPersistentEntityKey = { PersistentStateRef(it) }, fromPersistentEntity = { val txId = it.id.txId - ?: throw IllegalStateException("DB returned null SecureHash transactionId") - val index = it.id.index ?: throw IllegalStateException("DB returned null SecureHash index") + val index = it.id.index Pair( StateRef(txhash = SecureHash.parse(txId), index = index), Pair(it.index, SecureHash.parse(it.value) as SecureHash)) @@ -91,9 +90,9 @@ class RaftUniquenessProvider( class CommittedState( @EmbeddedId val id: PersistentStateRef, - @Column(name = "consuming_transaction_id") + @Column(name = "consuming_transaction_id", nullable = false) var value: String = "", - @Column(name = "raft_log_index") + @Column(name = "raft_log_index", nullable = false) 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 e5a6d29f25..54014442a3 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) + @Column(name = "state_ref", length = 96, nullable = false) var stateRef: String = "", /** refers to the UpgradedContract class name*/ - @Column(name = "contract_class_name") + @Column(name = "contract_class_name", nullable = false) 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 35f3867bbe..081fdc1060 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 @@ -34,19 +34,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") + @Column(name = "notary_name", nullable = false) var notary: Party, /** references a concrete ContractState that is [QueryableState] and has a [MappedSchema] */ - @Column(name = "contract_state_class_name") + @Column(name = "contract_state_class_name", nullable = false) var contractStateClassName: String, /** state lifecycle: unconsumed, consumed */ - @Column(name = "state_status") + @Column(name = "state_status", nullable = false) var stateStatus: Vault.StateStatus, /** refers to timestamp recorded upon entering UNCONSUMED state */ - @Column(name = "recorded_timestamp") + @Column(name = "recorded_timestamp", nullable = false) var recordedTime: Instant, /** refers to timestamp recorded upon entering CONSUMED state */ @@ -81,7 +81,7 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio /** * Represents a [LinearState] [UniqueIdentifier] */ - @Column(name = "external_id") + @Column(name = "external_id", nullable = true) var externalId: String?, @Column(name = "uuid", nullable = false) @@ -104,13 +104,13 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio @CollectionTable(name = "vault_fungible_states_parts", joinColumns = [(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") + @Column(name = "participants", nullable = true) var participants: MutableSet? = null, /** [OwnableState] attributes */ /** X500Name of owner party **/ - @Column(name = "owner_name") + @Column(name = "owner_name", nullable = true) var owner: AbstractParty, /** [FungibleAsset] attributes @@ -120,16 +120,16 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio */ /** Amount attributes */ - @Column(name = "quantity") + @Column(name = "quantity", nullable = false) var quantity: Long, /** Issuer attributes */ /** X500Name of issuer party **/ - @Column(name = "issuer_name") + @Column(name = "issuer_name", nullable = true) var issuer: AbstractParty, - @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE) + @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Type(type = "corda-wrapper-binary") var issuerRef: ByteArray ) : PersistentState() { @@ -146,13 +146,13 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio class VaultTxnNote( @Id @GeneratedValue - @Column(name = "seq_no") + @Column(name = "seq_no", nullable = false) var seqNo: Int, - @Column(name = "transaction_id", length = 64) + @Column(name = "transaction_id", length = 64, nullable = false) var txId: String, - @Column(name = "note") + @Column(name = "note", nullable = false) 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 2dffe5f80c..c662cb9ae6 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 @@ -31,7 +31,7 @@ object DummyLinearStateSchemaV1 : MappedSchema(schemaFamily = DummyLinearStateSc /** * UniqueIdentifier */ - @Column(name = "external_id") + @Column(name = "external_id", nullable = true) var externalId: String?, @Column(name = "uuid", nullable = false) @@ -41,16 +41,16 @@ object DummyLinearStateSchemaV1 : MappedSchema(schemaFamily = DummyLinearStateSc /** * Dummy attributes */ - @Column(name = "linear_string") + @Column(name = "linear_string", nullable = false) var linearString: String, - @Column(name = "linear_number") + @Column(name = "linear_number", nullable = false) var linearNumber: Long, - @Column(name = "linear_timestamp") + @Column(name = "linear_timestamp", nullable = false) var linearTimestamp: Instant, - @Column(name = "linear_boolean") + @Column(name = "linear_boolean", nullable = false) 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 ec57afb309..f5f16c18ec 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 @@ -21,13 +21,13 @@ object DummyLinearStateSchemaV2 : MappedSchema(schemaFamily = DummyLinearStateSc @CollectionTable(name = "dummy_linear_states_v2_parts", joinColumns = [(JoinColumn(name = "output_index", referencedColumnName = "output_index")), (JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"))]) override var participants: MutableSet? = null, - @Column(name = "linear_string") var linearString: String, + @Column(name = "linear_string", nullable = false) var linearString: String, - @Column(name = "linear_number") var linearNumber: Long, + @Column(name = "linear_number", nullable = false) var linearNumber: Long, - @Column(name = "linear_timestamp") var linearTimestamp: java.time.Instant, + @Column(name = "linear_timestamp", nullable = false) var linearTimestamp: java.time.Instant, - @Column(name = "linear_boolean") var linearBoolean: Boolean, + @Column(name = "linear_boolean", nullable = false) var linearBoolean: Boolean, @Transient val uid: UniqueIdentifier From 78c759e2e63ddbde01177208093a0ccef2b0aa46 Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Mon, 28 May 2018 18:06:33 +0100 Subject: [PATCH 6/6] Resolve compiler warnings for Kotlin >= 1.2.40. (#3245) --- .../src/main/kotlin/net/corda/finance/flows/CashExitFlow.kt | 3 +++ .../src/main/kotlin/net/corda/finance/flows/CashIssueFlow.kt | 3 +++ .../main/kotlin/net/corda/finance/flows/CashPaymentFlow.kt | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/finance/src/main/kotlin/net/corda/finance/flows/CashExitFlow.kt b/finance/src/main/kotlin/net/corda/finance/flows/CashExitFlow.kt index dfd49938a9..750437ad83 100644 --- a/finance/src/main/kotlin/net/corda/finance/flows/CashExitFlow.kt +++ b/finance/src/main/kotlin/net/corda/finance/flows/CashExitFlow.kt @@ -15,6 +15,9 @@ import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.ProgressTracker import net.corda.finance.contracts.asset.Cash import net.corda.finance.contracts.asset.cash.selection.AbstractCashSelection +import net.corda.finance.flows.AbstractCashFlow.Companion.FINALISING_TX +import net.corda.finance.flows.AbstractCashFlow.Companion.GENERATING_TX +import net.corda.finance.flows.AbstractCashFlow.Companion.SIGNING_TX import net.corda.finance.issuedBy import java.util.* diff --git a/finance/src/main/kotlin/net/corda/finance/flows/CashIssueFlow.kt b/finance/src/main/kotlin/net/corda/finance/flows/CashIssueFlow.kt index 39ef76823b..385767703e 100644 --- a/finance/src/main/kotlin/net/corda/finance/flows/CashIssueFlow.kt +++ b/finance/src/main/kotlin/net/corda/finance/flows/CashIssueFlow.kt @@ -9,6 +9,9 @@ import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.ProgressTracker import net.corda.finance.contracts.asset.Cash +import net.corda.finance.flows.AbstractCashFlow.Companion.FINALISING_TX +import net.corda.finance.flows.AbstractCashFlow.Companion.GENERATING_TX +import net.corda.finance.flows.AbstractCashFlow.Companion.SIGNING_TX import net.corda.finance.issuedBy import java.util.* diff --git a/finance/src/main/kotlin/net/corda/finance/flows/CashPaymentFlow.kt b/finance/src/main/kotlin/net/corda/finance/flows/CashPaymentFlow.kt index dc71e54884..f3afc3a107 100644 --- a/finance/src/main/kotlin/net/corda/finance/flows/CashPaymentFlow.kt +++ b/finance/src/main/kotlin/net/corda/finance/flows/CashPaymentFlow.kt @@ -11,6 +11,10 @@ import net.corda.core.serialization.CordaSerializable import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.ProgressTracker import net.corda.finance.contracts.asset.Cash +import net.corda.finance.flows.AbstractCashFlow.Companion.FINALISING_TX +import net.corda.finance.flows.AbstractCashFlow.Companion.GENERATING_ID +import net.corda.finance.flows.AbstractCashFlow.Companion.GENERATING_TX +import net.corda.finance.flows.AbstractCashFlow.Companion.SIGNING_TX import java.util.* /**