String declaredFormat = getDeclaredFormat(meta.getSupportedFormats(), format);
if (declaredFormat == null)
throw new WcsException("format " + format + " is not supported for this coverage",
InvalidParameterValue, "format");
final GridCrsType gridCRS = output.getGridCRS();
if (gridCRS != null) {
// check grid base crs is valid, and eventually default it out
String gridBaseCrs = gridCRS.getGridBaseCRS();
if (gridBaseCrs != null) {
// make sure the requested is among the supported ones, by
// making a
// code level
// comparison (to avoid assuming epsg:xxxx and
// http://www.opengis.net/gml/srs/epsg.xml#xxx are different
// ones.
// We'll also consider the urn one comparable, allowing eventual
// axis flip on the
// geographic crs
String actualCRS = null;
final String gridBaseCrsCode = extractCode(gridBaseCrs);
for (Iterator it = meta.getResponseSRS().iterator(); it.hasNext();) {
final String responseCRS = (String) it.next();
final String code = extractCode(responseCRS);
if (code.equalsIgnoreCase(gridBaseCrsCode)) {
actualCRS = responseCRS;
}
}
if (actualCRS == null)
throw new WcsException("CRS " + gridBaseCrs
+ " is not among the supported ones for coverage " + meta.getName(),
WcsExceptionCode.InvalidParameterValue, "GridBaseCrs");
gridCRS.setGridBaseCRS(gridBaseCrs);
} else {
String code = GML2EncodingUtils.epsgCode(meta.getCRS());
gridCRS.setGridBaseCRS("urn:x-ogc:def:crs:EPSG:" + code);
}
// check grid type makes sense and apply default otherwise
String gridTypeValue = gridCRS.getGridType();
GridType type = GridType.GT2dGridIn2dCrs;
if (gridTypeValue != null) {
type = null;
for (GridType gt : GridType.values()) {
if (gt.getXmlConstant().equalsIgnoreCase(gridTypeValue))
type = gt;
}
if (type == null)
throw new WcsException("Unknown grid type " + gridTypeValue,
InvalidParameterValue, "GridType");
else if (type == GridType.GT2dGridIn3dCrs)
throw new WcsException("Unsupported grid type " + gridTypeValue,
InvalidParameterValue, "GridType");
}
gridCRS.setGridType(type.getXmlConstant());
// check gridcs and apply only value we know about
String gridCS = gridCRS.getGridCS();
if (gridCS != null) {
if (!gridCS.equalsIgnoreCase(GridCS.GCSGrid2dSquare.getXmlConstant()))
throw new WcsException("Unsupported grid cs " + gridCS, InvalidParameterValue,
"GridCS");
}
gridCRS.setGridCS(GridCS.GCSGrid2dSquare.getXmlConstant());
// check the grid origin and set defaults
CoordinateReferenceSystem crs = null;
try {
crs = CRS.decode(gridCRS.getGridBaseCRS());
} catch (Exception e) {
throw new WcsException("Could not understand crs " + gridCRS.getGridBaseCRS(),
WcsExceptionCode.InvalidParameterValue, "GridBaseCRS");
}
if (!gridCRS.isSetGridOrigin() || gridCRS.getGridOrigin() == null) {
// if not set, we have a default of "0 0" as a string, since I
// cannot
// find a way to make it default to new Double[] {0 0} I'll fix
// it here
Double[] origin = new Double[type.getOriginArrayLength()];
Arrays.fill(origin, 0.0);
gridCRS.setGridOrigin(origin);
} else {
Double[] gridOrigin = (Double[]) gridCRS.getGridOrigin();
// make sure the origin dimension matches the output crs
// dimension
if (gridOrigin.length != type.getOriginArrayLength())
throw new WcsException("Grid origin size (" + gridOrigin.length
+ ") inconsistent with grid type " + type.getXmlConstant()
+ " that requires (" + type.getOriginArrayLength() + ")",
WcsExceptionCode.InvalidParameterValue, "GridOrigin");
gridCRS.setGridOrigin(gridOrigin);
}
// perform same checks on the offsets
Double[] gridOffsets = (Double[]) gridCRS.getGridOffsets();
if (gridOffsets != null) {
// make sure the origin dimension matches the grid type
if (type.getOffsetArrayLength() != gridOffsets.length)
throw new WcsException("Invalid offsets lenght, grid type "
+ type.getXmlConstant() + " requires " + type.getOffsetArrayLength(),
InvalidParameterValue, "GridOffsets");
} else {
gridCRS.setGridOffsets(null);
}
}
}