001: /*
002: * TableRowIterator.java
003: *
004: * Version: $Revision: 1941 $
005: *
006: * Date: $Date: 2007-05-15 04:23:25 -0500 (Tue, 15 May 2007) $
007: *
008: * Copyright (c) 2002-2005, Hewlett-Packard Company and Massachusetts
009: * Institute of Technology. All rights reserved.
010: *
011: * Redistribution and use in source and binary forms, with or without
012: * modification, are permitted provided that the following conditions are
013: * met:
014: *
015: * - Redistributions of source code must retain the above copyright
016: * notice, this list of conditions and the following disclaimer.
017: *
018: * - Redistributions in binary form must reproduce the above copyright
019: * notice, this list of conditions and the following disclaimer in the
020: * documentation and/or other materials provided with the distribution.
021: *
022: * - Neither the name of the Hewlett-Packard Company nor the name of the
023: * Massachusetts Institute of Technology nor the names of their
024: * contributors may be used to endorse or promote products derived from
025: * this software without specific prior 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
030: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
031: * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
032: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
033: * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
034: * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
035: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
036: * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
037: * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
038: * DAMAGE.
039: */
040: package org.dspace.storage.rdbms;
041:
042: import java.sql.ResultSet;
043: import java.sql.SQLException;
044: import java.sql.Statement;
045: import java.util.ArrayList;
046: import java.util.List;
047:
048: /**
049: * Represents the results of a database query
050: *
051: * @author Peter Breton
052: * @version $Revision: 1941 $
053: */
054: public class TableRowIterator {
055: /**
056: * Results from a query
057: */
058: private ResultSet results;
059:
060: /**
061: * Statement used to submit the query
062: */
063: private Statement statemt = null;
064:
065: /**
066: * The name of the RDBMS table
067: */
068: private String table;
069:
070: /**
071: * True if there is a next row
072: */
073: private boolean hasNext = true;
074:
075: /**
076: * True if we have already advanced to the next row.
077: */
078: private boolean hasAdvanced = false;
079:
080: /**
081: * Constructor
082: *
083: * @param results -
084: * A JDBC ResultSet
085: */
086: TableRowIterator(ResultSet results) {
087: this (results, null);
088: statemt = null;
089: }
090:
091: /**
092: * Constructor
093: *
094: * @param results -
095: * A JDBC ResultSet
096: * @param table -
097: * The name of the table
098: */
099: TableRowIterator(ResultSet results, String table) {
100: this .results = results;
101: this .table = table;
102: statemt = null;
103: }
104:
105: /**
106: * Finalize -- this method is called when this object is GC-ed.
107: */
108: public void finalize() {
109: close();
110: }
111:
112: /**
113: * setStatement -- this method saves the statement used to do the query. We
114: * must keep this so that the statement can be closed when we are finished.
115: *
116: * @param st -
117: * The statement used to do the query that created this
118: * TableRowIterator
119: */
120: public void setStatement(Statement st) {
121: statemt = st;
122: }
123:
124: /**
125: * Advance to the next row and return it. Returns null if there are no more
126: * rows.
127: *
128: * @return - The next row, or null if no more rows
129: * @exception SQLException -
130: * If a database error occurs while fetching values
131: */
132: public TableRow next() throws SQLException {
133: if (results == null) {
134: return null;
135: }
136:
137: if (!hasNext()) {
138: return null;
139: }
140:
141: hasAdvanced = false;
142:
143: return DatabaseManager.process(results, table);
144: }
145:
146: /**
147: * Return true if there are more rows, false otherwise
148: *
149: * @return - true if there are more rows, false otherwise
150: * @exception SQLException -
151: * If a database error occurs while fetching values
152: */
153: public boolean hasNext() throws SQLException {
154: if (results == null) {
155: close();
156: return false;
157: }
158:
159: if (hasAdvanced) {
160: return hasNext;
161: }
162:
163: hasAdvanced = true;
164: hasNext = results.next();
165:
166: // No more results
167: if (!hasNext) {
168: close();
169: }
170:
171: return hasNext;
172: }
173:
174: /**
175: * Saves all the values returned by iterator into a list.
176: *
177: * As a side effect the result set is closed and no more
178: * operations can be preformed on this object.
179: *
180: * @return - A list of all the values returned by the iterator.
181: * @exception SQLException -
182: * If a database error occurs while fetching values
183: */
184: public List toList() throws SQLException {
185: List resultsList = new ArrayList();
186:
187: while (hasNext()) {
188: resultsList.add(next());
189: }
190:
191: // Close the connection after converting it to a list.
192: this .close();
193:
194: return resultsList;
195: }
196:
197: /**
198: * Close the Iterator and release any associated resources
199: */
200: public void close() {
201: try {
202: if (results != null) {
203: results.close();
204: results = null;
205: }
206: } catch (SQLException sqle) {
207: }
208:
209: // try to close the statement if we have one
210: try {
211: if (statemt != null) {
212: statemt.close();
213: statemt = null;
214: }
215: } catch (SQLException sqle) {
216: }
217: }
218: }
|