KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > access > jdbc > RowDescriptor


1 /* ====================================================================
2  *
3  * The ObjectStyle Group Software License, version 1.1
4  * ObjectStyle Group - http://objectstyle.org/
5  *
6  * Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
7  * of the software. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if any,
22  * must include the following acknowlegement:
23  * "This product includes software developed by independent contributors
24  * and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
29  * or promote products derived from this software without prior written
30  * permission. For written permission, email
31  * "andrus at objectstyle dot org".
32  *
33  * 5. Products derived from this software may not be called "ObjectStyle"
34  * or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
35  * names without prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals and hosted on ObjectStyle Group web site. For more
53  * information on the ObjectStyle Group, please see
54  * <http://objectstyle.org/>.
55  */

56 package org.objectstyle.cayenne.access.jdbc;
57
58 import java.sql.ResultSet JavaDoc;
59 import java.sql.ResultSetMetaData JavaDoc;
60 import java.sql.SQLException JavaDoc;
61 import java.util.Map JavaDoc;
62
63 import org.objectstyle.cayenne.CayenneRuntimeException;
64 import org.objectstyle.cayenne.access.types.ExtendedType;
65 import org.objectstyle.cayenne.access.types.ExtendedTypeMap;
66
67 /**
68  * A descriptor of a result row obtained from a database.
69  *
70  * @since 1.2
71  * @author Andrei Adamchik
72  */

73 // replaces 1.1 ResultDescriptor
74
public class RowDescriptor {
75
76     protected ColumnDescriptor[] columns;
77     protected ExtendedType[] converters;
78
79     /**
80      * Creates an empty RowDescriptor. Intended mainly for testing and use by subclasses.
81      */

82     protected RowDescriptor() {
83
84     }
85
86     /**
87      * Creates a RowDescriptor for an array of columns.
88      */

89     public RowDescriptor(ColumnDescriptor[] columns, ExtendedTypeMap types) {
90         this.columns = columns;
91         indexTypes(types);
92     }
93
94     /**
95      * Creates new RowDescriptor using ResultSet metadata to determine the columns.
96      */

97     public RowDescriptor(ResultSet JavaDoc resultSet, ExtendedTypeMap types) {
98         this(resultSet, types, null);
99     }
100
101     /**
102      * Creates new RowDescriptor using ResultSet metadata to determine the columns. Note
103      * that if javaTypeOverrides array is null, default JDBC to Java types mapping is
104      * used.
105      */

106     public RowDescriptor(ResultSet JavaDoc resultSet, ExtendedTypeMap types, Map JavaDoc javaTypeOverrides) {
107
108         initFromResultSet(resultSet);
109
110         if (javaTypeOverrides != null) {
111             overrideJavaTypes(javaTypeOverrides);
112         }
113
114         indexTypes(types);
115     }
116
117     /**
118      * Initializes converters for columns.
119      */

120     protected void indexTypes(ExtendedTypeMap types) {
121         this.converters = new ExtendedType[columns.length];
122         for (int i = 0; i < columns.length; i++) {
123             converters[i] = types.getRegisteredType(columns[i].getJavaClass());
124         }
125     }
126
127     /**
128      * Builds columns list from ResultSet metadata.
129      */

130     protected void initFromResultSet(ResultSet JavaDoc resultSet) {
131         try {
132             ResultSetMetaData JavaDoc md = resultSet.getMetaData();
133             int len = md.getColumnCount();
134             if (len == 0) {
135                 throw new CayenneRuntimeException("No columns in ResultSet.");
136             }
137
138             this.columns = new ColumnDescriptor[len];
139
140             for (int i = 0; i < len; i++) {
141                 columns[i] = new ColumnDescriptor(md, i + 1);
142             }
143         }
144         catch (SQLException JavaDoc sqex) {
145             throw new CayenneRuntimeException("Error reading metadata.", sqex);
146         }
147     }
148
149     /**
150      * Overrides Java types of result columns. Keys in the map must correspond to the
151      * names of the columns.
152      */

153     protected void overrideJavaTypes(Map JavaDoc overrides) {
154
155         for (int i = 0; i < columns.length; i++) {
156             String JavaDoc type = (String JavaDoc) overrides.get(columns[i].getName());
157
158             if (type != null) {
159                 columns[i].setJavaClass(type);
160             }
161         }
162     }
163
164     /**
165      * Returns a number of columns in a row.
166      */

167     public int getWidth() {
168         return columns.length;
169     }
170
171     /**
172      * Returns column descriptors.
173      */

174     public ColumnDescriptor[] getColumns() {
175         return columns;
176     }
177
178     /**
179      * Returns extended types for columns.
180      */

181     public ExtendedType[] getConverters() {
182         return converters;
183     }
184 }
Popular Tags