org.geoserver.wps.spatialstatistics.ppio.GridCoverageURLPPIO.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.wps.spatialstatistics.ppio.GridCoverageURLPPIO.java

Source

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
 * (c) 2014 MangoSystem
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package org.geoserver.wps.spatialstatistics.ppio;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URL;
import java.net.URLConnection;
import java.util.UUID;
import java.util.logging.Logger;

import org.apache.commons.io.IOUtils;
import org.geoserver.config.GeoServer;
import org.geoserver.wps.WPSInfo;
import org.geoserver.wps.ppio.CDataPPIO;
import org.geoserver.wps.resource.WPSResourceManager;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.process.spatialstatistics.gridcoverage.RasterHelper;
import org.geotools.process.spatialstatistics.storage.RasterExportOperation;
import org.geotools.util.logging.Logging;

/**
 * A PPIO to generate grid coverage from URL.
 * 
 * @author Minpa Lee, MangoSystem
 * 
 * @source $URL$
 */
public class GridCoverageURLPPIO extends CDataPPIO {
    protected static final Logger LOGGER = Logging.getLogger(GridCoverageURLPPIO.class);

    private WPSResourceManager resourceManager;

    private GeoServer geoServer;

    protected GridCoverageURLPPIO(GeoServer geoServer, WPSResourceManager resourceManager) {
        super(GridCoverage2D.class, GridCoverage2D.class, "text/plain");
        this.geoServer = geoServer;
        this.resourceManager = resourceManager;
    }

    @Override
    public Object decode(String input) throws Exception {
        WPSInfo wps = geoServer.getService(WPSInfo.class);

        URL url = new URL(input);
        URLConnection conn = url.openConnection();
        conn.setConnectTimeout((int) wps.getConnectionTimeout());
        conn.setReadTimeout((int) wps.getConnectionTimeout());

        return decode(conn.getInputStream());
    }

    @Override
    public Object decode(InputStream input) throws Exception {
        String fileName = generateUniqeuFileName();
        File fileToSave = resourceManager.getOutputResource(null, fileName).file();

        // write the files to the disk
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(fileToSave);
            IOUtils.copy(input, fos);
        } finally {
            IOUtils.closeQuietly(fos);
        }

        return RasterHelper.openGridCoverage(fileToSave);
    }

    @Override
    public void encode(Object value, OutputStream os) throws IOException {
        Writer writer = new OutputStreamWriter(os);
        try {
            if (value != null) {
                GridCoverage2D coverage = (GridCoverage2D) value;

                String fileName = generateUniqeuFileName();
                File fileToSave = resourceManager.getOutputResource(null, fileName).file();

                RasterExportOperation op = new RasterExportOperation();
                op.saveAsGeoTiff(coverage, fileToSave.getAbsolutePath());

                URL url = new URL(resourceManager.getOutputResourceUrl(fileName, "image/tiff"));
                writer.write(url.toExternalForm());
            }
        } finally {
            writer.flush();
        }
    }

    @Override
    public String getFileExtension() {
        return "tif";
    }

    private String generateUniqeuFileName() {
        return UUID.randomUUID().toString() + ".tif";
    }
}