001: /*
002: * $Id: BaseDataType.java,v 1.20 2005/10/13 02:25:32 ahimanikya Exp $
003: * =======================================================================
004: * Copyright (c) 2002-2005 Axion Development Team. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above
011: * copyright notice, this list of conditions and the following
012: * disclaimer.
013: *
014: * 2. Redistributions in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * 3. The names "Tigris", "Axion", nor the names of its contributors may
020: * not be used to endorse or promote products derived from this
021: * software without specific prior written permission.
022: *
023: * 4. Products derived from this software may not be called "Axion", nor
024: * may "Tigris" or "Axion" appear in their names without specific prior
025: * written permission.
026: *
027: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
028: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
029: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
030: * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
031: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
032: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
033: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
034: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
035: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
036: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
037: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
038: * =======================================================================
039: */
040:
041: package org.axiondb.types;
042:
043: import java.io.DataInput;
044: import java.io.DataOutput;
045: import java.io.IOException;
046: import java.math.BigDecimal;
047: import java.math.BigInteger;
048: import java.net.MalformedURLException;
049: import java.net.URL;
050: import java.sql.Blob;
051: import java.sql.Clob;
052: import java.sql.DatabaseMetaData;
053: import java.sql.Date;
054: import java.sql.Time;
055: import java.sql.Timestamp;
056: import java.util.Comparator;
057:
058: import org.axiondb.AxionException;
059: import org.axiondb.DataType;
060: import org.axiondb.DataTypeFactory;
061: import org.axiondb.util.ComparableComparator;
062:
063: /**
064: * Abstract base implemention of {@link DataType}.
065: *
066: * @version $Revision: 1.20 $ $Date: 2005/10/13 02:25:32 $
067: * @author Rodney Waldhoff
068: * @author Rob Oxspring
069: * @author Chuck Burdick
070: */
071: public abstract class BaseDataType implements DataType, DataTypeFactory {
072: public abstract DataType makeNewInstance();
073:
074: public abstract boolean accepts(Object value);
075:
076: public abstract Object convert(Object value) throws AxionException;
077:
078: public abstract Object read(DataInput in) throws IOException;
079:
080: public abstract void write(Object value, DataOutput out)
081: throws IOException;
082:
083: public abstract int getJdbcType();
084:
085: /** @see org.axiondb.jdbc.AxionResultSetMetaData#getColumnClassName */
086: public String getPreferredValueClassName() {
087: return "java.lang.Object";
088: }
089:
090: public int compare(Object a, Object b) {
091: return getComparator().compare(a, b);
092: }
093:
094: /**
095: * This base implementation simply returns a
096: * {@link ComparableComparator}.
097: */
098: protected Comparator getComparator() {
099: return ComparableComparator.getInstance();
100: }
101:
102: public int getColumnDisplaySize() {
103: return 0;
104: }
105:
106: public int getPrecision() {
107: return 0;
108: }
109:
110: public int getScale() {
111: return 0;
112: }
113:
114: public boolean isCaseSensitive() {
115: return false;
116: }
117:
118: public boolean isCurrency() {
119: return false;
120: }
121:
122: public String getLiteralPrefix() {
123: return null;
124: }
125:
126: public String getLiteralSuffix() {
127: return null;
128: }
129:
130: public int getNullableCode() {
131: return DatabaseMetaData.typeNullable;
132: }
133:
134: public short getSearchableCode() {
135: return DatabaseMetaData.typePredBasic;
136: }
137:
138: public boolean isUnsigned() {
139: return false;
140: }
141:
142: public boolean supportsSuccessor() {
143: return false;
144: }
145:
146: public Object successor(Object value)
147: throws IllegalArgumentException {
148: throw new UnsupportedOperationException();
149: }
150:
151: public int getPrecisionRadix() {
152: return 10;
153: }
154:
155: protected Number toNumber(Object value) throws AxionException {
156: if (null == value) {
157: return null;
158: } else if (value instanceof Number) {
159: return (Number) value;
160: } else {
161: throw new AxionException("Can't convert " + toString()
162: + " to Number.");
163: }
164: }
165:
166: public BigDecimal toBigDecimal(Object value) throws AxionException {
167: Number num = toNumber(value);
168: if (num instanceof BigDecimal) {
169: return (BigDecimal) num;
170: } else if (null == num) {
171: return null;
172: } else {
173: return new BigDecimal(String.valueOf(num));
174: }
175: }
176:
177: public BigInteger toBigInteger(Object value) throws AxionException {
178: Number num = toNumber(value);
179: if (num instanceof BigInteger) {
180: return (BigInteger) num;
181: } else if (null == num) {
182: return null;
183: } else {
184: return new BigInteger(String.valueOf(num.longValue()));
185: }
186: }
187:
188: public boolean toBoolean(Object value) throws AxionException {
189: throw new AxionException("Can't convert " + toString()
190: + " to boolean.");
191: }
192:
193: public byte toByte(Object value) throws AxionException {
194: return toNumber(value).byteValue();
195: }
196:
197: public byte[] toByteArray(Object value) throws AxionException {
198: throw new AxionException("Can't convert " + toString()
199: + " to byte[].");
200: }
201:
202: public Date toDate(Object value) throws AxionException {
203: throw new AxionException("Can't convert " + toString()
204: + " to Date.");
205: }
206:
207: public double toDouble(Object value) throws AxionException {
208: return toNumber(value).doubleValue();
209: }
210:
211: public float toFloat(Object value) throws AxionException {
212: return toNumber(value).floatValue();
213: }
214:
215: public int toInt(Object value) throws AxionException {
216: return toNumber(value).intValue();
217: }
218:
219: public long toLong(Object value) throws AxionException {
220: return toNumber(value).longValue();
221: }
222:
223: public short toShort(Object value) throws AxionException {
224: return toNumber(value).shortValue();
225: }
226:
227: public String toString(Object value) throws AxionException {
228: Object val = convert(value);
229: if (val == null) {
230: return null;
231: }
232: return val.toString();
233: }
234:
235: public URL toURL(Object value) throws AxionException {
236: String str = toString(value);
237: if (null == str) {
238: return null;
239: }
240:
241: try {
242: return new URL(str);
243: } catch (MalformedURLException e) {
244: throw new AxionException("Can't convert " + value
245: + " to URL.");
246: }
247: }
248:
249: public Time toTime(Object value) throws AxionException {
250: throw new AxionException("Can't convert " + toString()
251: + " to Time.");
252: }
253:
254: public Timestamp toTimestamp(Object value) throws AxionException {
255: throw new AxionException("Can't convert " + toString()
256: + " to Timestamp.");
257: }
258:
259: public Clob toClob(Object value) throws AxionException {
260: return new StringClob(toString(value));
261: }
262:
263: public Blob toBlob(Object value) throws AxionException {
264: if (null == value) {
265: return null;
266: } else if (value instanceof byte[]) {
267: return new ByteArrayBlob((byte[]) value);
268: }
269: throw new AxionException("Can't convert " + toString()
270: + " to Blob.");
271: }
272:
273: private static final long serialVersionUID = -6298442558736380407L;
274: }
|