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
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.class, new 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.class, new 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