1 package com.vladmihalcea.hibernate.type.util;
2
3 import com.fasterxml.jackson.databind.JavaType;
4 import com.fasterxml.jackson.databind.type.TypeFactory;
5 import org.hibernate.internal.util.SerializationHelper;
6
7 import java.io.Serializable;
8 import java.util.Collection;
9
10 /**
11  * @author Vlad Mihalcea
12  */

13 public class ObjectMapperJsonSerializer implements JsonSerializer {
14
15     private final ObjectMapperWrapper objectMapperWrapper;
16
17     public ObjectMapperJsonSerializer(ObjectMapperWrapper objectMapperWrapper) {
18         this.objectMapperWrapper = objectMapperWrapper;
19     }
20
21     @Override
22     public <T> T clone(T value) {
23         if (value instanceof Collection && !((Collection) value).isEmpty()) {
24             Object firstElement = ((Collection) value).iterator().next();
25             if (!(firstElement instanceof Serializable)) {
26                 JavaType type = TypeFactory.defaultInstance().constructParametricType(value.getClass(), firstElement.getClass());
27                 return objectMapperWrapper.fromString(objectMapperWrapper.toString(value), type);
28             }
29         }
30
31         return value instanceof Serializable ?
32                 (T) SerializationHelper.clone((Serializable) value) :
33                 objectMapperWrapper.fromString(objectMapperWrapper.toString(value), (Class<T>) value.getClass());
34     }
35 }
36