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         super(JsonNode.classnew MutableMutabilityPlan<JsonNode>() {
23             @Override
24             public Serializable disassemble(JsonNode value) {
25                 return JacksonUtil.toString(value);
26             }
27
28             @Override
29             public JsonNode assemble(Serializable cached) {
30                 return JacksonUtil.toJsonNode((String) cached);
31             }
32
33             @Override
34             protected JsonNode deepCopyNotNull(JsonNode value) {
35                 return ObjectMapperWrapper.INSTANCE.clone(value);
36             }
37         });
38         this.objectMapperWrapper = ObjectMapperWrapper.INSTANCE;
39     }
40
41     public JsonNodeTypeDescriptor(final ObjectMapperWrapper objectMapperWrapper) {
42         super(JsonNode.classnew MutableMutabilityPlan<JsonNode>() {
43             @Override
44             public Serializable disassemble(JsonNode value) {
45                 return JacksonUtil.toString(value);
46             }
47
48             @Override
49             public JsonNode assemble(Serializable cached) {
50                 return JacksonUtil.toJsonNode((String) cached);
51             }
52
53             @Override
54             protected JsonNode deepCopyNotNull(JsonNode value) {
55                 return objectMapperWrapper.clone(value);
56             }
57         });
58         this.objectMapperWrapper = objectMapperWrapper;
59     }
60
61     @Override
62     public boolean areEqual(JsonNode one, JsonNode another) {
63         if (one == another) {
64             return true;
65         }
66         if (one == null || another == null) {
67             return false;
68         }
69         return objectMapperWrapper.toJsonNode(objectMapperWrapper.toString(one)).equals(
70                 objectMapperWrapper.toJsonNode(objectMapperWrapper.toString(another)));
71     }
72
73     @Override
74     public String toString(JsonNode value) {
75         return objectMapperWrapper.toString(value);
76     }
77
78     @Override
79     public JsonNode fromString(String string) {
80         return objectMapperWrapper.toJsonNode(string);
81     }
82
83     @SuppressWarnings({"unchecked"})
84     @Override
85     public <X> X unwrap(JsonNode value, Class<X> type, WrapperOptions options) {
86         if (value == null) {
87             return null;
88         }
89         if (String.class.isAssignableFrom(type)) {
90             return (X) toString(value);
91         }
92         if (JsonNode.class.isAssignableFrom(type)) {
93             return (X) objectMapperWrapper.toJsonNode(toString(value));
94         }
95         throw unknownUnwrap(type);
96     }
97
98     @Override
99     public <X> JsonNode wrap(X value, WrapperOptions options) {
100         if (value == null) {
101             return null;
102         }
103         return fromString(value.toString());
104     }
105
106 }
107