You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.5 KiB
Java
117 lines
2.5 KiB
Java
package eu.dnetlib.enabling.resultset;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
|
/**
|
|
* an open ResultSet that can be iterated to get it's data results.
|
|
*
|
|
* @author claudio
|
|
*
|
|
*/
|
|
public class IterableResultSet implements ResultSetListener, ResultSetAware {
|
|
|
|
/**
|
|
* logger.
|
|
*/
|
|
private static final Log log = LogFactory.getLog(IterableResultSet.class);
|
|
|
|
/**
|
|
* the container for the data results.
|
|
*/
|
|
private ResultSet resultSet;
|
|
|
|
/**
|
|
* the list that provides data for this resultSet.
|
|
*/
|
|
private FetchList<String> fetchList;
|
|
|
|
private int optionalNumberOfElements;
|
|
|
|
/**
|
|
*
|
|
* @param iter
|
|
* @param fetchSize
|
|
*/
|
|
protected IterableResultSet(Iterable<String> iter, int fetchSize) {
|
|
fetchList = new FetchList<String>(iter.iterator(), fetchSize);
|
|
if (iter instanceof SizedIterable<?>) {
|
|
optionalNumberOfElements = ((SizedIterable<?>) iter).getNumberOfElements();
|
|
} else {
|
|
optionalNumberOfElements = -1;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param fromPosition
|
|
* @param toPosition
|
|
* @return <T> List
|
|
*/
|
|
@Override
|
|
public List<String> getResult(int fromPosition, int toPosition) {
|
|
|
|
log.debug(" - getting result from " + fromPosition + " to " + toPosition + ", consumedElements: " + fetchList.getConsumedElements());
|
|
|
|
if (fromPosition != fetchList.getConsumedElements() + 1)
|
|
throw new RuntimeException("Unexpected value for 'fromPosition' parameter");
|
|
if (toPosition < fromPosition)
|
|
throw new RuntimeException("'fromPosition' must be lower or equal than 'toPosition'");
|
|
|
|
List<String> result = new ArrayList<String>();
|
|
|
|
for (int i = fromPosition; i <= toPosition; i++) {
|
|
if (fetchList.size() > 0)
|
|
result.add(fetchList.poll());
|
|
else
|
|
break;
|
|
}
|
|
|
|
ensureClosed();
|
|
|
|
return result;
|
|
}
|
|
|
|
private void ensureClosed() {
|
|
if (fetchList.size() == 0 && resultSet.isOpen()) {
|
|
log.info(">>>>>>>>>>> closing resultset <<<<<<<<<<<<<");
|
|
close();
|
|
}
|
|
}
|
|
|
|
public String getRSStatus() {
|
|
if (resultSet.isOpen())
|
|
return "open";
|
|
return "closed";
|
|
}
|
|
|
|
@Override
|
|
public int getSize() {
|
|
ensureClosed();
|
|
|
|
if (optionalNumberOfElements == -1)
|
|
return fetchList.getTotalElements();
|
|
else
|
|
return optionalNumberOfElements;
|
|
}
|
|
|
|
/**
|
|
* closes the resultset.
|
|
*/
|
|
protected void close() {
|
|
resultSet.close();
|
|
}
|
|
|
|
@Override
|
|
public void setResultSet(ResultSet resultSet) {
|
|
this.resultSet = resultSet;
|
|
}
|
|
|
|
public ResultSet getResultSet() {
|
|
return resultSet;
|
|
}
|
|
|
|
}
|