Skip to content

Commit

Permalink
[GEOS-8555] GeoServer does not understand WCS 2.0 GeoTiff extension p…
Browse files Browse the repository at this point in the history
…refixes in KVP requests
  • Loading branch information
aaime committed Jan 25, 2018
1 parent 66b38ec commit dfd9a94
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.eclipse.emf.ecore.EObject;
import org.geoserver.ows.kvp.EMFKvpRequestReader;
Expand Down Expand Up @@ -76,20 +77,27 @@ public Object read(Object request, Map kvp, Map rawKvp) throws Exception {
}

private void parseGeoTiffExtension(GetCoverageType gc, Map kvp) {
// the early spec draft had un-qualified params, keeping it for backwards compatibility
List<String> geoTiffParams = Arrays.asList("compression", "jpeg_quality", "predictor",
"interleave", "tiling", "tileheight", "tilewidth");
parseSimpleContentList(gc, kvp, geoTiffParams, GEOTIFF_NS);
parseSimpleContentList(gc, kvp, geoTiffParams, GEOTIFF_NS, null);
// the current has the qualified as "geotiff:xyz"
parseSimpleContentList(gc, kvp, geoTiffParams, GEOTIFF_NS, "geotiff");
}

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

private void parseSimpleContentList(GetCoverageType gc, Map kvp, List<String> geoTiffParams,
String namespace) {
String namespace, String kvpPrefix) {
for (String param : geoTiffParams) {
String value = KvpUtils.firstValue(kvp, param);
String key = param;
if (kvpPrefix != null) {
key = kvpPrefix + ":" + param;
}
String value = KvpUtils.firstValue(kvp, key);
if (value != null) {
ExtensionItemType item = WCS20_FACTORY.createExtensionItemType();
item.setNamespace(namespace);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,11 @@
*/
package org.geoserver.wcs2_0.kvp;

import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import it.geosolutions.imageio.plugins.tiff.BaselineTIFFTagSet;
import it.geosolutions.imageioimpl.plugins.tiff.TIFFImageMetadata;
import it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReader;
import it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReaderSpi;

import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Map;

import javax.imageio.IIOException;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.FileImageInputStream;
import javax.mail.BodyPart;
import javax.mail.Multipart;

import net.opengis.wcs20.GetCoverageType;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.geoserver.wcs.WCSInfo;
Expand All @@ -40,10 +21,26 @@
import org.geotools.referencing.operation.transform.AffineTransform2D;
import org.geotools.resources.coverage.CoverageUtilities;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletResponse;
import org.vfny.geoserver.wcs.WcsException.WcsExceptionCode;
import org.w3c.dom.Document;

import org.springframework.mock.web.MockHttpServletResponse;
import javax.imageio.IIOException;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.FileImageInputStream;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Map;

import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

public class GeoTiffKvpTest extends WCSKVPTestSupport {

Expand All @@ -64,6 +61,24 @@ public void extensionGeotiff() throws Exception {
assertEquals("256", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:tileheight"));
assertEquals("256", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:tilewidth"));
}

@Test
public void extensionGeotiffPrefixed() throws Exception {
// complete
GetCoverageType gc = parse("wcs?request=GetCoverage&service=WCS&version=2.0.1" +
"&coverageId=theCoverage&geotiff:compression=JPEG&geotiff:jpeg_quality=75&geotiff:predictor=None" +
"&geotiff:interleave=pixel&geotiff:tiling=true&geotiff:tileheight=256&geotiff:tilewidth=256");

Map<String, Object> extensions = getExtensionsMap(gc);

assertEquals("JPEG", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:compression"));
assertEquals("75", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:jpeg_quality"));
assertEquals("None", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:predictor"));
assertEquals("pixel", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:interleave"));
assertEquals("true", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:tiling"));
assertEquals("256", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:tileheight"));
assertEquals("256", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:tilewidth"));
}


@Test
Expand Down Expand Up @@ -92,9 +107,22 @@ public void wrongJPEGQuality() throws Exception {

@Test
public void jpeg() throws Exception {
jpeg(false);
}

@Test
public void jpegPrefix() throws Exception {
jpeg(true);
}

private void jpeg(boolean prefix) throws Exception {
String params = "compression=JPEG&jpeg_quality=75";
if (prefix) {
params = "geotiff:compression=JPEG&geotiff:jpeg_quality=75";
}
MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" +
"&coverageId=wcs__BlueMarble&compression=JPEG&jpeg_quality=75");
"&coverageId=wcs__BlueMarble&" + params);

assertEquals("image/tiff", response.getContentType());
byte[] tiffContents = getBinary(response);
checkJpegTiff(tiffContents);
Expand Down

0 comments on commit dfd9a94

Please sign in to comment.