Skip to content

Commit fbc40c3

Browse files
authored
fix(TypeHandlerLibrary): fix error-during-error-logging in GenericMap (#5048)
1 parent 558c841 commit fbc40c3

File tree

7 files changed

+139
-18
lines changed

7 files changed

+139
-18
lines changed

subsystems/TypeHandlerLibrary/src/main/java/org/terasology/persistence/typeHandling/coreTypes/GenericMapTypeHandler.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2021 The Terasology Foundation
1+
// Copyright 2022 The Terasology Foundation
22
// SPDX-License-Identifier: Apache-2.0
33

44
package org.terasology.persistence.typeHandling.coreTypes;
@@ -8,6 +8,7 @@
88
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
1010
import org.terasology.persistence.typeHandling.PersistedData;
11+
import org.terasology.persistence.typeHandling.PersistedDataMap;
1112
import org.terasology.persistence.typeHandling.PersistedDataSerializer;
1213
import org.terasology.persistence.typeHandling.TypeHandler;
1314

@@ -25,10 +26,10 @@
2526
*/
2627
public class GenericMapTypeHandler<K, V> extends TypeHandler<Map<K, V>> {
2728

28-
private static final Logger logger = LoggerFactory.getLogger(GenericMapTypeHandler.class);
29+
static final String KEY = "key";
30+
static final String VALUE = "value";
2931

30-
private static final String KEY = "key";
31-
private static final String VALUE = "value";
32+
private static final Logger logger = LoggerFactory.getLogger(GenericMapTypeHandler.class);
3233

3334
private final TypeHandler<K> keyHandler;
3435
private final TypeHandler<V> valueHandler;
@@ -67,17 +68,18 @@ public Optional<Map<K, V>> deserialize(PersistedData data) {
6768
Map<K, V> result = Maps.newLinkedHashMap();
6869

6970
for (PersistedData entry : data.getAsArray()) {
70-
final Optional<K> key = keyHandler.deserialize(entry.getAsValueMap().get(KEY));
71-
final Optional<V> value = valueHandler.deserialize(entry.getAsValueMap().get(VALUE));
71+
PersistedDataMap kvEntry = entry.getAsValueMap();
72+
final Optional<K> key = keyHandler.deserialize(kvEntry.get(KEY));
7273

7374
if (key.isPresent()) {
75+
final Optional<V> value = valueHandler.deserialize(kvEntry.get(VALUE));
7476
if (value.isPresent()) {
7577
result.put(key.get(), value.get());
7678
} else {
77-
logger.warn("Missing field '{}' for entry '{}'", VALUE, data.getAsString());
79+
logger.warn("Missing value for key '{}' with {} given entry '{}'", key.get(), valueHandler, kvEntry.get(VALUE));
7880
}
7981
} else {
80-
logger.warn("Missing field '{}' for entry '{}'", KEY, data.getAsString());
82+
logger.warn("Missing field '{}' for entry '{}'", KEY, kvEntry);
8183
}
8284
}
8385

subsystems/TypeHandlerLibrary/src/main/java/org/terasology/persistence/typeHandling/coreTypes/ObjectFieldMapTypeHandler.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
// Copyright 2021 The Terasology Foundation
1+
// Copyright 2022 The Terasology Foundation
22
// SPDX-License-Identifier: Apache-2.0
33
package org.terasology.persistence.typeHandling.coreTypes;
44

55
import com.google.common.base.Defaults;
6+
import com.google.common.base.MoreObjects;
67
import com.google.common.collect.Maps;
78
import org.slf4j.Logger;
89
import org.slf4j.LoggerFactory;
@@ -111,4 +112,12 @@ public Optional<T> deserialize(PersistedData data) {
111112
}
112113
return Optional.empty();
113114
}
115+
116+
@Override
117+
public String toString() {
118+
return MoreObjects.toStringHelper(this)
119+
.add("fields", fieldByName.keySet())
120+
.add("constructor", constructor)
121+
.toString();
122+
}
114123
}

subsystems/TypeHandlerLibrary/src/main/java/org/terasology/persistence/typeHandling/coreTypes/RuntimeDelegatingTypeHandler.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
// Copyright 2021 The Terasology Foundation
1+
// Copyright 2022 The Terasology Foundation
22
// SPDX-License-Identifier: Apache-2.0
33
package org.terasology.persistence.typeHandling.coreTypes;
44

5+
import com.google.common.base.MoreObjects;
56
import com.google.common.collect.Maps;
67
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;
@@ -34,10 +35,10 @@ public class RuntimeDelegatingTypeHandler<T> extends TypeHandler<T> {
3435

3536
private static final Logger LOGGER = LoggerFactory.getLogger(RuntimeDelegatingTypeHandler.class);
3637

37-
private TypeHandler<T> delegateHandler;
38-
private TypeInfo<T> typeInfo;
39-
private TypeHandlerLibrary typeHandlerLibrary;
40-
private SerializationSandbox sandbox;
38+
private final TypeHandler<T> delegateHandler;
39+
private final TypeInfo<T> typeInfo;
40+
private final TypeHandlerLibrary typeHandlerLibrary;
41+
private final SerializationSandbox sandbox;
4142

4243
public RuntimeDelegatingTypeHandler(TypeHandler<T> delegateHandler, TypeInfo<T> typeInfo, TypeHandlerContext context) {
4344
this.delegateHandler = delegateHandler;
@@ -242,4 +243,11 @@ private Optional<Type> findSubtypeWithName(String runtimeTypeName) {
242243
);
243244
}
244245

246+
@Override
247+
public String toString() {
248+
return MoreObjects.toStringHelper(this)
249+
.add("delegate", delegateHandler)
250+
.add("type", typeInfo)
251+
.toString();
252+
}
245253
}

subsystems/TypeHandlerLibrary/src/main/java/org/terasology/persistence/typeHandling/inMemory/PersistedMap.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
// Copyright 2021 The Terasology Foundation
1+
// Copyright 2022 The Terasology Foundation
22
// SPDX-License-Identifier: Apache-2.0
33
package org.terasology.persistence.typeHandling.inMemory;
44

5+
import com.google.common.base.MoreObjects;
56
import org.terasology.persistence.typeHandling.PersistedData;
67
import org.terasology.persistence.typeHandling.PersistedDataArray;
78
import org.terasology.persistence.typeHandling.PersistedDataMap;
@@ -80,4 +81,11 @@ public PersistedDataArray getAsArray(String name) {
8081
public Set<Map.Entry<String, PersistedData>> entrySet() {
8182
return map.entrySet();
8283
}
84+
85+
@Override
86+
public String toString() {
87+
return MoreObjects.toStringHelper(this)
88+
.addValue(map)
89+
.toString();
90+
}
8391
}

subsystems/TypeHandlerLibrary/src/main/java/org/terasology/persistence/typeHandling/inMemory/PersistedString.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
// Copyright 2021 The Terasology Foundation
1+
// Copyright 2022 The Terasology Foundation
22
// SPDX-License-Identifier: Apache-2.0
33
package org.terasology.persistence.typeHandling.inMemory;
44

5+
import com.google.common.base.MoreObjects;
6+
57
public class PersistedString extends AbstractPersistedData {
68

7-
private String data;
9+
private final String data;
810

911
public PersistedString(String data) {
1012
this.data = data;
@@ -20,4 +22,10 @@ public boolean isString() {
2022
return true;
2123
}
2224

25+
@Override
26+
public String toString() {
27+
return MoreObjects.toStringHelper(this)
28+
.addValue(data)
29+
.toString();
30+
}
2331
}

subsystems/TypeHandlerLibrary/src/main/java/org/terasology/reflection/reflect/ConstructorLibrary.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
// Copyright 2021 The Terasology Foundation
1+
// Copyright 2022 The Terasology Foundation
22
// SPDX-License-Identifier: Apache-2.0
33
package org.terasology.reflection.reflect;
44

5+
import com.google.common.base.MoreObjects;
56
import com.google.common.collect.HashMultiset;
67
import com.google.common.collect.ImmutableList;
78
import com.google.common.collect.ImmutableMultiset;
@@ -65,6 +66,13 @@ public T construct() {
6566
"Register an InstanceCreator for this type to fix this problem.", e);
6667
}
6768
}
69+
70+
@Override
71+
public String toString() {
72+
return MoreObjects.toStringHelper(this)
73+
.add("type", typeInfo)
74+
.toString();
75+
}
6876
};
6977
}
7078

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// Copyright 2022 The Terasology Foundation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package org.terasology.persistence.typeHandling.coreTypes;
5+
6+
import org.junit.jupiter.api.Test;
7+
import org.terasology.persistence.typeHandling.PersistedData;
8+
import org.terasology.persistence.typeHandling.PersistedDataSerializer;
9+
import org.terasology.persistence.typeHandling.TypeHandler;
10+
import org.terasology.persistence.typeHandling.inMemory.PersistedLong;
11+
import org.terasology.persistence.typeHandling.inMemory.PersistedMap;
12+
import org.terasology.persistence.typeHandling.inMemory.PersistedString;
13+
import org.terasology.persistence.typeHandling.inMemory.arrays.PersistedValueArray;
14+
15+
import java.util.Collections;
16+
import java.util.List;
17+
import java.util.Map;
18+
import java.util.Optional;
19+
20+
import static com.google.common.truth.Truth.assertThat;
21+
import static com.google.common.truth.Truth8.assertThat;
22+
23+
class GenericMapTypeHandlerTest {
24+
25+
private static final String TEST_KEY = "health:baseRegen";
26+
private static final long TEST_VALUE = -1;
27+
28+
private final PersistedData testData = new PersistedValueArray(List.of(
29+
new PersistedMap(Map.of(
30+
GenericMapTypeHandler.KEY, new PersistedString(TEST_KEY),
31+
GenericMapTypeHandler.VALUE, new PersistedLong(TEST_VALUE)
32+
))
33+
));
34+
35+
@Test
36+
void testDeserialize() {
37+
var th = new GenericMapTypeHandler<>(
38+
new StringTypeHandler(),
39+
new LongTypeHandler()
40+
);
41+
42+
assertThat(th.deserialize(testData)).isPresent();
43+
assertThat(th.deserialize(testData).get()).containsExactly(TEST_KEY, TEST_VALUE);
44+
}
45+
46+
@Test
47+
void testDeserializeWithMismatchedValueHandler() {
48+
var th = new GenericMapTypeHandler<>(
49+
new StringTypeHandler(),
50+
new UselessTypeHandler<>()
51+
);
52+
53+
assertThat(th.deserialize(testData)).hasValue(Collections.emptyMap());
54+
}
55+
56+
@Test
57+
void testDeserializeWithMismatchedKeyHandler() {
58+
var th = new GenericMapTypeHandler<>(
59+
new UselessTypeHandler<>(),
60+
new LongTypeHandler()
61+
);
62+
63+
assertThat(th.deserialize(testData)).hasValue(Collections.emptyMap());
64+
}
65+
66+
/** Never returns a value. */
67+
private static class UselessTypeHandler<T> extends TypeHandler<T> {
68+
@Override
69+
protected PersistedData serializeNonNull(Object value, PersistedDataSerializer serializer) {
70+
return null;
71+
}
72+
73+
@Override
74+
public Optional<T> deserialize(PersistedData data) {
75+
return Optional.empty();
76+
}
77+
}
78+
}

0 commit comments

Comments
 (0)