Skip to content

Commit a45c752

Browse files
committed
Add deep copy instead of shallow copy in mappers
Closes #166
1 parent c60e52b commit a45c752

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## [Unreleased]
44
- Close public access to TarantoolResult*Impl ([#326](https://github.com/tarantool/cartridge-java/issues/326))
5+
- Add deep copy instead of shallow copy in default message pack mapper
6+
57
## [0.10.1] - 2023-01-13
68

79
### Internal and API changes

src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Map;
2323
import java.util.Optional;
2424
import java.util.function.Function;
25+
import java.util.stream.Collectors;
2526

2627
import static io.tarantool.driver.mappers.MapperReflectionUtils.getInterfaceParameterClass;
2728

@@ -55,8 +56,10 @@ public DefaultMessagePackMapper() {
5556
*/
5657
public DefaultMessagePackMapper(DefaultMessagePackMapper mapper) {
5758
this();
58-
this.valueConverters.putAll(mapper.valueConverters);
59-
this.objectConverters.putAll(mapper.objectConverters);
59+
this.valueConverters.putAll(mapper.valueConverters.entrySet().stream()
60+
.collect(Collectors.toMap(Map.Entry::getKey, e -> new ArrayList<>(e.getValue()))));
61+
this.objectConverters.putAll(mapper.objectConverters.entrySet().stream()
62+
.collect(Collectors.toMap(Map.Entry::getKey, e -> new ArrayList<>(e.getValue()))));
6063
}
6164

6265
@SuppressWarnings("unchecked")

src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.msgpack.value.impl.ImmutableLongValueImpl;
1717
import org.msgpack.value.impl.ImmutableStringValueImpl;
1818

19+
import java.lang.reflect.Field;
1920
import java.math.BigDecimal;
2021
import java.util.Arrays;
2122
import java.util.HashMap;
@@ -186,6 +187,31 @@ void registerObjectConverter() throws MessagePackObjectMapperException {
186187
assertEquals(testValue, mapper.toValue(testTuple).asMapValue().map());
187188
}
188189

190+
@Test
191+
void test_defaultMessagePackMapperCopy_shouldWorkFine() throws MessagePackValueMapperException,
192+
NoSuchFieldException, IllegalAccessException {
193+
DefaultMessagePackMapper mapper = DefaultMessagePackMapperFactory.getInstance().defaultComplexTypesMapper();
194+
MessagePackMapper copiedMapper = mapper.copy();
195+
MessagePackMapper copiedOfMapper = DefaultMessagePackMapperFactory.getInstance().copyOf(mapper);
196+
197+
Field privateField
198+
= DefaultMessagePackMapper.class.getDeclaredField("valueConverters");
199+
// Set the accessibility as true
200+
privateField.setAccessible(true);
201+
202+
assertEquals(1, ((List) ((Map) privateField.get(mapper)).get(ValueType.MAP)).size());
203+
assertEquals(1, ((List) ((Map) privateField.get(copiedMapper)).get(ValueType.MAP)).size());
204+
205+
mapper.registerValueConverter(ValueType.MAP, CustomTuple.class,
206+
(ValueConverter<MapValue, CustomTuple>) v -> null);
207+
208+
assertEquals(2, ((List) ((Map) privateField.get(mapper)).get(ValueType.MAP)).size());
209+
assertEquals(1, ((List) ((Map) privateField.get(copiedMapper)).get(ValueType.MAP)).size());
210+
assertEquals(1, ((List) ((Map) privateField.get(copiedOfMapper)).get(ValueType.MAP)).size());
211+
212+
mapper.copy();
213+
}
214+
189215
//TODO: add this test when will it be resolved https://github.com/tarantool/cartridge-java/issues/118
190216
// @Test
191217
// void should_getObject_returnShort_ifParameterObjectClassIsShort() {

0 commit comments

Comments
 (0)