001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019: package org.apache.openjpa.jdbc.meta;
020:
021: import java.math.BigDecimal;
022: import java.math.BigInteger;
023: import java.sql.Time;
024: import java.sql.Timestamp;
025:
026: import org.apache.openjpa.meta.JavaTypes;
027: import serp.util.Numbers;
028:
029: /**
030: * Java SQL type constants.
031: *
032: * @author Abe White
033: */
034: public class JavaSQLTypes extends JavaTypes {
035:
036: // constants for the sql types that aren't directly supported by
037: // OpenJPA; make sure these don't conflict with our standard metadata types
038: public static final int SQL_ARRAY = 1000;
039: public static final int ASCII_STREAM = 1001;
040: public static final int BINARY_STREAM = 1002;
041: public static final int BLOB = 1003;
042: public static final int BYTES = 1004;
043: public static final int CHAR_STREAM = 1005;
044: public static final int CLOB = 1006;
045: public static final int SQL_DATE = 1007;
046: public static final int SQL_OBJECT = 1008;
047: public static final int REF = 1009;
048: public static final int TIME = 1010;
049: public static final int TIMESTAMP = 1011;
050: public static final int JDBC_DEFAULT = 1012;
051:
052: private static final Byte ZERO_BYTE = new Byte((byte) 0);
053: private static final Character ZERO_CHAR = new Character((char) 0);
054: private static final Double ZERO_DOUBLE = new Double(0d);
055: private static final Float ZERO_FLOAT = new Float(0f);
056: private static final Short ZERO_SHORT = new Short((short) 0);
057: private static final BigDecimal ZERO_BIGDECIMAL = new BigDecimal(0d);
058:
059: private static final Byte NONZERO_BYTE = new Byte((byte) 1);
060: private static final Character NONZERO_CHAR = new Character(
061: (char) 'a');
062: private static final Double NONZERO_DOUBLE = new Double(1d);
063: private static final Float NONZERO_FLOAT = new Float(1f);
064: private static final Short NONZERO_SHORT = new Short((short) 1);
065: private static final BigInteger NONZERO_BIGINTEGER = new BigInteger(
066: "1");
067: private static final BigDecimal NONZERO_BIGDECIMAL = new BigDecimal(
068: 1d);
069:
070: /**
071: * Return the proper date typecode.
072: */
073: public static int getDateTypeCode(Class dtype) {
074: if (dtype == java.util.Date.class)
075: return DATE;
076: if (dtype == java.sql.Date.class)
077: return SQL_DATE;
078: if (dtype == Timestamp.class)
079: return TIMESTAMP;
080: if (dtype == Time.class)
081: return TIME;
082: return OBJECT;
083: }
084:
085: /**
086: * Return an empty value object for the given type code.
087: */
088: public static Object getEmptyValue(int type) {
089: switch (type) {
090: case JavaTypes.STRING:
091: return "";
092: case JavaTypes.BOOLEAN:
093: case JavaTypes.BOOLEAN_OBJ:
094: return Boolean.FALSE;
095: case JavaTypes.BYTE:
096: case JavaTypes.BYTE_OBJ:
097: return ZERO_BYTE;
098: case JavaTypes.CHAR:
099: case JavaTypes.CHAR_OBJ:
100: return ZERO_CHAR;
101: case JavaTypes.DOUBLE:
102: case JavaTypes.DOUBLE_OBJ:
103: return ZERO_DOUBLE;
104: case JavaTypes.FLOAT:
105: case JavaTypes.FLOAT_OBJ:
106: return ZERO_FLOAT;
107: case JavaTypes.INT:
108: case JavaTypes.INT_OBJ:
109: return Numbers.valueOf(0);
110: case JavaTypes.LONG:
111: case JavaTypes.LONG_OBJ:
112: return Numbers.valueOf(0L);
113: case JavaTypes.SHORT:
114: case JavaTypes.SHORT_OBJ:
115: return ZERO_SHORT;
116: case JavaTypes.BIGINTEGER:
117: return BigInteger.ZERO;
118: case JavaTypes.BIGDECIMAL:
119: case JavaTypes.NUMBER:
120: return ZERO_BIGDECIMAL;
121: default:
122: return null;
123: }
124: }
125:
126: /**
127: * Return a non-empty value object for the given type code.
128: */
129: public static Object getNonEmptyValue(int type) {
130: switch (type) {
131: case JavaTypes.STRING:
132: return "x";
133: case JavaTypes.BOOLEAN:
134: case JavaTypes.BOOLEAN_OBJ:
135: return Boolean.TRUE;
136: case JavaTypes.BYTE:
137: case JavaTypes.BYTE_OBJ:
138: return NONZERO_BYTE;
139: case JavaTypes.CHAR:
140: case JavaTypes.CHAR_OBJ:
141: return NONZERO_CHAR;
142: case JavaTypes.DOUBLE:
143: case JavaTypes.DOUBLE_OBJ:
144: return NONZERO_DOUBLE;
145: case JavaTypes.FLOAT:
146: case JavaTypes.FLOAT_OBJ:
147: return NONZERO_FLOAT;
148: case JavaTypes.INT:
149: case JavaTypes.INT_OBJ:
150: return Numbers.valueOf(1);
151: case JavaTypes.LONG:
152: case JavaTypes.LONG_OBJ:
153: return Numbers.valueOf(1L);
154: case JavaTypes.SHORT:
155: case JavaTypes.SHORT_OBJ:
156: return NONZERO_SHORT;
157: case JavaTypes.BIGINTEGER:
158: return NONZERO_BIGINTEGER;
159: case JavaTypes.BIGDECIMAL:
160: case JavaTypes.NUMBER:
161: return NONZERO_BIGDECIMAL;
162: default:
163: return null;
164: }
165: }
166: }
|