001: /* Copyright (c) 2001-2005, The HSQL Development Group
002: * All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * Redistributions of source code must retain the above copyright notice, this
008: * list of conditions and the following disclaimer.
009: *
010: * Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * Neither the name of the HSQL Development Group nor the names of its
015: * contributors may be used to endorse or promote products derived from this
016: * software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
022: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
026: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package org.hsqldb.types;
032:
033: import java.io.Serializable;
034:
035: import org.hsqldb.HsqlException;
036: import org.hsqldb.Trace;
037: import org.hsqldb.lib.InOutUtil;
038:
039: /**
040: * Represents of an instance of an OTHER field value. <p>
041: *
042: * Prior to 1.7.0 there were problems storing Objects of normal column types
043: * in columns of the type OTHER. In 1.7.0 changes were made to allow this,
044: * but as all the conversion took place inside the engine, it introduced a
045: * requirement for all classes for objects stored in OTHER columns to be
046: * available on the runtime class path of the engine. <p>
047: *
048: * In 1.7.2, the introduction of real preprared statement support allows us
049: * revert to the pre 1.7.0 behaviour without the artificial limitations. <p>
050: *
051: * The classes for stored objects need not be available to open and operate
052: * the database in general. The classes need to be available only if a
053: * conversion from one of these objects to another type is performed inside
054: * the engine while operating the database.
055: *
056: * The current limitation is that in SQL statements, values of type String
057: * (CHARACTER and related SQL types) cannot be stored in columns of type
058: * OTHER. This limitation does not exist for String values assigned to
059: * PreparedStatement variables.
060: *
061: * @author fredt@users
062: * @version 1.7.2
063: * @since 1.7.2
064: */
065: public class JavaObject {
066:
067: private byte[] data;
068:
069: /**
070: * Constructor used inside the engine when an already serialized
071: * Object is read from a file (.log, .script, .data or text table source).
072: */
073: public JavaObject(byte[] data) {
074: this .data = data;
075: }
076:
077: /**
078: * Constructor used inside the engine to convert an Object into an
079: * object of type OTHER.
080: * Used also with JDBC setParameter().
081: * If parameter serialize is true, the Object is serialized for storage.
082: */
083: public JavaObject(Serializable o) throws HsqlException {
084:
085: try {
086: data = InOutUtil.serialize(o);
087: } catch (Exception e) {
088: throw Trace.error(Trace.SERIALIZATION_FAILURE, e
089: .getMessage());
090: }
091: }
092:
093: public byte[] getBytes() {
094: return data;
095: }
096:
097: public int getBytesLength() {
098: return data.length;
099: }
100:
101: /**
102: * This method is called from classes implementing the JDBC
103: * interfaces. Inside the engine it is used for conversion from a value of
104: * type OTHER to another type. It will throw if the OTHER is an instance
105: * of a classe that is not available.
106: */
107: public Serializable getObject() throws HsqlException {
108:
109: try {
110: return InOutUtil.deserialize(data);
111: } catch (Exception e) {
112: throw Trace.error(Trace.SERIALIZATION_FAILURE, e
113: .getMessage());
114: }
115: }
116:
117: /**
118: * Returns String repsentation of this object.
119: *
120: * @return a String represntation of this object.
121: */
122: public String toString() {
123: return super.toString();
124: }
125: }
|