Package org.geoserver.wcs2_0.kvp

Source Code of org.geoserver.wcs2_0.kvp.WCS20GetCoverageRequestReader

package org.geoserver.wcs2_0.kvp;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import net.opengis.wcs20.DimensionSubsetType;
import net.opengis.wcs20.ExtensionItemType;
import net.opengis.wcs20.GetCoverageType;
import net.opengis.wcs20.ScaleAxisByFactorType;
import net.opengis.wcs20.ScaleByFactorType;
import net.opengis.wcs20.ScaleToExtentType;
import net.opengis.wcs20.ScaleToSizeType;
import net.opengis.wcs20.ScalingType;
import net.opengis.wcs20.Wcs20Factory;

import org.geoserver.ows.kvp.EMFKvpRequestReader;
import org.geoserver.ows.util.KvpUtils;
import org.geoserver.wcs2_0.WCS20Const;
import org.geotools.wcs.v2_0.Interpolation;
import org.geotools.wcs.v2_0.RangeSubset;
import org.geotools.wcs.v2_0.Scaling;

/**
* KVP reader for WCS 2.0 GetCoverage request
*
* @author Andrea Aime - GeoSolutions
*/
@SuppressWarnings("rawtypes")
public class WCS20GetCoverageRequestReader extends EMFKvpRequestReader {

    private static final Wcs20Factory WCS20_FACTORY = Wcs20Factory.eINSTANCE;

    private static final String GEOTIFF_NS = "http://www.opengis.net/wcs/geotiff/1.0";

    private static final String CRS_NS = "http://www.opengis.net/wcs/service-extension/crs/1.0";

    public WCS20GetCoverageRequestReader() {
        super(GetCoverageType.class, WCS20_FACTORY);
    }

    @Override
    public Object read(Object request, Map kvp, Map rawKvp) throws Exception {
        GetCoverageType gc = (GetCoverageType) super.read(request, kvp, rawKvp);

        // handle dimension subsets
        Object subsets = kvp.get("subset");
        if (subsets instanceof DimensionSubsetType) {
            gc.getDimensionSubset().add((DimensionSubsetType) subsets);
        } else if (subsets instanceof List) {
            for (Object subset : (List) subsets) {
                gc.getDimensionSubset().add((DimensionSubsetType) subset);
            }
        }

        // prepare for extensions
        gc.setExtension(WCS20_FACTORY.createExtensionType());

        // parse the extensions. Note, here we do only the validation bits that are not shared
        // with the XML, everything else is in GetCoverage
        parseGeoTiffExtension(gc, kvp);
        parseCRSExtension(gc, rawKvp);
        parseScalingExtension(gc, kvp);
        parseRangeSubsetExtension(gc, kvp);
        parseInterpolationExtension(gc, kvp);
        parseOverviewPolicyExtension(gc, kvp);

        return gc;
    }

    private void parseGeoTiffExtension(GetCoverageType gc, Map kvp) {
        List<String> geoTiffParams = Arrays.asList("compression", "jpeg_quality", "predictor",
                "interleave", "tiling", "tileheight", "tilewidth");
        parseSimpleContentList(gc, kvp, geoTiffParams, GEOTIFF_NS);
    }

    private void parseCRSExtension(GetCoverageType gc, Map kvp) {
        List<String> geoTiffParams = Arrays.asList("subsettingCrs", "outputCrs");
        parseSimpleContentList(gc, kvp, geoTiffParams, CRS_NS);
    }

    private void parseSimpleContentList(GetCoverageType gc, Map kvp, List<String> geoTiffParams,
            String namespace) {
        for (String param : geoTiffParams) {
            String value = KvpUtils.firstValue(kvp, param);
            if (value != null) {
                ExtensionItemType item = WCS20_FACTORY.createExtensionItemType();
                item.setNamespace(namespace);
                item.setName(param);
                item.setSimpleContent(value);

                gc.getExtension().getContents().add(item);
            }
        }
    }

    private void parseScalingExtension(GetCoverageType gc, Map kvp) {
        boolean found = false;
        ScalingType scaling = WCS20_FACTORY.createScalingType();
        if (kvp.containsKey("scalefactor")) {
            found = true;
            ScaleByFactorType sf = WCS20_FACTORY.createScaleByFactorType();
            sf.setScaleFactor(((Double) kvp.get("scalefactor")));
            scaling.setScaleByFactor(sf);
        }
        if (kvp.containsKey("scaleaxes")) {
            found = true;
            scaling.setScaleAxesByFactor((ScaleAxisByFactorType) kvp.get("scaleaxes"));
        }
        if (kvp.containsKey("scalesize")) {
            found = true;
            scaling.setScaleToSize((ScaleToSizeType) kvp.get("scalesize"));
        }
        if (kvp.containsKey("scaleextent")) {
            found = true;
            scaling.setScaleToExtent((ScaleToExtentType) kvp.get("scaleextent"));
        }

        // if we found at least one, put it in the extension map (it's the duty of
        // GetCoverage to complain about multiple scaling constructs)
        if (found == true) {
            ExtensionItemType item = WCS20_FACTORY.createExtensionItemType();
            item.setNamespace(Scaling.NAMESPACE);
            item.setName("Scaling");
            item.setObjectContent(scaling);
            gc.getExtension().getContents().add(item);
        }
    }

    private void parseRangeSubsetExtension(GetCoverageType gc, Map kvp) {
        if (kvp.containsKey("rangesubset")) {
            ExtensionItemType item = WCS20_FACTORY.createExtensionItemType();
            item.setNamespace(RangeSubset.NAMESPACE);
            item.setName("RangeSubset");
            item.setObjectContent(kvp.get("rangesubset"));
            gc.getExtension().getContents().add(item);
        }
    }

    private void parseInterpolationExtension(GetCoverageType gc, Map kvp) {
        if (kvp.containsKey("interpolation")) {
            ExtensionItemType item = WCS20_FACTORY.createExtensionItemType();
            item.setNamespace(Interpolation.NAMESPACE);
            item.setName("Interpolation");
            item.setObjectContent(kvp.get("interpolation"));
            gc.getExtension().getContents().add(item);
        }
    }

    private void parseOverviewPolicyExtension(GetCoverageType gc, Map kvp) {
        if (kvp.containsKey(WCS20Const.OVERVIEW_POLICY_EXTENSION_LOWERCASE)) {
            Object item = kvp.get(WCS20Const.OVERVIEW_POLICY_EXTENSION_LOWERCASE);
            if (item instanceof ExtensionItemType) {
                gc.getExtension().getContents().add((ExtensionItemType) item);
            }
        }
    }
}
TOP

Related Classes of org.geoserver.wcs2_0.kvp.WCS20GetCoverageRequestReader

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.