Package org.geoserver.wfsv.response.v1_1_0

Source Code of org.geoserver.wfsv.response.v1_1_0.FeatureDiffCollection

/* 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");
        }
    }
}
TOP

Related Classes of org.geoserver.wfsv.response.v1_1_0.FeatureDiffCollection

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.