mirror of
https://github.com/corda/corda.git
synced 2025-04-06 19:07:08 +00:00
CORDA-786 - Genericise the CorDapp Proxy
This commit is contained in:
parent
6881350493
commit
d25b7f560c
@ -39,7 +39,7 @@ interface Cordapp {
|
||||
val services: List<Class<out SerializeAsToken>>
|
||||
val serializationWhitelists: List<SerializationWhitelist>
|
||||
val serializationCustomSerializerProxies: List<Class<*>>
|
||||
val serializationCustomSerializers: List<Class<out SerializationCustomSerializer>>
|
||||
val serializationCustomSerializers: List<Class<out SerializationCustomSerializer<*, *>>>
|
||||
val customSchemas: Set<MappedSchema>
|
||||
val jarPath: URL
|
||||
val cordappClasses: List<String>
|
||||
|
@ -18,7 +18,7 @@ data class CordappImpl(
|
||||
override val services: List<Class<out SerializeAsToken>>,
|
||||
override val serializationWhitelists: List<SerializationWhitelist>,
|
||||
override val serializationCustomSerializerProxies: List<Class<*>>,
|
||||
override val serializationCustomSerializers: List<Class<out SerializationCustomSerializer>>,
|
||||
override val serializationCustomSerializers: List<Class<out SerializationCustomSerializer<*, *>>>,
|
||||
override val customSchemas: Set<MappedSchema>,
|
||||
override val jarPath: URL) : Cordapp {
|
||||
override val name: String = File(jarPath.toURI()).name.removeSuffix(".jar")
|
||||
|
@ -21,18 +21,18 @@ import java.lang.reflect.Type
|
||||
* @property type the type of the object that this class is proxying
|
||||
* @property ptype the type of the proxy object used as an intermediate representation of [type]
|
||||
*/
|
||||
interface SerializationCustomSerializer {
|
||||
interface SerializationCustomSerializer<OBJ, PROXY> {
|
||||
/**
|
||||
* Should facilitate the conversion of the third party object into the serializable
|
||||
* local class specified by [ptype]
|
||||
*/
|
||||
fun toProxy(obj: Any) : Any
|
||||
fun toProxy(obj: OBJ) : PROXY
|
||||
|
||||
/**
|
||||
* Should facilitate the conversion of the proxy object into a new instance of the
|
||||
* unserializable type
|
||||
*/
|
||||
fun fromProxy(proxy: Any) : Any
|
||||
fun fromProxy(proxy: PROXY) : OBJ
|
||||
|
||||
/**
|
||||
* Should be set to the type of the object being proxied
|
||||
|
@ -8,7 +8,7 @@ import org.apache.qpid.proton.codec.Data
|
||||
import java.lang.reflect.Type
|
||||
|
||||
class CorDappCustomSerializer(
|
||||
private val serialiser: SerializationCustomSerializer,
|
||||
private val serialiser: SerializationCustomSerializer<*, *>,
|
||||
factory: SerializerFactory)
|
||||
: AMQPSerializer<Any>, SerializerFor {
|
||||
override val revealSubclassesInSchema: Boolean get() = false
|
||||
@ -21,7 +21,8 @@ class CorDappCustomSerializer(
|
||||
override fun writeClassInfo(output: SerializationOutput) {}
|
||||
|
||||
override fun writeObject(obj: Any, data: Data, type: Type, output: SerializationOutput) {
|
||||
val proxy = serialiser.toProxy(obj)
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val proxy = (serialiser as SerializationCustomSerializer<Any?,Any?>).toProxy(obj)
|
||||
|
||||
data.withDescribed(descriptor) {
|
||||
data.withList {
|
||||
@ -32,9 +33,10 @@ class CorDappCustomSerializer(
|
||||
}
|
||||
}
|
||||
|
||||
override fun readObject(obj: Any, schema: Schema, input: DeserializationInput): Any {
|
||||
return serialiser.fromProxy(uncheckedCast(proxySerializer.readObject(obj, schema, input)))
|
||||
}
|
||||
override fun readObject(obj: Any, schema: Schema, input: DeserializationInput) =
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
(serialiser as SerializationCustomSerializer<Any?,Any?>).fromProxy(
|
||||
uncheckedCast(proxySerializer.readObject(obj, schema, input)))!!
|
||||
|
||||
override fun isSerializerFor(clazz: Class<*>): Boolean = clazz == type
|
||||
}
|
||||
|
@ -254,7 +254,7 @@ class CordappLoader private constructor(private val cordappJarPaths: List<Restri
|
||||
return scanResult.getClassesWithAnnotation(Class::class, CordaCustomSerializerProxy::class)
|
||||
}
|
||||
|
||||
private fun findSerialzers(scanResult: RestrictedScanResult) : List<Class<out SerializationCustomSerializer>> {
|
||||
private fun findSerialzers(scanResult: RestrictedScanResult) : List<Class<out SerializationCustomSerializer<*, *>>> {
|
||||
return scanResult.getClassesWithAnnotation(SerializationCustomSerializer::class, CordaCustomSerializer::class)
|
||||
}
|
||||
|
||||
|
@ -9,13 +9,14 @@ import java.lang.reflect.Type
|
||||
|
||||
@CordaCustomSerializer
|
||||
@Suppress("UNUSED")
|
||||
class CurrencyParameterSensitivitiesSerializer : SerializationCustomSerializer {
|
||||
class CurrencyParameterSensitivitiesSerializer :
|
||||
SerializationCustomSerializer<CurrencyParameterSensitivities, CurrencyParameterSensitivitiesSerializer.Proxy> {
|
||||
@CordaCustomSerializerProxy
|
||||
data class Proxy(val sensitivities: List<CurrencyParameterSensitivity>)
|
||||
|
||||
override val type: Type get() = CurrencyParameterSensitivities::class.java
|
||||
override val ptype: Type get() = Proxy::class.java
|
||||
|
||||
override fun fromProxy(proxy: Any): Any = CurrencyParameterSensitivities.of ((proxy as Proxy).sensitivities)
|
||||
override fun toProxy(obj: Any): Any = Proxy ((obj as CurrencyParameterSensitivities).sensitivities)
|
||||
override fun fromProxy(proxy: Proxy) = CurrencyParameterSensitivities.of(proxy.sensitivities)
|
||||
override fun toProxy(obj: CurrencyParameterSensitivities) = Proxy(obj.sensitivities)
|
||||
}
|
@ -12,7 +12,8 @@ import java.lang.reflect.Type
|
||||
|
||||
@CordaCustomSerializer
|
||||
@Suppress("UNUSED")
|
||||
class CurrencyParameterSensitivitySerializer : SerializationCustomSerializer {
|
||||
class CurrencyParameterSensitivitySerializer :
|
||||
SerializationCustomSerializer<CurrencyParameterSensitivity, CurrencyParameterSensitivitySerializer.Proxy> {
|
||||
@CordaCustomSerializerProxy
|
||||
data class Proxy(val currency: Currency, val marketDataName: MarketDataName<*>,
|
||||
val parameterMetadata: List<ParameterMetadata>,
|
||||
@ -21,13 +22,13 @@ class CurrencyParameterSensitivitySerializer : SerializationCustomSerializer {
|
||||
override val type: Type get() = CurrencyParameterSensitivity::class.java
|
||||
override val ptype: Type get() = Proxy::class.java
|
||||
|
||||
override fun fromProxy(proxy: Any): Any =
|
||||
override fun fromProxy(proxy: CurrencyParameterSensitivitySerializer.Proxy) =
|
||||
CurrencyParameterSensitivity.of(
|
||||
(proxy as Proxy).marketDataName,
|
||||
proxy.marketDataName,
|
||||
proxy.parameterMetadata,
|
||||
proxy.currency,
|
||||
proxy.sensitivity)
|
||||
|
||||
override fun toProxy(obj: Any): Any = Proxy ((obj as CurrencyParameterSensitivity).currency,
|
||||
override fun toProxy(obj: CurrencyParameterSensitivity) = Proxy((obj as CurrencyParameterSensitivity).currency,
|
||||
obj.marketDataName, obj.parameterMetadata, obj.sensitivity)
|
||||
}
|
||||
|
@ -8,13 +8,13 @@ import java.lang.reflect.Type
|
||||
|
||||
@CordaCustomSerializer
|
||||
@Suppress("UNUSED")
|
||||
class CurrencySerializer : SerializationCustomSerializer {
|
||||
class CurrencySerializer : SerializationCustomSerializer<Currency, CurrencySerializer.Proxy> {
|
||||
@CordaCustomSerializerProxy
|
||||
data class Proxy(val currency: String)
|
||||
|
||||
override val type: Type get() = Currency::class.java
|
||||
override val ptype: Type get() = Proxy::class.java
|
||||
|
||||
override fun fromProxy(proxy: Any): Any = Currency.parse((proxy as Proxy).currency)
|
||||
override fun toProxy(obj: Any): Any = Proxy((obj as Currency).toString())
|
||||
override fun fromProxy(proxy: Proxy) = Currency.parse(proxy.currency)
|
||||
override fun toProxy(obj: Currency) = Proxy(obj.toString())
|
||||
}
|
||||
|
@ -8,13 +8,13 @@ import java.lang.reflect.Type
|
||||
|
||||
@CordaCustomSerializer
|
||||
@Suppress("UNUSED")
|
||||
class DoubleArraySerializer : SerializationCustomSerializer {
|
||||
class DoubleArraySerializer : SerializationCustomSerializer<DoubleArray, DoubleArraySerializer.Proxy> {
|
||||
@CordaCustomSerializerProxy
|
||||
data class Proxy(val amount: kotlin.DoubleArray)
|
||||
|
||||
override val type: Type get() = DoubleArray::class.java
|
||||
override val ptype: Type get() = Proxy::class.java
|
||||
|
||||
override fun fromProxy(proxy: Any): Any = DoubleArray.copyOf((proxy as Proxy).amount)
|
||||
override fun toProxy(obj: Any): Any = Proxy((obj as DoubleArray).toArray())
|
||||
override fun fromProxy(proxy: Proxy) = DoubleArray.copyOf(proxy.amount)
|
||||
override fun toProxy(obj: DoubleArray) = Proxy(obj.toArray())
|
||||
}
|
||||
|
@ -7,12 +7,13 @@ import java.lang.reflect.Type
|
||||
|
||||
@CordaCustomSerializer
|
||||
@Suppress("UNUSED")
|
||||
class MultiCurrencyAmountSerializer : SerializationCustomSerializer {
|
||||
class MultiCurrencyAmountSerializer :
|
||||
SerializationCustomSerializer<MultiCurrencyAmount, MultiCurrencyAmountSerializer.Proxy> {
|
||||
@CordaCustomSerializerProxy
|
||||
data class Proxy(val curencies : Map<Currency, Double>)
|
||||
|
||||
override fun toProxy(obj: Any): Any = Proxy((obj as MultiCurrencyAmount).toMap())
|
||||
override fun fromProxy(proxy: Any): Any = MultiCurrencyAmount.of((proxy as Proxy).curencies)
|
||||
override fun toProxy(obj: MultiCurrencyAmount) = Proxy(obj.toMap())
|
||||
override fun fromProxy(proxy: Proxy) = MultiCurrencyAmount.of(proxy.curencies)
|
||||
|
||||
override val type: Type get() = MultiCurrencyAmount::class.java
|
||||
override val ptype: Type get() = Proxy::class.java
|
||||
|
@ -8,16 +8,15 @@ import java.time.LocalDate
|
||||
|
||||
@CordaCustomSerializer
|
||||
@Suppress("UNUSED")
|
||||
class TenorDateParameterMetadataSerializer : SerializationCustomSerializer {
|
||||
class TenorDateParameterMetadataSerializer :
|
||||
SerializationCustomSerializer<TenorDateParameterMetadata, TenorDateParameterMetadataSerializer.Proxy> {
|
||||
@CordaCustomSerializerProxy
|
||||
data class Proxy(val tenor: Tenor, val date: LocalDate, val identifier: Tenor, val label: String)
|
||||
|
||||
override val type: Type get() = TenorDateParameterMetadata::class.java
|
||||
override val ptype: Type get() = Proxy::class.java
|
||||
|
||||
override fun toProxy(obj: Any): Any = Proxy(
|
||||
(obj as TenorDateParameterMetadata).tenor, obj.date, obj.identifier, obj.label)
|
||||
|
||||
override fun fromProxy(proxy: Any): Any = TenorDateParameterMetadata.of(
|
||||
(proxy as Proxy).date, proxy.tenor, proxy.label)
|
||||
override fun toProxy(obj: TenorDateParameterMetadata) = Proxy(obj.tenor, obj.date, obj.identifier, obj.label)
|
||||
override fun fromProxy(proxy: Proxy) = TenorDateParameterMetadata.of(proxy.date, proxy.tenor, proxy.label)
|
||||
}
|
||||
|
@ -7,15 +7,13 @@ import java.time.Period
|
||||
|
||||
@CordaCustomSerializer
|
||||
@Suppress("UNUSED")
|
||||
class TenorSerializer : SerializationCustomSerializer {
|
||||
class TenorSerializer : SerializationCustomSerializer<Tenor, TenorSerializer.Proxy> {
|
||||
@CordaCustomSerializerProxy
|
||||
data class Proxy(val years: Int, val months: Int, val days: Int, val name: String)
|
||||
|
||||
override val type: Type get() = Tenor::class.java
|
||||
override val ptype: Type get() = Proxy::class.java
|
||||
|
||||
override fun toProxy(obj: Any): Any = Proxy(
|
||||
(obj as Tenor).period.years, obj.period.months, obj.period.days, obj.toString())
|
||||
|
||||
override fun fromProxy(proxy: Any): Any = Tenor.of (Period.of((proxy as Proxy).years, proxy.months, proxy.days))
|
||||
override fun toProxy(obj: Tenor) = Proxy(obj.period.years, obj.period.months, obj.period.days, obj.toString())
|
||||
override fun fromProxy(proxy: Proxy) = Tenor.of (Period.of(proxy.years, proxy.months, proxy.days))
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user