Skip to content

Commit 9ea0ed3

Browse files
HashMaps are now specifically copied when merged. There is no other, clean way.
1 parent 86f95f6 commit 9ea0ed3

2 files changed

Lines changed: 35 additions & 9 deletions

File tree

  • spring-data-eclipse-store/src
    • main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working
    • test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/special/types

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import java.lang.reflect.Field;
2020
import java.lang.reflect.Modifier;
2121
import java.util.Collection;
22+
import java.util.HashMap;
23+
import java.util.Hashtable;
24+
import java.util.LinkedHashMap;
2225
import java.util.Objects;
2326

2427
import org.slf4j.Logger;
@@ -253,12 +256,23 @@ else if(DataTypeUtil.isObjectArray(valueOfSourceObject))
253256
originalValueObjectOfSource,
254257
!targetObjectIsPartOfJavaPackage);
255258
}
256-
// Merge after setting reference to avoid endless loops
257-
this.mergeValues(
258-
valueOfSourceObject,
259-
originalValueObjectOfSource,
260-
alreadyMergedTargets,
261-
changedCollector);
259+
260+
if(this.isSpecialCaseWhereOnlyAFullCopyWorks(valueOfSourceObject))
261+
{
262+
fam.writeValueOfField(
263+
targetObject,
264+
this.onlyCreateCopy(valueOfSourceObject, true),
265+
!targetObjectIsPartOfJavaPackage);
266+
}
267+
else
268+
{
269+
// Merge after setting reference to avoid endless loops
270+
this.mergeValues(
271+
valueOfSourceObject,
272+
originalValueObjectOfSource,
273+
alreadyMergedTargets,
274+
changedCollector);
275+
}
262276
}
263277
}
264278
}
@@ -269,6 +283,21 @@ else if(DataTypeUtil.isObjectArray(valueOfSourceObject))
269283
}
270284
}
271285

286+
/**
287+
* Super special case for HashMap or similar java-classes which can't be merged nicely. Thus, we make a simple copy
288+
* of the whole object.
289+
*/
290+
private boolean isSpecialCaseWhereOnlyAFullCopyWorks(final Object valueOfSourceObject)
291+
{
292+
return
293+
valueOfSourceObject != null
294+
&& (
295+
valueOfSourceObject.getClass().isAssignableFrom(HashMap.class)
296+
|| valueOfSourceObject.getClass().isAssignableFrom(LinkedHashMap.class)
297+
|| valueOfSourceObject.getClass().isAssignableFrom(Hashtable.class)
298+
);
299+
}
300+
272301
@SuppressWarnings("unchecked")
273302
private <E> E[] createGenericObjectArray(
274303
final Class<E> clazz,

spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/special/types/TypesTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import java.util.function.Function;
2222

2323
import org.junit.jupiter.api.Assertions;
24-
import org.junit.jupiter.api.Disabled;
2524
import org.junit.jupiter.params.ParameterizedTest;
2625
import org.junit.jupiter.params.provider.MethodSource;
2726
import org.springframework.beans.factory.annotation.Autowired;
@@ -127,8 +126,6 @@ <T extends ComplexObject<?>> void simpleChangeAfterStore(
127126

128127
@ParameterizedTest
129128
@MethodSource(TYPES_DATA_SOURCE)
130-
// TODO: Fix this.
131-
@Disabled("Is not fixed yet, but will be.")
132129
<T extends ComplexObject<?>> void doubleStoreSameEntityWithChange(
133130
final Class<? extends EclipseStoreRepository<T, Integer>> repositoryClass,
134131
final Function<Integer, T> objectCreator,

0 commit comments

Comments
 (0)