From b33e299e3a0e5d8259477909bc5badbfa1b5a4fc Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Mon, 21 Aug 2017 14:19:21 +0100 Subject: [PATCH] Refactor serialisation contexts into separate classes, according to their use-cases. (#1293) * Refactor Kryo contexts into separate classes, according to their use-cases. This prevents Kotlin from trying to instantiate them all every time. * Also refactor AMQP contexts accordingly. * Expand comments to explain why these serialisation contexts have been separated. --- .../serialization/AMQPSerializationScheme.kt | 6 --- .../internal/serialization/ClientContexts.kt | 17 +++++++ .../serialization/SerializationScheme.kt | 28 ----------- .../internal/serialization/ServerContexts.kt | 46 +++++++++++++++++++ 4 files changed, 63 insertions(+), 34 deletions(-) create mode 100644 node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ClientContexts.kt create mode 100644 node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ServerContexts.kt diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt index bd5e883603..d51f593554 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt @@ -99,9 +99,3 @@ val AMQP_P2P_CONTEXT = SerializationContextImpl(AmqpHeaderV1_0, emptyMap(), true, SerializationContext.UseCase.P2P) -val AMQP_STORAGE_CONTEXT = SerializationContextImpl(AmqpHeaderV1_0, - SerializationDefaults.javaClass.classLoader, - AllButBlacklisted, - emptyMap(), - true, - SerializationContext.UseCase.Storage) \ No newline at end of file diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ClientContexts.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ClientContexts.kt new file mode 100644 index 0000000000..add6b1465e --- /dev/null +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ClientContexts.kt @@ -0,0 +1,17 @@ +@file:JvmName("ClientContexts") +package net.corda.nodeapi.internal.serialization + +import net.corda.core.serialization.SerializationContext +import net.corda.core.serialization.SerializationDefaults + +/* + * Serialisation contexts for the client. + * These have been refactored into a separate file to prevent + * servers from trying to instantiate any of them. + */ +val KRYO_RPC_CLIENT_CONTEXT = SerializationContextImpl(KryoHeaderV0_1, + SerializationDefaults.javaClass.classLoader, + GlobalTransientClassWhiteList(BuiltInExceptionsWhitelist()), + emptyMap(), + true, + SerializationContext.UseCase.RPCClient) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt index d6860dc3ea..f08f66e9fb 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt @@ -218,34 +218,6 @@ val KRYO_P2P_CONTEXT = SerializationContextImpl(KryoHeaderV0_1, emptyMap(), true, SerializationContext.UseCase.P2P) -val KRYO_RPC_SERVER_CONTEXT = SerializationContextImpl(KryoHeaderV0_1, - SerializationDefaults.javaClass.classLoader, - GlobalTransientClassWhiteList(BuiltInExceptionsWhitelist()), - emptyMap(), - true, - SerializationContext.UseCase.RPCServer) -val KRYO_RPC_CLIENT_CONTEXT = SerializationContextImpl(KryoHeaderV0_1, - SerializationDefaults.javaClass.classLoader, - GlobalTransientClassWhiteList(BuiltInExceptionsWhitelist()), - emptyMap(), - true, - SerializationContext.UseCase.RPCClient) -val KRYO_STORAGE_CONTEXT = SerializationContextImpl(KryoHeaderV0_1, - SerializationDefaults.javaClass.classLoader, - AllButBlacklisted, - emptyMap(), - true, - SerializationContext.UseCase.Storage) -val KRYO_CHECKPOINT_CONTEXT = SerializationContextImpl(KryoHeaderV0_1, - SerializationDefaults.javaClass.classLoader, - QuasarWhitelist, - emptyMap(), - true, - SerializationContext.UseCase.Checkpoint) - -object QuasarWhitelist : ClassWhitelist { - override fun hasListed(type: Class<*>): Boolean = true -} interface SerializationScheme { // byteSequence expected to just be the 8 bytes necessary for versioning 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 new file mode 100644 index 0000000000..89dd6b524d --- /dev/null +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ServerContexts.kt @@ -0,0 +1,46 @@ +@file:JvmName("ServerContexts") +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.AmqpHeaderV1_0 + +/* + * Serialisation contexts for the server. + * These have been refactored into a separate file to prevent + * clients from trying to instantiate any of them. + * + * NOTE: The [KRYO_STORAGE_CONTEXT] and [AMQP_STORAGE_CONTEXT] + * CANNOT always be instantiated outside of the server and so + * MUST be kept separate! + */ +val KRYO_RPC_SERVER_CONTEXT = SerializationContextImpl(KryoHeaderV0_1, + SerializationDefaults.javaClass.classLoader, + GlobalTransientClassWhiteList(BuiltInExceptionsWhitelist()), + emptyMap(), + true, + SerializationContext.UseCase.RPCServer) +val KRYO_STORAGE_CONTEXT = SerializationContextImpl(KryoHeaderV0_1, + SerializationDefaults.javaClass.classLoader, + AllButBlacklisted, + emptyMap(), + true, + SerializationContext.UseCase.Storage) +val KRYO_CHECKPOINT_CONTEXT = SerializationContextImpl(KryoHeaderV0_1, + SerializationDefaults.javaClass.classLoader, + QuasarWhitelist, + emptyMap(), + true, + SerializationContext.UseCase.Checkpoint) + +object QuasarWhitelist : ClassWhitelist { + override fun hasListed(type: Class<*>): Boolean = true +} + +val AMQP_STORAGE_CONTEXT = SerializationContextImpl(AmqpHeaderV1_0, + SerializationDefaults.javaClass.classLoader, + AllButBlacklisted, + emptyMap(), + true, + SerializationContext.UseCase.Storage)