Skip to content

Commit 89f2383

Browse files
AxonSerializers - add replyTokenContextSerializer for String objects
1 parent 7fa5fba commit 89f2383

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

kotlin/src/main/kotlin/org/axonframework/extensions/kotlin/serialization/AxonSerializers.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import kotlin.reflect.KClass
5353
* TODO - documentation
5454
*/
5555
val trackingTokenSerializer = PolymorphicSerializer(TrackingToken::class).nullable
56+
val replyTokenContextSerializer = String.serializer().nullable
5657

5758
/**
5859
* TODO - documentation
@@ -231,16 +232,14 @@ object ReplayTokenSerializer : KSerializer<ReplayToken> {
231232
override fun deserialize(decoder: Decoder) = decoder.decodeStructure(descriptor) {
232233
var tokenAtReset: TrackingToken? = null
233234
var currentToken: TrackingToken? = null
234-
// TODO Fixate context to a String for ease. And, add documentation about this
235-
var context: Any? = null
235+
var context: String? = null
236236
while (true) {
237237
val index = decodeElementIndex(descriptor)
238238
if (index == CompositeDecoder.DECODE_DONE) break
239239
when (index) {
240240
0 -> tokenAtReset = decodeSerializableElement(descriptor, index, trackingTokenSerializer)
241241
1 -> currentToken = decodeSerializableElement(descriptor, index, trackingTokenSerializer)
242-
/* replace null for a working serializer that knows how to check the primitives and potentially provided serializers */
243-
2 -> context = decodeSerializableElement(descriptor, index, null)
242+
2 -> context = decodeSerializableElement(descriptor, index, replyTokenContextSerializer)
244243
}
245244
}
246245
ReplayToken.createReplayToken(
@@ -253,7 +252,16 @@ object ReplayTokenSerializer : KSerializer<ReplayToken> {
253252
override fun serialize(encoder: Encoder, value: ReplayToken) = encoder.encodeStructure(descriptor) {
254253
encodeSerializableElement(descriptor, 0, trackingTokenSerializer, value.tokenAtReset)
255254
encodeSerializableElement(descriptor, 1, trackingTokenSerializer, value.currentToken)
255+
encodeSerializableElement(
256+
descriptor,
257+
2,
258+
replyTokenContextSerializer,
259+
stringOrNullFrom(value.context())
260+
)
256261
}
262+
263+
private fun stringOrNullFrom(obj: Any?): String? =
264+
obj?.takeIf { it is String }?.let { it as String }
257265
}
258266

259267
/**

kotlin/src/test/kotlin/org/axonframework/extensions/kotlin/serializer/AxonSerializersTest.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import org.axonframework.messaging.responsetypes.ResponseType
3636
import org.axonframework.serialization.Serializer
3737
import org.axonframework.serialization.SimpleSerializedObject
3838
import org.axonframework.serialization.SimpleSerializedType
39+
import org.axonframework.serialization.json.JacksonSerializer
3940
import org.junit.jupiter.api.Assertions.assertEquals
4041
import org.junit.jupiter.api.Test
4142

@@ -76,7 +77,7 @@ internal class AxonSerializersTest {
7677
}
7778

7879
@Test
79-
fun replayToken() {
80+
fun `replay token with String context`() {
8081
val token = ReplayToken.createReplayToken(
8182
GlobalSequenceTrackingToken(15), GlobalSequenceTrackingToken(10), "someContext"
8283
)
@@ -86,13 +87,20 @@ internal class AxonSerializersTest {
8687
}
8788

8889
@Test
89-
fun `replay token with currentToken with null value`() {
90-
val token = ReplayToken.createReplayToken(GlobalSequenceTrackingToken(5), null)
91-
val json = """{"tokenAtReset":{"type":"org.axonframework.eventhandling.GlobalSequenceTrackingToken","globalIndex":5},"currentToken":null}"""
90+
fun `replay token with currentToken with null value and null context`() {
91+
val token = ReplayToken.createReplayToken(GlobalSequenceTrackingToken(5), null, null)
92+
val json = """{"tokenAtReset":{"type":"org.axonframework.eventhandling.GlobalSequenceTrackingToken","globalIndex":5},"currentToken":null,"context":null}"""
9293
assertEquals(json, serializer.serialize(token, String::class.java).data)
9394
assertEquals(token, serializer.deserializeTrackingToken(token.javaClass.name, json))
9495
}
9596

97+
@Test
98+
fun `replay token deserialize without context field`() {
99+
val token = ReplayToken.createReplayToken(GlobalSequenceTrackingToken(5), null, null)
100+
val json = """{"tokenAtReset":{"type":"org.axonframework.eventhandling.GlobalSequenceTrackingToken","globalIndex":5},"currentToken":null}"""
101+
assertEquals(token, serializer.deserializeTrackingToken(token.javaClass.name, json))
102+
}
103+
96104
@Test
97105
fun globalSequenceTrackingToken() {
98106
val token = GlobalSequenceTrackingToken(5)

0 commit comments

Comments
 (0)