From 3c13c07c0931fb19e284dd4d5fa74f850e010988 Mon Sep 17 00:00:00 2001 From: Tudor Malene Date: Thu, 20 Dec 2018 15:04:16 +0000 Subject: [PATCH] CORDA-2344 Set contextClassloader on the flow threads. (#4437) * CORDA-2344 Set contextClassloader on the flow threads. * CORDA-2344 Set contextClassloader on the flow threads. --- .../net/corda/node/internal/cordapp/CordappProviderImpl.kt | 2 +- .../node/services/statemachine/FlowStateMachineImpl.kt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/node/src/main/kotlin/net/corda/node/internal/cordapp/CordappProviderImpl.kt b/node/src/main/kotlin/net/corda/node/internal/cordapp/CordappProviderImpl.kt index 5ab49c53a0..9a6c83711a 100644 --- a/node/src/main/kotlin/net/corda/node/internal/cordapp/CordappProviderImpl.kt +++ b/node/src/main/kotlin/net/corda/node/internal/cordapp/CordappProviderImpl.kt @@ -22,7 +22,7 @@ import java.util.concurrent.ConcurrentHashMap /** * Cordapp provider and store. For querying CorDapps for their attachment and vice versa. */ -open class CordappProviderImpl(private val cordappLoader: CordappLoader, +open class CordappProviderImpl(val cordappLoader: CordappLoader, private val cordappConfigProvider: CordappConfigProvider, private val attachmentStorage: AttachmentStorage) : SingletonSerializeAsToken(), CordappProviderInternal { companion object { diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt index 016498212d..1284b45f7e 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt @@ -18,6 +18,7 @@ import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.Try import net.corda.core.utilities.debug import net.corda.core.utilities.trace +import net.corda.node.internal.cordapp.CordappProviderImpl import net.corda.node.services.api.FlowAppAuditEvent import net.corda.node.services.api.FlowPermissionAuditEvent import net.corda.node.services.api.ServiceHubInternal @@ -219,6 +220,11 @@ class FlowStateMachineImpl(override val id: StateMachineRunId, logger.debug { "Calling flow: $logic" } val startTime = System.nanoTime() val resultOrError = try { + + // This sets the Cordapp classloader on the contextClassLoader of the current thread. + // Needed because in previous versions of the finance app we used Thread.contextClassLoader to resolve services defined in cordapps. + Thread.currentThread().contextClassLoader = (serviceHub.cordappProvider as CordappProviderImpl).cordappLoader.appClassLoader + val result = logic.call() suspend(FlowIORequest.WaitForSessionConfirmations, maySkipCheckpoint = true) Try.Success(result)