Skip to content

Commit 101ecdd

Browse files
committed
testing
1 parent 8d01538 commit 101ecdd

File tree

8 files changed

+144
-21
lines changed

8 files changed

+144
-21
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ kotlin.code.style=official
22

33
protocolVersion=0.2.3
44

5-
kotlinVersion=1.6.0
5+
kotlinVersion=1.6.10
66
vertxVersion=4.0.2
77
jacksonVersion=2.13.0

src/commonMain/kotlin/spp.protocol/instrument/LiveInstrument.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package spp.protocol.instrument
22

33
import kotlinx.serialization.Contextual
44
import kotlinx.serialization.Serializable
5+
import kotlinx.serialization.json.JsonClassDiscriminator
56

67
/**
78
* todo: description.
@@ -10,6 +11,7 @@ import kotlinx.serialization.Serializable
1011
* @author [Brandon Fergerson](mailto:bfergerson@apache.org)
1112
*/
1213
@Serializable
14+
@JsonClassDiscriminator("type")
1315
abstract class LiveInstrument {
1416
abstract val location: LiveSourceLocation
1517
abstract val condition: String?

src/commonMain/kotlin/spp.protocol/instrument/breakpoint/LiveBreakpoint.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package spp.protocol.instrument.breakpoint
22

3+
import kotlinx.serialization.Contextual
4+
import kotlinx.serialization.SerialName
5+
import kotlinx.serialization.Serializable
6+
import kotlinx.serialization.json.JsonClassDiscriminator
37
import spp.protocol.instrument.InstrumentThrottle
48
import spp.protocol.instrument.LiveInstrument
59
import spp.protocol.instrument.LiveInstrumentType
610
import spp.protocol.instrument.LiveSourceLocation
7-
import kotlinx.serialization.Contextual
8-
import kotlinx.serialization.Serializable
911

1012
/**
1113
* todo: description.
@@ -14,6 +16,8 @@ import kotlinx.serialization.Serializable
1416
* @author [Brandon Fergerson](mailto:bfergerson@apache.org)
1517
*/
1618
@Serializable
19+
@SerialName("BREAKPOINT")
20+
@JsonClassDiscriminator("type")
1721
data class LiveBreakpoint(
1822
override val location: LiveSourceLocation,
1923
override val condition: String? = null,

src/commonMain/kotlin/spp.protocol/instrument/log/LiveLog.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import spp.protocol.instrument.LiveInstrument
55
import spp.protocol.instrument.LiveInstrumentType
66
import spp.protocol.instrument.LiveSourceLocation
77
import kotlinx.serialization.Contextual
8+
import kotlinx.serialization.SerialName
89
import kotlinx.serialization.Serializable
910

1011
/**
@@ -14,6 +15,7 @@ import kotlinx.serialization.Serializable
1415
* @author [Brandon Fergerson](mailto:bfergerson@apache.org)
1516
*/
1617
@Serializable
18+
@SerialName("LOG")
1719
data class LiveLog(
1820
val logFormat: String,
1921
val logArguments: List<String> = emptyList(),

src/commonMain/kotlin/spp.protocol/instrument/meter/LiveMeter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package spp.protocol.instrument.meter
22

33
import kotlinx.serialization.Contextual
4+
import kotlinx.serialization.SerialName
45
import kotlinx.serialization.Serializable
56
import spp.protocol.instrument.InstrumentThrottle
67
import spp.protocol.instrument.LiveInstrument
@@ -13,6 +14,7 @@ import spp.protocol.instrument.LiveSourceLocation
1314
* @author [Brandon Fergerson](mailto:bfergerson@apache.org)
1415
*/
1516
@Serializable
17+
@SerialName("METER")
1618
data class LiveMeter(
1719
val meterName: String,
1820
val meterType: MeterType,

src/jvmMain/kotlin/spp/protocol/ProtocolMarshaller.kt

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@ package spp.protocol
22

33
import com.fasterxml.jackson.databind.DeserializationFeature
44
import com.fasterxml.jackson.databind.SerializationFeature
5+
import com.fasterxml.jackson.databind.module.SimpleModule
56
import com.fasterxml.jackson.datatype.guava.GuavaModule
67
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module
78
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
8-
import com.fasterxml.jackson.module.kotlin.KotlinModule
9+
import io.vertx.core.Vertx
10+
import io.vertx.core.buffer.Buffer
11+
import io.vertx.core.eventbus.MessageCodec
12+
import io.vertx.core.json.Json
13+
import io.vertx.core.json.JsonObject
14+
import io.vertx.core.json.jackson.DatabindCodec
15+
import kotlinx.datetime.Instant
916
import spp.protocol.artifact.ArtifactQualifiedName
1017
import spp.protocol.artifact.log.LogCountSummary
1118
import spp.protocol.artifact.trace.TraceResult
@@ -17,14 +24,8 @@ import spp.protocol.instrument.breakpoint.LiveBreakpoint
1724
import spp.protocol.instrument.breakpoint.event.LiveBreakpointHit
1825
import spp.protocol.instrument.log.LiveLog
1926
import spp.protocol.instrument.meter.LiveMeter
27+
import spp.protocol.util.KSerializers
2028
import spp.protocol.view.LiveViewSubscription
21-
import io.vertx.core.Vertx
22-
import io.vertx.core.buffer.Buffer
23-
import io.vertx.core.eventbus.MessageCodec
24-
import io.vertx.core.json.Json
25-
import io.vertx.core.json.JsonObject
26-
import io.vertx.core.json.jackson.DatabindCodec
27-
import kotlinx.datetime.Instant
2829
import java.util.*
2930

3031
/**
@@ -39,9 +40,13 @@ object ProtocolMarshaller {
3940
DatabindCodec.mapper().registerModule(GuavaModule())
4041
DatabindCodec.mapper().registerModule(Jdk8Module())
4142
DatabindCodec.mapper().registerModule(JavaTimeModule())
42-
DatabindCodec.mapper().registerModule(KotlinModule())
4343
DatabindCodec.mapper().enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING)
4444
DatabindCodec.mapper().enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING)
45+
46+
val module = SimpleModule()
47+
module.addSerializer(Instant::class.java, KSerializers.KotlinInstantSerializer())
48+
module.addDeserializer(Instant::class.java, KSerializers.KotlinInstantDeserializer())
49+
DatabindCodec.mapper().registerModule(module)
4550
} catch (ignore: Throwable) {
4651
}
4752
}
@@ -88,7 +93,13 @@ object ProtocolMarshaller {
8893

8994
@JvmStatic
9095
fun serializeLiveInstrument(value: LiveInstrument): JsonObject {
91-
val valueObject = JsonObject(Json.encode(value))
96+
val valueObject = when (value) {
97+
is LiveBreakpoint -> JsonObject(KSerializers.json.encodeToString(LiveBreakpoint.serializer(), value))
98+
is LiveLog -> JsonObject(KSerializers.json.encodeToString(LiveLog.serializer(), value))
99+
is LiveMeter -> JsonObject(KSerializers.json.encodeToString(LiveMeter.serializer(), value))
100+
else -> throw IllegalArgumentException("Unknown LiveInstrument type: ${value::class.java.name}")
101+
}
102+
92103
//force persistence of "type" as graalvm's native-image drops it for some reason
93104
when (value) {
94105
is LiveBreakpoint -> valueObject.put("type", LiveInstrumentType.BREAKPOINT.name)
@@ -102,11 +113,11 @@ object ProtocolMarshaller {
102113
@JvmStatic
103114
fun deserializeLiveInstrument(value: JsonObject): LiveInstrument {
104115
return if (value.getString("type") == "BREAKPOINT") {
105-
value.mapTo(LiveBreakpoint::class.java)
116+
KSerializers.json.decodeFromString(LiveBreakpoint.serializer(), value.toString())
106117
} else if (value.getString("type") == "LOG") {
107-
value.mapTo(LiveLog::class.java)
118+
KSerializers.json.decodeFromString(LiveLog.serializer(), value.toString())
108119
} else if (value.getString("type") == "METER") {
109-
value.mapTo(LiveMeter::class.java)
120+
KSerializers.json.decodeFromString(LiveMeter.serializer(), value.toString())
110121
} else {
111122
throw UnsupportedOperationException("Live instrument type: " + value.getString("type"))
112123
}
@@ -149,7 +160,7 @@ object ProtocolMarshaller {
149160

150161
@JvmStatic
151162
fun deserializeLiveSourceLocation(value: JsonObject): LiveSourceLocation {
152-
return value.mapTo(LiveSourceLocation::class.java)
163+
return kotlinx.serialization.json.Json.decodeFromString(LiveSourceLocation.serializer(), value.toString())
153164
}
154165

155166
@JvmStatic

src/jvmMain/kotlin/spp/protocol/probe/command/LiveInstrumentContext.kt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ package spp.protocol.probe.command
33
import com.fasterxml.jackson.annotation.JsonIgnore
44
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
55
import io.vertx.core.json.Json
6+
import kotlinx.serialization.encodeToString
7+
import spp.protocol.instrument.LiveInstrument
8+
import spp.protocol.instrument.LiveSourceLocation
9+
import spp.protocol.instrument.breakpoint.LiveBreakpoint
10+
import spp.protocol.instrument.log.LiveLog
11+
import spp.protocol.instrument.meter.LiveMeter
12+
import spp.protocol.util.KSerializers
613
import java.io.Serializable
714
import java.util.stream.Collectors
815

@@ -17,8 +24,18 @@ data class LiveInstrumentContext(
1724
val liveInstruments: List<String>
1825
get() = instruments.toList()
1926

20-
fun addLiveInstrument(liveInstrument: Any): LiveInstrumentContext {
21-
instruments.add(Json.encode(liveInstrument))
27+
fun addLiveInstrument(liveInstrument: LiveInstrument): LiveInstrumentContext {
28+
when (liveInstrument) {
29+
is LiveBreakpoint -> {
30+
instruments.add(KSerializers.json.encodeToString(liveInstrument))
31+
}
32+
is LiveLog -> {
33+
instruments.add(KSerializers.json.encodeToString(LiveLog.serializer(), liveInstrument))
34+
}
35+
is LiveMeter -> {
36+
instruments.add(KSerializers.json.encodeToString(LiveMeter.serializer(), liveInstrument))
37+
}
38+
}
2239
return this
2340
}
2441

@@ -36,8 +53,8 @@ data class LiveInstrumentContext(
3653
return instruments.stream().map { Json.decodeValue(it, clazz) }.collect(Collectors.toList())
3754
}
3855

39-
fun addLocation(location: Any) {
40-
locations.add(Json.encode(location))
56+
fun addLocation(location: LiveSourceLocation) {
57+
locations.add(KSerializers.json.encodeToString(LiveSourceLocation.serializer(), location))
4158
}
4259

4360
fun <T> getLocationsCast(clazz: Class<T>): List<T> {

src/jvmMain/kotlin/spp/protocol/util/KSerializers.kt

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,38 @@ import com.fasterxml.jackson.core.JsonGenerator
44
import com.fasterxml.jackson.core.JsonParser
55
import com.fasterxml.jackson.databind.*
66
import kotlinx.datetime.Instant
7+
import kotlinx.serialization.ContextualSerializer
8+
import kotlinx.serialization.KSerializer
9+
import kotlinx.serialization.builtins.serializer
10+
import kotlinx.serialization.descriptors.PrimitiveKind
11+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
12+
import kotlinx.serialization.descriptors.SerialDescriptor
13+
import kotlinx.serialization.encoding.Decoder
14+
import kotlinx.serialization.encoding.Encoder
15+
import kotlinx.serialization.json.*
16+
import kotlinx.serialization.modules.SerializersModule
17+
import spp.protocol.instrument.LiveVariable
18+
import java.util.concurrent.atomic.AtomicInteger
719

820
/**
921
* Used to serialize/deserialize Kotlin classes.
1022
*
1123
* @since 0.1.0
1224
*/
1325
object KSerializers {
26+
27+
val json = Json {
28+
encodeDefaults = true
29+
serializersModule = SerializersModule {
30+
contextual(LiveVariable::class, LiveVariable.serializer())
31+
contextual(String::class, String.serializer())
32+
contextual(Long::class, Long.serializer())
33+
contextual(Int::class, Int.serializer())
34+
contextual(AtomicInteger::class, AtomicIntegerKSerializer())
35+
contextual(Any::class, AnySerializer())
36+
}
37+
}
38+
1439
class KotlinInstantSerializer : JsonSerializer<Instant>() {
1540
override fun serialize(value: Instant, jgen: JsonGenerator, provider: SerializerProvider) =
1641
jgen.writeNumber(value.toEpochMilliseconds())
@@ -20,4 +45,64 @@ object KSerializers {
2045
override fun deserialize(p: JsonParser, p1: DeserializationContext): Instant =
2146
Instant.fromEpochMilliseconds((p.codec.readTree(p) as JsonNode).longValue())
2247
}
48+
49+
class AtomicIntegerKSerializer : KSerializer<AtomicInteger> {
50+
override val descriptor = PrimitiveSerialDescriptor(
51+
"spp.protocol.util.AtomicIntegerKSerializer",
52+
PrimitiveKind.INT
53+
)
54+
55+
override fun deserialize(decoder: Decoder) = AtomicInteger(decoder.decodeInt())
56+
override fun serialize(encoder: Encoder, value: AtomicInteger) = encoder.encodeInt(value.get())
57+
}
58+
59+
class AnySerializer : KSerializer<Any> {
60+
override val descriptor: SerialDescriptor =
61+
ContextualSerializer(Any::class, null, emptyArray()).descriptor
62+
63+
override fun deserialize(decoder: Decoder): Any {
64+
val json = decoder as? JsonDecoder
65+
?: throw IllegalStateException("Only JsonDecoder is supported.")
66+
return fromJson(json.decodeJsonElement())!!
67+
}
68+
69+
override fun serialize(encoder: Encoder, value: Any) {
70+
val json = encoder as? JsonEncoder
71+
?: throw IllegalStateException("Only JsonEncoder is supported.")
72+
json.encodeJsonElement(toJson(value))
73+
}
74+
75+
fun toJson(item: Any?): JsonElement = when (item) {
76+
null -> JsonNull
77+
is String -> JsonPrimitive(item)
78+
is Number -> JsonPrimitive(item)
79+
is Boolean -> JsonPrimitive(item)
80+
is Map<*, *> -> {
81+
val content = item.map { (k, v) -> k.toString() to toJson(v) }
82+
JsonObject(content.toMap())
83+
}
84+
is List<*> -> {
85+
val content = item.map { toJson(it) }
86+
JsonArray(content)
87+
}
88+
is JsonElement -> item
89+
is LiveVariable -> json.encodeToJsonElement(LiveVariable.serializer(), item)
90+
else -> throw IllegalArgumentException("Unable to encode $item")
91+
}
92+
93+
fun fromJson(item: JsonElement): Any? = when (item) {
94+
JsonNull -> null
95+
is JsonPrimitive -> when {
96+
item.isString -> item.content
97+
item.content == "true" || item.content == "false" -> {
98+
item.content == "true"
99+
}
100+
item.content.contains('.') -> item.content.toDouble()
101+
else -> item.content.toLong()
102+
}
103+
is JsonObject -> item.mapValues { fromJson(it.value) }
104+
is JsonArray -> item.map { fromJson(it) }
105+
else -> throw IllegalArgumentException("Unable to decode $item")
106+
}
107+
}
23108
}

0 commit comments

Comments
 (0)