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 this(ObjectMapperWrapper.INSTANCE);
23 }
24
25 public JsonNodeTypeDescriptor(final ObjectMapperWrapper objectMapperWrapper) {
26 super(JsonNode.class, new 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