1 package com.vladmihalcea.hibernate.type.array.internal;
2
3 import org.hibernate.HibernateException;
4 import org.hibernate.type.descriptor.WrapperOptions;
5 import org.hibernate.type.descriptor.java.AbstractTypeDescriptor;
6 import org.hibernate.type.descriptor.java.MutabilityPlan;
7 import org.hibernate.type.descriptor.java.MutableMutabilityPlan;
8 import org.hibernate.usertype.DynamicParameterizedType;
9
10 import java.sql.Array;
11 import java.sql.SQLException;
12 import java.util.Arrays;
13 import java.util.Properties;
14
15 import static com.vladmihalcea.hibernate.type.array.internal.AbstractArrayType.SQL_ARRAY_TYPE;
16
17
20 public abstract class AbstractArrayTypeDescriptor<T>
21 extends AbstractTypeDescriptor<T> implements DynamicParameterizedType {
22
23 private Class<T> arrayObjectClass;
24
25 private String sqlArrayType;
26
27 public AbstractArrayTypeDescriptor(Class<T> arrayObjectClass) {
28 this(arrayObjectClass, (MutabilityPlan<T>) new MutableMutabilityPlan<Object>() {
29 @Override
30 protected T deepCopyNotNull(Object value) {
31 return ArrayUtil.deepCopy(value);
32 }
33 });
34 }
35
36 protected AbstractArrayTypeDescriptor(Class<T> arrayObjectClass, MutabilityPlan<T> mutableMutabilityPlan) {
37 super(arrayObjectClass, mutableMutabilityPlan);
38 this.arrayObjectClass = arrayObjectClass;
39 }
40
41 public Class<T> getArrayObjectClass() {
42 return arrayObjectClass;
43 }
44
45 public void setArrayObjectClass(Class<T> arrayObjectClass) {
46 this.arrayObjectClass = arrayObjectClass;
47 }
48
49 @Override
50 public void setParameterValues(Properties parameters) {
51 if (parameters.containsKey(PARAMETER_TYPE)) {
52 arrayObjectClass = ((ParameterType) parameters.get(PARAMETER_TYPE)).getReturnedClass();
53 }
54 sqlArrayType = parameters.getProperty(SQL_ARRAY_TYPE);
55 }
56
57 @Override
58 public boolean areEqual(Object one, Object another) {
59 if (one == another) {
60 return true;
61 }
62 if (one == null || another == null) {
63 return false;
64 }
65 return ArrayUtil.isEquals(one, another);
66 }
67
68 @Override
69 public String toString(Object value) {
70 return Arrays.deepToString(ArrayUtil.wrapArray(value));
71 }
72
73 @Override
74 public T fromString(String string) {
75 return ArrayUtil.fromString(string, arrayObjectClass);
76 }
77
78 @Override
79 public String extractLoggableRepresentation(T value) {
80 return (value == null) ? "null" : toString(value);
81 }
82
83 @SuppressWarnings({"unchecked"})
84 @Override
85 public <X> X unwrap(T value, Class<X> type, WrapperOptions options) {
86 return (X) ArrayUtil.wrapArray(value);
87 }
88
89 @Override
90 public <X> T wrap(X value, WrapperOptions options) {
91 if (value instanceof Array) {
92 Array array = (Array) value;
93 try {
94 return ArrayUtil.unwrapArray((Object[]) array.getArray(), arrayObjectClass);
95 } catch (SQLException e) {
96 throw new HibernateException(
97 new IllegalArgumentException(e)
98 );
99 }
100 }
101 return (T) value;
102 }
103
104 protected String getSqlArrayType() {
105 return sqlArrayType;
106 }
107 }
108