/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wcs2_0.response; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import net.opengis.wcs20.ExtensionItemType; import net.opengis.wcs20.ExtensionType; import net.opengis.wcs20.GetCoverageType; import org.eclipse.emf.common.util.EList; import org.geoserver.catalog.Catalog; import org.geoserver.config.GeoServer; import org.geoserver.ows.Response; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.platform.OWS20Exception.OWSExceptionCode; import org.geoserver.platform.Operation; import org.geoserver.wcs.responses.CoverageResponseDelegate; import org.geoserver.wcs.responses.CoverageResponseDelegateFinder; import org.geoserver.wcs2_0.exception.WCS20Exception; import org.geoserver.wcs2_0.util.NCNameResourceCodec; import org.geotools.coverage.grid.GridCoverage2D; import org.opengis.coverage.grid.GridCoverage; /** * Returns a single coverage encoded in the specified output format (eventually the native one) * @author Andrea Aime - GeoSolutions */ public class WCS20GetCoverageResponse extends Response { public final static String COVERAGE_ID_PARAM = "coverageId"; CoverageResponseDelegateFinder responseFactory; public WCS20GetCoverageResponse(CoverageResponseDelegateFinder responseFactory) { super(GridCoverage.class); this.responseFactory = responseFactory; } public String getMimeType(Object value, Operation operation) { GetCoverageType getCoverage = (GetCoverageType) operation.getParameters()[0]; String format = getCoverage.getFormat(); if (format == null) { return "image/tiff"; } else { CoverageResponseDelegate delegate = responseFactory.encoderFor(format); if (delegate == null) { throw new WCS20Exception("Unsupported format " + format, OWSExceptionCode.InvalidParameterValue, "format"); } else { return format; } } } @Override public boolean canHandle(Operation operation) { Object firstParam = operation.getParameters()[0]; if (!(firstParam instanceof GetCoverageType)) { // we only handle WCS 2.0 requests return false; } GetCoverageType getCoverage = (GetCoverageType) firstParam; // this class only handles encoding the coverage in its output format return getCoverage.getMediaType() == null; } public void write(Object value, OutputStream output, Operation operation) throws IOException { // grab the coverage GridCoverage2D coverage = (GridCoverage2D) value; // grab the format GetCoverageType getCoverage = (GetCoverageType) operation.getParameters()[0]; String format = getCoverage.getFormat(); if (format == null) { format = "image/tiff"; } // extract additional extensions final Map<String,String> encodingParameters= new HashMap<String,String>(); final ExtensionType extension = getCoverage.getExtension(); if (extension != null) { final EList<ExtensionItemType> extensions = extension.getContents(); for (ExtensionItemType ext:extensions) { encodingParameters.put(ext.getName(), ext.getSimpleContent()); } } String coverageId = getCoverage.getCoverageId(); if (coverageId != null) { encodingParameters.put(COVERAGE_ID_PARAM, coverageId); } // grab the delegate CoverageResponseDelegate delegate = responseFactory.encoderFor(format); delegate.encode(coverage, format, encodingParameters, output); } @Override public String getAttachmentFileName(Object value, Operation operation) { // grab the format GetCoverageType getCoverage = (GetCoverageType) operation.getParameters()[0]; String format = getCoverage.getFormat(); if (format == null) { format = "image/tiff"; } // grab the delegate and thus the extension CoverageResponseDelegate delegate = responseFactory.encoderFor(format); String extension = delegate.getFileExtension(format); // collect the name of the coverages that have been requested return getCoverage.getCoverageId() + "." + extension; } }