Skip to content

Package: ObjectTypeSerializer

ObjectTypeSerializer

nameinstructionbranchcomplexitylinemethod
ObjectTypeSerializer(TypeSerializerBuilder)
M: 24 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 6 C: 0
0%
M: 1 C: 0
0%
addSpecificSerializer(Class, ModelSerializer)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
findSerializer(Object, JsonGenerator, SerializationContextImpl)
M: 17 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
lambda$findSerializer$0(SerializationContextImpl, Class, Class)
M: 18 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
serializeKey(Object, JsonGenerator, SerializationContextImpl)
M: 14 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%
serializeValue(Object, JsonGenerator, SerializationContextImpl)
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*
2: * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
3: *
4: * This program and the accompanying materials are made available under the
5: * terms of the Eclipse Public License v. 2.0 which is available at
6: * http://www.eclipse.org/legal/epl-2.0,
7: * or the Eclipse Distribution License v. 1.0 which is available at
8: * http://www.eclipse.org/org/documents/edl-v10.php.
9: *
10: * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
11: */
12:
13: package org.eclipse.yasson.internal.serializer.types;
14:
15: import java.lang.reflect.Type;
16: import java.util.LinkedList;
17: import java.util.List;
18: import java.util.Map;
19: import java.util.concurrent.ConcurrentHashMap;
20:
21: import jakarta.json.stream.JsonGenerator;
22:
23: import org.eclipse.yasson.internal.SerializationContextImpl;
24: import org.eclipse.yasson.internal.model.customization.Customization;
25: import org.eclipse.yasson.internal.serializer.ModelSerializer;
26: import org.eclipse.yasson.internal.serializer.SerializationModelCreator;
27:
28: /**
29: * Object type serializer. Dynamically resolves the serialized type based on the serialized instance class.
30: */
31: public class ObjectTypeSerializer extends TypeSerializer<Object> {
32:
33: private final Customization customization;
34:
35: private final Map<Class<?>, ModelSerializer> cache;
36: private final List<Type> chain;
37: private final boolean isKey;
38:
39: ObjectTypeSerializer(TypeSerializerBuilder serializerBuilder) {
40: super(serializerBuilder);
41: this.customization = serializerBuilder.getCustomization();
42: this.cache = new ConcurrentHashMap<>();
43: this.chain = new LinkedList<>(serializerBuilder.getChain());
44: this.isKey = serializerBuilder.isKey();
45: }
46:
47: @Override
48: void serializeValue(Object value, JsonGenerator generator, SerializationContextImpl context) {
49: //Dynamically resolved type during runtime. Cached in SerializationModelCreator.
50: findSerializer(value, generator, context);
51: }
52:
53: @Override
54: void serializeKey(Object key, JsonGenerator generator, SerializationContextImpl context) {
55:• if (key == null) {
56: super.serializeKey(null, generator, context);
57: return;
58: }
59: //Dynamically resolved type during runtime. Cached in SerializationModelCreator.
60: findSerializer(key, generator, context);
61: }
62:
63: private void findSerializer(Object key, JsonGenerator generator, SerializationContextImpl context) {
64: Class<?> clazz = key.getClass();
65: cache.computeIfAbsent(clazz, aClass -> {
66: SerializationModelCreator serializationModelCreator = context.getJsonbContext().getSerializationModelCreator();
67: return serializationModelCreator.serializerChainRuntime(new LinkedList<>(chain), clazz, customization, false, isKey);
68: }).serialize(key, generator, context);
69: }
70:
71: /**
72: * Add serializer to the cache.
73: *
74: * @param clazz class of the serializer
75: * @param modelSerializer model serializer bound to the class
76: */
77: public void addSpecificSerializer(Class<?> clazz, ModelSerializer modelSerializer) {
78: cache.put(clazz, modelSerializer);
79: }
80: }