001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.dbutils;
018
019 import java.sql.ResultSet;
020 import java.sql.SQLException;
021 import java.util.Iterator;
022
023 /**
024 * <p>
025 * Wraps a <code>ResultSet</code> in an <code>Iterator<Object[]></code>. This is useful
026 * when you want to present a non-database application layer with domain
027 * neutral data.
028 * </p>
029 *
030 * <p>
031 * This implementation requires the <code>ResultSet.isLast()</code> method
032 * to be implemented.
033 * </p>
034 */
035 public class ResultSetIterator implements Iterator<Object[]> {
036
037 /**
038 * The wrapped <code>ResultSet</code>.
039 */
040 private final ResultSet rs;
041
042 /**
043 * The processor to use when converting a row into an Object[].
044 */
045 private final RowProcessor convert;
046
047 /**
048 * Constructor for ResultSetIterator.
049 * @param rs Wrap this <code>ResultSet</code> in an <code>Iterator</code>.
050 */
051 public ResultSetIterator(ResultSet rs) {
052 this(rs, new BasicRowProcessor());
053 }
054
055 /**
056 * Constructor for ResultSetIterator.
057 * @param rs Wrap this <code>ResultSet</code> in an <code>Iterator</code>.
058 * @param convert The processor to use when converting a row into an
059 * <code>Object[]</code>. Defaults to a
060 * <code>BasicRowProcessor</code>.
061 */
062 public ResultSetIterator(ResultSet rs, RowProcessor convert) {
063 this.rs = rs;
064 this.convert = convert;
065 }
066
067 /**
068 * Returns true if there are more rows in the ResultSet.
069 * @return boolean <code>true</code> if there are more rows
070 * @throws RuntimeException if an SQLException occurs.
071 */
072 public boolean hasNext() {
073 try {
074 return !rs.isLast();
075 } catch (SQLException e) {
076 rethrow(e);
077 return false;
078 }
079 }
080
081 /**
082 * Returns the next row as an <code>Object[]</code>.
083 * @return An <code>Object[]</code> with the same number of elements as
084 * columns in the <code>ResultSet</code>.
085 * @see java.util.Iterator#next()
086 * @throws RuntimeException if an SQLException occurs.
087 */
088 public Object[] next() {
089 try {
090 rs.next();
091 return this.convert.toArray(rs);
092 } catch (SQLException e) {
093 rethrow(e);
094 return null;
095 }
096 }
097
098 /**
099 * Deletes the current row from the <code>ResultSet</code>.
100 * @see java.util.Iterator#remove()
101 * @throws RuntimeException if an SQLException occurs.
102 */
103 public void remove() {
104 try {
105 this.rs.deleteRow();
106 } catch (SQLException e) {
107 rethrow(e);
108 }
109 }
110
111 /**
112 * Rethrow the SQLException as a RuntimeException. This implementation
113 * creates a new RuntimeException with the SQLException's error message.
114 * @param e SQLException to rethrow
115 * @since DbUtils 1.1
116 */
117 protected void rethrow(SQLException e) {
118 throw new RuntimeException(e.getMessage());
119 }
120
121 /**
122 * Generates an <code>Iterable</code>, suitable for use in for-each loops.
123 *
124 * @param rs Wrap this <code>ResultSet</code> in an <code>Iterator</code>.
125 * @return an <code>Iterable</code>, suitable for use in for-each loops.
126 */
127 public static Iterable<Object[]> iterable(final ResultSet rs) {
128 return new Iterable<Object[]>() {
129
130 public Iterator<Object[]> iterator() {
131 return new ResultSetIterator(rs);
132 }
133
134 };
135 }
136
137 }