metridoc.plugins.iterators.DefaultIterator.groovy Maven / Gradle / Ivy
/*
* Copyright 2010 Trustees of the University of Pennsylvania Licensed under the
* Educational Community License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS"
* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package metridoc.plugins.iterators
import org.apache.camel.Exchange
import groovy.sql.GroovyRowResult
/**
* Created by IntelliJ IDEA.
* User: tbarker
* Date: 9/9/11
* Time: 10:46 AM
*
* This class is a convenience class for creating new grid implementations. This class is not thread safe. Iteration
* should be performed with one thread.
*/
abstract class DefaultIterator implements Iterator {
int line = 0
Exchange originalExchange
private boolean hasClosed
private List peekedAtRecord
List next() {
if (hasNext()) {
def data
if (!peekedAtRecord) {
peek()
}
data = peekedAtRecord
peekedAtRecord = null
def index = 0
return data
}
throw new NoSuchElementException("no more elements in ${this}")
}
private static boolean recordSizeLargerThanColumnSize(Set columns, List data) {
return data.size() > columns.size()
}
/**
*
* @param columns the columns to check
* @param record the record to check columns against
* @return the adjusted columns. Since the passed columns are directly changed, the return is mostly for
* testing convenience
*/
private static Set adjustColumnsIfRecordSizeLargerThanColumnSize(Set columns, List data) {
if (recordSizeLargerThanColumnSize(columns, data)) {
int columnSize = columns.size()
int recordSize = data.size()
((columnSize + 1)..recordSize).each {
int possibleIndex = it
while (columns.contains(String.valueOf(possibleIndex))) {
possibleIndex++
}
columns.add(String.valueOf(possibleIndex))
}
}
return columns
}
private void peek() {
line++
peekedAtRecord = doNext()
}
boolean hasNext() {
boolean result
if (!peekedAtRecord) {
peek()
}
boolean doClose = !hasClosed && !peekedAtRecord && this instanceof Closeable
if (doClose) {
def closeable = this as Closeable
closeable.close()
hasClosed = true
}
return peekedAtRecord ? true : false
}
void remove() {
throw new UnsupportedOperationException("remove not supported in DefaultIterator")
}
abstract List doNext()
}