diff -r fd16c54261b3 -r 90ce3da70b43 jdk/src/share/classes/javax/sql/rowset/serial/SerialStruct.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialStruct.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,254 @@ +/* + * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.sql.rowset.serial; + +import java.sql.*; +import javax.sql.*; +import java.io.*; +import java.math.*; +import java.util.Map; +import java.util.Vector; + +import javax.sql.rowset.*; + +/** + * A serialized mapping in the Java programming language of an SQL + * structured type. Each attribute that is not already serialized + * is mapped to a serialized form, and if an attribute is itself + * a structured type, each of its attributes that is not already + * serialized is mapped to a serialized form. + *

+ * In addition, the structured type is custom mapped to a class in the + * Java programming language if there is such a mapping, as are + * its attributes, if appropriate. + *

+ * The SerialStruct class provides a constructor for creating + * an instance from a Struct object, a method for retrieving + * the SQL type name of the SQL structured type in the database, and methods + * for retrieving its attribute values. + */ +public class SerialStruct implements Struct, Serializable, Cloneable { + + + /** + * The SQL type name for the structured type that this + * SerialStruct object represents. This is the name + * used in the SQL definition of the SQL structured type. + * + * @serial + */ + private String SQLTypeName; + + /** + * An array of Object instances in which each + * element is an attribute of the SQL structured type that this + * SerialStruct object represents. The attributes are + * ordered according to their order in the definition of the + * SQL structured type. + * + * @serial + */ + private Object attribs[]; + + /** + * Constructs a SerialStruct object from the given + * Struct object, using the given java.util.Map + * object for custom mapping the SQL structured type or any of its + * attributes that are SQL structured types. + * + * @param map a java.util.Map object in which + * each entry consists of 1) a String object + * giving the fully qualified name of a UDT and 2) the + * Class object for the SQLData implementation + * that defines how the UDT is to be mapped + * @throws SerialException if an error occurs + * @see java.sql.Struct + */ + public SerialStruct(Struct in, Map> map) + throws SerialException + { + + try { + + // get the type name + SQLTypeName = new String(in.getSQLTypeName()); + System.out.println("SQLTypeName: " + SQLTypeName); + + // get the attributes of the struct + attribs = in.getAttributes(map); + + /* + * the array may contain further Structs + * and/or classes that have been mapped, + * other types that we have to serialize + */ + mapToSerial(map); + + } catch (SQLException e) { + throw new SerialException(e.getMessage()); + } + } + + /** + * Constructs a SerialStruct object from the + * given SQLData object, using the given type + * map to custom map it to a class in the Java programming + * language. The type map gives the SQL type and the class + * to which it is mapped. The SQLData object + * defines the class to which the SQL type will be mapped. + * + * @param in an instance of the SQLData class + * that defines the mapping of the SQL structured + * type to one or more objects in the Java programming language + * @param map a java.util.Map object in which + * each entry consists of 1) a String object + * giving the fully qualified name of a UDT and 2) the + * Class object for the SQLData implementation + * that defines how the UDT is to be mapped + * @throws SerialException if an error occurs + */ + public SerialStruct(SQLData in, Map> map) + throws SerialException + { + + try { + + //set the type name + SQLTypeName = new String(in.getSQLTypeName()); + + Vector tmp = new Vector(); + in.writeSQL(new SQLOutputImpl(tmp, map)); + attribs = tmp.toArray(); + + } catch (SQLException e) { + throw new SerialException(e.getMessage()); + } + } + + + /** + * Retrieves the SQL type name for this SerialStruct + * object. This is the name used in the SQL definition of the + * structured type + * + * @return a String object representing the SQL + * type name for the SQL structured type that this + * SerialStruct object represents + * @throws SerialException if an error occurs + */ + public String getSQLTypeName() throws SerialException { + return SQLTypeName; + } + + /** + * Retrieves an array of Object values containing the + * attributes of the SQL structured type that this + * SerialStruct object represents. + * + * @return an array of Object values, with each + * element being an attribute of the SQL structured type + * that this SerialStruct object represents + * @throws SerialException if an error occurs + */ + public Object[] getAttributes() throws SerialException { + return attribs; + } + + /** + * Retrieves the attributes for the SQL structured type that + * this SerialStruct represents as an array of + * Object values, using the given type map for + * custom mapping if appropriate. + * + * @param map a java.util.Map object in which + * each entry consists of 1) a String object + * giving the fully qualified name of a UDT and 2) the + * Class object for the SQLData implementation + * that defines how the UDT is to be mapped + * @return an array of Object values, with each + * element being an attribute of the SQL structured + * type that this SerialStruct object + * represents + * @throws SerialException if an error occurs + */ + public Object[] getAttributes(Map> map) + throws SerialException + { + return attribs; + } + + + /** + * Maps attributes of an SQL structured type that are not + * serialized to a serialized form, using the given type map + * for custom mapping when appropriate. The following types + * in the Java programming language are mapped to their + * serialized forms: Struct, SQLData, + * Ref, Blob, Clob, and + * Array. + *

+ * This method is called internally and is not used by an + * application programmer. + * + * @param map a java.util.Map object in which + * each entry consists of 1) a String object + * giving the fully qualified name of a UDT and 2) the + * Class object for the SQLData implementation + * that defines how the UDT is to be mapped + * @throws SerialException if an error occurs + */ + private void mapToSerial(Map map) throws SerialException { + + try { + + for (int i = 0; i < attribs.length; i++) { + if (attribs[i] instanceof Struct) { + attribs[i] = new SerialStruct((Struct)attribs[i], map); + } else if (attribs[i] instanceof SQLData) { + attribs[i] = new SerialStruct((SQLData)attribs[i], map); + } else if (attribs[i] instanceof Blob) { + attribs[i] = new SerialBlob((Blob)attribs[i]); + } else if (attribs[i] instanceof Clob) { + attribs[i] = new SerialClob((Clob)attribs[i]); + } else if (attribs[i] instanceof Ref) { + attribs[i] = new SerialRef((Ref)attribs[i]); + } else if (attribs[i] instanceof java.sql.Array) { + attribs[i] = new SerialArray((java.sql.Array)attribs[i], map); + } + } + + } catch (SQLException e) { + throw new SerialException(e.getMessage()); + } + return; + } + + /** + * The identifier that assists in the serialization of this + * SerialStruct object. + */ + static final long serialVersionUID = -8322445504027483372L; +}