mirror of
https://github.com/corda/corda.git
synced 2025-06-18 07:08:15 +00:00
Portable database primary keys
Blob/ByteArray I not allowed as primary key in Oracle
This commit is contained in:
@ -9,10 +9,10 @@ import net.corda.core.serialization.deserialize
|
|||||||
import net.corda.core.serialization.serialize
|
import net.corda.core.serialization.serialize
|
||||||
import net.corda.node.services.api.ServiceHubInternal
|
import net.corda.node.services.api.ServiceHubInternal
|
||||||
import net.corda.node.utilities.*
|
import net.corda.node.utilities.*
|
||||||
|
import net.corda.nodeapi.ArtemisMessagingComponent
|
||||||
import java.io.ByteArrayInputStream
|
import java.io.ByteArrayInputStream
|
||||||
import java.security.cert.CertificateFactory
|
import java.security.cert.CertificateFactory
|
||||||
import javax.persistence.*
|
import javax.persistence.*
|
||||||
import java.io.Serializable
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -30,77 +30,77 @@ class PersistentNetworkMapService(services: ServiceHubInternal, minimumPlatformV
|
|||||||
@Entity
|
@Entity
|
||||||
@Table(name = "${NODE_DATABASE_PREFIX}network_map_nodes")
|
@Table(name = "${NODE_DATABASE_PREFIX}network_map_nodes")
|
||||||
class NetworkNode(
|
class NetworkNode(
|
||||||
@EmbeddedId
|
@Id @Column(name = "node_party_key")
|
||||||
|
var publicKey: String = "",
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
var nodeParty: NodeParty = NodeParty(),
|
var nodeParty: NodeParty = NodeParty(),
|
||||||
|
|
||||||
@Lob
|
@Lob @Column
|
||||||
@Column
|
|
||||||
var registrationInfo: ByteArray = ByteArray(0)
|
var registrationInfo: ByteArray = ByteArray(0)
|
||||||
)
|
)
|
||||||
|
|
||||||
@Embeddable
|
@Embeddable
|
||||||
data class NodeParty(
|
class NodeParty(
|
||||||
@Column(name = "node_party_name")
|
@Column(name = "node_party_name")
|
||||||
var name: String = "",
|
var name: String = "",
|
||||||
|
|
||||||
@Column(name = "node_party_key", length = 4096)
|
|
||||||
var owningKey: String = "", // PublicKey
|
|
||||||
|
|
||||||
@Column(name = "node_party_certificate", length = 4096)
|
@Column(name = "node_party_certificate", length = 4096)
|
||||||
var certificate: ByteArray = ByteArray(0),
|
var certificate: ByteArray = ByteArray(0),
|
||||||
|
|
||||||
@Column(name = "node_party_path", length = 4096)
|
@Column(name = "node_party_path", length = 4096)
|
||||||
var certPath: ByteArray = ByteArray(0)
|
var certPath: ByteArray = ByteArray(0)
|
||||||
): Serializable
|
)
|
||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
private val factory = CertificateFactory.getInstance("X.509")
|
private val factory = CertificateFactory.getInstance("X.509")
|
||||||
|
|
||||||
fun createNetworkNodesMap(): PersistentMap<PartyAndCertificate, NodeRegistrationInfo, NetworkNode, NodeParty> {
|
fun createNetworkNodesMap(): PersistentMap<PartyAndCertificate, NodeRegistrationInfo, NetworkNode, String> {
|
||||||
return PersistentMap(
|
return PersistentMap(
|
||||||
toPersistentEntityKey = { NodeParty(
|
toPersistentEntityKey = { it.owningKey.toBase58String() },
|
||||||
it.name.toString(),
|
|
||||||
it.owningKey.toBase58String(),
|
|
||||||
it.certificate.encoded,
|
|
||||||
it.certPath.encoded
|
|
||||||
) },
|
|
||||||
fromPersistentEntity = {
|
fromPersistentEntity = {
|
||||||
Pair(PartyAndCertificate(factory.generateCertPath(ByteArrayInputStream(it.nodeParty.certPath))),
|
Pair(PartyAndCertificate(factory.generateCertPath(ByteArrayInputStream(it.nodeParty.certPath))),
|
||||||
it.registrationInfo.deserialize(context = SerializationDefaults.STORAGE_CONTEXT))
|
it.registrationInfo.deserialize(context = SerializationDefaults.STORAGE_CONTEXT))
|
||||||
},
|
},
|
||||||
toPersistentEntity = { key: PartyAndCertificate, value: NodeRegistrationInfo ->
|
toPersistentEntity = { key: PartyAndCertificate, value: NodeRegistrationInfo ->
|
||||||
NetworkNode().apply {
|
NetworkNode(
|
||||||
// TODO: We should understand an X500Name database field type, rather than manually doing the conversion ourselves
|
publicKey = key.owningKey.toBase58String(),
|
||||||
nodeParty = NodeParty(
|
nodeParty = NodeParty(
|
||||||
key.name.toString(),
|
key.name.toString(),
|
||||||
key.owningKey.toBase58String(),
|
|
||||||
key.certificate.encoded,
|
key.certificate.encoded,
|
||||||
key.certPath.encoded
|
key.certPath.encoded
|
||||||
)
|
),
|
||||||
registrationInfo = value.serialize(context = SerializationDefaults.STORAGE_CONTEXT).bytes
|
registrationInfo = value.serialize(context = SerializationDefaults.STORAGE_CONTEXT).bytes
|
||||||
}
|
)
|
||||||
},
|
},
|
||||||
persistentEntityClass = NetworkNode::class.java
|
persistentEntityClass = NetworkNode::class.java
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createNetworkSubscribersMap(): PersistentMap<SingleMessageRecipient, LastAcknowledgeInfo, NetworkSubscriber, ByteArray> {
|
fun createNetworkSubscribersMap(): PersistentMap<SingleMessageRecipient, LastAcknowledgeInfo, NetworkSubscriber, String> {
|
||||||
return PersistentMap(
|
return PersistentMap(
|
||||||
toPersistentEntityKey = { it.serialize(context = SerializationDefaults.STORAGE_CONTEXT).bytes},
|
toPersistentEntityKey = { it.getPrimaryKeyBasedOnSubType() },
|
||||||
fromPersistentEntity = {
|
fromPersistentEntity = {
|
||||||
Pair(it.key.deserialize(context = SerializationDefaults.STORAGE_CONTEXT),
|
Pair(it.key.deserialize(context = SerializationDefaults.STORAGE_CONTEXT),
|
||||||
it.value.deserialize(context = SerializationDefaults.STORAGE_CONTEXT))
|
it.value.deserialize(context = SerializationDefaults.STORAGE_CONTEXT))
|
||||||
},
|
},
|
||||||
toPersistentEntity = { _key: SingleMessageRecipient, _value: LastAcknowledgeInfo ->
|
toPersistentEntity = { k: SingleMessageRecipient, v: LastAcknowledgeInfo ->
|
||||||
NetworkSubscriber().apply {
|
NetworkSubscriber(
|
||||||
key = _key.serialize(context = SerializationDefaults.STORAGE_CONTEXT).bytes
|
id = k.getPrimaryKeyBasedOnSubType(),
|
||||||
value = _value.serialize(context = SerializationDefaults.STORAGE_CONTEXT).bytes
|
key = k.serialize(context = SerializationDefaults.STORAGE_CONTEXT).bytes,
|
||||||
}
|
value = v.serialize(context = SerializationDefaults.STORAGE_CONTEXT).bytes
|
||||||
|
)
|
||||||
},
|
},
|
||||||
persistentEntityClass = NetworkSubscriber::class.java
|
persistentEntityClass = NetworkSubscriber::class.java
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun SingleMessageRecipient.getPrimaryKeyBasedOnSubType() =
|
||||||
|
if (this is ArtemisMessagingComponent.ArtemisPeerAddress) {
|
||||||
|
this.hostAndPort.toString()
|
||||||
|
} else {
|
||||||
|
this.toString()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override val nodeRegistrations: MutableMap<PartyAndCertificate, NodeRegistrationInfo> =
|
override val nodeRegistrations: MutableMap<PartyAndCertificate, NodeRegistrationInfo> =
|
||||||
@ -109,7 +109,9 @@ class PersistentNetworkMapService(services: ServiceHubInternal, minimumPlatformV
|
|||||||
@Entity
|
@Entity
|
||||||
@Table(name = "${NODE_DATABASE_PREFIX}network_map_subscribers")
|
@Table(name = "${NODE_DATABASE_PREFIX}network_map_subscribers")
|
||||||
class NetworkSubscriber(
|
class NetworkSubscriber(
|
||||||
@Id
|
@Id @Column
|
||||||
|
var id: String = "",
|
||||||
|
|
||||||
@Column(length = 4096)
|
@Column(length = 4096)
|
||||||
var key: ByteArray = ByteArray(0),
|
var key: ByteArray = ByteArray(0),
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user