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 /**
18  * @author Vlad Mihalcea
19  */

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