/*
* Copyright (c) 2001 - 20089 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.template;
import java.util.LinkedList;
import java.util.List;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import freemarker.ext.beans.BeansWrapper;
import freemarker.template.TemplateCollectionModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateModelIterator;
/**
*
* Create FeatureCollection Template Model without copying features to memory
* When using this in a FeatureWrapper, it is necessary to call purge() method after
* processing template, to close any open database connections
*
* @author Niels Charlier, Curtin University of Technology
*
*/
public class DirectTemplateFeatureCollectionFactory implements FeatureWrapper.TemplateFeatureCollectionFactory {
protected List<FeatureIterator> openIterators = new LinkedList<FeatureIterator>();
public void purge() {
while (!openIterators.isEmpty()) {
openIterators.get(0).close();
openIterators.remove(0);
}
}
public TemplateCollectionModel createTemplateFeatureCollection(FeatureCollection collection,
BeansWrapper wrapper) {
return new TemplateFeatureCollection(collection, wrapper);
}
protected class TemplateFeatureCollection implements TemplateCollectionModel {
protected BeansWrapper wrapper;
protected FeatureCollection collection;
public TemplateFeatureCollection(FeatureCollection collection, BeansWrapper wrapper) {
this.collection = collection;
this.wrapper = wrapper;
}
public TemplateModelIterator iterator() throws TemplateModelException {
return new TemplateFeatureIterator(collection.features(), wrapper);
}
}
protected class TemplateFeatureIterator implements TemplateModelIterator {
protected BeansWrapper wrapper;
protected FeatureIterator iterator;
public TemplateFeatureIterator(FeatureIterator iterator, BeansWrapper wrapper) {
this.iterator = iterator;
this.wrapper = wrapper;
}
public TemplateModel next() throws TemplateModelException {
return wrapper.wrap(iterator.next());
}
public boolean hasNext() throws TemplateModelException {
return iterator.hasNext();
}
}
}