View Javadoc
1   /*
2    *  Copyright 2010, 2011, 2012 Christopher Pheby
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
15   */
16  package org.jadira.usertype.spi.shared;
17  
18  import static org.jadira.usertype.spi.utils.reflection.ArrayUtils.copyOf;
19  
20  import java.io.Serializable;
21  import java.lang.reflect.InvocationTargetException;
22  import java.sql.PreparedStatement;
23  import java.sql.ResultSet;
24  import java.sql.SQLException;
25  import java.util.Properties;
26  
27  import org.hibernate.HibernateException;
28  import org.hibernate.engine.spi.SharedSessionContractImplementor;
29  import org.hibernate.type.AbstractSingleColumnStandardBasicType;
30  import org.hibernate.type.TypeResolver;
31  import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
32  import org.hibernate.usertype.EnhancedUserType;
33  
34  public abstract class AbstractHeuristicUserType extends AbstractUserType implements EnhancedUserType, Serializable {
35  
36  	private static final long serialVersionUID = 7099384329368123541L;
37  
38  	private Class<?> identifierType;
39  	
40  	private AbstractSingleColumnStandardBasicType<?> type;
41  	
42  	private int[] sqlTypes;
43  
44      protected void setIdentifierType(Class<?> identifierType) {
45      	this.identifierType = identifierType;
46      }
47      
48      protected Class<?> getIdentifierType() {
49      	return identifierType;
50      }
51      
52      protected AbstractSingleColumnStandardBasicType<?> getType() {
53      	return type;
54      }
55      
56  	public void setParameterValues(Properties parameters) {
57  		
58  		@SuppressWarnings("unchecked")
59  		final AbstractSingleColumnStandardBasicType<? extends Object> heuristicType = (AbstractSingleColumnStandardBasicType<? extends Object>) new TypeResolver().heuristicType(identifierType.getName(), parameters);
60  		if (heuristicType == null) {
61  			throw new HibernateException("Unsupported identifier type " + identifierType.getName());
62  		}
63  		
64  		type = heuristicType;
65  		sqlTypes = new int[]{ type.sqlType() };
66  	}
67  
68  	public int[] sqlTypes() {
69          return copyOf(sqlTypes);
70      }
71  
72      @Override
73      public abstract Class<?> returnedClass();
74      
75  	@Override
76  	public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
77  
78  		beforeNullSafeOperation(session);
79  		
80  		try {
81  	
82  			try {
83  				return doNullSafeGet(rs, names, session, owner);
84  			} catch (IllegalArgumentException e) {
85  				throw new HibernateException(
86  						"Exception during nullSafeGet of type '" 
87  							+ identifierType.getName() + "'", e);
88  			} catch (IllegalAccessException e) {
89  				throw new HibernateException(
90  						"Exception during nullSafeGet of type '" 
91  								+ identifierType.getName() + "'", e);
92  			} catch (InvocationTargetException e) {
93  				throw new HibernateException(
94  						"Exception during nullSafeGet of type '" 
95  								+ identifierType.getName() + "'", e);
96  			}    
97      	} finally {
98      		afterNullSafeOperation(session);
99      	}
100 	}
101 
102     public abstract Object doNullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException, IllegalArgumentException, IllegalAccessException, InvocationTargetException;
103     
104     @Override
105     public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index, SharedSessionContractImplementor session) throws SQLException {
106 
107     	beforeNullSafeOperation(session);
108     	
109     	try {
110     		doNullSafeSet(preparedStatement, value, index, session);
111 		} catch (IllegalArgumentException e) {
112 			throw new HibernateException(
113 					"Exception during nullSafeSet of type '" 
114 							+ identifierType.getName() + "'", e);
115 		} catch (IllegalAccessException e) {
116 			throw new HibernateException(
117 					"Exception during nullSafeSet of type '" 
118 							+ identifierType.getName() + "'", e);
119 			} catch (InvocationTargetException e) {
120 		} finally {
121 			afterNullSafeOperation(session);
122 		}
123     }
124 
125     public abstract void doNullSafeSet(PreparedStatement preparedStatement, Object value, int index, SharedSessionContractImplementor session) throws SQLException, IllegalArgumentException, IllegalAccessException, InvocationTargetException;
126 
127     @SuppressWarnings({ "rawtypes", "unchecked" })
128     @Override
129     public String objectToSQLString(Object object) {
130     	final JavaTypeDescriptor desc = type.getJavaTypeDescriptor();
131     	return desc.toString(object);
132     }
133 
134     @SuppressWarnings({ "rawtypes", "unchecked" })
135 	@Override
136 	@Deprecated
137     public String toXMLString(Object object) {
138     	final JavaTypeDescriptor desc = type.getJavaTypeDescriptor();
139     	return desc.toString(object);
140     }
141 
142     @Override
143     @Deprecated
144     public Object fromXMLString(String string) {
145 		return type.fromString(string);
146     }
147 }