/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.wfsv.response.v1_1_0;
import java.io.IOException;
import java.util.AbstractCollection;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geotools.data.FeatureDiffReader;
import org.geotools.data.postgis.FeatureDiffReaderImpl;
/**
* To really wrap a FeatureDiffReader into a freemarker template, we have to
* wrap it into a collection. This allows the reader to be scrolled over without
* the need to copy it memory.
*
* @author Andrea Aime - TOPP
*
*/
public class FeatureDiffCollection extends AbstractCollection {
static Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.geoserver.wfs");
private FeatureDiffReader reader;
public FeatureDiffCollection(FeatureDiffReader reader) {
this.reader = reader;
}
public Iterator iterator() {
try {
return new FeatureDiffReaderIterator(new FeatureDiffReaderImpl((FeatureDiffReaderImpl) reader));
} catch (Exception e) {
close(reader);
throw new RuntimeException(e);
}
}
public int size() {
FeatureDiffReader clone = null;
try {
clone = new FeatureDiffReaderImpl((FeatureDiffReaderImpl) reader);
int size = 0;
while (clone.hasNext())
size++;
return size;
} catch (Exception e) {
close(reader);
throw new RuntimeException(e);
} finally {
if (clone != null) {
close(clone);
}
}
}
private void close(FeatureDiffReader r) {
try {
r.close();
r = null;
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Error closing diff reader wrapping iterator", e);
}
}
private static class FeatureDiffReaderIterator implements Iterator {
private FeatureDiffReader reader;
public FeatureDiffReaderIterator(FeatureDiffReader reader) {
this.reader = reader;
}
public boolean hasNext() {
try {
boolean hasNext = reader.hasNext();
if (!hasNext) {
close();
}
return hasNext;
} catch (IOException e) {
close();
throw new RuntimeException(e);
}
}
private void close() {
try {
reader.close();
reader = null;
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Error closing diff reader wrapping iterator", e);
}
}
public Object next() {
try {
return reader.next();
} catch (Exception e) {
close();
throw new RuntimeException(e);
}
}
public void remove() {
throw new UnsupportedOperationException("Feature diffs are read only");
}
}
}