View Javadoc

1   package org.apache.torque.templates.typemapping;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.util.Collections;
23  import java.util.HashMap;
24  import java.util.HashSet;
25  import java.util.Map;
26  import java.util.Set;
27  
28  /**
29   * Various mappings for schema types, e.g. to their corresponding
30   * Java object types, and Java native types.
31   *
32   * These are the official SQL type to Java type mappings.
33   * These don't quite correspond to the way the peer
34   * system works so we'll have to make some adjustments.
35   * <pre>
36   * -------------------------------------------------------
37   * SQL Type      | Java Type            | Peer Type
38   * -------------------------------------------------------
39   * CHAR          | String               | String
40   * VARCHAR       | String               | String
41   * LONGVARCHAR   | String               | String
42   * NUMERIC       | java.math.BigDecimal | java.math.BigDecimal
43   * DECIMAL       | java.math.BigDecimal | java.math.BigDecimal
44   * BIT           | boolean OR Boolean   | Boolean
45   * TINYINT       | byte OR Byte         | Byte
46   * SMALLINT      | short OR Short       | Short
47   * INTEGER       | int OR Integer       | Integer
48   * BIGINT        | long OR Long         | Long
49   * REAL          | float OR Float       | Float
50   * FLOAT         | double OR Double     | Double
51   * DOUBLE        | double OR Double     | Double
52   * BINARY        | byte[]               | ?
53   * VARBINARY     | byte[]               | ?
54   * LONGVARBINARY | byte[]               | ?
55   * DATE          | java.sql.Date        | java.util.Date
56   * TIME          | java.sql.Time        | java.util.Date
57   * TIMESTAMP     | java.sql.Timestamp   | java.util.Date
58   *
59   * -------------------------------------------------------
60   * A couple variations have been introduced to cover cases
61   * that may arise, but are not covered above
62   * BOOLEANCHAR   | boolean OR Boolean   | String
63   * BOOLEANINT    | boolean OR Boolean   | Integer
64   * </pre>
65   *
66   * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
67   * @author <a href="mailto:mpoeschl@marmot.at>Martin Poeschl</a>
68   * @version $Id: TypeMap.java 1331196 2012-04-27 02:56:12Z tfischer $
69   */
70  public final class TypeMap
71  {
72      /**
73       * All text types.
74       */
75      private static final Set<SchemaType> TEXT_TYPES;
76  
77      static
78      {
79          Set<SchemaType> textTypes = new HashSet<SchemaType>();
80          textTypes.add(SchemaType.CHAR);
81          textTypes.add(SchemaType.VARCHAR);
82          textTypes.add(SchemaType.LONGVARCHAR);
83          textTypes.add(SchemaType.CLOB);
84          textTypes.add(SchemaType.DATE);
85          textTypes.add(SchemaType.TIME);
86          textTypes.add(SchemaType.TIMESTAMP);
87          textTypes.add(SchemaType.BOOLEANCHAR);
88          TEXT_TYPES = Collections.unmodifiableSet(textTypes);
89      }
90  
91      public static final String CHAR_OBJECT_TYPE = "\"\"";
92      public static final String VARCHAR_OBJECT_TYPE = "\"\"";
93      public static final String LONGVARCHAR_OBJECT_TYPE = "\"\"";
94      public static final String CLOB_OBJECT_TYPE = "\"\"";
95      public static final String NUMERIC_OBJECT_TYPE 
96              = "new java.math.BigDecimal((double) 0)";
97      public static final String DECIMAL_OBJECT_TYPE 
98              = "new java.math.BigDecimal((double) 0)";
99      public static final String BIT_OBJECT_TYPE = "new Boolean(true)";
100     public static final String TINYINT_OBJECT_TYPE = "Byte.valueOf((byte) 0)";
101     public static final String SMALLINT_OBJECT_TYPE = "Short.valueOf((short) 0)";
102     public static final String INTEGER_OBJECT_TYPE = "Integer.valueOf(0)";
103     public static final String BIGINT_OBJECT_TYPE = "Long.valueOf(0)";
104     public static final String REAL_OBJECT_TYPE = "new Float(0)";
105     public static final String FLOAT_OBJECT_TYPE = "new Double(0)";
106     public static final String DOUBLE_OBJECT_TYPE = "new Double(0)";
107     public static final String BINARY_OBJECT_TYPE = "new Object()"; //?
108     public static final String VARBINARY_OBJECT_TYPE = "new Object()"; //?
109     public static final String LONGVARBINARY_OBJECT_TYPE = "new Object()"; //?
110     public static final String BLOB_OBJECT_TYPE = "new Object()"; //?
111     public static final String DATE_OBJECT_TYPE = "new Date()";
112     public static final String TIME_OBJECT_TYPE = "new Date()";
113     public static final String TIMESTAMP_OBJECT_TYPE = "new Date()";
114     public static final String BOOLEANCHAR_OBJECT_TYPE = "\"\"";
115     public static final String BOOLEANINT_OBJECT_TYPE = "new Integer(0)";
116 
117     /**
118      * The mapping from schema type to the default initialisation value
119      * for that schema type.
120      */
121     private static final Map<SchemaType, String>
122             SCHEMA_TYPE_TO_INIT_VALUE_MAP;
123 
124     /**
125      * The default Mapping of schema Types to Java Types. Where possible,
126      * primitive types are used.
127      */
128     private static final Map<SchemaType, JavaType>
129             SCHEMA_TYPE_TO_JAVA_PRIMITIVE_TYPE_MAP;
130     /**
131      * The default Mapping of schema Types to Java Types.
132      * No primitive types are used.
133      */
134     private static final Map<SchemaType, JavaType>
135             SCHEMA_TYPE_TO_JAVA_OBJECT_TYPE_MAP;
136 
137 
138     /**
139      * The result set getter methods for a given schema type.
140      */
141     private static Map<SchemaType, ResultSetGetter>
142             SCHEMA_TYPE_TO_RESULT_SET_GETTER;
143 
144     // fill SCHEMA_TYPE_TO_INIT_VALUE_MAP
145     static {
146         Map<SchemaType, String> schemaToInitValue
147                 = new HashMap<SchemaType, String>();
148 
149         schemaToInitValue.put(SchemaType.CHAR, CHAR_OBJECT_TYPE);
150         schemaToInitValue.put(SchemaType.VARCHAR, VARCHAR_OBJECT_TYPE);
151         schemaToInitValue.put(SchemaType.LONGVARCHAR, LONGVARCHAR_OBJECT_TYPE);
152         schemaToInitValue.put(SchemaType.CLOB, CLOB_OBJECT_TYPE);
153         schemaToInitValue.put(SchemaType.NUMERIC, NUMERIC_OBJECT_TYPE);
154         schemaToInitValue.put(SchemaType.DECIMAL, DECIMAL_OBJECT_TYPE);
155         schemaToInitValue.put(SchemaType.BIT, BIT_OBJECT_TYPE);
156         schemaToInitValue.put(SchemaType.TINYINT, TINYINT_OBJECT_TYPE);
157         schemaToInitValue.put(SchemaType.SMALLINT, SMALLINT_OBJECT_TYPE);
158         schemaToInitValue.put(SchemaType.INTEGER, INTEGER_OBJECT_TYPE);
159         schemaToInitValue.put(SchemaType.BIGINT, BIGINT_OBJECT_TYPE);
160         schemaToInitValue.put(SchemaType.REAL, REAL_OBJECT_TYPE);
161         schemaToInitValue.put(SchemaType.FLOAT, FLOAT_OBJECT_TYPE);
162         schemaToInitValue.put(SchemaType.DOUBLE, DOUBLE_OBJECT_TYPE);
163         schemaToInitValue.put(SchemaType.BINARY, BINARY_OBJECT_TYPE);
164         schemaToInitValue.put(SchemaType.VARBINARY, VARBINARY_OBJECT_TYPE);
165         schemaToInitValue.put(SchemaType.LONGVARBINARY, LONGVARBINARY_OBJECT_TYPE);
166         schemaToInitValue.put(SchemaType.BLOB, BLOB_OBJECT_TYPE);
167         schemaToInitValue.put(SchemaType.DATE, DATE_OBJECT_TYPE);
168         schemaToInitValue.put(SchemaType.TIME, TIME_OBJECT_TYPE);
169         schemaToInitValue.put(SchemaType.TIMESTAMP, TIMESTAMP_OBJECT_TYPE);
170         schemaToInitValue.put(SchemaType.BOOLEANCHAR, BOOLEANCHAR_OBJECT_TYPE);
171         schemaToInitValue.put(SchemaType.BOOLEANINT, BOOLEANINT_OBJECT_TYPE);
172         SCHEMA_TYPE_TO_INIT_VALUE_MAP
173             = Collections.unmodifiableMap(schemaToInitValue);
174     }
175 
176     // Fill SCHEMA_TYPE_TO_JAVA_PRIMITIVE_TYPE_MAP
177     static
178     {
179         Map<SchemaType, JavaType> schemaToJava
180                 = new HashMap<SchemaType, JavaType>();
181         schemaToJava.put(SchemaType.CHAR, JavaType.STRING);
182         schemaToJava.put(SchemaType.VARCHAR, JavaType.STRING);
183         schemaToJava.put(SchemaType.LONGVARCHAR, JavaType.STRING);
184         schemaToJava.put(SchemaType.CLOB, JavaType.STRING);
185         schemaToJava.put(SchemaType.NUMERIC, JavaType.BIG_DECIMAL);
186         schemaToJava.put(SchemaType.DECIMAL, JavaType.BIG_DECIMAL);
187         schemaToJava.put(SchemaType.BIT, JavaType.BOOLEAN_PRIMITIVE);
188         schemaToJava.put(SchemaType.TINYINT, JavaType.BYTE_PRIMITIVE);
189         schemaToJava.put(SchemaType.SMALLINT, JavaType.SHORT_PRIMITIVE);
190         schemaToJava.put(SchemaType.INTEGER, JavaType.INTEGER_PRIMITIVE);
191         schemaToJava.put(SchemaType.BIGINT, JavaType.LONG_PRIMITIVE);
192         schemaToJava.put(SchemaType.REAL, JavaType.FLOAT_PRIMITIVE);
193         schemaToJava.put(SchemaType.FLOAT, JavaType.DOUBLE_PRIMITIVE);
194         schemaToJava.put(SchemaType.DOUBLE, JavaType.DOUBLE_PRIMITIVE);
195         schemaToJava.put(SchemaType.BINARY, JavaType.BYTE_PRIMITIVE_ARRAY);
196         schemaToJava.put(SchemaType.VARBINARY, JavaType.BYTE_PRIMITIVE_ARRAY);
197         schemaToJava.put(SchemaType.LONGVARBINARY, JavaType.BYTE_PRIMITIVE_ARRAY);
198         schemaToJava.put(SchemaType.BLOB, JavaType.BYTE_PRIMITIVE_ARRAY);
199         schemaToJava.put(SchemaType.DATE, JavaType.DATE);
200         schemaToJava.put(SchemaType.TIME, JavaType.DATE);
201         schemaToJava.put(SchemaType.TIMESTAMP, JavaType.DATE);
202         schemaToJava.put(SchemaType.BOOLEANCHAR, JavaType.BOOLEAN_PRIMITIVE);
203         schemaToJava.put(SchemaType.BOOLEANINT, JavaType.BOOLEAN_PRIMITIVE);
204         SCHEMA_TYPE_TO_JAVA_PRIMITIVE_TYPE_MAP
205                 = Collections.unmodifiableMap(schemaToJava);
206     }
207 
208 
209     // Fill SCHEMA_TYPE_TO_JAVA_OBJECT_TYPE_MAP
210     static
211     {
212         Map<SchemaType, JavaType> schemaToJava
213                 = new HashMap<SchemaType, JavaType>();
214         schemaToJava.put(SchemaType.CHAR, JavaType.STRING);
215         schemaToJava.put(SchemaType.VARCHAR, JavaType.STRING);
216         schemaToJava.put(SchemaType.LONGVARCHAR, JavaType.STRING);
217         schemaToJava.put(SchemaType.CLOB, JavaType.STRING);
218         schemaToJava.put(SchemaType.NUMERIC, JavaType.BIG_DECIMAL);
219         schemaToJava.put(SchemaType.DECIMAL, JavaType.BIG_DECIMAL);
220         schemaToJava.put(SchemaType.BIT, JavaType.BOOLEAN_OBJECT);
221         schemaToJava.put(SchemaType.TINYINT, JavaType.BYTE_OBJECT);
222         schemaToJava.put(SchemaType.SMALLINT, JavaType.SHORT_OBJECT);
223         schemaToJava.put(SchemaType.INTEGER, JavaType.INTEGER_OBJECT);
224         schemaToJava.put(SchemaType.BIGINT, JavaType.LONG_OBJECT);
225         schemaToJava.put(SchemaType.REAL, JavaType.FLOAT_OBJECT);
226         schemaToJava.put(SchemaType.FLOAT, JavaType.DOUBLE_OBJECT);
227         schemaToJava.put(SchemaType.DOUBLE, JavaType.DOUBLE_OBJECT);
228         schemaToJava.put(SchemaType.BINARY, JavaType.BYTE_PRIMITIVE_ARRAY);
229         schemaToJava.put(SchemaType.VARBINARY, JavaType.BYTE_PRIMITIVE_ARRAY);
230         schemaToJava.put(SchemaType.LONGVARBINARY, JavaType.BYTE_PRIMITIVE_ARRAY);
231         schemaToJava.put(SchemaType.BLOB, JavaType.BYTE_PRIMITIVE_ARRAY);
232         schemaToJava.put(SchemaType.DATE, JavaType.DATE);
233         schemaToJava.put(SchemaType.TIME, JavaType.DATE);
234         schemaToJava.put(SchemaType.TIMESTAMP, JavaType.DATE);
235         schemaToJava.put(SchemaType.BOOLEANCHAR, JavaType.BOOLEAN_OBJECT);
236         schemaToJava.put(SchemaType.BOOLEANINT, JavaType.BOOLEAN_OBJECT);
237         SCHEMA_TYPE_TO_JAVA_OBJECT_TYPE_MAP
238                 = Collections.unmodifiableMap(schemaToJava);
239     }
240 
241     static
242     {
243         Map<SchemaType, ResultSetGetter> schemaToResultSetGetter
244                 = new HashMap<SchemaType, ResultSetGetter>();
245 
246         schemaToResultSetGetter.put(SchemaType.CHAR, ResultSetGetter.STRING);
247         schemaToResultSetGetter.put(SchemaType.VARCHAR, ResultSetGetter.STRING);
248         schemaToResultSetGetter.put(SchemaType.LONGVARCHAR, ResultSetGetter.STRING);
249         schemaToResultSetGetter.put(SchemaType.CLOB, ResultSetGetter.STRING);
250         schemaToResultSetGetter.put(SchemaType.NUMERIC, ResultSetGetter.BIG_DECIMAL);
251         schemaToResultSetGetter.put(SchemaType.DECIMAL, ResultSetGetter.BIG_DECIMAL);
252         schemaToResultSetGetter.put(SchemaType.BIT, ResultSetGetter.BOOLEAN);
253         schemaToResultSetGetter.put(SchemaType.TINYINT, ResultSetGetter.BYTE);
254         schemaToResultSetGetter.put(SchemaType.SMALLINT, ResultSetGetter.SHORT);
255         schemaToResultSetGetter.put(SchemaType.INTEGER, ResultSetGetter.INT);
256         schemaToResultSetGetter.put(SchemaType.BIGINT, ResultSetGetter.LONG);
257         schemaToResultSetGetter.put(SchemaType.REAL, ResultSetGetter.FLOAT);
258         schemaToResultSetGetter.put(SchemaType.FLOAT, ResultSetGetter.DOUBLE);
259         schemaToResultSetGetter.put(SchemaType.DOUBLE, ResultSetGetter.DOUBLE);
260         schemaToResultSetGetter.put(SchemaType.BINARY, ResultSetGetter.BYTES);
261         schemaToResultSetGetter.put(SchemaType.VARBINARY, ResultSetGetter.BYTES);
262         schemaToResultSetGetter.put(SchemaType.LONGVARBINARY, ResultSetGetter.BYTES);
263         schemaToResultSetGetter.put(SchemaType.BLOB, ResultSetGetter.BYTES);
264         schemaToResultSetGetter.put(SchemaType.DATE, ResultSetGetter.DATE);
265         schemaToResultSetGetter.put(SchemaType.TIME, ResultSetGetter.TIME);
266         schemaToResultSetGetter.put(SchemaType.TIMESTAMP, ResultSetGetter.TIMESTAMP);
267         schemaToResultSetGetter.put(SchemaType.BOOLEANCHAR, ResultSetGetter.STRING);
268         schemaToResultSetGetter.put(SchemaType.BOOLEANINT, ResultSetGetter.INT);
269         SCHEMA_TYPE_TO_RESULT_SET_GETTER
270                 = Collections.unmodifiableMap(schemaToResultSetGetter);
271     }
272 
273     /**
274      * Private constructor for utility class.
275      */
276     private TypeMap()
277     {
278     }
279 
280     /**
281      * Return a Java object which corresponds to the
282      * JDBC type provided. Use in MapBuilder generation.
283      *
284      * @param jdbcType the JDBC type
285      * @return name of the Object
286      */
287     public static String getJavaObject(SchemaType jdbcType)
288     {
289         return (String) SCHEMA_TYPE_TO_INIT_VALUE_MAP.get(jdbcType);
290     }
291 
292     /**
293      * Returns the java type which corresponds to the schema type provided.
294      * Where possible, primitive types are used.
295      *
296      * @param schemaType the schema type.
297      * @return name of the native java type
298      */
299     public static JavaType getJavaPrimitiveType(SchemaType schemaType)
300     {
301         return SCHEMA_TYPE_TO_JAVA_PRIMITIVE_TYPE_MAP.get(schemaType);
302     }
303 
304     /**
305      * Returns the java type which corresponds to the schema type provided.
306      * Only Object types are used.
307      *
308      * @param schemaType the schema type.
309      * @return the corresponding java Type.
310      */
311     public static JavaType getJavaObjectType(SchemaType schemaType)
312     {
313         return SCHEMA_TYPE_TO_JAVA_OBJECT_TYPE_MAP.get(schemaType);
314     }
315 
316     /**
317      * Returns the result set getter method which corresponds to the
318      * Schema type provided.
319      *
320      * @param schemaType the schema type
321      * @return the result set getter method.
322      */
323     public static ResultSetGetter getResultSetGetter(SchemaType schemaType)
324     {
325         return SCHEMA_TYPE_TO_RESULT_SET_GETTER.get(schemaType);
326     }
327 
328     /**
329      * Returns true if the type is boolean in the java
330      * object and a numeric (1 or 0) in the db.
331      *
332      * @param type The type to check.
333      * @return true if the type is BOOLEANINT
334      */
335     public static boolean isBooleanInt(SchemaType type)
336     {
337         return SchemaType.BOOLEANINT.equals(type);
338     }
339 
340     /**
341      * Returns true if the type is boolean in the
342      * java object and a String "Y" or "N" in the db.
343      *
344      * @param type The type to check.
345      * @return true if the type is BOOLEANCHAR
346      */
347     public static boolean isBooleanChar(SchemaType type)
348     {
349         return SchemaType.BOOLEANCHAR.equals(type);
350     }
351 
352     /**
353      * Returns true if the type is boolean in the
354      * java object and a Bit "1" or "0" in the db.
355      *
356      * @param type The type to check.
357      * @return true if the type is BIT
358      */
359     public static boolean isBit(SchemaType type)
360     {
361         return SchemaType.BIT.equals(type);
362     }
363 
364     /**
365      * Returns true if values for the type need to be quoted.
366      *
367      * @param type The type to check.
368      * @return true if values for the type need to be quoted.
369      */
370     public static boolean isTextType(SchemaType type)
371     {
372         return TEXT_TYPES.contains(type);
373     }
374 }