1 package com.vladmihalcea.hibernate.type.json.internal;
2
3 import com.fasterxml.jackson.databind.JsonNode;
4 import com.vladmihalcea.hibernate.type.util.ObjectMapperWrapper;
5 import org.hibernate.type.descriptor.WrapperOptions;
6 import org.hibernate.type.descriptor.java.AbstractTypeDescriptor;
7 import org.hibernate.type.descriptor.java.MutableMutabilityPlan;
8
9 import java.io.Serializable;
10
11 /**
12  * @author Vlad Mihalcea
13  */

14 public class JsonNodeTypeDescriptor
15         extends AbstractTypeDescriptor<JsonNode> {
16
17     public static final JsonNodeTypeDescriptor INSTANCE = new JsonNodeTypeDescriptor();
18
19     private ObjectMapperWrapper objectMapperWrapper;
20
21     public JsonNodeTypeDescriptor() {
22         this(ObjectMapperWrapper.INSTANCE);
23     }
24
25     public JsonNodeTypeDescriptor(final ObjectMapperWrapper objectMapperWrapper) {
26         super(JsonNode.classnew MutableMutabilityPlan<JsonNode>() {
27             @Override
28             public Serializable disassemble(JsonNode value) {
29                 return JacksonUtil.toString(value);
30             }
31
32             @Override
33             public JsonNode assemble(Serializable cached) {
34                 return JacksonUtil.toJsonNode((String) cached);
35             }
36
37             @Override
38             protected JsonNode deepCopyNotNull(JsonNode value) {
39                 return objectMapperWrapper.clone(value);
40             }
41         });
42         this.objectMapperWrapper = objectMapperWrapper;
43     }
44
45     @Override
46     public boolean areEqual(JsonNode one, JsonNode another) {
47         if (one == another) {
48             return true;
49         }
50         if (one == null || another == null) {
51             return false;
52         }
53         return objectMapperWrapper.toJsonNode(objectMapperWrapper.toString(one)).equals(
54                 objectMapperWrapper.toJsonNode(objectMapperWrapper.toString(another)));
55     }
56
57     @Override
58     public String toString(JsonNode value) {
59         return objectMapperWrapper.toString(value);
60     }
61
62     @Override
63     public JsonNode fromString(String string) {
64         return objectMapperWrapper.toJsonNode(string);
65     }
66
67     @SuppressWarnings({"unchecked"})
68     @Override
69     public <X> X unwrap(JsonNode value, Class<X> type, WrapperOptions options) {
70         if (value == null) {
71             return null;
72         }
73         if (String.class.isAssignableFrom(type)) {
74             return (X) toString(value);
75         }
76         if (JsonNode.class.isAssignableFrom(type)) {
77             return (X) objectMapperWrapper.toJsonNode(toString(value));
78         }
79         throw unknownUnwrap(type);
80     }
81
82     @Override
83     public <X> JsonNode wrap(X value, WrapperOptions options) {
84         if (value == null) {
85             return null;
86         }
87         return fromString(value.toString());
88     }
89
90 }
91