mirror of
https://github.com/corda/corda.git
synced 2024-12-20 05:28:21 +00:00
uncheckedCast crusade (#1667)
This commit is contained in:
parent
c6c4c13bee
commit
9874e1ff34
@ -17,6 +17,7 @@ import net.corda.core.identity.AbstractParty
|
|||||||
import net.corda.core.identity.AnonymousParty
|
import net.corda.core.identity.AnonymousParty
|
||||||
import net.corda.core.identity.CordaX500Name
|
import net.corda.core.identity.CordaX500Name
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.messaging.CordaRPCOps
|
import net.corda.core.messaging.CordaRPCOps
|
||||||
import net.corda.core.node.NodeInfo
|
import net.corda.core.node.NodeInfo
|
||||||
import net.corda.core.node.services.IdentityService
|
import net.corda.core.node.services.IdentityService
|
||||||
@ -266,8 +267,7 @@ object JacksonSupport {
|
|||||||
parser.nextToken()
|
parser.nextToken()
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
@Suppress("UNCHECKED_CAST")
|
return uncheckedCast(SecureHash.parse(parser.text))
|
||||||
return SecureHash.parse(parser.text) as T
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
throw JsonParseException(parser, "Invalid hash ${parser.text}: ${e.message}")
|
throw JsonParseException(parser, "Invalid hash ${parser.text}: ${e.message}")
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import net.corda.client.jfx.utils.fold
|
|||||||
import net.corda.client.jfx.utils.map
|
import net.corda.client.jfx.utils.map
|
||||||
import net.corda.core.contracts.ContractState
|
import net.corda.core.contracts.ContractState
|
||||||
import net.corda.core.contracts.StateAndRef
|
import net.corda.core.contracts.StateAndRef
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.node.services.Vault
|
import net.corda.core.node.services.Vault
|
||||||
import net.corda.finance.contracts.asset.Cash
|
import net.corda.finance.contracts.asset.Cash
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
@ -37,10 +38,9 @@ class ContractStateModel {
|
|||||||
companion object {
|
companion object {
|
||||||
private fun Collection<StateAndRef<ContractState>>.filterCashStateAndRefs(): List<StateAndRef<Cash.State>> {
|
private fun Collection<StateAndRef<ContractState>>.filterCashStateAndRefs(): List<StateAndRef<Cash.State>> {
|
||||||
return this.map { stateAndRef ->
|
return this.map { stateAndRef ->
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
if (stateAndRef.state.data is Cash.State) {
|
if (stateAndRef.state.data is Cash.State) {
|
||||||
// Kotlin doesn't unify here for some reason
|
// Kotlin doesn't unify here for some reason
|
||||||
stateAndRef as StateAndRef<Cash.State>
|
uncheckedCast(stateAndRef)
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import javafx.beans.property.ObjectProperty
|
|||||||
import javafx.beans.value.ObservableValue
|
import javafx.beans.value.ObservableValue
|
||||||
import javafx.beans.value.WritableValue
|
import javafx.beans.value.WritableValue
|
||||||
import javafx.collections.ObservableList
|
import javafx.collections.ObservableList
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import org.reactfx.EventSink
|
import org.reactfx.EventSink
|
||||||
import org.reactfx.EventStream
|
import org.reactfx.EventStream
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
@ -78,9 +79,7 @@ object Models {
|
|||||||
if (model.javaClass != klass.java) {
|
if (model.javaClass != klass.java) {
|
||||||
throw IllegalStateException("Model stored as ${klass.qualifiedName} has type ${model.javaClass}")
|
throw IllegalStateException("Model stored as ${klass.qualifiedName} has type ${model.javaClass}")
|
||||||
}
|
}
|
||||||
|
return uncheckedCast(model)
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
return model as M
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <reified M : Any> get(origin: KClass<*>): M = get(M::class, origin)
|
inline fun <reified M : Any> get(origin: KClass<*>): M = get(M::class, origin)
|
||||||
|
@ -14,6 +14,7 @@ import javafx.collections.ObservableMap
|
|||||||
import javafx.collections.transformation.FilteredList
|
import javafx.collections.transformation.FilteredList
|
||||||
import net.corda.core.contracts.ContractState
|
import net.corda.core.contracts.ContractState
|
||||||
import net.corda.core.contracts.StateAndRef
|
import net.corda.core.contracts.StateAndRef
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.messaging.DataFeed
|
import net.corda.core.messaging.DataFeed
|
||||||
import net.corda.core.node.services.Vault
|
import net.corda.core.node.services.Vault
|
||||||
import org.fxmisc.easybind.EasyBind
|
import org.fxmisc.easybind.EasyBind
|
||||||
@ -92,8 +93,7 @@ fun <A, B> ObservableValue<out A>.bind(function: (A) -> ObservableValue<B>): Obs
|
|||||||
* propagate variance constraints and type inference fails.
|
* propagate variance constraints and type inference fails.
|
||||||
*/
|
*/
|
||||||
fun <A, B> ObservableValue<out A>.bindOut(function: (A) -> ObservableValue<out B>): ObservableValue<out B> =
|
fun <A, B> ObservableValue<out A>.bindOut(function: (A) -> ObservableValue<out B>): ObservableValue<out B> =
|
||||||
@Suppress("UNCHECKED_CAST")
|
EasyBind.monadic(this).flatMap(uncheckedCast(function))
|
||||||
EasyBind.monadic(this).flatMap(function as (A) -> ObservableValue<B>)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enum class FilterCriterion { HEIGHT, NAME }
|
* enum class FilterCriterion { HEIGHT, NAME }
|
||||||
@ -105,8 +105,7 @@ fun <A, B> ObservableValue<out A>.bindOut(function: (A) -> ObservableValue<out B
|
|||||||
*/
|
*/
|
||||||
fun <A> ObservableList<out A>.filter(predicate: ObservableValue<(A) -> Boolean>): ObservableList<A> {
|
fun <A> ObservableList<out A>.filter(predicate: ObservableValue<(A) -> Boolean>): ObservableList<A> {
|
||||||
// We cast here to enforce variance, FilteredList should be covariant
|
// We cast here to enforce variance, FilteredList should be covariant
|
||||||
@Suppress("UNCHECKED_CAST")
|
return FilteredList<A>(uncheckedCast(this)).apply {
|
||||||
return FilteredList<A>(this as ObservableList<A>).apply {
|
|
||||||
predicateProperty().bind(predicate.map { predicateFunction ->
|
predicateProperty().bind(predicate.map { predicateFunction ->
|
||||||
Predicate<A> { predicateFunction(it) }
|
Predicate<A> { predicateFunction(it) }
|
||||||
})
|
})
|
||||||
@ -120,13 +119,11 @@ fun <A> ObservableList<out A>.filter(predicate: ObservableValue<(A) -> Boolean>)
|
|||||||
*/
|
*/
|
||||||
fun <A> ObservableList<out A?>.filterNotNull(): ObservableList<A> {
|
fun <A> ObservableList<out A?>.filterNotNull(): ObservableList<A> {
|
||||||
//TODO This is a tactical work round for an issue with SAM conversion (https://youtrack.jetbrains.com/issue/ALL-1552) so that the M10 explorer works.
|
//TODO This is a tactical work round for an issue with SAM conversion (https://youtrack.jetbrains.com/issue/ALL-1552) so that the M10 explorer works.
|
||||||
@Suppress("UNCHECKED_CAST")
|
return uncheckedCast(uncheckedCast<Any, ObservableList<A?>>(this).filtered(object : Predicate<A?> {
|
||||||
return (this as ObservableList<A?>).filtered(object : Predicate<A?> {
|
|
||||||
override fun test(t: A?): Boolean {
|
override fun test(t: A?): Boolean {
|
||||||
return t != null
|
return t != null
|
||||||
|
|
||||||
}
|
}
|
||||||
}) as ObservableList<A>
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package net.corda.client.mock
|
package net.corda.client.mock
|
||||||
|
|
||||||
import net.corda.client.mock.Generator.Companion.choice
|
import net.corda.client.mock.Generator.Companion.choice
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.utilities.Try
|
import net.corda.core.utilities.Try
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@ -115,14 +116,13 @@ class Generator<out A>(val generate: (SplittableRandom) -> Try<A>) {
|
|||||||
|
|
||||||
fun <A> frequency(vararg generators: Pair<Double, Generator<A>>) = frequency(generators.toList())
|
fun <A> frequency(vararg generators: Pair<Double, Generator<A>>) = frequency(generators.toList())
|
||||||
|
|
||||||
fun <A> sequence(generators: List<Generator<A>>) = Generator {
|
fun <A> sequence(generators: List<Generator<A>>) = Generator<List<A>> {
|
||||||
val result = mutableListOf<A>()
|
val result = mutableListOf<A>()
|
||||||
for (generator in generators) {
|
for (generator in generators) {
|
||||||
val element = generator.generate(it)
|
val element = generator.generate(it)
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
when (element) {
|
when (element) {
|
||||||
is Try.Success -> result.add(element.value)
|
is Try.Success -> result.add(element.value)
|
||||||
is Try.Failure -> return@Generator element as Try<List<A>>
|
is Try.Failure -> return@Generator uncheckedCast(element)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Try.Success(result)
|
Try.Success(result)
|
||||||
@ -175,7 +175,7 @@ class Generator<out A>(val generate: (SplittableRandom) -> Try<A>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun <A> replicatePoisson(meanSize: Double, generator: Generator<A>, atLeastOne: Boolean = false) = Generator {
|
fun <A> replicatePoisson(meanSize: Double, generator: Generator<A>, atLeastOne: Boolean = false) = Generator<List<A>> {
|
||||||
val chance = (meanSize - 1) / meanSize
|
val chance = (meanSize - 1) / meanSize
|
||||||
val result = mutableListOf<A>()
|
val result = mutableListOf<A>()
|
||||||
var finish = false
|
var finish = false
|
||||||
@ -191,8 +191,7 @@ class Generator<out A>(val generate: (SplittableRandom) -> Try<A>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (res is Try.Failure) {
|
if (res is Try.Failure) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
return@Generator uncheckedCast(res)
|
||||||
return@Generator res as Try<List<A>>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Try.Success(result)
|
Try.Success(result)
|
||||||
|
@ -4,6 +4,7 @@ import net.corda.client.rpc.RPCConnection
|
|||||||
import net.corda.client.rpc.RPCException
|
import net.corda.client.rpc.RPCException
|
||||||
import net.corda.core.crypto.random63BitValue
|
import net.corda.core.crypto.random63BitValue
|
||||||
import net.corda.core.internal.logElapsedTime
|
import net.corda.core.internal.logElapsedTime
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.messaging.RPCOps
|
import net.corda.core.messaging.RPCOps
|
||||||
import net.corda.core.serialization.SerializationContext
|
import net.corda.core.serialization.SerializationContext
|
||||||
import net.corda.core.serialization.SerializationDefaults
|
import net.corda.core.serialization.SerializationDefaults
|
||||||
@ -114,10 +115,7 @@ class RPCClient<I : RPCOps>(
|
|||||||
val proxyHandler = RPCClientProxyHandler(rpcConfiguration, username, password, serverLocator, clientAddress, rpcOpsClass, serializationContext)
|
val proxyHandler = RPCClientProxyHandler(rpcConfiguration, username, password, serverLocator, clientAddress, rpcOpsClass, serializationContext)
|
||||||
try {
|
try {
|
||||||
proxyHandler.start()
|
proxyHandler.start()
|
||||||
|
val ops: I = uncheckedCast(Proxy.newProxyInstance(rpcOpsClass.classLoader, arrayOf(rpcOpsClass), proxyHandler))
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val ops = Proxy.newProxyInstance(rpcOpsClass.classLoader, arrayOf(rpcOpsClass), proxyHandler) as I
|
|
||||||
|
|
||||||
val serverProtocolVersion = ops.protocolVersion
|
val serverProtocolVersion = ops.protocolVersion
|
||||||
if (serverProtocolVersion < rpcConfiguration.minimumServerProtocolVersion) {
|
if (serverProtocolVersion < rpcConfiguration.minimumServerProtocolVersion) {
|
||||||
throw RPCException("Requested minimum protocol version (${rpcConfiguration.minimumServerProtocolVersion}) is higher" +
|
throw RPCException("Requested minimum protocol version (${rpcConfiguration.minimumServerProtocolVersion}) is higher" +
|
||||||
|
@ -4,6 +4,7 @@ package net.corda.core.contracts
|
|||||||
|
|
||||||
import net.corda.core.identity.AbstractParty
|
import net.corda.core.identity.AbstractParty
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import java.security.PublicKey
|
import java.security.PublicKey
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@ -58,7 +59,7 @@ inline fun <reified T : CommandData> Collection<CommandWithParties<CommandData>>
|
|||||||
|
|
||||||
/** Ensures that a transaction has only one command that is of the given type, otherwise throws an exception. */
|
/** Ensures that a transaction has only one command that is of the given type, otherwise throws an exception. */
|
||||||
fun <C : CommandData> Collection<CommandWithParties<CommandData>>.requireSingleCommand(klass: Class<C>) =
|
fun <C : CommandData> Collection<CommandWithParties<CommandData>>.requireSingleCommand(klass: Class<C>) =
|
||||||
mapNotNull { @Suppress("UNCHECKED_CAST") if (klass.isInstance(it.value)) it as CommandWithParties<C> else null }.single()
|
mapNotNull { if (klass.isInstance(it.value)) uncheckedCast<CommandWithParties<CommandData>, CommandWithParties<C>>(it) else null }.single()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple functionality for verifying a move command. Verifies that each input has a signature from its owning key.
|
* Simple functionality for verifying a move command. Verifies that each input has a signature from its owning key.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.corda.core.crypto
|
package net.corda.core.crypto
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.serialization.CordaSerializable
|
import net.corda.core.serialization.CordaSerializable
|
||||||
import net.corda.core.serialization.SerializedBytes
|
import net.corda.core.serialization.SerializedBytes
|
||||||
import net.corda.core.serialization.deserialize
|
import net.corda.core.serialization.deserialize
|
||||||
@ -23,8 +24,7 @@ open class SignedData<T : Any>(val raw: SerializedBytes<T>, val sig: DigitalSign
|
|||||||
@Throws(SignatureException::class)
|
@Throws(SignatureException::class)
|
||||||
fun verified(): T {
|
fun verified(): T {
|
||||||
sig.by.verify(raw.bytes, sig)
|
sig.by.verify(raw.bytes, sig)
|
||||||
@Suppress("UNCHECKED_CAST")
|
val data: T = uncheckedCast(raw.deserialize<Any>())
|
||||||
val data = raw.deserialize<Any>() as T
|
|
||||||
verifyData(data)
|
verifyData(data)
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package net.corda.core.flows
|
|||||||
import co.paralleluniverse.fibers.Suspendable
|
import co.paralleluniverse.fibers.Suspendable
|
||||||
import net.corda.core.contracts.*
|
import net.corda.core.contracts.*
|
||||||
import net.corda.core.internal.ContractUpgradeUtils
|
import net.corda.core.internal.ContractUpgradeUtils
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.transactions.LedgerTransaction
|
import net.corda.core.transactions.LedgerTransaction
|
||||||
import net.corda.core.transactions.TransactionBuilder
|
import net.corda.core.transactions.TransactionBuilder
|
||||||
import java.security.PublicKey
|
import java.security.PublicKey
|
||||||
@ -30,8 +31,7 @@ object ContractUpgradeFlow {
|
|||||||
val command = commandData.value
|
val command = commandData.value
|
||||||
val participantKeys: Set<PublicKey> = input.data.participants.map { it.owningKey }.toSet()
|
val participantKeys: Set<PublicKey> = input.data.participants.map { it.owningKey }.toSet()
|
||||||
val keysThatSigned: Set<PublicKey> = commandData.signers.toSet()
|
val keysThatSigned: Set<PublicKey> = commandData.signers.toSet()
|
||||||
@Suppress("UNCHECKED_CAST")
|
val upgradedContract: UpgradedContract<ContractState, *> = uncheckedCast(javaClass.classLoader.loadClass(command.upgradedContractClass).newInstance())
|
||||||
val upgradedContract = javaClass.classLoader.loadClass(command.upgradedContractClass).newInstance() as UpgradedContract<ContractState, *>
|
|
||||||
requireThat {
|
requireThat {
|
||||||
"The signing keys include all participant keys" using keysThatSigned.containsAll(participantKeys)
|
"The signing keys include all participant keys" using keysThatSigned.containsAll(participantKeys)
|
||||||
"Inputs state reference the legacy contract" using (input.contract == upgradedContract.legacyContract)
|
"Inputs state reference the legacy contract" using (input.contract == upgradedContract.legacyContract)
|
||||||
|
@ -114,8 +114,7 @@ sealed class FetchDataFlow<T : NamedByHash, in W : Any>(
|
|||||||
|
|
||||||
protected abstract fun load(txid: SecureHash): T?
|
protected abstract fun load(txid: SecureHash): T?
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
protected open fun convert(wire: W): T = uncheckedCast(wire)
|
||||||
protected open fun convert(wire: W): T = wire as T
|
|
||||||
|
|
||||||
private fun validateFetchResponse(maybeItems: UntrustworthyData<ArrayList<W>>,
|
private fun validateFetchResponse(maybeItems: UntrustworthyData<ArrayList<W>>,
|
||||||
requests: List<SecureHash>): List<T> {
|
requests: List<SecureHash>): List<T> {
|
||||||
|
@ -226,8 +226,8 @@ private fun IntProgression.toSpliterator(): Spliterator.OfInt {
|
|||||||
|
|
||||||
fun IntProgression.stream(parallel: Boolean = false): IntStream = StreamSupport.intStream(toSpliterator(), parallel)
|
fun IntProgression.stream(parallel: Boolean = false): IntStream = StreamSupport.intStream(toSpliterator(), parallel)
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST") // When toArray has filled in the array, the component type is no longer T? but T (that may itself be nullable).
|
// When toArray has filled in the array, the component type is no longer T? but T (that may itself be nullable):
|
||||||
inline fun <reified T> Stream<out T>.toTypedArray() = toArray { size -> arrayOfNulls<T>(size) } as Array<T>
|
inline fun <reified T> Stream<out T>.toTypedArray(): Array<T> = uncheckedCast(toArray { size -> arrayOfNulls<T>(size) })
|
||||||
|
|
||||||
fun <T> Class<T>.castIfPossible(obj: Any): T? = if (isInstance(obj)) cast(obj) else null
|
fun <T> Class<T>.castIfPossible(obj: Any): T? = if (isInstance(obj)) cast(obj) else null
|
||||||
|
|
||||||
@ -256,8 +256,7 @@ fun <T: Any> KClass<T>.objectOrNewInstance(): T {
|
|||||||
class DeclaredField<T>(clazz: Class<*>, name: String, private val receiver: Any?) {
|
class DeclaredField<T>(clazz: Class<*>, name: String, private val receiver: Any?) {
|
||||||
private val javaField = clazz.getDeclaredField(name).apply { isAccessible = true }
|
private val javaField = clazz.getDeclaredField(name).apply { isAccessible = true }
|
||||||
var value: T
|
var value: T
|
||||||
@Suppress("UNCHECKED_CAST")
|
get() = uncheckedCast<Any?, T>(javaField.get(receiver))
|
||||||
get() = javaField.get(receiver) as T
|
|
||||||
set(value) = javaField.set(receiver, value)
|
set(value) = javaField.set(receiver, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
package net.corda.core.node.services.vault
|
package net.corda.core.node.services.vault
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.schemas.PersistentState
|
import net.corda.core.schemas.PersistentState
|
||||||
import net.corda.core.serialization.CordaSerializable
|
import net.corda.core.serialization.CordaSerializable
|
||||||
import java.lang.reflect.Field
|
import java.lang.reflect.Field
|
||||||
@ -88,8 +89,7 @@ fun <O, R> resolveEnclosingObjectFromExpression(expression: CriteriaExpression<O
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
fun <O, C> resolveEnclosingObjectFromColumn(column: Column<O, C>): Class<O> = uncheckedCast(column.declaringClass)
|
||||||
fun <O, C> resolveEnclosingObjectFromColumn(column: Column<O, C>): Class<O> = column.declaringClass as Class<O>
|
|
||||||
fun <O, C> getColumnName(column: Column<O, C>): String = column.name
|
fun <O, C> getColumnName(column: Column<O, C>): String = column.name
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -4,6 +4,7 @@ import net.corda.core.contracts.*
|
|||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
import net.corda.core.internal.indexOfOrThrow
|
import net.corda.core.internal.indexOfOrThrow
|
||||||
import net.corda.core.internal.castIfPossible
|
import net.corda.core.internal.castIfPossible
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import java.util.function.Predicate
|
import java.util.function.Predicate
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,8 +41,7 @@ abstract class BaseTransaction : NamedByHash {
|
|||||||
/**
|
/**
|
||||||
* Returns a [StateAndRef] for the given output index.
|
* Returns a [StateAndRef] for the given output index.
|
||||||
*/
|
*/
|
||||||
@Suppress("UNCHECKED_CAST")
|
fun <T : ContractState> outRef(index: Int): StateAndRef<T> = StateAndRef(uncheckedCast(outputs[index]), StateRef(id, index))
|
||||||
fun <T : ContractState> outRef(index: Int): StateAndRef<T> = StateAndRef(outputs[index] as TransactionState<T>, StateRef(id, index))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a [StateAndRef] for the requested output state, or throws [IllegalArgumentException] if not found.
|
* Returns a [StateAndRef] for the requested output state, or throws [IllegalArgumentException] if not found.
|
||||||
@ -111,8 +111,7 @@ abstract class BaseTransaction : NamedByHash {
|
|||||||
*/
|
*/
|
||||||
fun <T : ContractState> outRefsOfType(clazz: Class<T>): List<StateAndRef<T>> {
|
fun <T : ContractState> outRefsOfType(clazz: Class<T>): List<StateAndRef<T>> {
|
||||||
return outputs.mapIndexedNotNull { index, state ->
|
return outputs.mapIndexedNotNull { index, state ->
|
||||||
@Suppress("UNCHECKED_CAST")
|
clazz.castIfPossible(state.data)?.let { StateAndRef<T>(uncheckedCast(state), StateRef(id, index)) }
|
||||||
clazz.castIfPossible(state.data)?.let { StateAndRef(state as TransactionState<T>, StateRef(id, index)) }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import net.corda.core.contracts.*
|
|||||||
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.castIfPossible
|
import net.corda.core.internal.castIfPossible
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.serialization.CordaSerializable
|
import net.corda.core.serialization.CordaSerializable
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.function.Predicate
|
import java.util.function.Predicate
|
||||||
@ -52,8 +53,7 @@ data class LedgerTransaction(
|
|||||||
* @param index The index into the inputs.
|
* @param index The index into the inputs.
|
||||||
* @return The [StateAndRef]
|
* @return The [StateAndRef]
|
||||||
*/
|
*/
|
||||||
@Suppress("UNCHECKED_CAST")
|
fun <T : ContractState> inRef(index: Int): StateAndRef<T> = uncheckedCast(inputs[index])
|
||||||
fun <T : ContractState> inRef(index: Int): StateAndRef<T> = inputs[index] as StateAndRef<T>
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verifies this transaction and runs contract code. At this stage it is assumed that signatures have already been verified.
|
* Verifies this transaction and runs contract code. At this stage it is assumed that signatures have already been verified.
|
||||||
@ -230,8 +230,7 @@ data class LedgerTransaction(
|
|||||||
* @return the possibly empty list of inputs [StateAndRef] matching the clazz restriction.
|
* @return the possibly empty list of inputs [StateAndRef] matching the clazz restriction.
|
||||||
*/
|
*/
|
||||||
fun <T : ContractState> inRefsOfType(clazz: Class<T>): List<StateAndRef<T>> {
|
fun <T : ContractState> inRefsOfType(clazz: Class<T>): List<StateAndRef<T>> {
|
||||||
@Suppress("UNCHECKED_CAST")
|
return inputs.mapNotNull { if (clazz.isInstance(it.state.data)) uncheckedCast<StateAndRef<ContractState>, StateAndRef<T>>(it) else null }
|
||||||
return inputs.mapNotNull { if (clazz.isInstance(it.state.data)) it as StateAndRef<T> else null }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <reified T : ContractState> inRefsOfType(): List<StateAndRef<T>> = inRefsOfType(T::class.java)
|
inline fun <reified T : ContractState> inRefsOfType(): List<StateAndRef<T>> = inRefsOfType(T::class.java)
|
||||||
@ -307,8 +306,7 @@ data class LedgerTransaction(
|
|||||||
* @param index the position of the item in the commands.
|
* @param index the position of the item in the commands.
|
||||||
* @return The Command at the requested index
|
* @return The Command at the requested index
|
||||||
*/
|
*/
|
||||||
@Suppress("UNCHECKED_CAST")
|
fun <T : CommandData> getCommand(index: Int): Command<T> = Command(uncheckedCast(commands[index].value), commands[index].signers)
|
||||||
fun <T : CommandData> getCommand(index: Int): Command<T> = Command(commands[index].value as T, commands[index].signers)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper to simplify getting all [Command] items with a [CommandData] of a particular class, interface, or base class.
|
* Helper to simplify getting all [Command] items with a [CommandData] of a particular class, interface, or base class.
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package net.corda.core.utilities
|
package net.corda.core.utilities
|
||||||
|
|
||||||
import net.corda.core.internal.concurrent.get
|
import net.corda.core.internal.concurrent.get
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.serialization.CordaSerializable
|
import net.corda.core.serialization.CordaSerializable
|
||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
@ -101,14 +102,13 @@ private class TransientProperty<out T> internal constructor(private val initiali
|
|||||||
@Transient private var initialised = false
|
@Transient private var initialised = false
|
||||||
@Transient private var value: T? = null
|
@Transient private var value: T? = null
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
override operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
|
override operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
|
||||||
if (!initialised) {
|
if (!initialised) {
|
||||||
value = initialiser()
|
value = initialiser()
|
||||||
initialised = true
|
initialised = true
|
||||||
}
|
}
|
||||||
return value as T
|
return uncheckedCast(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.corda.core.utilities
|
package net.corda.core.utilities
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.serialization.CordaSerializable
|
import net.corda.core.serialization.CordaSerializable
|
||||||
import net.corda.core.utilities.Try.Failure
|
import net.corda.core.utilities.Try.Failure
|
||||||
import net.corda.core.utilities.Try.Success
|
import net.corda.core.utilities.Try.Success
|
||||||
@ -35,30 +36,27 @@ sealed class Try<out A> {
|
|||||||
abstract fun getOrThrow(): A
|
abstract fun getOrThrow(): A
|
||||||
|
|
||||||
/** Maps the given function to the value from this [Success], or returns `this` if this is a [Failure]. */
|
/** Maps the given function to the value from this [Success], or returns `this` if this is a [Failure]. */
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
inline fun <B> map(function: (A) -> B): Try<B> = when (this) {
|
inline fun <B> map(function: (A) -> B): Try<B> = when (this) {
|
||||||
is Success -> Success(function(value))
|
is Success -> Success(function(value))
|
||||||
is Failure -> this as Try<B>
|
is Failure -> uncheckedCast(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the given function applied to the value from this [Success], or returns `this` if this is a [Failure]. */
|
/** Returns the given function applied to the value from this [Success], or returns `this` if this is a [Failure]. */
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
inline fun <B> flatMap(function: (A) -> Try<B>): Try<B> = when (this) {
|
inline fun <B> flatMap(function: (A) -> Try<B>): Try<B> = when (this) {
|
||||||
is Success -> function(value)
|
is Success -> function(value)
|
||||||
is Failure -> this as Try<B>
|
is Failure -> uncheckedCast(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maps the given function to the values from this [Success] and [other], or returns `this` if this is a [Failure]
|
* Maps the given function to the values from this [Success] and [other], or returns `this` if this is a [Failure]
|
||||||
* or [other] if [other] is a [Failure].
|
* or [other] if [other] is a [Failure].
|
||||||
*/
|
*/
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
inline fun <B, C> combine(other: Try<B>, function: (A, B) -> C): Try<C> = when (this) {
|
inline fun <B, C> combine(other: Try<B>, function: (A, B) -> C): Try<C> = when (this) {
|
||||||
is Success -> when (other) {
|
is Success -> when (other) {
|
||||||
is Success -> Success(function(value, other.value))
|
is Success -> Success(function(value, other.value))
|
||||||
is Failure -> other as Try<C>
|
is Failure -> uncheckedCast(other)
|
||||||
}
|
}
|
||||||
is Failure -> this as Try<C>
|
is Failure -> uncheckedCast(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
data class Success<out A>(val value: A) : Try<A>() {
|
data class Success<out A>(val value: A) : Try<A>() {
|
||||||
|
@ -3,6 +3,7 @@ package net.corda.finance.contracts.universal
|
|||||||
import net.corda.core.contracts.*
|
import net.corda.core.contracts.*
|
||||||
import net.corda.core.identity.AbstractParty
|
import net.corda.core.identity.AbstractParty
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.transactions.LedgerTransaction
|
import net.corda.core.transactions.LedgerTransaction
|
||||||
import net.corda.core.transactions.TransactionBuilder
|
import net.corda.core.transactions.TransactionBuilder
|
||||||
import net.corda.finance.contracts.BusinessCalendar
|
import net.corda.finance.contracts.BusinessCalendar
|
||||||
@ -124,19 +125,18 @@ class UniversalContract : Contract {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun <T> replaceStartEnd(p: Perceivable<T>, start: Instant, end: Instant): Perceivable<T> =
|
fun <T> replaceStartEnd(p: Perceivable<T>, start: Instant, end: Instant): Perceivable<T> =
|
||||||
when (p) {
|
when (p) {
|
||||||
is Const -> p
|
is Const -> p
|
||||||
is TimePerceivable -> TimePerceivable(p.cmp, replaceStartEnd(p.instant, start, end)) as Perceivable<T>
|
is TimePerceivable -> uncheckedCast(TimePerceivable(p.cmp, replaceStartEnd(p.instant, start, end)))
|
||||||
is EndDate -> const(end) as Perceivable<T>
|
is EndDate -> uncheckedCast(const(end))
|
||||||
is StartDate -> const(start) as Perceivable<T>
|
is StartDate -> uncheckedCast(const(start))
|
||||||
is UnaryPlus -> UnaryPlus(replaceStartEnd(p.arg, start, end))
|
is UnaryPlus -> UnaryPlus(replaceStartEnd(p.arg, start, end))
|
||||||
is PerceivableOperation -> PerceivableOperation<T>(replaceStartEnd(p.left, start, end), p.op, replaceStartEnd(p.right, start, end))
|
is PerceivableOperation -> PerceivableOperation<T>(replaceStartEnd(p.left, start, end), p.op, replaceStartEnd(p.right, start, end))
|
||||||
is Interest -> Interest(replaceStartEnd(p.amount, start, end), p.dayCountConvention, replaceStartEnd(p.interest, start, end), replaceStartEnd(p.start, start, end), replaceStartEnd(p.end, start, end)) as Perceivable<T>
|
is Interest -> uncheckedCast(Interest(replaceStartEnd(p.amount, start, end), p.dayCountConvention, replaceStartEnd(p.interest, start, end), replaceStartEnd(p.start, start, end), replaceStartEnd(p.end, start, end)))
|
||||||
is Fixing -> Fixing(p.source, replaceStartEnd(p.date, start, end), p.tenor) as Perceivable<T>
|
is Fixing -> uncheckedCast(Fixing(p.source, replaceStartEnd(p.date, start, end), p.tenor))
|
||||||
is PerceivableAnd -> (replaceStartEnd(p.left, start, end) and replaceStartEnd(p.right, start, end)) as Perceivable<T>
|
is PerceivableAnd -> uncheckedCast(replaceStartEnd(p.left, start, end) and replaceStartEnd(p.right, start, end))
|
||||||
is PerceivableOr -> (replaceStartEnd(p.left, start, end) or replaceStartEnd(p.right, start, end)) as Perceivable<T>
|
is PerceivableOr -> uncheckedCast(replaceStartEnd(p.left, start, end) or replaceStartEnd(p.right, start, end))
|
||||||
is ActorPerceivable -> p
|
is ActorPerceivable -> p
|
||||||
else -> throw NotImplementedError("replaceStartEnd " + p.javaClass.name)
|
else -> throw NotImplementedError("replaceStartEnd " + p.javaClass.name)
|
||||||
}
|
}
|
||||||
@ -276,7 +276,6 @@ class UniversalContract : Contract {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun <T> replaceFixing(tx: LedgerTransaction, perceivable: Perceivable<T>,
|
fun <T> replaceFixing(tx: LedgerTransaction, perceivable: Perceivable<T>,
|
||||||
fixings: Map<FixOf, BigDecimal>, unusedFixings: MutableSet<FixOf>): Perceivable<T> =
|
fixings: Map<FixOf, BigDecimal>, unusedFixings: MutableSet<FixOf>): Perceivable<T> =
|
||||||
when (perceivable) {
|
when (perceivable) {
|
||||||
@ -284,14 +283,14 @@ class UniversalContract : Contract {
|
|||||||
is UnaryPlus -> UnaryPlus(replaceFixing(tx, perceivable.arg, fixings, unusedFixings))
|
is UnaryPlus -> UnaryPlus(replaceFixing(tx, perceivable.arg, fixings, unusedFixings))
|
||||||
is PerceivableOperation -> PerceivableOperation(replaceFixing(tx, perceivable.left, fixings, unusedFixings),
|
is PerceivableOperation -> PerceivableOperation(replaceFixing(tx, perceivable.left, fixings, unusedFixings),
|
||||||
perceivable.op, replaceFixing(tx, perceivable.right, fixings, unusedFixings))
|
perceivable.op, replaceFixing(tx, perceivable.right, fixings, unusedFixings))
|
||||||
is Interest -> Interest(replaceFixing(tx, perceivable.amount, fixings, unusedFixings),
|
is Interest -> uncheckedCast(Interest(replaceFixing(tx, perceivable.amount, fixings, unusedFixings),
|
||||||
perceivable.dayCountConvention, replaceFixing(tx, perceivable.interest, fixings, unusedFixings),
|
perceivable.dayCountConvention, replaceFixing(tx, perceivable.interest, fixings, unusedFixings),
|
||||||
perceivable.start, perceivable.end) as Perceivable<T>
|
perceivable.start, perceivable.end))
|
||||||
is Fixing -> {
|
is Fixing -> {
|
||||||
val dt = eval(tx, perceivable.date)
|
val dt = eval(tx, perceivable.date)
|
||||||
if (dt != null && fixings.containsKey(FixOf(perceivable.source, dt.toLocalDate(), perceivable.tenor))) {
|
if (dt != null && fixings.containsKey(FixOf(perceivable.source, dt.toLocalDate(), perceivable.tenor))) {
|
||||||
unusedFixings.remove(FixOf(perceivable.source, dt.toLocalDate(), perceivable.tenor))
|
unusedFixings.remove(FixOf(perceivable.source, dt.toLocalDate(), perceivable.tenor))
|
||||||
Const(fixings[FixOf(perceivable.source, dt.toLocalDate(), perceivable.tenor)]!!) as Perceivable<T>
|
uncheckedCast(Const(fixings[FixOf(perceivable.source, dt.toLocalDate(), perceivable.tenor)]!!))
|
||||||
} else perceivable
|
} else perceivable
|
||||||
}
|
}
|
||||||
else -> throw NotImplementedError("replaceFixing - " + perceivable.javaClass.name)
|
else -> throw NotImplementedError("replaceFixing - " + perceivable.javaClass.name)
|
||||||
|
@ -39,7 +39,6 @@ private fun rowsToAmount(currency: Currency, rows: Vault.Page<FungibleAsset<*>>)
|
|||||||
} else {
|
} else {
|
||||||
require(rows.otherResults.size == 2)
|
require(rows.otherResults.size == 2)
|
||||||
require(rows.otherResults[1] == currency.currencyCode)
|
require(rows.otherResults[1] == currency.currencyCode)
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val quantity = rows.otherResults[0] as Long
|
val quantity = rows.otherResults[0] as Long
|
||||||
Amount(quantity, currency)
|
Amount(quantity, currency)
|
||||||
}
|
}
|
||||||
|
@ -594,7 +594,6 @@ class CashTests : TestDependencyInjectionBase() {
|
|||||||
makeSpend(100.DOLLARS, THEIR_IDENTITY_1)
|
makeSpend(100.DOLLARS, THEIR_IDENTITY_1)
|
||||||
}
|
}
|
||||||
database.transaction {
|
database.transaction {
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val vaultState = vaultStatesUnconsumed.elementAt(0)
|
val vaultState = vaultStatesUnconsumed.elementAt(0)
|
||||||
assertEquals(vaultState.ref, wtx.inputs[0])
|
assertEquals(vaultState.ref, wtx.inputs[0])
|
||||||
assertEquals(vaultState.state.data.copy(owner = THEIR_IDENTITY_1), wtx.getOutput(0))
|
assertEquals(vaultState.state.data.copy(owner = THEIR_IDENTITY_1), wtx.getOutput(0))
|
||||||
@ -622,7 +621,6 @@ class CashTests : TestDependencyInjectionBase() {
|
|||||||
makeSpend(10.DOLLARS, THEIR_IDENTITY_1)
|
makeSpend(10.DOLLARS, THEIR_IDENTITY_1)
|
||||||
}
|
}
|
||||||
database.transaction {
|
database.transaction {
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val vaultState = vaultStatesUnconsumed.elementAt(0)
|
val vaultState = vaultStatesUnconsumed.elementAt(0)
|
||||||
val changeAmount = 90.DOLLARS `issued by` defaultIssuer
|
val changeAmount = 90.DOLLARS `issued by` defaultIssuer
|
||||||
val likelyChangeState = wtx.outputs.map(TransactionState<*>::data).filter { state ->
|
val likelyChangeState = wtx.outputs.map(TransactionState<*>::data).filter { state ->
|
||||||
@ -649,7 +647,6 @@ class CashTests : TestDependencyInjectionBase() {
|
|||||||
makeSpend(500.DOLLARS, THEIR_IDENTITY_1)
|
makeSpend(500.DOLLARS, THEIR_IDENTITY_1)
|
||||||
}
|
}
|
||||||
database.transaction {
|
database.transaction {
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val vaultState0 = vaultStatesUnconsumed.elementAt(0)
|
val vaultState0 = vaultStatesUnconsumed.elementAt(0)
|
||||||
val vaultState1 = vaultStatesUnconsumed.elementAt(1)
|
val vaultState1 = vaultStatesUnconsumed.elementAt(1)
|
||||||
assertEquals(vaultState0.ref, wtx.inputs[0])
|
assertEquals(vaultState0.ref, wtx.inputs[0])
|
||||||
|
@ -5,6 +5,7 @@ import com.typesafe.config.Config
|
|||||||
import com.typesafe.config.ConfigUtil
|
import com.typesafe.config.ConfigUtil
|
||||||
import net.corda.core.identity.CordaX500Name
|
import net.corda.core.identity.CordaX500Name
|
||||||
import net.corda.core.internal.noneOrSingle
|
import net.corda.core.internal.noneOrSingle
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.utilities.NetworkHostAndPort
|
import net.corda.core.utilities.NetworkHostAndPort
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import java.net.Proxy
|
import java.net.Proxy
|
||||||
@ -25,7 +26,7 @@ import kotlin.reflect.jvm.jvmErasure
|
|||||||
annotation class OldConfig(val value: String)
|
annotation class OldConfig(val value: String)
|
||||||
|
|
||||||
// TODO Move other config parsing to use parseAs and remove this
|
// TODO Move other config parsing to use parseAs and remove this
|
||||||
operator fun <T> Config.getValue(receiver: Any, metadata: KProperty<*>): T {
|
operator fun <T : Any> Config.getValue(receiver: Any, metadata: KProperty<*>): T {
|
||||||
return getValueInternal(metadata.name, metadata.returnType)
|
return getValueInternal(metadata.name, metadata.returnType)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,9 +53,8 @@ fun Config.toProperties(): Properties {
|
|||||||
{ it.value.unwrapped().toString() })
|
{ it.value.unwrapped().toString() })
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
private fun <T : Any> Config.getValueInternal(path: String, type: KType): T {
|
||||||
private fun <T> Config.getValueInternal(path: String, type: KType): T {
|
return uncheckedCast(if (type.arguments.isEmpty()) getSingleValue(path, type) else getCollectionValue(path, type))
|
||||||
return (if (type.arguments.isEmpty()) getSingleValue(path, type) else getCollectionValue(path, type)) as T
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Config.getSingleValue(path: String, type: KType): Any? {
|
private fun Config.getSingleValue(path: String, type: KType): Any? {
|
||||||
@ -122,8 +122,7 @@ private fun Config.defaultToOldPath(property: KProperty<*>): String {
|
|||||||
return property.name
|
return property.name
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
private fun parseEnum(enumType: Class<*>, name: String): Enum<*> = enumBridge<Proxy.Type>(uncheckedCast(enumType), name) // Any enum will do
|
||||||
private fun parseEnum(enumType: Class<*>, name: String): Enum<*> = enumBridge(enumType as Class<Proxy.Type>, name) // Any enum will do
|
|
||||||
|
|
||||||
private fun <T : Enum<T>> enumBridge(clazz: Class<T>, name: String): T = java.lang.Enum.valueOf(clazz, name)
|
private fun <T : Enum<T>> enumBridge(clazz: Class<T>, name: String): T = java.lang.Enum.valueOf(clazz, name)
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ import net.corda.core.crypto.CompositeKey
|
|||||||
import net.corda.core.crypto.Crypto
|
import net.corda.core.crypto.Crypto
|
||||||
import net.corda.core.crypto.TransactionSignature
|
import net.corda.core.crypto.TransactionSignature
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.serialization.SerializationContext
|
import net.corda.core.serialization.SerializationContext
|
||||||
import net.corda.core.serialization.SerializeAsTokenContext
|
import net.corda.core.serialization.SerializeAsTokenContext
|
||||||
import net.corda.core.serialization.SerializedBytes
|
import net.corda.core.serialization.SerializedBytes
|
||||||
@ -245,9 +246,8 @@ object WireTransactionSerializer : Serializer<WireTransaction>() {
|
|||||||
kryo.writeClassAndObject(output, obj.privacySalt)
|
kryo.writeClassAndObject(output, obj.privacySalt)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
override fun read(kryo: Kryo, input: Input, type: Class<WireTransaction>): WireTransaction {
|
override fun read(kryo: Kryo, input: Input, type: Class<WireTransaction>): WireTransaction {
|
||||||
val componentGroups = kryo.readClassAndObject(input) as List<ComponentGroup>
|
val componentGroups: List<ComponentGroup> = uncheckedCast(kryo.readClassAndObject(input))
|
||||||
val privacySalt = kryo.readClassAndObject(input) as PrivacySalt
|
val privacySalt = kryo.readClassAndObject(input) as PrivacySalt
|
||||||
return WireTransaction(componentGroups, privacySalt)
|
return WireTransaction(componentGroups, privacySalt)
|
||||||
}
|
}
|
||||||
@ -261,9 +261,8 @@ object NotaryChangeWireTransactionSerializer : Serializer<NotaryChangeWireTransa
|
|||||||
kryo.writeClassAndObject(output, obj.newNotary)
|
kryo.writeClassAndObject(output, obj.newNotary)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
override fun read(kryo: Kryo, input: Input, type: Class<NotaryChangeWireTransaction>): NotaryChangeWireTransaction {
|
override fun read(kryo: Kryo, input: Input, type: Class<NotaryChangeWireTransaction>): NotaryChangeWireTransaction {
|
||||||
val inputs = kryo.readClassAndObject(input) as List<StateRef>
|
val inputs: List<StateRef> = uncheckedCast(kryo.readClassAndObject(input))
|
||||||
val notary = kryo.readClassAndObject(input) as Party
|
val notary = kryo.readClassAndObject(input) as Party
|
||||||
val newNotary = kryo.readClassAndObject(input) as Party
|
val newNotary = kryo.readClassAndObject(input) as Party
|
||||||
|
|
||||||
@ -278,11 +277,10 @@ object SignedTransactionSerializer : Serializer<SignedTransaction>() {
|
|||||||
kryo.writeClassAndObject(output, obj.sigs)
|
kryo.writeClassAndObject(output, obj.sigs)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
override fun read(kryo: Kryo, input: Input, type: Class<SignedTransaction>): SignedTransaction {
|
override fun read(kryo: Kryo, input: Input, type: Class<SignedTransaction>): SignedTransaction {
|
||||||
return SignedTransaction(
|
return SignedTransaction(
|
||||||
kryo.readClassAndObject(input) as SerializedBytes<CoreTransaction>,
|
uncheckedCast<Any?, SerializedBytes<CoreTransaction>>(kryo.readClassAndObject(input)),
|
||||||
kryo.readClassAndObject(input) as List<TransactionSignature>
|
uncheckedCast<Any?, List<TransactionSignature>>(kryo.readClassAndObject(input))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -600,8 +598,7 @@ class ThrowableSerializer<T>(kryo: Kryo, type: Class<T>) : Serializer<Throwable>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
private val delegate: Serializer<Throwable> = uncheckedCast(ReflectionSerializerFactory.makeSerializer(kryo, FieldSerializer::class.java, type))
|
||||||
private val delegate: Serializer<Throwable> = ReflectionSerializerFactory.makeSerializer(kryo, FieldSerializer::class.java, type) as Serializer<Throwable>
|
|
||||||
|
|
||||||
override fun write(kryo: Kryo, output: Output, throwable: Throwable) {
|
override fun write(kryo: Kryo, output: Output, throwable: Throwable) {
|
||||||
delegate.write(kryo, output, throwable)
|
delegate.write(kryo, output, throwable)
|
||||||
|
@ -14,6 +14,7 @@ import com.google.common.cache.CacheBuilder
|
|||||||
import net.corda.core.contracts.Attachment
|
import net.corda.core.contracts.Attachment
|
||||||
import net.corda.core.crypto.SecureHash
|
import net.corda.core.crypto.SecureHash
|
||||||
import net.corda.core.internal.LazyPool
|
import net.corda.core.internal.LazyPool
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.serialization.*
|
import net.corda.core.serialization.*
|
||||||
import net.corda.core.utilities.ByteSequence
|
import net.corda.core.utilities.ByteSequence
|
||||||
import net.corda.core.utilities.OpaqueBytes
|
import net.corda.core.utilities.OpaqueBytes
|
||||||
@ -204,11 +205,10 @@ abstract class AbstractKryoSerializationScheme : SerializationScheme {
|
|||||||
Input(byteSequence.bytes, byteSequence.offset + headerSize, byteSequence.size - headerSize).use { input ->
|
Input(byteSequence.bytes, byteSequence.offset + headerSize, byteSequence.size - headerSize).use { input ->
|
||||||
return pool.run { kryo ->
|
return pool.run { kryo ->
|
||||||
withContext(kryo, context) {
|
withContext(kryo, context) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
if (context.objectReferencesEnabled) {
|
if (context.objectReferencesEnabled) {
|
||||||
kryo.readClassAndObject(input) as T
|
uncheckedCast(kryo.readClassAndObject(input))
|
||||||
} else {
|
} else {
|
||||||
kryo.withoutReferences { kryo.readClassAndObject(input) as T }
|
kryo.withoutReferences { uncheckedCast<Any?, T>(kryo.readClassAndObject(input)) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.corda.nodeapi.internal.serialization.amqp
|
package net.corda.nodeapi.internal.serialization.amqp
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.utilities.NonEmptySet
|
import net.corda.core.utilities.NonEmptySet
|
||||||
import org.apache.qpid.proton.amqp.Symbol
|
import org.apache.qpid.proton.amqp.Symbol
|
||||||
import org.apache.qpid.proton.codec.Data
|
import org.apache.qpid.proton.codec.Data
|
||||||
@ -36,8 +37,7 @@ class CollectionSerializer(val declaredType: ParameterizedType, factory: Seriali
|
|||||||
fun deriveParameterizedType(declaredType: Type, declaredClass: Class<*>, actualClass: Class<*>?): ParameterizedType {
|
fun deriveParameterizedType(declaredType: Type, declaredClass: Class<*>, actualClass: Class<*>?): ParameterizedType {
|
||||||
if(supportedTypes.containsKey(declaredClass)) {
|
if(supportedTypes.containsKey(declaredClass)) {
|
||||||
// Simple case - it is already known to be a collection.
|
// Simple case - it is already known to be a collection.
|
||||||
@Suppress("UNCHECKED_CAST")
|
return deriveParametrizedType(declaredType, uncheckedCast(declaredClass))
|
||||||
return deriveParametrizedType(declaredType, declaredClass as Class<out Collection<*>>)
|
|
||||||
}
|
}
|
||||||
else if (actualClass != null && Collection::class.java.isAssignableFrom(actualClass)) {
|
else if (actualClass != null && Collection::class.java.isAssignableFrom(actualClass)) {
|
||||||
// Declared class is not collection, but [actualClass] is - represent it accordingly.
|
// Declared class is not collection, but [actualClass] is - represent it accordingly.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.corda.nodeapi.internal.serialization.amqp
|
package net.corda.nodeapi.internal.serialization.amqp
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.nameForType
|
import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.nameForType
|
||||||
import org.apache.qpid.proton.amqp.Symbol
|
import org.apache.qpid.proton.amqp.Symbol
|
||||||
import org.apache.qpid.proton.codec.Data
|
import org.apache.qpid.proton.codec.Data
|
||||||
@ -9,7 +10,7 @@ import java.lang.reflect.Type
|
|||||||
* Base class for serializers of core platform types that do not conform to the usual serialization rules and thus
|
* Base class for serializers of core platform types that do not conform to the usual serialization rules and thus
|
||||||
* cannot be automatically serialized.
|
* cannot be automatically serialized.
|
||||||
*/
|
*/
|
||||||
abstract class CustomSerializer<T> : AMQPSerializer<T> {
|
abstract class CustomSerializer<T : Any> : AMQPSerializer<T> {
|
||||||
/**
|
/**
|
||||||
* This is a collection of custom serializers that this custom serializer depends on. e.g. for proxy objects
|
* This is a collection of custom serializers that this custom serializer depends on. e.g. for proxy objects
|
||||||
* that refer to other custom types etc.
|
* that refer to other custom types etc.
|
||||||
@ -36,8 +37,7 @@ abstract class CustomSerializer<T> : AMQPSerializer<T> {
|
|||||||
|
|
||||||
override fun writeObject(obj: Any, data: Data, type: Type, output: SerializationOutput) {
|
override fun writeObject(obj: Any, data: Data, type: Type, output: SerializationOutput) {
|
||||||
data.withDescribed(descriptor) {
|
data.withDescribed(descriptor) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
writeDescribedObject(uncheckedCast(obj), data, type, output)
|
||||||
writeDescribedObject(obj as T, data, type, output)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ abstract class CustomSerializer<T> : AMQPSerializer<T> {
|
|||||||
* subclass in the schema, so that we can distinguish between subclasses.
|
* subclass in the schema, so that we can distinguish between subclasses.
|
||||||
*/
|
*/
|
||||||
// TODO: should this be a custom serializer at all, or should it just be a plain AMQPSerializer?
|
// TODO: should this be a custom serializer at all, or should it just be a plain AMQPSerializer?
|
||||||
class SubClass<T>(protected val clazz: Class<*>, protected val superClassSerializer: CustomSerializer<T>) : CustomSerializer<T>() {
|
class SubClass<T : Any>(protected val clazz: Class<*>, protected val superClassSerializer: CustomSerializer<T>) : CustomSerializer<T>() {
|
||||||
// TODO: should this be empty or contain the schema of the super?
|
// TODO: should this be empty or contain the schema of the super?
|
||||||
override val schemaForDocumentation = Schema(emptyList())
|
override val schemaForDocumentation = Schema(emptyList())
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ abstract class CustomSerializer<T> : AMQPSerializer<T> {
|
|||||||
* Additional base features for a custom serializer for a particular class [withInheritance] is false
|
* Additional base features for a custom serializer for a particular class [withInheritance] is false
|
||||||
* or super class / interfaces [withInheritance] is true
|
* or super class / interfaces [withInheritance] is true
|
||||||
*/
|
*/
|
||||||
abstract class CustomSerializerImp<T>(protected val clazz: Class<T>, protected val withInheritance: Boolean) : CustomSerializer<T>() {
|
abstract class CustomSerializerImp<T : Any>(protected val clazz: Class<T>, protected val withInheritance: Boolean) : CustomSerializer<T>() {
|
||||||
override val type: Type get() = clazz
|
override val type: Type get() = clazz
|
||||||
override val typeDescriptor = Symbol.valueOf("$DESCRIPTOR_DOMAIN:${nameForType(clazz)}")
|
override val typeDescriptor = Symbol.valueOf("$DESCRIPTOR_DOMAIN:${nameForType(clazz)}")
|
||||||
override fun writeClassInfo(output: SerializationOutput) {}
|
override fun writeClassInfo(output: SerializationOutput) {}
|
||||||
@ -87,12 +87,12 @@ abstract class CustomSerializer<T> : AMQPSerializer<T> {
|
|||||||
/**
|
/**
|
||||||
* Additional base features for a custom serializer for a particular class, that excludes subclasses.
|
* Additional base features for a custom serializer for a particular class, that excludes subclasses.
|
||||||
*/
|
*/
|
||||||
abstract class Is<T>(clazz: Class<T>) : CustomSerializerImp<T>(clazz, false)
|
abstract class Is<T : Any>(clazz: Class<T>) : CustomSerializerImp<T>(clazz, false)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Additional base features for a custom serializer for all implementations of a particular interface or super class.
|
* Additional base features for a custom serializer for all implementations of a particular interface or super class.
|
||||||
*/
|
*/
|
||||||
abstract class Implements<T>(clazz: Class<T>) : CustomSerializerImp<T>(clazz, true)
|
abstract class Implements<T : Any>(clazz: Class<T>) : CustomSerializerImp<T>(clazz, true)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Additional base features over and above [Implements] or [Is] custom serializer for when the serialized form should be
|
* Additional base features over and above [Implements] or [Is] custom serializer for when the serialized form should be
|
||||||
@ -101,7 +101,7 @@ abstract class CustomSerializer<T> : AMQPSerializer<T> {
|
|||||||
* The proxy class must use only types which are either native AMQP or other types for which there are pre-registered
|
* The proxy class must use only types which are either native AMQP or other types for which there are pre-registered
|
||||||
* custom serializers.
|
* custom serializers.
|
||||||
*/
|
*/
|
||||||
abstract class Proxy<T, P>(clazz: Class<T>,
|
abstract class Proxy<T : Any, P : Any>(clazz: Class<T>,
|
||||||
protected val proxyClass: Class<P>,
|
protected val proxyClass: Class<P>,
|
||||||
protected val factory: SerializerFactory,
|
protected val factory: SerializerFactory,
|
||||||
withInheritance: Boolean = true) : CustomSerializerImp<T>(clazz, withInheritance) {
|
withInheritance: Boolean = true) : CustomSerializerImp<T>(clazz, withInheritance) {
|
||||||
@ -134,8 +134,7 @@ abstract class CustomSerializer<T> : AMQPSerializer<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun readObject(obj: Any, schema: Schema, input: DeserializationInput): T {
|
override fun readObject(obj: Any, schema: Schema, input: DeserializationInput): T {
|
||||||
@Suppress("UNCHECKED_CAST")
|
val proxy: P = uncheckedCast(proxySerializer.readObject(obj, schema, input))
|
||||||
val proxy = proxySerializer.readObject(obj, schema, input) as P
|
|
||||||
return fromProxy(proxy)
|
return fromProxy(proxy)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -151,7 +150,7 @@ abstract class CustomSerializer<T> : AMQPSerializer<T> {
|
|||||||
* @param make A lambda for constructing an instance, that defaults to calling a constructor that expects a string.
|
* @param make A lambda for constructing an instance, that defaults to calling a constructor that expects a string.
|
||||||
* @param unmake A lambda that extracts the string value for an instance, that defaults to the [toString] method.
|
* @param unmake A lambda that extracts the string value for an instance, that defaults to the [toString] method.
|
||||||
*/
|
*/
|
||||||
abstract class ToString<T>(clazz: Class<T>, withInheritance: Boolean = false,
|
abstract class ToString<T : Any>(clazz: Class<T>, withInheritance: Boolean = false,
|
||||||
private val maker: (String) -> T = clazz.getConstructor(String::class.java).let {
|
private val maker: (String) -> T = clazz.getConstructor(String::class.java).let {
|
||||||
`constructor` ->
|
`constructor` ->
|
||||||
{ string -> `constructor`.newInstance(string) }
|
{ string -> `constructor`.newInstance(string) }
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.corda.nodeapi.internal.serialization.amqp
|
package net.corda.nodeapi.internal.serialization.amqp
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import org.apache.qpid.proton.amqp.Symbol
|
import org.apache.qpid.proton.amqp.Symbol
|
||||||
import org.apache.qpid.proton.codec.Data
|
import org.apache.qpid.proton.codec.Data
|
||||||
import java.io.NotSerializableException
|
import java.io.NotSerializableException
|
||||||
@ -31,8 +32,7 @@ class MapSerializer(private val declaredType: ParameterizedType, factory: Serial
|
|||||||
LinkedHashMap::class.java to { map -> LinkedHashMap(map) },
|
LinkedHashMap::class.java to { map -> LinkedHashMap(map) },
|
||||||
TreeMap::class.java to { map -> TreeMap(map) },
|
TreeMap::class.java to { map -> TreeMap(map) },
|
||||||
EnumMap::class.java to { map ->
|
EnumMap::class.java to { map ->
|
||||||
@Suppress("UNCHECKED_CAST")
|
EnumMap(uncheckedCast<Map<*, *>, Map<EnumJustUsedForCasting, Any>>(map))
|
||||||
EnumMap(map as Map<EnumJustUsedForCasting, Any>)
|
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
|
|
||||||
@ -44,8 +44,7 @@ class MapSerializer(private val declaredType: ParameterizedType, factory: Serial
|
|||||||
declaredClass.checkSupportedMapType()
|
declaredClass.checkSupportedMapType()
|
||||||
if(supportedTypes.containsKey(declaredClass)) {
|
if(supportedTypes.containsKey(declaredClass)) {
|
||||||
// Simple case - it is already known to be a map.
|
// Simple case - it is already known to be a map.
|
||||||
@Suppress("UNCHECKED_CAST")
|
return deriveParametrizedType(declaredType, uncheckedCast(declaredClass))
|
||||||
return deriveParametrizedType(declaredType, declaredClass as Class<out Map<*, *>>)
|
|
||||||
}
|
}
|
||||||
else if (actualClass != null && Map::class.java.isAssignableFrom(actualClass)) {
|
else if (actualClass != null && Map::class.java.isAssignableFrom(actualClass)) {
|
||||||
// Declared class is not map, but [actualClass] is - represent it accordingly.
|
// Declared class is not map, but [actualClass] is - represent it accordingly.
|
||||||
|
@ -2,6 +2,7 @@ package net.corda.nodeapi.internal.serialization.amqp
|
|||||||
|
|
||||||
import com.google.common.hash.Hasher
|
import com.google.common.hash.Hasher
|
||||||
import com.google.common.hash.Hashing
|
import com.google.common.hash.Hashing
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.utilities.OpaqueBytes
|
import net.corda.core.utilities.OpaqueBytes
|
||||||
import net.corda.core.utilities.loggerFor
|
import net.corda.core.utilities.loggerFor
|
||||||
import net.corda.core.utilities.toBase64
|
import net.corda.core.utilities.toBase64
|
||||||
@ -94,8 +95,7 @@ data class Schema(val types: List<TypeNotation>) : DescribedType {
|
|||||||
|
|
||||||
override fun newInstance(described: Any?): Schema {
|
override fun newInstance(described: Any?): Schema {
|
||||||
val list = described as? List<*> ?: throw IllegalStateException("Was expecting a list")
|
val list = described as? List<*> ?: throw IllegalStateException("Was expecting a list")
|
||||||
@Suppress("UNCHECKED_CAST")
|
return Schema(uncheckedCast(list[0]))
|
||||||
return Schema(list[0] as List<TypeNotation>)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,8 +162,7 @@ data class Field(val name: String, val type: String, val requires: List<String>,
|
|||||||
|
|
||||||
override fun newInstance(described: Any?): Field {
|
override fun newInstance(described: Any?): Field {
|
||||||
val list = described as? List<*> ?: throw IllegalStateException("Was expecting a list")
|
val list = described as? List<*> ?: throw IllegalStateException("Was expecting a list")
|
||||||
@Suppress("UNCHECKED_CAST")
|
return Field(list[0] as String, list[1] as String, uncheckedCast(list[2]), list[3] as? String, list[4] as? String, list[5] as Boolean, list[6] as Boolean)
|
||||||
return Field(list[0] as String, list[1] as String, list[2] as List<String>, list[3] as? String, list[4] as? String, list[5] as Boolean, list[6] as Boolean)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,8 +222,7 @@ data class CompositeType(override val name: String, override val label: String?,
|
|||||||
|
|
||||||
override fun newInstance(described: Any?): CompositeType {
|
override fun newInstance(described: Any?): CompositeType {
|
||||||
val list = described as? List<*> ?: throw IllegalStateException("Was expecting a list")
|
val list = described as? List<*> ?: throw IllegalStateException("Was expecting a list")
|
||||||
@Suppress("UNCHECKED_CAST")
|
return CompositeType(list[0] as String, list[1] as? String, uncheckedCast(list[2]), list[3] as Descriptor, uncheckedCast(list[4]))
|
||||||
return CompositeType(list[0] as String, list[1] as? String, list[2] as List<String>, list[3] as Descriptor, list[4] as List<Field>)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,8 +271,7 @@ data class RestrictedType(override val name: String,
|
|||||||
|
|
||||||
override fun newInstance(described: Any?): RestrictedType {
|
override fun newInstance(described: Any?): RestrictedType {
|
||||||
val list = described as? List<*> ?: throw IllegalStateException("Was expecting a list")
|
val list = described as? List<*> ?: throw IllegalStateException("Was expecting a list")
|
||||||
@Suppress("UNCHECKED_CAST")
|
return RestrictedType(list[0] as String, list[1] as? String, uncheckedCast(list[2]), list[3] as String, list[4] as Descriptor, uncheckedCast(list[5]))
|
||||||
return RestrictedType(list[0] as String, list[1] as? String, list[2] as List<String>, list[3] as String, list[4] as Descriptor, list[5] as List<Choice>)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package net.corda.nodeapi.internal.serialization.amqp
|
|||||||
|
|
||||||
import com.google.common.primitives.Primitives
|
import com.google.common.primitives.Primitives
|
||||||
import com.google.common.reflect.TypeResolver
|
import com.google.common.reflect.TypeResolver
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.serialization.ClassWhitelist
|
import net.corda.core.serialization.ClassWhitelist
|
||||||
import net.corda.core.serialization.CordaSerializable
|
import net.corda.core.serialization.CordaSerializable
|
||||||
import net.corda.nodeapi.internal.serialization.carpenter.*
|
import net.corda.nodeapi.internal.serialization.carpenter.*
|
||||||
@ -262,8 +263,7 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl: ClassLoader) {
|
|||||||
return customSerializer
|
return customSerializer
|
||||||
} else {
|
} else {
|
||||||
// Make a subclass serializer for the subclass and return that...
|
// Make a subclass serializer for the subclass and return that...
|
||||||
@Suppress("UNCHECKED_CAST")
|
return CustomSerializer.SubClass(clazz, uncheckedCast(customSerializer))
|
||||||
return CustomSerializer.SubClass(clazz, customSerializer as CustomSerializer<Any>)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package net.corda.nodeapi.internal.serialization.amqp.custom
|
package net.corda.nodeapi.internal.serialization.amqp.custom
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer
|
import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer
|
||||||
import net.corda.nodeapi.internal.serialization.amqp.MapSerializer
|
import net.corda.nodeapi.internal.serialization.amqp.MapSerializer
|
||||||
import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory
|
import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
/**
|
/**
|
||||||
* A serializer that writes out an [EnumSet] as a type, plus list of instances in the set.
|
* A serializer that writes out an [EnumSet] as a type, plus list of instances in the set.
|
||||||
*/
|
*/
|
||||||
@ -16,7 +16,7 @@ class EnumSetSerializer(factory: SerializerFactory) : CustomSerializer.Proxy<Enu
|
|||||||
|
|
||||||
private fun elementType(set: EnumSet<*>): Class<*> {
|
private fun elementType(set: EnumSet<*>): Class<*> {
|
||||||
return if (set.isEmpty()) {
|
return if (set.isEmpty()) {
|
||||||
EnumSet.complementOf(set as EnumSet<MapSerializer.EnumJustUsedForCasting>).first().javaClass
|
EnumSet.complementOf(uncheckedCast<EnumSet<*>, EnumSet<MapSerializer.EnumJustUsedForCasting>>(set)).first().javaClass
|
||||||
} else {
|
} else {
|
||||||
set.first().javaClass
|
set.first().javaClass
|
||||||
}
|
}
|
||||||
@ -24,9 +24,9 @@ class EnumSetSerializer(factory: SerializerFactory) : CustomSerializer.Proxy<Enu
|
|||||||
|
|
||||||
override fun fromProxy(proxy: EnumSetProxy): EnumSet<*> {
|
override fun fromProxy(proxy: EnumSetProxy): EnumSet<*> {
|
||||||
return if (proxy.elements.isEmpty()) {
|
return if (proxy.elements.isEmpty()) {
|
||||||
EnumSet.noneOf(proxy.clazz as Class<MapSerializer.EnumJustUsedForCasting>)
|
EnumSet.noneOf(uncheckedCast<Class<*>, Class<MapSerializer.EnumJustUsedForCasting>>(proxy.clazz))
|
||||||
} else {
|
} else {
|
||||||
EnumSet.copyOf(proxy.elements as List<MapSerializer.EnumJustUsedForCasting>)
|
EnumSet.copyOf(uncheckedCast<List<Any>, List<MapSerializer.EnumJustUsedForCasting>>(proxy.elements))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,10 +237,9 @@ class ClassCarpenter(cl: ClassLoader = Thread.currentThread().contextClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun ClassWriter.generateGetters(schema: Schema) {
|
private fun ClassWriter.generateGetters(schema: Schema) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
for ((name, type) in schema.fields) {
|
||||||
for ((name, type) in (schema.fields as Map<String, ClassField>)) {
|
|
||||||
visitMethod(ACC_PUBLIC, "get" + name.capitalize(), "()" + type.descriptor, null, null).apply {
|
visitMethod(ACC_PUBLIC, "get" + name.capitalize(), "()" + type.descriptor, null, null).apply {
|
||||||
type.addNullabilityAnnotation(this)
|
(type as ClassField).addNullabilityAnnotation(this)
|
||||||
visitCode()
|
visitCode()
|
||||||
visitVarInsn(ALOAD, 0) // Load 'this'
|
visitVarInsn(ALOAD, 0) // Load 'this'
|
||||||
visitFieldInsn(GETFIELD, schema.jvmName, name, type.descriptor)
|
visitFieldInsn(GETFIELD, schema.jvmName, name, type.descriptor)
|
||||||
@ -258,8 +257,7 @@ class ClassCarpenter(cl: ClassLoader = Thread.currentThread().contextClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun ClassWriter.generateAbstractGetters(schema: Schema) {
|
private fun ClassWriter.generateAbstractGetters(schema: Schema) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
for ((name, field) in schema.fields) {
|
||||||
for ((name, field) in (schema.fields as Map<String, ClassField>)) {
|
|
||||||
val opcodes = ACC_ABSTRACT + ACC_PUBLIC
|
val opcodes = ACC_ABSTRACT + ACC_PUBLIC
|
||||||
// abstract method doesn't have any implementation so just end
|
// abstract method doesn't have any implementation so just end
|
||||||
visitMethod(opcodes, "get" + name.capitalize(), "()${field.descriptor}", null, null).visitEnd()
|
visitMethod(opcodes, "get" + name.capitalize(), "()${field.descriptor}", null, null).visitEnd()
|
||||||
@ -363,9 +361,8 @@ class ClassCarpenter(cl: ClassLoader = Thread.currentThread().contextClassLoader
|
|||||||
|
|
||||||
// Assign the fields from parameters.
|
// Assign the fields from parameters.
|
||||||
var slot = 1 + superclassFields.size
|
var slot = 1 + superclassFields.size
|
||||||
@Suppress("UNCHECKED_CAST")
|
for ((name, field) in schema.fields) {
|
||||||
for ((name, field) in (schema.fields as Map<String, ClassField>)) {
|
(field as ClassField).nullTest(this, slot)
|
||||||
field.nullTest(this, slot)
|
|
||||||
|
|
||||||
visitVarInsn(ALOAD, 0) // Load 'this' onto the stack
|
visitVarInsn(ALOAD, 0) // Load 'this' onto the stack
|
||||||
slot += load(slot, field) // Load the contents of the parameter onto the stack.
|
slot += load(slot, field) // Load the contents of the parameter onto the stack.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.corda.nodeapi.internal.serialization.carpenter
|
package net.corda.nodeapi.internal.serialization.carpenter
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.nodeapi.internal.serialization.AllWhitelist
|
import net.corda.nodeapi.internal.serialization.AllWhitelist
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import java.beans.Introspector
|
import java.beans.Introspector
|
||||||
@ -323,7 +324,6 @@ class ClassCarpenterTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun `int array`() {
|
fun `int array`() {
|
||||||
val className = "iEnjoyPotato"
|
val className = "iEnjoyPotato"
|
||||||
val schema = ClassSchema(
|
val schema = ClassSchema(
|
||||||
@ -356,7 +356,6 @@ class ClassCarpenterTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun `integer array`() {
|
fun `integer array`() {
|
||||||
val className = "iEnjoyFlan"
|
val className = "iEnjoyFlan"
|
||||||
val schema = ClassSchema(
|
val schema = ClassSchema(
|
||||||
@ -366,16 +365,15 @@ class ClassCarpenterTest {
|
|||||||
val clazz = cc.build(schema)
|
val clazz = cc.build(schema)
|
||||||
|
|
||||||
val i = clazz.constructors[0].newInstance(arrayOf(1, 2, 3)) as SimpleFieldAccess
|
val i = clazz.constructors[0].newInstance(arrayOf(1, 2, 3)) as SimpleFieldAccess
|
||||||
val arr = clazz.getMethod("getA").invoke(i)
|
val arr: Array<Int> = uncheckedCast(clazz.getMethod("getA").invoke(i))
|
||||||
|
|
||||||
assertEquals(1, (arr as Array<Int>)[0])
|
assertEquals(1, arr[0])
|
||||||
assertEquals(2, arr[1])
|
assertEquals(2, arr[1])
|
||||||
assertEquals(3, arr[2])
|
assertEquals(3, arr[2])
|
||||||
assertEquals("$className{a=[1, 2, 3]}", i.toString())
|
assertEquals("$className{a=[1, 2, 3]}", i.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun `int array with ints`() {
|
fun `int array with ints`() {
|
||||||
val className = "iEnjoyCrumble"
|
val className = "iEnjoyCrumble"
|
||||||
val schema = ClassSchema(
|
val schema = ClassSchema(
|
||||||
@ -395,7 +393,6 @@ class ClassCarpenterTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun `multiple int arrays`() {
|
fun `multiple int arrays`() {
|
||||||
val className = "iEnjoyJam"
|
val className = "iEnjoyJam"
|
||||||
val schema = ClassSchema(
|
val schema = ClassSchema(
|
||||||
@ -417,7 +414,6 @@ class ClassCarpenterTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun `string array`() {
|
fun `string array`() {
|
||||||
val className = "iEnjoyToast"
|
val className = "iEnjoyToast"
|
||||||
val schema = ClassSchema(
|
val schema = ClassSchema(
|
||||||
@ -427,7 +423,7 @@ class ClassCarpenterTest {
|
|||||||
val clazz = cc.build(schema)
|
val clazz = cc.build(schema)
|
||||||
|
|
||||||
val i = clazz.constructors[0].newInstance(arrayOf("toast", "butter", "jam"))
|
val i = clazz.constructors[0].newInstance(arrayOf("toast", "butter", "jam"))
|
||||||
val arr = clazz.getMethod("getA").invoke(i) as Array<String>
|
val arr: Array<String> = uncheckedCast(clazz.getMethod("getA").invoke(i))
|
||||||
|
|
||||||
assertEquals("toast", arr[0])
|
assertEquals("toast", arr[0])
|
||||||
assertEquals("butter", arr[1])
|
assertEquals("butter", arr[1])
|
||||||
@ -435,7 +431,6 @@ class ClassCarpenterTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun `string arrays`() {
|
fun `string arrays`() {
|
||||||
val className = "iEnjoyToast"
|
val className = "iEnjoyToast"
|
||||||
val schema = ClassSchema(
|
val schema = ClassSchema(
|
||||||
@ -452,8 +447,8 @@ class ClassCarpenterTest {
|
|||||||
"and on the side",
|
"and on the side",
|
||||||
arrayOf("some pickles", "some fries"))
|
arrayOf("some pickles", "some fries"))
|
||||||
|
|
||||||
val arr1 = clazz.getMethod("getA").invoke(i) as Array<String>
|
val arr1: Array<String> = uncheckedCast(clazz.getMethod("getA").invoke(i))
|
||||||
val arr2 = clazz.getMethod("getC").invoke(i) as Array<String>
|
val arr2: Array<String> = uncheckedCast(clazz.getMethod("getC").invoke(i))
|
||||||
|
|
||||||
assertEquals("bread", arr1[0])
|
assertEquals("bread", arr1[0])
|
||||||
assertEquals("spread", arr1[1])
|
assertEquals("spread", arr1[1])
|
||||||
|
@ -18,6 +18,7 @@ import net.corda.core.internal.concurrent.doneFuture
|
|||||||
import net.corda.core.internal.concurrent.flatMap
|
import net.corda.core.internal.concurrent.flatMap
|
||||||
import net.corda.core.internal.concurrent.openFuture
|
import net.corda.core.internal.concurrent.openFuture
|
||||||
import net.corda.core.internal.toX509CertHolder
|
import net.corda.core.internal.toX509CertHolder
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.messaging.CordaRPCOps
|
import net.corda.core.messaging.CordaRPCOps
|
||||||
import net.corda.core.messaging.RPCOps
|
import net.corda.core.messaging.RPCOps
|
||||||
import net.corda.core.messaging.SingleMessageRecipient
|
import net.corda.core.messaging.SingleMessageRecipient
|
||||||
@ -322,11 +323,9 @@ abstract class AbstractNode(open val configuration: NodeConfiguration,
|
|||||||
} else {
|
} else {
|
||||||
log.warn(deprecatedFlowConstructorMessage(initiatedFlow))
|
log.warn(deprecatedFlowConstructorMessage(initiatedFlow))
|
||||||
}
|
}
|
||||||
@Suppress("UNCHECKED_CAST")
|
{ flowSession: FlowSession -> uncheckedCast(partyCtor.newInstance(flowSession.counterparty)) }
|
||||||
{ flowSession: FlowSession -> partyCtor.newInstance(flowSession.counterparty) as F }
|
|
||||||
} else {
|
} else {
|
||||||
@Suppress("UNCHECKED_CAST")
|
{ flowSession: FlowSession -> uncheckedCast(flowSessionCtor.newInstance(flowSession)) }
|
||||||
{ flowSession: FlowSession -> flowSessionCtor.newInstance(flowSession) as F }
|
|
||||||
}
|
}
|
||||||
val initiatingFlow = initiatedFlow.requireAnnotation<InitiatedBy>().value.java
|
val initiatingFlow = initiatedFlow.requireAnnotation<InitiatedBy>().value.java
|
||||||
val (version, classWithAnnotation) = initiatingFlow.flowVersionAndInitiatingClass
|
val (version, classWithAnnotation) = initiatingFlow.flowVersionAndInitiatingClass
|
||||||
|
@ -8,6 +8,7 @@ import net.corda.core.flows.StateMachineRunId
|
|||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
import net.corda.core.internal.FlowStateMachine
|
import net.corda.core.internal.FlowStateMachine
|
||||||
import net.corda.core.internal.VisibleForTesting
|
import net.corda.core.internal.VisibleForTesting
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.messaging.DataFeed
|
import net.corda.core.messaging.DataFeed
|
||||||
import net.corda.core.messaging.SingleMessageRecipient
|
import net.corda.core.messaging.SingleMessageRecipient
|
||||||
import net.corda.core.messaging.StateMachineTransactionMapping
|
import net.corda.core.messaging.StateMachineTransactionMapping
|
||||||
@ -132,8 +133,7 @@ interface ServiceHubInternal : ServiceHub {
|
|||||||
flowInitiator: FlowInitiator,
|
flowInitiator: FlowInitiator,
|
||||||
vararg args: Any?): FlowStateMachineImpl<T> {
|
vararg args: Any?): FlowStateMachineImpl<T> {
|
||||||
val logicRef = FlowLogicRefFactoryImpl.createForRPC(logicType, *args)
|
val logicRef = FlowLogicRefFactoryImpl.createForRPC(logicType, *args)
|
||||||
@Suppress("UNCHECKED_CAST")
|
val logic: FlowLogic<T> = uncheckedCast(FlowLogicRefFactoryImpl.toFlowLogic(logicRef))
|
||||||
val logic = FlowLogicRefFactoryImpl.toFlowLogic(logicRef) as FlowLogic<T>
|
|
||||||
return startFlow(logic, flowInitiator, ourIdentity = null)
|
return startFlow(logic, flowInitiator, ourIdentity = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import net.corda.core.internal.ThreadBox
|
|||||||
import net.corda.core.internal.concurrent.openFuture
|
import net.corda.core.internal.concurrent.openFuture
|
||||||
import net.corda.core.internal.div
|
import net.corda.core.internal.div
|
||||||
import net.corda.core.internal.noneOrSingle
|
import net.corda.core.internal.noneOrSingle
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.node.NodeInfo
|
import net.corda.core.node.NodeInfo
|
||||||
import net.corda.core.node.services.NetworkMapCache
|
import net.corda.core.node.services.NetworkMapCache
|
||||||
import net.corda.core.node.services.NetworkMapCache.MapChange
|
import net.corda.core.node.services.NetworkMapCache.MapChange
|
||||||
@ -56,7 +57,6 @@ import java.math.BigInteger
|
|||||||
import java.security.KeyStore
|
import java.security.KeyStore
|
||||||
import java.security.KeyStoreException
|
import java.security.KeyStoreException
|
||||||
import java.security.Principal
|
import java.security.Principal
|
||||||
import java.security.cert.X509Certificate
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.Executor
|
import java.util.concurrent.Executor
|
||||||
import java.util.concurrent.ScheduledExecutorService
|
import java.util.concurrent.ScheduledExecutorService
|
||||||
@ -478,8 +478,7 @@ private class VerifyingNettyConnector(configuration: MutableMap<String, Any>,
|
|||||||
override fun createConnection(): Connection? {
|
override fun createConnection(): Connection? {
|
||||||
val connection = super.createConnection() as? NettyConnection
|
val connection = super.createConnection() as? NettyConnection
|
||||||
if (sslEnabled && connection != null) {
|
if (sslEnabled && connection != null) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
val expectedLegalNames: Set<CordaX500Name> = uncheckedCast(configuration[ArtemisTcpTransport.VERIFY_PEER_LEGAL_NAME] ?: emptySet<CordaX500Name>())
|
||||||
val expectedLegalNames = (configuration[ArtemisTcpTransport.VERIFY_PEER_LEGAL_NAME] ?: emptySet<CordaX500Name>()) as Set<CordaX500Name>
|
|
||||||
try {
|
try {
|
||||||
val session = connection.channel
|
val session = connection.channel
|
||||||
.pipeline()
|
.pipeline()
|
||||||
@ -608,12 +607,11 @@ class NodeLoginModule : LoginModule {
|
|||||||
private lateinit var verifierCertCheck: CertificateChainCheckPolicy.Check
|
private lateinit var verifierCertCheck: CertificateChainCheckPolicy.Check
|
||||||
private val principals = ArrayList<Principal>()
|
private val principals = ArrayList<Principal>()
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
override fun initialize(subject: Subject, callbackHandler: CallbackHandler, sharedState: Map<String, *>, options: Map<String, *>) {
|
override fun initialize(subject: Subject, callbackHandler: CallbackHandler, sharedState: Map<String, *>, options: Map<String, *>) {
|
||||||
this.subject = subject
|
this.subject = subject
|
||||||
this.callbackHandler = callbackHandler
|
this.callbackHandler = callbackHandler
|
||||||
userService = options[RPCUserService::class.java.name] as RPCUserService
|
userService = options[RPCUserService::class.java.name] as RPCUserService
|
||||||
val certChainChecks = options[CERT_CHAIN_CHECKS_OPTION_NAME] as Map<String, CertificateChainCheckPolicy.Check>
|
val certChainChecks: Map<String, CertificateChainCheckPolicy.Check> = uncheckedCast(options[CERT_CHAIN_CHECKS_OPTION_NAME])
|
||||||
peerCertCheck = certChainChecks[PEER_ROLE]!!
|
peerCertCheck = certChainChecks[PEER_ROLE]!!
|
||||||
nodeCertCheck = certChainChecks[NODE_ROLE]!!
|
nodeCertCheck = certChainChecks[NODE_ROLE]!!
|
||||||
verifierCertCheck = certChainChecks[VERIFIER_ROLE]!!
|
verifierCertCheck = certChainChecks[VERIFIER_ROLE]!!
|
||||||
|
@ -4,6 +4,7 @@ import com.google.common.util.concurrent.ListenableFuture
|
|||||||
import net.corda.core.concurrent.CordaFuture
|
import net.corda.core.concurrent.CordaFuture
|
||||||
import net.corda.core.identity.CordaX500Name
|
import net.corda.core.identity.CordaX500Name
|
||||||
import net.corda.core.internal.concurrent.openFuture
|
import net.corda.core.internal.concurrent.openFuture
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.messaging.MessageRecipients
|
import net.corda.core.messaging.MessageRecipients
|
||||||
import net.corda.core.messaging.SingleMessageRecipient
|
import net.corda.core.messaging.SingleMessageRecipient
|
||||||
import net.corda.core.node.services.PartyInfo
|
import net.corda.core.node.services.PartyInfo
|
||||||
@ -161,8 +162,7 @@ fun <M : Any> MessagingService.onNext(topic: String, sessionId: Long): CordaFutu
|
|||||||
val messageFuture = openFuture<M>()
|
val messageFuture = openFuture<M>()
|
||||||
runOnNextMessage(topic, sessionId) { message ->
|
runOnNextMessage(topic, sessionId) { message ->
|
||||||
messageFuture.capture {
|
messageFuture.capture {
|
||||||
@Suppress("UNCHECKED_CAST")
|
uncheckedCast(message.data.deserialize<Any>())
|
||||||
message.data.deserialize<Any>() as M
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return messageFuture
|
return messageFuture
|
||||||
|
@ -12,12 +12,9 @@ import net.corda.core.crypto.random63BitValue
|
|||||||
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.identity.PartyAndCertificate
|
import net.corda.core.identity.PartyAndCertificate
|
||||||
import net.corda.core.internal.FlowStateMachine
|
import net.corda.core.internal.*
|
||||||
import net.corda.core.internal.abbreviate
|
|
||||||
import net.corda.core.internal.concurrent.OpenFuture
|
import net.corda.core.internal.concurrent.OpenFuture
|
||||||
import net.corda.core.internal.concurrent.openFuture
|
import net.corda.core.internal.concurrent.openFuture
|
||||||
import net.corda.core.internal.isRegularFile
|
|
||||||
import net.corda.core.internal.staticField
|
|
||||||
import net.corda.core.transactions.SignedTransaction
|
import net.corda.core.transactions.SignedTransaction
|
||||||
import net.corda.core.utilities.*
|
import net.corda.core.utilities.*
|
||||||
import net.corda.node.services.api.FlowAppAuditEvent
|
import net.corda.node.services.api.FlowAppAuditEvent
|
||||||
@ -281,7 +278,7 @@ class FlowStateMachineImpl<R>(override val id: StateMachineRunId,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO Dummy implementation of access to application specific audit logging
|
// TODO Dummy implementation of access to application specific audit logging
|
||||||
override fun recordAuditEvent(eventType: String, comment: String, extraAuditData: Map<String, String>): Unit {
|
override fun recordAuditEvent(eventType: String, comment: String, extraAuditData: Map<String, String>) {
|
||||||
val flowAuditEvent = FlowAppAuditEvent(
|
val flowAuditEvent = FlowAppAuditEvent(
|
||||||
serviceHub.clock.instant(),
|
serviceHub.clock.instant(),
|
||||||
flowInitiator,
|
flowInitiator,
|
||||||
@ -430,8 +427,7 @@ class FlowStateMachineImpl<R>(override val id: StateMachineRunId,
|
|||||||
val session = receiveRequest.session
|
val session = receiveRequest.session
|
||||||
val receiveType = receiveRequest.receiveType
|
val receiveType = receiveRequest.receiveType
|
||||||
if (receiveType.isInstance(message)) {
|
if (receiveType.isInstance(message)) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
return uncheckedCast(this)
|
||||||
return this as ReceivedSessionMessage<M>
|
|
||||||
} else if (message is SessionEnd) {
|
} else if (message is SessionEnd) {
|
||||||
openSessions.values.remove(session)
|
openSessions.values.remove(session)
|
||||||
if (message is ErrorSessionEnd) {
|
if (message is ErrorSessionEnd) {
|
||||||
@ -519,7 +515,6 @@ class FlowStateMachineImpl<R>(override val id: StateMachineRunId,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val Class<out FlowLogic<*>>.flowVersionAndInitiatingClass: Pair<Int, Class<out FlowLogic<*>>> get() {
|
val Class<out FlowLogic<*>>.flowVersionAndInitiatingClass: Pair<Int, Class<out FlowLogic<*>>> get() {
|
||||||
var current: Class<*> = this
|
var current: Class<*> = this
|
||||||
var found: Pair<Int, Class<out FlowLogic<*>>>? = null
|
var found: Pair<Int, Class<out FlowLogic<*>>>? = null
|
||||||
@ -528,7 +523,7 @@ val Class<out FlowLogic<*>>.flowVersionAndInitiatingClass: Pair<Int, Class<out F
|
|||||||
if (annotation != null) {
|
if (annotation != null) {
|
||||||
if (found != null) throw IllegalArgumentException("${InitiatingFlow::class.java.name} can only be annotated once")
|
if (found != null) throw IllegalArgumentException("${InitiatingFlow::class.java.name} can only be annotated once")
|
||||||
require(annotation.version > 0) { "Flow versions have to be greater or equal to 1" }
|
require(annotation.version > 0) { "Flow versions have to be greater or equal to 1" }
|
||||||
found = annotation.version to (current as Class<out FlowLogic<*>>)
|
found = annotation.version to uncheckedCast(current)
|
||||||
}
|
}
|
||||||
current = current.superclass
|
current = current.superclass
|
||||||
?: return found
|
?: return found
|
||||||
|
@ -14,9 +14,7 @@ import net.corda.core.crypto.SecureHash
|
|||||||
import net.corda.core.crypto.random63BitValue
|
import net.corda.core.crypto.random63BitValue
|
||||||
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.ThreadBox
|
import net.corda.core.internal.*
|
||||||
import net.corda.core.internal.bufferUntilSubscribed
|
|
||||||
import net.corda.core.internal.castIfPossible
|
|
||||||
import net.corda.core.messaging.DataFeed
|
import net.corda.core.messaging.DataFeed
|
||||||
import net.corda.core.serialization.SerializationDefaults.CHECKPOINT_CONTEXT
|
import net.corda.core.serialization.SerializationDefaults.CHECKPOINT_CONTEXT
|
||||||
import net.corda.core.serialization.SerializationDefaults.SERIALIZATION_FACTORY
|
import net.corda.core.serialization.SerializationDefaults.SERIALIZATION_FACTORY
|
||||||
@ -149,10 +147,9 @@ class StateMachineManager(val serviceHub: ServiceHubInternal,
|
|||||||
|
|
||||||
/** Returns a list of all state machines executing the given flow logic at the top level (subflows do not count) */
|
/** Returns a list of all state machines executing the given flow logic at the top level (subflows do not count) */
|
||||||
fun <P : FlowLogic<T>, T> findStateMachines(flowClass: Class<P>): List<Pair<P, CordaFuture<T>>> {
|
fun <P : FlowLogic<T>, T> findStateMachines(flowClass: Class<P>): List<Pair<P, CordaFuture<T>>> {
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
return mutex.locked {
|
return mutex.locked {
|
||||||
stateMachines.keys.mapNotNull {
|
stateMachines.keys.mapNotNull {
|
||||||
flowClass.castIfPossible(it.logic)?.let { it to (it.stateMachine as FlowStateMachineImpl<T>).resultFuture }
|
flowClass.castIfPossible(it.logic)?.let { it to uncheckedCast<FlowStateMachine<*>, FlowStateMachineImpl<T>>(it.stateMachine).resultFuture }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.corda.node.services.transactions
|
package net.corda.node.services.transactions
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.nodeapi.internal.addShutdownHook
|
import net.corda.nodeapi.internal.addShutdownHook
|
||||||
import java.io.Closeable
|
import java.io.Closeable
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
@ -31,8 +32,7 @@ open class PathManager<T : PathManager<T>>(path: Path) : Closeable {
|
|||||||
|
|
||||||
fun handle(): T {
|
fun handle(): T {
|
||||||
handleCounter.incrementAndGet()
|
handleCounter.incrementAndGet()
|
||||||
@Suppress("UNCHECKED_CAST")
|
return uncheckedCast(this)
|
||||||
return this as T
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close() {
|
override fun close() {
|
||||||
|
@ -3,6 +3,7 @@ package net.corda.node.services.vault
|
|||||||
import net.corda.core.contracts.ContractState
|
import net.corda.core.contracts.ContractState
|
||||||
import net.corda.core.contracts.StateRef
|
import net.corda.core.contracts.StateRef
|
||||||
import net.corda.core.identity.AbstractParty
|
import net.corda.core.identity.AbstractParty
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.node.services.Vault
|
import net.corda.core.node.services.Vault
|
||||||
import net.corda.core.node.services.VaultQueryException
|
import net.corda.core.node.services.VaultQueryException
|
||||||
import net.corda.core.node.services.vault.*
|
import net.corda.core.node.services.vault.*
|
||||||
@ -111,8 +112,7 @@ class HibernateQueryCriteriaParser(val contractStateType: Class<out ContractStat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
is ColumnPredicate.BinaryComparison -> {
|
is ColumnPredicate.BinaryComparison -> {
|
||||||
@Suppress("UNCHECKED_CAST")
|
val literal: Comparable<Any?>? = uncheckedCast(columnPredicate.rightLiteral)
|
||||||
val literal = columnPredicate.rightLiteral as Comparable<Any?>?
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
column as Path<Comparable<Any?>?>
|
column as Path<Comparable<Any?>?>
|
||||||
when (columnPredicate.operator) {
|
when (columnPredicate.operator) {
|
||||||
@ -139,10 +139,8 @@ class HibernateQueryCriteriaParser(val contractStateType: Class<out ContractStat
|
|||||||
is ColumnPredicate.Between -> {
|
is ColumnPredicate.Between -> {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
column as Path<Comparable<Any?>?>
|
column as Path<Comparable<Any?>?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
val fromLiteral: Comparable<Any?>? = uncheckedCast(columnPredicate.rightFromLiteral)
|
||||||
val fromLiteral = columnPredicate.rightFromLiteral as Comparable<Any?>?
|
val toLiteral: Comparable<Any?>? = uncheckedCast(columnPredicate.rightToLiteral)
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val toLiteral = columnPredicate.rightToLiteral as Comparable<Any?>?
|
|
||||||
criteriaBuilder.between(column, fromLiteral, toLiteral)
|
criteriaBuilder.between(column, fromLiteral, toLiteral)
|
||||||
}
|
}
|
||||||
is ColumnPredicate.NullExpression -> {
|
is ColumnPredicate.NullExpression -> {
|
||||||
|
@ -7,6 +7,7 @@ import net.corda.core.contracts.TransactionState
|
|||||||
import net.corda.core.crypto.SecureHash
|
import net.corda.core.crypto.SecureHash
|
||||||
import net.corda.core.internal.ThreadBox
|
import net.corda.core.internal.ThreadBox
|
||||||
import net.corda.core.internal.bufferUntilSubscribed
|
import net.corda.core.internal.bufferUntilSubscribed
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.messaging.DataFeed
|
import net.corda.core.messaging.DataFeed
|
||||||
import net.corda.core.node.services.Vault
|
import net.corda.core.node.services.Vault
|
||||||
import net.corda.core.node.services.VaultQueryException
|
import net.corda.core.node.services.VaultQueryException
|
||||||
@ -153,8 +154,7 @@ class HibernateVaultQueryImpl(val hibernateConfig: HibernateConfiguration,
|
|||||||
override fun <T : ContractState> _trackBy(criteria: QueryCriteria, paging: PageSpecification, sorting: Sort, contractStateType: Class<out T>): DataFeed<Vault.Page<T>, Vault.Update<T>> {
|
override fun <T : ContractState> _trackBy(criteria: QueryCriteria, paging: PageSpecification, sorting: Sort, contractStateType: Class<out T>): DataFeed<Vault.Page<T>, Vault.Update<T>> {
|
||||||
return mutex.locked {
|
return mutex.locked {
|
||||||
val snapshotResults = _queryBy(criteria, paging, sorting, contractStateType)
|
val snapshotResults = _queryBy(criteria, paging, sorting, contractStateType)
|
||||||
@Suppress("UNCHECKED_CAST")
|
val updates: Observable<Vault.Update<T>> = uncheckedCast(vault.updatesPublisher.bufferUntilSubscribed().filter { it.containsType(contractStateType, snapshotResults.stateTypes) })
|
||||||
val updates = vault.updatesPublisher.bufferUntilSubscribed().filter { it.containsType(contractStateType, snapshotResults.stateTypes) } as Observable<Vault.Update<T>>
|
|
||||||
DataFeed(snapshotResults, updates)
|
DataFeed(snapshotResults, updates)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,8 +180,7 @@ class HibernateVaultQueryImpl(val hibernateConfig: HibernateConfiguration,
|
|||||||
|
|
||||||
val contractInterfaceToConcreteTypes = mutableMapOf<String, MutableSet<String>>()
|
val contractInterfaceToConcreteTypes = mutableMapOf<String, MutableSet<String>>()
|
||||||
distinctTypes.forEach { type ->
|
distinctTypes.forEach { type ->
|
||||||
@Suppress("UNCHECKED_CAST")
|
val concreteType: Class<ContractState> = uncheckedCast(Class.forName(type))
|
||||||
val concreteType = Class.forName(type) as Class<ContractState>
|
|
||||||
val contractInterfaces = deriveContractInterfaces(concreteType)
|
val contractInterfaces = deriveContractInterfaces(concreteType)
|
||||||
contractInterfaces.map {
|
contractInterfaces.map {
|
||||||
val contractInterface = contractInterfaceToConcreteTypes.getOrPut(it.name, { mutableSetOf() })
|
val contractInterface = contractInterfaceToConcreteTypes.getOrPut(it.name, { mutableSetOf() })
|
||||||
@ -196,9 +195,8 @@ class HibernateVaultQueryImpl(val hibernateConfig: HibernateConfiguration,
|
|||||||
val myInterfaces: MutableSet<Class<T>> = mutableSetOf()
|
val myInterfaces: MutableSet<Class<T>> = mutableSetOf()
|
||||||
clazz.interfaces.forEach {
|
clazz.interfaces.forEach {
|
||||||
if (!it.equals(ContractState::class.java)) {
|
if (!it.equals(ContractState::class.java)) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
myInterfaces.add(uncheckedCast(it))
|
||||||
myInterfaces.add(it as Class<T>)
|
myInterfaces.addAll(deriveContractInterfaces(uncheckedCast(it)))
|
||||||
myInterfaces.addAll(deriveContractInterfaces(it))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return myInterfaces
|
return myInterfaces
|
||||||
|
@ -233,8 +233,7 @@ object InteractiveShell {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
val clazz: Class<FlowLogic<*>> = uncheckedCast(matches.single())
|
||||||
val clazz = matches.single() as Class<FlowLogic<*>>
|
|
||||||
try {
|
try {
|
||||||
// TODO Flow invocation should use startFlowDynamic.
|
// TODO Flow invocation should use startFlowDynamic.
|
||||||
val fsm = runFlowFromString({ node.services.startFlow(it, FlowInitiator.Shell) }, inputData, clazz)
|
val fsm = runFlowFromString({ node.services.startFlow(it, FlowInitiator.Shell) }, inputData, clazz)
|
||||||
@ -434,8 +433,6 @@ object InteractiveShell {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kotlin bug: USELESS_CAST warning is generated below but the IDE won't let us remove it.
|
|
||||||
@Suppress("USELESS_CAST", "UNCHECKED_CAST")
|
|
||||||
private fun maybeFollow(response: Any?, printerFun: (Any?) -> String, toStream: PrintWriter): OpenFuture<Unit>? {
|
private fun maybeFollow(response: Any?, printerFun: (Any?) -> String, toStream: PrintWriter): OpenFuture<Unit>? {
|
||||||
// Match on a couple of common patterns for "important" observables. It's tough to do this in a generic
|
// Match on a couple of common patterns for "important" observables. It's tough to do this in a generic
|
||||||
// way because observables can be embedded anywhere in the object graph, and can emit other arbitrary
|
// way because observables can be embedded anywhere in the object graph, and can emit other arbitrary
|
||||||
@ -454,7 +451,7 @@ object InteractiveShell {
|
|||||||
} ?: return null
|
} ?: return null
|
||||||
|
|
||||||
val subscriber = PrintingSubscriber(printerFun, toStream)
|
val subscriber = PrintingSubscriber(printerFun, toStream)
|
||||||
(observable as Observable<Any>).subscribe(subscriber)
|
uncheckedCast(observable).subscribe(subscriber)
|
||||||
return subscriber.future
|
return subscriber.future
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ import net.corda.core.contracts.*
|
|||||||
import net.corda.core.crypto.TransactionSignature
|
import net.corda.core.crypto.TransactionSignature
|
||||||
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.node.NodeInfo
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.serialization.CordaSerializable
|
import net.corda.core.serialization.CordaSerializable
|
||||||
import net.corda.core.transactions.SignedTransaction
|
import net.corda.core.transactions.SignedTransaction
|
||||||
import net.corda.core.transactions.TransactionBuilder
|
import net.corda.core.transactions.TransactionBuilder
|
||||||
@ -46,7 +46,6 @@ object FixingFlow {
|
|||||||
|
|
||||||
@Suspendable
|
@Suspendable
|
||||||
override fun assembleSharedTX(handshake: TwoPartyDealFlow.Handshake<FixingSession>): Triple<TransactionBuilder, List<PublicKey>, List<TransactionSignature>> {
|
override fun assembleSharedTX(handshake: TwoPartyDealFlow.Handshake<FixingSession>): Triple<TransactionBuilder, List<PublicKey>, List<TransactionSignature>> {
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val fixOf = deal.nextFixingOf()!!
|
val fixOf = deal.nextFixingOf()!!
|
||||||
|
|
||||||
// TODO Do we need/want to substitute in new public keys for the Parties?
|
// TODO Do we need/want to substitute in new public keys for the Parties?
|
||||||
@ -91,9 +90,8 @@ object FixingFlow {
|
|||||||
class Floater(override val otherSideSession: FlowSession,
|
class Floater(override val otherSideSession: FlowSession,
|
||||||
override val payload: FixingSession,
|
override val payload: FixingSession,
|
||||||
override val progressTracker: ProgressTracker = TwoPartyDealFlow.Primary.tracker()) : TwoPartyDealFlow.Primary() {
|
override val progressTracker: ProgressTracker = TwoPartyDealFlow.Primary.tracker()) : TwoPartyDealFlow.Primary() {
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
private val dealToFix: StateAndRef<FixableDealState> by transient {
|
private val dealToFix: StateAndRef<FixableDealState> by transient {
|
||||||
val state = serviceHub.loadState(payload.ref) as TransactionState<FixableDealState>
|
val state: TransactionState<FixableDealState> = uncheckedCast(serviceHub.loadState(payload.ref))
|
||||||
StateAndRef(state, payload.ref)
|
StateAndRef(state, payload.ref)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ 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
|
||||||
import net.corda.core.internal.FlowStateMachine
|
import net.corda.core.internal.FlowStateMachine
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.node.services.queryBy
|
import net.corda.core.node.services.queryBy
|
||||||
import net.corda.core.toFuture
|
import net.corda.core.toFuture
|
||||||
import net.corda.core.transactions.SignedTransaction
|
import net.corda.core.transactions.SignedTransaction
|
||||||
@ -155,9 +156,8 @@ class IRSSimulation(networkSendManuallyPumped: Boolean, runAsync: Boolean, laten
|
|||||||
|
|
||||||
val acceptDealFlows: Observable<AcceptDealFlow> = node2.internals.registerInitiatedFlow(AcceptDealFlow::class.java)
|
val acceptDealFlows: Observable<AcceptDealFlow> = node2.internals.registerInitiatedFlow(AcceptDealFlow::class.java)
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val acceptorTxFuture = acceptDealFlows.toFuture().toCompletableFuture().thenCompose {
|
val acceptorTxFuture = acceptDealFlows.toFuture().toCompletableFuture().thenCompose {
|
||||||
(it.stateMachine as FlowStateMachine<SignedTransaction>).resultFuture.toCompletableFuture()
|
uncheckedCast<FlowStateMachine<*>, FlowStateMachine<SignedTransaction>>(it.stateMachine).resultFuture.toCompletableFuture()
|
||||||
}
|
}
|
||||||
|
|
||||||
showProgressFor(listOf(node1, node2))
|
showProgressFor(listOf(node1, node2))
|
||||||
|
@ -10,6 +10,7 @@ import net.corda.core.identity.CordaX500Name
|
|||||||
import net.corda.core.internal.concurrent.fork
|
import net.corda.core.internal.concurrent.fork
|
||||||
import net.corda.core.internal.concurrent.map
|
import net.corda.core.internal.concurrent.map
|
||||||
import net.corda.core.internal.div
|
import net.corda.core.internal.div
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.messaging.RPCOps
|
import net.corda.core.messaging.RPCOps
|
||||||
import net.corda.core.utilities.NetworkHostAndPort
|
import net.corda.core.utilities.NetworkHostAndPort
|
||||||
import net.corda.node.services.RPCUserService
|
import net.corda.node.services.RPCUserService
|
||||||
@ -507,8 +508,7 @@ class RandomRpcUser {
|
|||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun main(args: Array<String>) {
|
fun main(args: Array<String>) {
|
||||||
require(args.size == 4)
|
require(args.size == 4)
|
||||||
@Suppress("UNCHECKED_CAST")
|
val rpcClass: Class<RPCOps> = uncheckedCast(Class.forName(args[0]))
|
||||||
val rpcClass = Class.forName(args[0]) as Class<RPCOps>
|
|
||||||
val hostAndPort = NetworkHostAndPort.parse(args[1])
|
val hostAndPort = NetworkHostAndPort.parse(args[1])
|
||||||
val username = args[2]
|
val username = args[2]
|
||||||
val password = args[3]
|
val password = args[3]
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
@file:Suppress("UNUSED_PARAMETER", "UNCHECKED_CAST")
|
@file:Suppress("UNUSED_PARAMETER")
|
||||||
@file:JvmName("CoreTestUtils")
|
@file:JvmName("CoreTestUtils")
|
||||||
|
|
||||||
package net.corda.testing
|
package net.corda.testing
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package net.corda.testing
|
package net.corda.testing
|
||||||
|
|
||||||
import com.google.common.util.concurrent.SettableFuture
|
import com.google.common.util.concurrent.SettableFuture
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.core.utilities.getOrThrow
|
import net.corda.core.utilities.getOrThrow
|
||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
@ -213,9 +214,8 @@ private sealed class ExpectComposeState<E : Any> {
|
|||||||
class Single<E : Any, T : E>(val single: ExpectCompose.Single<E, T>) : ExpectComposeState<E>() {
|
class Single<E : Any, T : E>(val single: ExpectCompose.Single<E, T>) : ExpectComposeState<E>() {
|
||||||
override fun nextState(event: E): Pair<() -> Unit, ExpectComposeState<E>>? =
|
override fun nextState(event: E): Pair<() -> Unit, ExpectComposeState<E>>? =
|
||||||
if (single.expect.clazz.isAssignableFrom(event.javaClass)) {
|
if (single.expect.clazz.isAssignableFrom(event.javaClass)) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
val coercedEvent: T = uncheckedCast(event)
|
||||||
val coercedEvent = event as T
|
if (single.expect.match(coercedEvent)) {
|
||||||
if (single.expect.match(event)) {
|
|
||||||
Pair({ single.expect.expectClosure(coercedEvent) }, Finished())
|
Pair({ single.expect.expectClosure(coercedEvent) }, Finished())
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
@ -285,8 +285,7 @@ private sealed class ExpectComposeState<E : Any> {
|
|||||||
is ExpectCompose.Single<E, *> -> {
|
is ExpectCompose.Single<E, *> -> {
|
||||||
// This coercion should not be needed but kotlin can't reason about existential type variables(T)
|
// This coercion should not be needed but kotlin can't reason about existential type variables(T)
|
||||||
// so here we're coercing T into E (even though T is invariant).
|
// so here we're coercing T into E (even though T is invariant).
|
||||||
@Suppress("UNCHECKED_CAST")
|
Single(uncheckedCast(expectCompose))
|
||||||
Single(expectCompose as ExpectCompose.Single<E, E>)
|
|
||||||
}
|
}
|
||||||
is ExpectCompose.Sequential -> {
|
is ExpectCompose.Sequential -> {
|
||||||
if (expectCompose.sequence.size > 0) {
|
if (expectCompose.sequence.size > 0) {
|
||||||
|
@ -16,6 +16,7 @@ import net.corda.core.internal.div
|
|||||||
import net.corda.core.internal.write
|
import net.corda.core.internal.write
|
||||||
import net.corda.core.serialization.SerializeAsToken
|
import net.corda.core.serialization.SerializeAsToken
|
||||||
import net.corda.client.jackson.JacksonSupport
|
import net.corda.client.jackson.JacksonSupport
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.node.services.statemachine.FlowStackSnapshotFactory
|
import net.corda.node.services.statemachine.FlowStackSnapshotFactory
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
@ -134,11 +135,10 @@ class FlowStackSnapshotFactoryImpl : FlowStackSnapshotFactory {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private inline fun <reified R, A> R.getField(name: String): A {
|
private inline fun <reified R, A : Any> R.getField(name: String): A {
|
||||||
val field = R::class.java.getDeclaredField(name)
|
val field = R::class.java.getDeclaredField(name)
|
||||||
field.isAccessible = true
|
field.isAccessible = true
|
||||||
@Suppress("UNCHECKED_CAST")
|
return uncheckedCast(field.get(this))
|
||||||
return field.get(this) as A
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getFiberStack(fiber: Fiber<*>): Stack {
|
private fun getFiberStack(fiber: Fiber<*>): Stack {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.corda.testing
|
package net.corda.testing
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import kotlin.reflect.KCallable
|
import kotlin.reflect.KCallable
|
||||||
import kotlin.reflect.jvm.reflect
|
import kotlin.reflect.jvm.reflect
|
||||||
|
|
||||||
@ -9,18 +10,14 @@ import kotlin.reflect.jvm.reflect
|
|||||||
* different combinations of parameters.
|
* different combinations of parameters.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
fun <A : Any, R> measure(a: Iterable<A>, f: (A) -> R) =
|
||||||
fun <A, R> measure(a: Iterable<A>, f: (A) -> R) =
|
measure(listOf(a), f.reflect()!!) { f(uncheckedCast(it[0])) }
|
||||||
measure(listOf(a), f.reflect()!!) { (f as ((Any?)->R))(it[0]) }
|
fun <A : Any, B : Any, R> measure(a: Iterable<A>, b: Iterable<B>, f: (A, B) -> R) =
|
||||||
@Suppress("UNCHECKED_CAST")
|
measure(listOf(a, b), f.reflect()!!) { f(uncheckedCast(it[0]), uncheckedCast(it[1])) }
|
||||||
fun <A, B, R> measure(a: Iterable<A>, b: Iterable<B>, f: (A, B) -> R) =
|
fun <A : Any, B : Any, C : Any, R> measure(a: Iterable<A>, b: Iterable<B>, c: Iterable<C>, f: (A, B, C) -> R) =
|
||||||
measure(listOf(a, b), f.reflect()!!) { (f as ((Any?,Any?)->R))(it[0], it[1]) }
|
measure(listOf(a, b, c), f.reflect()!!) { f(uncheckedCast(it[0]), uncheckedCast(it[1]), uncheckedCast(it[2])) }
|
||||||
@Suppress("UNCHECKED_CAST")
|
fun <A : Any, B : Any, C : Any, D : Any, R> measure(a: Iterable<A>, b: Iterable<B>, c: Iterable<C>, d: Iterable<D>, f: (A, B, C, D) -> R) =
|
||||||
fun <A, B, C, R> measure(a: Iterable<A>, b: Iterable<B>, c: Iterable<C>, f: (A, B, C) -> R) =
|
measure(listOf(a, b, c, d), f.reflect()!!) { f(uncheckedCast(it[0]), uncheckedCast(it[1]), uncheckedCast(it[2]), uncheckedCast(it[3])) }
|
||||||
measure(listOf(a, b, c), f.reflect()!!) { (f as ((Any?,Any?,Any?)->R))(it[0], it[1], it[2]) }
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun <A, B, C, D, R> measure(a: Iterable<A>, b: Iterable<B>, c: Iterable<C>, d: Iterable<D>, f: (A, B, C, D) -> R) =
|
|
||||||
measure(listOf(a, b, c, d), f.reflect()!!) { (f as ((Any?,Any?,Any?,Any?)->R))(it[0], it[1], it[2], it[3]) }
|
|
||||||
|
|
||||||
private fun <R> measure(paramIterables: List<Iterable<Any?>>, kCallable: KCallable<R>, call: (Array<Any?>) -> R): Iterable<MeasureResult<R>> {
|
private fun <R> measure(paramIterables: List<Iterable<Any?>>, kCallable: KCallable<R>, call: (Array<Any?>) -> R): Iterable<MeasureResult<R>> {
|
||||||
val kParameters = kCallable.parameters
|
val kParameters = kCallable.parameters
|
||||||
|
@ -5,6 +5,7 @@ import net.corda.core.cordapp.CordappProvider
|
|||||||
import net.corda.core.crypto.*
|
import net.corda.core.crypto.*
|
||||||
import net.corda.core.crypto.NullKeys.NULL_SIGNATURE
|
import net.corda.core.crypto.NullKeys.NULL_SIGNATURE
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
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.transactions.TransactionBuilder
|
import net.corda.core.transactions.TransactionBuilder
|
||||||
@ -188,8 +189,8 @@ data class TestLedgerDSLInterpreter private constructor(
|
|||||||
nonVerifiedTransactionWithLocations[stateRef.txhash] ?:
|
nonVerifiedTransactionWithLocations[stateRef.txhash] ?:
|
||||||
throw TransactionResolutionException(stateRef.txhash)
|
throw TransactionResolutionException(stateRef.txhash)
|
||||||
val output = transactionWithLocation.transaction.outputs[stateRef.index]
|
val output = transactionWithLocation.transaction.outputs[stateRef.index]
|
||||||
return if (S::class.java.isAssignableFrom(output.data.javaClass)) @Suppress("UNCHECKED_CAST") {
|
return if (S::class.java.isAssignableFrom(output.data.javaClass)) {
|
||||||
output as TransactionState<S>
|
uncheckedCast(output)
|
||||||
} else {
|
} else {
|
||||||
throw TypeMismatch(requested = S::class.java, actual = output.data.javaClass)
|
throw TypeMismatch(requested = S::class.java, actual = output.data.javaClass)
|
||||||
}
|
}
|
||||||
@ -313,8 +314,7 @@ data class TestLedgerDSLInterpreter private constructor(
|
|||||||
} else if (!clazz.isAssignableFrom(stateAndRef.state.data.javaClass)) {
|
} else if (!clazz.isAssignableFrom(stateAndRef.state.data.javaClass)) {
|
||||||
throw TypeMismatch(requested = clazz, actual = stateAndRef.state.data.javaClass)
|
throw TypeMismatch(requested = clazz, actual = stateAndRef.state.data.javaClass)
|
||||||
} else {
|
} else {
|
||||||
@Suppress("UNCHECKED_CAST")
|
return uncheckedCast(stateAndRef)
|
||||||
return stateAndRef as StateAndRef<S>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
package net.corda.demobench.model
|
package net.corda.demobench.model
|
||||||
|
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import net.corda.nodeapi.User
|
import net.corda.nodeapi.User
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun toUser(map: Map<String, Any>) = User(
|
fun toUser(map: Map<String, Any>) = User(
|
||||||
map.getOrElse("username", { "none" }) as String,
|
map.getOrElse("username", { "none" }) as String,
|
||||||
map.getOrElse("password", { "none" }) as String,
|
map.getOrElse("password", { "none" }) as String,
|
||||||
LinkedHashSet<String>(map.getOrElse("permissions", { emptyList<String>() }) as Collection<String>)
|
LinkedHashSet(uncheckedCast<Any, Collection<String>>(map.getOrElse("permissions", { emptyList<String>() })))
|
||||||
)
|
)
|
||||||
|
|
||||||
fun user(name: String) = User(name, "letmein", setOf("ALL"))
|
fun user(name: String) = User(name, "letmein", setOf("ALL"))
|
||||||
|
@ -7,6 +7,7 @@ import javafx.beans.property.SimpleObjectProperty
|
|||||||
import net.corda.core.internal.createDirectories
|
import net.corda.core.internal.createDirectories
|
||||||
import net.corda.core.internal.div
|
import net.corda.core.internal.div
|
||||||
import net.corda.core.internal.exists
|
import net.corda.core.internal.exists
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import tornadofx.*
|
import tornadofx.*
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
@ -52,14 +53,13 @@ class SettingsModel(path: Path = Paths.get("conf")) : Component(), Observable {
|
|||||||
// Save all changes in memory to properties file.
|
// Save all changes in memory to properties file.
|
||||||
fun commit() = Files.newOutputStream(path).use { config.store(it, "") }
|
fun commit() = Files.newOutputStream(path).use { config.store(it, "") }
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
private operator fun <T> Properties.getValue(receiver: Any, metadata: KProperty<*>): T {
|
private operator fun <T> Properties.getValue(receiver: Any, metadata: KProperty<*>): T {
|
||||||
return when (metadata.returnType.javaType) {
|
return when (metadata.returnType.javaType) {
|
||||||
String::class.java -> string(metadata.name, "") as T
|
String::class.java -> uncheckedCast(string(metadata.name, ""))
|
||||||
Int::class.java -> string(metadata.name, "0").toInt() as T
|
Int::class.java -> uncheckedCast(string(metadata.name, "0").toInt())
|
||||||
Boolean::class.java -> boolean(metadata.name) as T
|
Boolean::class.java -> uncheckedCast(boolean(metadata.name))
|
||||||
Currency::class.java -> Currency.getInstance(string(metadata.name, "USD")) as T
|
Currency::class.java -> uncheckedCast(Currency.getInstance(string(metadata.name, "USD")))
|
||||||
Path::class.java -> Paths.get(string(metadata.name, "")).toAbsolutePath() as T
|
Path::class.java -> uncheckedCast(Paths.get(string(metadata.name, "")).toAbsolutePath())
|
||||||
else -> throw IllegalArgumentException("Unsupported type ${metadata.returnType}")
|
else -> throw IllegalArgumentException("Unsupported type ${metadata.returnType}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package net.corda.webserver.converters
|
package net.corda.webserver.converters
|
||||||
|
|
||||||
import net.corda.core.identity.CordaX500Name
|
import net.corda.core.identity.CordaX500Name
|
||||||
|
import net.corda.core.internal.uncheckedCast
|
||||||
import java.lang.reflect.Type
|
import java.lang.reflect.Type
|
||||||
import javax.ws.rs.ext.ParamConverter
|
import javax.ws.rs.ext.ParamConverter
|
||||||
import javax.ws.rs.ext.ParamConverterProvider
|
import javax.ws.rs.ext.ParamConverterProvider
|
||||||
@ -15,8 +16,7 @@ object CordaX500NameConverter : ParamConverter<CordaX500Name> {
|
|||||||
object CordaConverterProvider : ParamConverterProvider {
|
object CordaConverterProvider : ParamConverterProvider {
|
||||||
override fun <T : Any> getConverter(rawType: Class<T>, genericType: Type?, annotations: Array<out Annotation>?): ParamConverter<T>? {
|
override fun <T : Any> getConverter(rawType: Class<T>, genericType: Type?, annotations: Array<out Annotation>?): ParamConverter<T>? {
|
||||||
if (rawType == CordaX500Name::class.java) {
|
if (rawType == CordaX500Name::class.java) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
return uncheckedCast(CordaX500NameConverter)
|
||||||
return CordaX500NameConverter as ParamConverter<T>
|
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user