From 36d13124d5904e1dd6c339d357afb1daf1157942 Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Thu, 10 May 2018 12:42:01 +0100 Subject: [PATCH] ENT-1463: Refactor serialisation slightly for determinisation. (#3110) --- .../internal/serialization/ByteBufferStreams.kt | 6 +++--- .../nodeapi/internal/serialization/ServerContexts.kt | 5 ----- .../nodeapi/internal/serialization/SharedContexts.kt | 9 +++++---- .../serialization/amqp/AMQPSerializationScheme.kt | 10 +++++++++- .../internal/serialization/carpenter/ClassCarpenter.kt | 5 +++-- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ByteBufferStreams.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ByteBufferStreams.kt index f3710569ed..e7e942c595 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ByteBufferStreams.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ByteBufferStreams.kt @@ -10,9 +10,9 @@ import java.nio.ByteBuffer import kotlin.math.min internal val serializeOutputStreamPool = LazyPool( - clear = ByteBufferOutputStream::reset, - shouldReturnToPool = { it.size() < 256 * 1024 }, // Discard if it grew too large - newInstance = { ByteBufferOutputStream(64 * 1024) }) + clear = ByteBufferOutputStream::reset, + shouldReturnToPool = { it.size() < 256 * 1024 }, // Discard if it grew too large + newInstance = { ByteBufferOutputStream(64 * 1024) }) internal fun byteArrayOutput(task: (ByteBufferOutputStream) -> T): ByteArray { return serializeOutputStreamPool.run { underlying -> diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ServerContexts.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ServerContexts.kt index c18d7f4228..ae2e8cdb67 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ServerContexts.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ServerContexts.kt @@ -2,16 +2,11 @@ package net.corda.nodeapi.internal.serialization -import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializationDefaults import net.corda.nodeapi.internal.serialization.amqp.amqpMagic import net.corda.nodeapi.internal.serialization.kryo.kryoMagic -object QuasarWhitelist : ClassWhitelist { - override fun hasListed(type: Class<*>): Boolean = true -} - /* * Serialisation contexts for the server. * These have been refactored into a separate file to prevent diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SharedContexts.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SharedContexts.kt index e54c70cc69..0880af153c 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SharedContexts.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SharedContexts.kt @@ -2,10 +2,7 @@ package net.corda.nodeapi.internal.serialization -import net.corda.core.serialization.EncodingWhitelist -import net.corda.core.serialization.SerializationContext -import net.corda.core.serialization.SerializationDefaults -import net.corda.core.serialization.SerializationEncoding +import net.corda.core.serialization.* import net.corda.nodeapi.internal.serialization.amqp.amqpMagic import net.corda.nodeapi.internal.serialization.kryo.kryoMagic @@ -36,3 +33,7 @@ val AMQP_P2P_CONTEXT = SerializationContextImpl(amqpMagic, internal object AlwaysAcceptEncodingWhitelist : EncodingWhitelist { override fun acceptEncoding(encoding: SerializationEncoding) = true } + +object QuasarWhitelist : ClassWhitelist { + override fun hasListed(type: Class<*>): Boolean = true +} diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt index 4c16e1f44a..16ed0fa30d 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt @@ -95,11 +95,11 @@ abstract class AbstractAMQPSerializationScheme( register(net.corda.nodeapi.internal.serialization.amqp.custom.X509CRLSerializer) register(net.corda.nodeapi.internal.serialization.amqp.custom.CertPathSerializer(this)) register(net.corda.nodeapi.internal.serialization.amqp.custom.StringBufferSerializer) - register(net.corda.nodeapi.internal.serialization.amqp.custom.SimpleStringSerializer) register(net.corda.nodeapi.internal.serialization.amqp.custom.InputStreamSerializer) register(net.corda.nodeapi.internal.serialization.amqp.custom.BitSetSerializer(this)) register(net.corda.nodeapi.internal.serialization.amqp.custom.EnumSetSerializer(this)) register(net.corda.nodeapi.internal.serialization.amqp.custom.ContractAttachmentSerializer(this)) + registerNonDeterministicSerializers(factory) } for (whitelistProvider in serializationWhitelists) { factory.addToWhitelist(*whitelistProvider.whitelist.toTypedArray()) @@ -116,7 +116,15 @@ abstract class AbstractAMQPSerializationScheme( factory.registerExternal(CorDappCustomSerializer(customSerializer, factory)) } } + } + /* + * Register the serializers which will be excluded from the DJVM. + */ + private fun registerNonDeterministicSerializers(factory: SerializerFactory) { + with(factory) { + register(net.corda.nodeapi.internal.serialization.amqp.custom.SimpleStringSerializer) + } } private val serializerFactoriesForContexts = ConcurrentHashMap, SerializerFactory>() diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenter.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenter.kt index 5ac6c95c7c..b99440a912 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenter.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenter.kt @@ -89,8 +89,9 @@ private val toStringHelper: String = Type.getInternalName(MoreObjects.ToStringHe * * Equals/hashCode methods are not yet supported. */ -class ClassCarpenter(cl: ClassLoader = Thread.currentThread().contextClassLoader, - val whitelist: ClassWhitelist) { +class ClassCarpenter(cl: ClassLoader, val whitelist: ClassWhitelist) { + constructor(whitelist: ClassWhitelist) : this(Thread.currentThread().contextClassLoader, whitelist) + // TODO: Generics. // TODO: Sandbox the generated code when a security manager is in use. // TODO: Generate equals/hashCode.