mirror of
https://github.com/corda/corda.git
synced 2024-12-24 07:06:44 +00:00
Moved FlowStateMachine into an internal package
This commit is contained in:
parent
a1450b5990
commit
a4e4ecff8a
31
core/src/main/kotlin/net/corda/core/flows/FlowInitiator.kt
Normal file
31
core/src/main/kotlin/net/corda/core/flows/FlowInitiator.kt
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package net.corda.core.flows
|
||||||
|
|
||||||
|
import net.corda.core.contracts.ScheduledStateRef
|
||||||
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.serialization.CordaSerializable
|
||||||
|
import java.security.Principal
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FlowInitiator holds information on who started the flow. We have different ways of doing that: via RPC [FlowInitiator.RPC],
|
||||||
|
* communication started by peer node [FlowInitiator.Peer], scheduled flows [FlowInitiator.Scheduled]
|
||||||
|
* or via the Corda Shell [FlowInitiator.Shell].
|
||||||
|
*/
|
||||||
|
@CordaSerializable
|
||||||
|
sealed class FlowInitiator : Principal {
|
||||||
|
/** Started using [net.corda.core.messaging.CordaRPCOps.startFlowDynamic]. */
|
||||||
|
data class RPC(val username: String) : FlowInitiator() {
|
||||||
|
override fun getName(): String = username
|
||||||
|
}
|
||||||
|
/** Started when we get new session initiation request. */
|
||||||
|
data class Peer(val party: Party) : FlowInitiator() {
|
||||||
|
override fun getName(): String = party.name.toString()
|
||||||
|
}
|
||||||
|
/** Started as scheduled activity. */
|
||||||
|
data class Scheduled(val scheduledState: ScheduledStateRef) : FlowInitiator() {
|
||||||
|
override fun getName(): String = "Scheduler"
|
||||||
|
}
|
||||||
|
// TODO When proper ssh access enabled, add username/use RPC?
|
||||||
|
object Shell : FlowInitiator() {
|
||||||
|
override fun getName(): String = "Shell User"
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,7 @@ package net.corda.core.flows
|
|||||||
import co.paralleluniverse.fibers.Suspendable
|
import co.paralleluniverse.fibers.Suspendable
|
||||||
import net.corda.core.crypto.SecureHash
|
import net.corda.core.crypto.SecureHash
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.internal.FlowStateMachine
|
||||||
import net.corda.core.node.ServiceHub
|
import net.corda.core.node.ServiceHub
|
||||||
import net.corda.core.transactions.SignedTransaction
|
import net.corda.core.transactions.SignedTransaction
|
||||||
import net.corda.core.utilities.ProgressTracker
|
import net.corda.core.utilities.ProgressTracker
|
||||||
|
@ -1,81 +0,0 @@
|
|||||||
package net.corda.core.flows
|
|
||||||
|
|
||||||
import co.paralleluniverse.fibers.Suspendable
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture
|
|
||||||
import net.corda.core.contracts.ScheduledStateRef
|
|
||||||
import net.corda.core.crypto.SecureHash
|
|
||||||
import net.corda.core.identity.Party
|
|
||||||
import net.corda.core.node.ServiceHub
|
|
||||||
import net.corda.core.serialization.CordaSerializable
|
|
||||||
import net.corda.core.transactions.SignedTransaction
|
|
||||||
import net.corda.core.utilities.UntrustworthyData
|
|
||||||
import org.slf4j.Logger
|
|
||||||
import java.security.Principal
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
/**
|
|
||||||
* FlowInitiator holds information on who started the flow. We have different ways of doing that: via RPC [FlowInitiator.RPC],
|
|
||||||
* communication started by peer node [FlowInitiator.Peer], scheduled flows [FlowInitiator.Scheduled]
|
|
||||||
* or via the Corda Shell [FlowInitiator.Shell].
|
|
||||||
*/
|
|
||||||
@CordaSerializable
|
|
||||||
sealed class FlowInitiator : Principal {
|
|
||||||
/** Started using [net.corda.core.messaging.CordaRPCOps.startFlowDynamic]. */
|
|
||||||
data class RPC(val username: String) : FlowInitiator() {
|
|
||||||
override fun getName(): String = username
|
|
||||||
}
|
|
||||||
/** Started when we get new session initiation request. */
|
|
||||||
data class Peer(val party: Party) : FlowInitiator() {
|
|
||||||
override fun getName(): String = party.name.toString()
|
|
||||||
}
|
|
||||||
/** Started as scheduled activity. */
|
|
||||||
data class Scheduled(val scheduledState: ScheduledStateRef) : FlowInitiator() {
|
|
||||||
override fun getName(): String = "Scheduler"
|
|
||||||
}
|
|
||||||
// TODO When proper ssh access enabled, add username/use RPC?
|
|
||||||
object Shell : FlowInitiator() {
|
|
||||||
override fun getName(): String = "Shell User"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A unique identifier for a single state machine run, valid across node restarts. Note that a single run always
|
|
||||||
* has at least one flow, but that flow may also invoke sub-flows: they all share the same run id.
|
|
||||||
*/
|
|
||||||
@CordaSerializable
|
|
||||||
data class StateMachineRunId(val uuid: UUID) {
|
|
||||||
companion object {
|
|
||||||
fun createRandom(): StateMachineRunId = StateMachineRunId(UUID.randomUUID())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toString(): String = "[$uuid]"
|
|
||||||
}
|
|
||||||
|
|
||||||
/** This is an internal interface that is implemented by code in the node module. You should look at [FlowLogic]. */
|
|
||||||
interface FlowStateMachine<R> {
|
|
||||||
@Suspendable
|
|
||||||
fun <T : Any> sendAndReceive(receiveType: Class<T>,
|
|
||||||
otherParty: Party,
|
|
||||||
payload: Any,
|
|
||||||
sessionFlow: FlowLogic<*>,
|
|
||||||
retrySend: Boolean = false): UntrustworthyData<T>
|
|
||||||
|
|
||||||
@Suspendable
|
|
||||||
fun <T : Any> receive(receiveType: Class<T>, otherParty: Party, sessionFlow: FlowLogic<*>): UntrustworthyData<T>
|
|
||||||
|
|
||||||
@Suspendable
|
|
||||||
fun send(otherParty: Party, payload: Any, sessionFlow: FlowLogic<*>)
|
|
||||||
|
|
||||||
@Suspendable
|
|
||||||
fun waitForLedgerCommit(hash: SecureHash, sessionFlow: FlowLogic<*>): SignedTransaction
|
|
||||||
|
|
||||||
fun checkFlowPermission(permissionName: String, extraAuditData: Map<String,String>)
|
|
||||||
|
|
||||||
fun recordAuditEvent(eventType: String, comment: String, extraAuditData: Map<String,String>)
|
|
||||||
|
|
||||||
val serviceHub: ServiceHub
|
|
||||||
val logger: Logger
|
|
||||||
val id: StateMachineRunId
|
|
||||||
val resultFuture: ListenableFuture<R>
|
|
||||||
val flowInitiator: FlowInitiator
|
|
||||||
}
|
|
@ -0,0 +1,17 @@
|
|||||||
|
package net.corda.core.flows
|
||||||
|
|
||||||
|
import net.corda.core.serialization.CordaSerializable
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A unique identifier for a single state machine run, valid across node restarts. Note that a single run always
|
||||||
|
* has at least one flow, but that flow may also invoke sub-flows: they all share the same run id.
|
||||||
|
*/
|
||||||
|
@CordaSerializable
|
||||||
|
data class StateMachineRunId(val uuid: UUID) {
|
||||||
|
companion object {
|
||||||
|
fun createRandom(): StateMachineRunId = StateMachineRunId(UUID.randomUUID())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String = "[$uuid]"
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package net.corda.core.internal
|
||||||
|
|
||||||
|
import co.paralleluniverse.fibers.Suspendable
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture
|
||||||
|
import net.corda.core.crypto.SecureHash
|
||||||
|
import net.corda.core.flows.FlowInitiator
|
||||||
|
import net.corda.core.flows.FlowLogic
|
||||||
|
import net.corda.core.flows.StateMachineRunId
|
||||||
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.node.ServiceHub
|
||||||
|
import net.corda.core.transactions.SignedTransaction
|
||||||
|
import net.corda.core.utilities.UntrustworthyData
|
||||||
|
import org.slf4j.Logger
|
||||||
|
|
||||||
|
/** This is an internal interface that is implemented by code in the node module. You should look at [FlowLogic]. */
|
||||||
|
interface FlowStateMachine<R> {
|
||||||
|
@Suspendable
|
||||||
|
fun <T : Any> sendAndReceive(receiveType: Class<T>,
|
||||||
|
otherParty: Party,
|
||||||
|
payload: Any,
|
||||||
|
sessionFlow: FlowLogic<*>,
|
||||||
|
retrySend: Boolean = false): UntrustworthyData<T>
|
||||||
|
|
||||||
|
@Suspendable
|
||||||
|
fun <T : Any> receive(receiveType: Class<T>, otherParty: Party, sessionFlow: FlowLogic<*>): UntrustworthyData<T>
|
||||||
|
|
||||||
|
@Suspendable
|
||||||
|
fun send(otherParty: Party, payload: Any, sessionFlow: FlowLogic<*>)
|
||||||
|
|
||||||
|
@Suspendable
|
||||||
|
fun waitForLedgerCommit(hash: SecureHash, sessionFlow: FlowLogic<*>): SignedTransaction
|
||||||
|
|
||||||
|
fun checkFlowPermission(permissionName: String, extraAuditData: Map<String,String>)
|
||||||
|
|
||||||
|
fun recordAuditEvent(eventType: String, comment: String, extraAuditData: Map<String,String>)
|
||||||
|
|
||||||
|
val serviceHub: ServiceHub
|
||||||
|
val logger: Logger
|
||||||
|
val id: StateMachineRunId
|
||||||
|
val resultFuture: ListenableFuture<R>
|
||||||
|
val flowInitiator: FlowInitiator
|
||||||
|
}
|
@ -40,8 +40,8 @@ interface FlowProgressHandle<A> : FlowHandle<A> {
|
|||||||
|
|
||||||
@CordaSerializable
|
@CordaSerializable
|
||||||
data class FlowHandleImpl<A>(
|
data class FlowHandleImpl<A>(
|
||||||
override val id: StateMachineRunId,
|
override val id: StateMachineRunId,
|
||||||
override val returnValue: ListenableFuture<A>) : FlowHandle<A> {
|
override val returnValue: ListenableFuture<A>) : FlowHandle<A> {
|
||||||
|
|
||||||
// Remember to add @Throws to FlowHandle.close() if this throws an exception.
|
// Remember to add @Throws to FlowHandle.close() if this throws an exception.
|
||||||
override fun close() {
|
override fun close() {
|
||||||
@ -51,9 +51,9 @@ data class FlowHandleImpl<A>(
|
|||||||
|
|
||||||
@CordaSerializable
|
@CordaSerializable
|
||||||
data class FlowProgressHandleImpl<A>(
|
data class FlowProgressHandleImpl<A>(
|
||||||
override val id: StateMachineRunId,
|
override val id: StateMachineRunId,
|
||||||
override val returnValue: ListenableFuture<A>,
|
override val returnValue: ListenableFuture<A>,
|
||||||
override val progress: Observable<String>) : FlowProgressHandle<A> {
|
override val progress: Observable<String>) : FlowProgressHandle<A> {
|
||||||
|
|
||||||
// Remember to add @Throws to FlowProgressHandle.close() if this throws an exception.
|
// Remember to add @Throws to FlowProgressHandle.close() if this throws an exception.
|
||||||
override fun close() {
|
override fun close() {
|
||||||
|
@ -3,7 +3,7 @@ package net.corda.core.transactions
|
|||||||
import co.paralleluniverse.strands.Strand
|
import co.paralleluniverse.strands.Strand
|
||||||
import net.corda.core.contracts.*
|
import net.corda.core.contracts.*
|
||||||
import net.corda.core.crypto.*
|
import net.corda.core.crypto.*
|
||||||
import net.corda.core.flows.FlowStateMachine
|
import net.corda.core.internal.FlowStateMachine
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
import net.corda.core.serialization.serialize
|
import net.corda.core.serialization.serialize
|
||||||
import java.security.KeyPair
|
import java.security.KeyPair
|
||||||
|
@ -6,7 +6,7 @@ import net.corda.core.contracts.Amount
|
|||||||
import net.corda.core.contracts.DOLLARS
|
import net.corda.core.contracts.DOLLARS
|
||||||
import net.corda.core.contracts.currency
|
import net.corda.core.contracts.currency
|
||||||
import net.corda.core.flows.FlowException
|
import net.corda.core.flows.FlowException
|
||||||
import net.corda.core.flows.FlowStateMachine
|
import net.corda.core.internal.FlowStateMachine
|
||||||
import net.corda.core.getOrThrow
|
import net.corda.core.getOrThrow
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
import net.corda.core.map
|
import net.corda.core.map
|
||||||
|
@ -4,7 +4,7 @@ import com.google.common.annotations.VisibleForTesting
|
|||||||
import com.google.common.util.concurrent.ListenableFuture
|
import com.google.common.util.concurrent.ListenableFuture
|
||||||
import net.corda.core.flows.FlowInitiator
|
import net.corda.core.flows.FlowInitiator
|
||||||
import net.corda.core.flows.FlowLogic
|
import net.corda.core.flows.FlowLogic
|
||||||
import net.corda.core.flows.FlowStateMachine
|
import net.corda.core.internal.FlowStateMachine
|
||||||
import net.corda.core.messaging.SingleMessageRecipient
|
import net.corda.core.messaging.SingleMessageRecipient
|
||||||
import net.corda.core.node.NodeInfo
|
import net.corda.core.node.NodeInfo
|
||||||
import net.corda.core.node.PluginServiceHub
|
import net.corda.core.node.PluginServiceHub
|
||||||
|
@ -12,6 +12,7 @@ import net.corda.core.abbreviate
|
|||||||
import net.corda.core.crypto.SecureHash
|
import net.corda.core.crypto.SecureHash
|
||||||
import net.corda.core.flows.*
|
import net.corda.core.flows.*
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.internal.FlowStateMachine
|
||||||
import net.corda.core.random63BitValue
|
import net.corda.core.random63BitValue
|
||||||
import net.corda.core.transactions.SignedTransaction
|
import net.corda.core.transactions.SignedTransaction
|
||||||
import net.corda.core.utilities.ProgressTracker
|
import net.corda.core.utilities.ProgressTracker
|
||||||
|
@ -12,7 +12,7 @@ import com.google.common.util.concurrent.SettableFuture
|
|||||||
import net.corda.core.*
|
import net.corda.core.*
|
||||||
import net.corda.core.flows.FlowInitiator
|
import net.corda.core.flows.FlowInitiator
|
||||||
import net.corda.core.flows.FlowLogic
|
import net.corda.core.flows.FlowLogic
|
||||||
import net.corda.core.flows.FlowStateMachine
|
import net.corda.core.internal.FlowStateMachine
|
||||||
import net.corda.core.messaging.CordaRPCOps
|
import net.corda.core.messaging.CordaRPCOps
|
||||||
import net.corda.core.messaging.StateMachineUpdate
|
import net.corda.core.messaging.StateMachineUpdate
|
||||||
import net.corda.core.utilities.Emoji
|
import net.corda.core.utilities.Emoji
|
||||||
|
@ -6,7 +6,7 @@ import net.corda.core.contracts.Amount
|
|||||||
import net.corda.core.crypto.SecureHash
|
import net.corda.core.crypto.SecureHash
|
||||||
import net.corda.core.flows.FlowInitiator
|
import net.corda.core.flows.FlowInitiator
|
||||||
import net.corda.core.flows.FlowLogic
|
import net.corda.core.flows.FlowLogic
|
||||||
import net.corda.core.flows.FlowStateMachine
|
import net.corda.core.internal.FlowStateMachine
|
||||||
import net.corda.core.flows.StateMachineRunId
|
import net.corda.core.flows.StateMachineRunId
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
import net.corda.core.node.ServiceHub
|
import net.corda.core.node.ServiceHub
|
||||||
|
@ -13,6 +13,7 @@ import net.corda.core.flows.*
|
|||||||
import net.corda.core.identity.AbstractParty
|
import net.corda.core.identity.AbstractParty
|
||||||
import net.corda.core.identity.AnonymousParty
|
import net.corda.core.identity.AnonymousParty
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.internal.FlowStateMachine
|
||||||
import net.corda.core.messaging.SingleMessageRecipient
|
import net.corda.core.messaging.SingleMessageRecipient
|
||||||
import net.corda.core.node.NodeInfo
|
import net.corda.core.node.NodeInfo
|
||||||
import net.corda.core.node.services.*
|
import net.corda.core.node.services.*
|
||||||
|
@ -11,7 +11,7 @@ import net.corda.core.*
|
|||||||
import net.corda.core.contracts.StateAndRef
|
import net.corda.core.contracts.StateAndRef
|
||||||
import net.corda.core.contracts.UniqueIdentifier
|
import net.corda.core.contracts.UniqueIdentifier
|
||||||
import net.corda.core.flows.FlowLogic
|
import net.corda.core.flows.FlowLogic
|
||||||
import net.corda.core.flows.FlowStateMachine
|
import net.corda.core.internal.FlowStateMachine
|
||||||
import net.corda.core.flows.InitiatedBy
|
import net.corda.core.flows.InitiatedBy
|
||||||
import net.corda.core.flows.InitiatingFlow
|
import net.corda.core.flows.InitiatingFlow
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
|
@ -3,7 +3,6 @@ package net.corda.testing.node
|
|||||||
import net.corda.core.contracts.Attachment
|
import net.corda.core.contracts.Attachment
|
||||||
import net.corda.core.crypto.*
|
import net.corda.core.crypto.*
|
||||||
import net.corda.core.flows.StateMachineRunId
|
import net.corda.core.flows.StateMachineRunId
|
||||||
import net.corda.core.identity.Party
|
|
||||||
import net.corda.core.identity.PartyAndCertificate
|
import net.corda.core.identity.PartyAndCertificate
|
||||||
import net.corda.core.messaging.SingleMessageRecipient
|
import net.corda.core.messaging.SingleMessageRecipient
|
||||||
import net.corda.core.node.NodeInfo
|
import net.corda.core.node.NodeInfo
|
||||||
@ -13,8 +12,6 @@ import net.corda.core.serialization.SerializeAsToken
|
|||||||
import net.corda.core.serialization.SingletonSerializeAsToken
|
import net.corda.core.serialization.SingletonSerializeAsToken
|
||||||
import net.corda.core.transactions.SignedTransaction
|
import net.corda.core.transactions.SignedTransaction
|
||||||
import net.corda.core.utilities.DUMMY_CA
|
import net.corda.core.utilities.DUMMY_CA
|
||||||
import net.corda.core.utilities.DUMMY_NOTARY
|
|
||||||
import net.corda.core.utilities.DUMMY_NOTARY_IDENTITY
|
|
||||||
import net.corda.core.utilities.getTestPartyAndCertificate
|
import net.corda.core.utilities.getTestPartyAndCertificate
|
||||||
import net.corda.node.services.identity.InMemoryIdentityService
|
import net.corda.node.services.identity.InMemoryIdentityService
|
||||||
import net.corda.node.services.keys.freshCertificate
|
import net.corda.node.services.keys.freshCertificate
|
||||||
@ -25,7 +22,6 @@ import net.corda.node.services.schema.NodeSchemaService
|
|||||||
import net.corda.node.services.transactions.InMemoryTransactionVerifierService
|
import net.corda.node.services.transactions.InMemoryTransactionVerifierService
|
||||||
import net.corda.node.services.vault.NodeVaultService
|
import net.corda.node.services.vault.NodeVaultService
|
||||||
import net.corda.testing.MEGA_CORP
|
import net.corda.testing.MEGA_CORP
|
||||||
import net.corda.testing.MINI_CORP
|
|
||||||
import net.corda.testing.MOCK_IDENTITIES
|
import net.corda.testing.MOCK_IDENTITIES
|
||||||
import net.corda.testing.MOCK_VERSION_INFO
|
import net.corda.testing.MOCK_VERSION_INFO
|
||||||
import org.bouncycastle.cert.X509CertificateHolder
|
import org.bouncycastle.cert.X509CertificateHolder
|
||||||
|
Loading…
Reference in New Issue
Block a user