HttpServletResponse response, RequestType reqType) throws OWSException {
String encoding = request.getCharacterEncoding();
String layer = values.get("layer");
if (layer == null) {
throw new OWSException(400, "MissingParameterValue", "LAYER", "Missing LAYER parameter");
}
TileLayer tileLayer = null;
try {
tileLayer = tld.getTileLayer(layer);
} catch (GeoWebCacheException e) {
throw new OWSException(400, "InvalidParameterValue", "LAYER", "LAYER " + layer
+ " is not known.");
}
Map<String, String> fullParameters;
try {
// WMTS uses the "STYLE" instead of "STYLES"
@SuppressWarnings("unchecked")
Map<String, Object> rawParameters = new HashMap<>(request.getParameterMap());
for(Entry<String, Object> e:rawParameters.entrySet()){
if(e.getKey().equalsIgnoreCase("STYLE")) {
rawParameters.put("STYLES", e.getValue());
break;
}
}
fullParameters = tileLayer.getModifiableParameters(rawParameters, encoding);
} catch (GeoWebCacheException e) {
throw new OWSException(500, "NoApplicableCode", "", e.getMessage()
+ " while fetching modifiable parameters for LAYER " + layer);
}
MimeType mimeType = null;
if (reqType == RequestType.TILE) {
String format = values.get("format");
if (format == null) {
throw new OWSException(400, "MissingParameterValue", "FORMAT",
"Unable to determine requested FORMAT, " + format);
}
try {
mimeType = MimeType.createFromFormat(format);
} catch (MimeException me) {
throw new OWSException(400, "InvalidParameterValue", "FORMAT",
"Unable to determine requested FORMAT, " + format);
}
} else {
String infoFormat = ServletUtils.stringFromMap(request.getParameterMap(),
request.getCharacterEncoding(), "infoformat");
if (infoFormat == null) {
throw new OWSException(400, "MissingParameterValue", "INFOFORMAT",
"Parameter INFOFORMAT was not provided");
}
try {
mimeType = MimeType.createFromFormat(infoFormat);
} catch (MimeException me) {
throw new OWSException(400, "InvalidParameterValue", "INFOFORMAT",
"Unable to determine requested INFOFORMAT, " + infoFormat);
}
}
final String tilematrixset = values.get("tilematrixset");
if (tilematrixset == null) {
throw new OWSException(400, "MissingParameterValue", "TILEMATRIXSET",
"No TILEMATRIXSET specified");
}
GridSubset gridSubset = tileLayer.getGridSubset(tilematrixset);
if (gridSubset == null) {
throw new OWSException(400, "InvalidParameterValue", "TILEMATRIXSET",
"Unable to match requested TILEMATRIXSET " + tilematrixset
+ " to those supported by layer");
}
final String tileMatrix = values.get("tilematrix");
if (tileMatrix == null) {
throw new OWSException(400, "MissingParameterValue", "TILEMATRIX",
"No TILEMATRIX specified");
}
long z = gridSubset.getGridIndex(tileMatrix);
if (z < 0) {
throw new OWSException(400, "InvalidParameterValue", "TILEMATRIX",
"Unknown TILEMATRIX " + tileMatrix);
}
// WMTS has 0 in the top left corner -> flip y value
final String tileRow = values.get("tilerow");
if (tileRow == null) {
throw new OWSException(400, "MissingParameterValue", "TILEROW", "No TILEROW specified");
}
final long tilesHigh = gridSubset.getNumTilesHigh((int) z);
long y = tilesHigh - Long.parseLong(tileRow) - 1;
String tileCol = values.get("tilecol");
if (tileCol == null) {
throw new OWSException(400, "MissingParameterValue", "TILECOLUMN",
"No TILECOLUMN specified");
}
long x = Long.parseLong(tileCol);
long[] gridCov = gridSubset.getCoverage((int) z);
if (x < gridCov[0] || x > gridCov[2]) {
throw new OWSException(400, "TileOutOfRange", "TILECOLUMN", "Column " + x
+ " is out of range, min: " + gridCov[0] + " max:" + gridCov[2]);
}
if (y < gridCov[1] || y > gridCov[3]) {
long minRow = tilesHigh - gridCov[3] - 1;
long maxRow = tilesHigh - gridCov[1] - 1;
throw new OWSException(400, "TileOutOfRange", "TILEROW", "Row " + tileRow
+ " is out of range, min: " + minRow + " max:" + maxRow);
}
long[] tileIndex = { x, y, z };