1 package com.vladmihalcea.hibernate.type.search.internal;
2
3 import org.hibernate.annotations.common.reflection.XProperty;
4 import org.hibernate.annotations.common.reflection.java.JavaXMember;
5 import org.hibernate.type.descriptor.WrapperOptions;
6 import org.hibernate.type.descriptor.java.AbstractTypeDescriptor;
7 import org.hibernate.usertype.DynamicParameterizedType;
8
9 import java.lang.reflect.ParameterizedType;
10 import java.lang.reflect.Type;
11 import java.lang.reflect.TypeVariable;
12 import java.util.Properties;
13
14 public class PostgreSQLTSVectorTypeDescriptor extends AbstractTypeDescriptor<Object> implements DynamicParameterizedType {
15
16     public PostgreSQLTSVectorTypeDescriptor() {
17         super(Object.class);
18     }
19
20     private Type type;
21
22     @Override
23     public void setParameterValues(Properties parameters) {
24         final XProperty xProperty = (XProperty) parameters.get(DynamicParameterizedType.XPROPERTY);
25         if (xProperty instanceof JavaXMember) {
26             type = ((JavaXMember) xProperty).getJavaType();
27         } else {
28             type = ((ParameterType) parameters.get(PARAMETER_TYPE)).getReturnedClass();
29         }
30     }
31
32     @Override
33     public boolean areEqual(Object one, Object another) {
34         if (one == another) {
35             return true;
36         }
37         if (one == null || another == null) {
38             return false;
39         }
40         if (one instanceof String && another instanceof String) {
41             return one.equals(another);
42         }
43         return one.equals(another);
44     }
45
46     @Override
47     public String toString(Object value) {
48         return value.toString();
49     }
50
51     @Override
52     public Object fromString(String string) {
53         if (String.class.isAssignableFrom(typeToClass())) {
54             return string;
55         }
56         return string;
57     }
58
59     @SuppressWarnings({"unchecked"})
60     @Override
61     public <X> X unwrap(Object value, Class<X> type, WrapperOptions options) {
62         if (value == null) {
63             return null;
64         }
65         if (String.class.isAssignableFrom(type)) {
66             return (X) toString(value);
67         }
68         throw unknownUnwrap(type);
69     }
70
71     @Override
72     public <X> Object wrap(X value, WrapperOptions options) {
73         if (value == null) {
74             return null;
75         }
76         return fromString(value.toString());
77     }
78
79     private Class typeToClass() {
80         Type classType = type;
81         if (type instanceof ParameterizedType) {
82             classType = ((ParameterizedType) type).getRawType();
83         } else if (type instanceof TypeVariable) {
84             classType = ((TypeVariable) type).getGenericDeclaration().getClass();
85         }
86         return (Class) classType;
87     }
88 }
89