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 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>

View File

@ -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")

View File

@ -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

View File

@ -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
}

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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())
}

View File

@ -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())
}

View File

@ -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

View File

@ -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)
}

View File

@ -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))
}