CORDA-786 - Genericise the CorDapp Proxy

This commit is contained in:
Katelyn Baker 2017-11-30 14:58:53 +00:00
parent 6881350493
commit d25b7f560c
12 changed files with 39 additions and 37 deletions

View File

@ -39,7 +39,7 @@ interface Cordapp {
val services: List<Class<out SerializeAsToken>> val services: List<Class<out SerializeAsToken>>
val serializationWhitelists: List<SerializationWhitelist> val serializationWhitelists: List<SerializationWhitelist>
val serializationCustomSerializerProxies: List<Class<*>> val serializationCustomSerializerProxies: List<Class<*>>
val serializationCustomSerializers: List<Class<out SerializationCustomSerializer>> val serializationCustomSerializers: List<Class<out SerializationCustomSerializer<*, *>>>
val customSchemas: Set<MappedSchema> val customSchemas: Set<MappedSchema>
val jarPath: URL val jarPath: URL
val cordappClasses: List<String> val cordappClasses: List<String>

View File

@ -18,7 +18,7 @@ data class CordappImpl(
override val services: List<Class<out SerializeAsToken>>, override val services: List<Class<out SerializeAsToken>>,
override val serializationWhitelists: List<SerializationWhitelist>, override val serializationWhitelists: List<SerializationWhitelist>,
override val serializationCustomSerializerProxies: List<Class<*>>, 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 customSchemas: Set<MappedSchema>,
override val jarPath: URL) : Cordapp { override val jarPath: URL) : Cordapp {
override val name: String = File(jarPath.toURI()).name.removeSuffix(".jar") override val name: String = File(jarPath.toURI()).name.removeSuffix(".jar")

View File

@ -21,18 +21,18 @@ import java.lang.reflect.Type
* @property type the type of the object that this class is proxying * @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] * @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 * Should facilitate the conversion of the third party object into the serializable
* local class specified by [ptype] * 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 * Should facilitate the conversion of the proxy object into a new instance of the
* unserializable type * unserializable type
*/ */
fun fromProxy(proxy: Any) : Any fun fromProxy(proxy: PROXY) : OBJ
/** /**
* Should be set to the type of the object being proxied * Should be set to the type of the object being proxied

View File

@ -8,7 +8,7 @@ import org.apache.qpid.proton.codec.Data
import java.lang.reflect.Type import java.lang.reflect.Type
class CorDappCustomSerializer( class CorDappCustomSerializer(
private val serialiser: SerializationCustomSerializer, private val serialiser: SerializationCustomSerializer<*, *>,
factory: SerializerFactory) factory: SerializerFactory)
: AMQPSerializer<Any>, SerializerFor { : AMQPSerializer<Any>, SerializerFor {
override val revealSubclassesInSchema: Boolean get() = false override val revealSubclassesInSchema: Boolean get() = false
@ -21,7 +21,8 @@ class CorDappCustomSerializer(
override fun writeClassInfo(output: SerializationOutput) {} override fun writeClassInfo(output: SerializationOutput) {}
override fun writeObject(obj: Any, data: Data, type: Type, 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.withDescribed(descriptor) {
data.withList { data.withList {
@ -32,9 +33,10 @@ class CorDappCustomSerializer(
} }
} }
override fun readObject(obj: Any, schema: Schema, input: DeserializationInput): Any { override fun readObject(obj: Any, schema: Schema, input: DeserializationInput) =
return serialiser.fromProxy(uncheckedCast(proxySerializer.readObject(obj, schema, input))) @Suppress("UNCHECKED_CAST")
} (serialiser as SerializationCustomSerializer<Any?,Any?>).fromProxy(
uncheckedCast(proxySerializer.readObject(obj, schema, input)))!!
override fun isSerializerFor(clazz: Class<*>): Boolean = clazz == type override fun isSerializerFor(clazz: Class<*>): Boolean = clazz == type
} }

View File

@ -254,7 +254,7 @@ class CordappLoader private constructor(private val cordappJarPaths: List<Restri
return scanResult.getClassesWithAnnotation(Class::class, CordaCustomSerializerProxy::class) 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) return scanResult.getClassesWithAnnotation(SerializationCustomSerializer::class, CordaCustomSerializer::class)
} }

View File

@ -9,13 +9,14 @@ import java.lang.reflect.Type
@CordaCustomSerializer @CordaCustomSerializer
@Suppress("UNUSED") @Suppress("UNUSED")
class CurrencyParameterSensitivitiesSerializer : SerializationCustomSerializer { class CurrencyParameterSensitivitiesSerializer :
SerializationCustomSerializer<CurrencyParameterSensitivities, CurrencyParameterSensitivitiesSerializer.Proxy> {
@CordaCustomSerializerProxy @CordaCustomSerializerProxy
data class Proxy(val sensitivities: List<CurrencyParameterSensitivity>) data class Proxy(val sensitivities: List<CurrencyParameterSensitivity>)
override val type: Type get() = CurrencyParameterSensitivities::class.java override val type: Type get() = CurrencyParameterSensitivities::class.java
override val ptype: Type get() = Proxy::class.java override val ptype: Type get() = Proxy::class.java
override fun fromProxy(proxy: Any): Any = CurrencyParameterSensitivities.of ((proxy as Proxy).sensitivities) override fun fromProxy(proxy: Proxy) = CurrencyParameterSensitivities.of(proxy.sensitivities)
override fun toProxy(obj: Any): Any = Proxy ((obj as CurrencyParameterSensitivities).sensitivities) override fun toProxy(obj: CurrencyParameterSensitivities) = Proxy(obj.sensitivities)
} }

View File

@ -12,7 +12,8 @@ import java.lang.reflect.Type
@CordaCustomSerializer @CordaCustomSerializer
@Suppress("UNUSED") @Suppress("UNUSED")
class CurrencyParameterSensitivitySerializer : SerializationCustomSerializer { class CurrencyParameterSensitivitySerializer :
SerializationCustomSerializer<CurrencyParameterSensitivity, CurrencyParameterSensitivitySerializer.Proxy> {
@CordaCustomSerializerProxy @CordaCustomSerializerProxy
data class Proxy(val currency: Currency, val marketDataName: MarketDataName<*>, data class Proxy(val currency: Currency, val marketDataName: MarketDataName<*>,
val parameterMetadata: List<ParameterMetadata>, val parameterMetadata: List<ParameterMetadata>,
@ -21,13 +22,13 @@ class CurrencyParameterSensitivitySerializer : SerializationCustomSerializer {
override val type: Type get() = CurrencyParameterSensitivity::class.java override val type: Type get() = CurrencyParameterSensitivity::class.java
override val ptype: Type get() = Proxy::class.java override val ptype: Type get() = Proxy::class.java
override fun fromProxy(proxy: Any): Any = override fun fromProxy(proxy: CurrencyParameterSensitivitySerializer.Proxy) =
CurrencyParameterSensitivity.of( CurrencyParameterSensitivity.of(
(proxy as Proxy).marketDataName, proxy.marketDataName,
proxy.parameterMetadata, proxy.parameterMetadata,
proxy.currency, proxy.currency,
proxy.sensitivity) 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) obj.marketDataName, obj.parameterMetadata, obj.sensitivity)
} }

View File

@ -8,13 +8,13 @@ import java.lang.reflect.Type
@CordaCustomSerializer @CordaCustomSerializer
@Suppress("UNUSED") @Suppress("UNUSED")
class CurrencySerializer : SerializationCustomSerializer { class CurrencySerializer : SerializationCustomSerializer<Currency, CurrencySerializer.Proxy> {
@CordaCustomSerializerProxy @CordaCustomSerializerProxy
data class Proxy(val currency: String) data class Proxy(val currency: String)
override val type: Type get() = Currency::class.java override val type: Type get() = Currency::class.java
override val ptype: Type get() = Proxy::class.java override val ptype: Type get() = Proxy::class.java
override fun fromProxy(proxy: Any): Any = Currency.parse((proxy as Proxy).currency) override fun fromProxy(proxy: Proxy) = Currency.parse(proxy.currency)
override fun toProxy(obj: Any): Any = Proxy((obj as Currency).toString()) override fun toProxy(obj: Currency) = Proxy(obj.toString())
} }

View File

@ -8,13 +8,13 @@ import java.lang.reflect.Type
@CordaCustomSerializer @CordaCustomSerializer
@Suppress("UNUSED") @Suppress("UNUSED")
class DoubleArraySerializer : SerializationCustomSerializer { class DoubleArraySerializer : SerializationCustomSerializer<DoubleArray, DoubleArraySerializer.Proxy> {
@CordaCustomSerializerProxy @CordaCustomSerializerProxy
data class Proxy(val amount: kotlin.DoubleArray) data class Proxy(val amount: kotlin.DoubleArray)
override val type: Type get() = DoubleArray::class.java override val type: Type get() = DoubleArray::class.java
override val ptype: Type get() = Proxy::class.java override val ptype: Type get() = Proxy::class.java
override fun fromProxy(proxy: Any): Any = DoubleArray.copyOf((proxy as Proxy).amount) override fun fromProxy(proxy: Proxy) = DoubleArray.copyOf(proxy.amount)
override fun toProxy(obj: Any): Any = Proxy((obj as DoubleArray).toArray()) override fun toProxy(obj: DoubleArray) = Proxy(obj.toArray())
} }

View File

@ -7,12 +7,13 @@ import java.lang.reflect.Type
@CordaCustomSerializer @CordaCustomSerializer
@Suppress("UNUSED") @Suppress("UNUSED")
class MultiCurrencyAmountSerializer : SerializationCustomSerializer { class MultiCurrencyAmountSerializer :
SerializationCustomSerializer<MultiCurrencyAmount, MultiCurrencyAmountSerializer.Proxy> {
@CordaCustomSerializerProxy @CordaCustomSerializerProxy
data class Proxy(val curencies : Map<Currency, Double>) data class Proxy(val curencies : Map<Currency, Double>)
override fun toProxy(obj: Any): Any = Proxy((obj as MultiCurrencyAmount).toMap()) override fun toProxy(obj: MultiCurrencyAmount) = Proxy(obj.toMap())
override fun fromProxy(proxy: Any): Any = MultiCurrencyAmount.of((proxy as Proxy).curencies) override fun fromProxy(proxy: Proxy) = MultiCurrencyAmount.of(proxy.curencies)
override val type: Type get() = MultiCurrencyAmount::class.java override val type: Type get() = MultiCurrencyAmount::class.java
override val ptype: Type get() = Proxy::class.java override val ptype: Type get() = Proxy::class.java

View File

@ -8,16 +8,15 @@ import java.time.LocalDate
@CordaCustomSerializer @CordaCustomSerializer
@Suppress("UNUSED") @Suppress("UNUSED")
class TenorDateParameterMetadataSerializer : SerializationCustomSerializer { class TenorDateParameterMetadataSerializer :
SerializationCustomSerializer<TenorDateParameterMetadata, TenorDateParameterMetadataSerializer.Proxy> {
@CordaCustomSerializerProxy @CordaCustomSerializerProxy
data class Proxy(val tenor: Tenor, val date: LocalDate, val identifier: Tenor, val label: String) 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 type: Type get() = TenorDateParameterMetadata::class.java
override val ptype: Type get() = Proxy::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( override fun toProxy(obj: TenorDateParameterMetadata) = Proxy(obj.tenor, obj.date, obj.identifier, obj.label)
(proxy as Proxy).date, proxy.tenor, proxy.label) override fun fromProxy(proxy: Proxy) = TenorDateParameterMetadata.of(proxy.date, proxy.tenor, proxy.label)
} }

View File

@ -7,15 +7,13 @@ import java.time.Period
@CordaCustomSerializer @CordaCustomSerializer
@Suppress("UNUSED") @Suppress("UNUSED")
class TenorSerializer : SerializationCustomSerializer { class TenorSerializer : SerializationCustomSerializer<Tenor, TenorSerializer.Proxy> {
@CordaCustomSerializerProxy @CordaCustomSerializerProxy
data class Proxy(val years: Int, val months: Int, val days: Int, val name: String) 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 type: Type get() = Tenor::class.java
override val ptype: Type get() = Proxy::class.java override val ptype: Type get() = Proxy::class.java
override fun toProxy(obj: Any): Any = Proxy( override fun toProxy(obj: Tenor) = Proxy(obj.period.years, obj.period.months, obj.period.days, obj.toString())
(obj as Tenor).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))
override fun fromProxy(proxy: Any): Any = Tenor.of (Period.of((proxy as Proxy).years, proxy.months, proxy.days))
} }