final List<Object> elevations, final GridCoverage2DReader reader,
boolean readGeom) throws IOException {
// setup the scene
final ParameterValueGroup readParametersDescriptor = reader.getFormat().getReadParameters();
CoverageInfo coverage = mapLayerInfo.getCoverage();
MetadataMap metadata = coverage.getMetadata();
GeneralParameterValue[] readParameters = CoverageUtils.getParameters(
readParametersDescriptor, coverage.getParameters(), readGeom);
ReaderDimensionsAccessor dimensions = new ReaderDimensionsAccessor(reader);
// pass down time
final DimensionInfo timeInfo = metadata.get(ResourceInfo.TIME, DimensionInfo.class);
// add the descriptors for custom dimensions
final List<GeneralParameterDescriptor> parameterDescriptors =
new ArrayList<GeneralParameterDescriptor>(readParametersDescriptor.getDescriptor().descriptors());
Set<ParameterDescriptor<List>> dynamicParameters = reader.getDynamicParameters();
parameterDescriptors.addAll(dynamicParameters);
if (timeInfo != null && timeInfo.isEnabled()) {
// handle "default"
List<Object> fixedTimes = new ArrayList<Object>(times);
for (int i = 0; i < fixedTimes.size(); i++) {
if (fixedTimes.get(i) == null) {
fixedTimes.set(i, getDefaultTime(coverage));
}
}
// pass down the parameters
readParameters = CoverageUtils.mergeParameter(parameterDescriptors, readParameters,
fixedTimes, "TIME", "Time");
}
// pass down elevation
final DimensionInfo elevationInfo = metadata.get(ResourceInfo.ELEVATION,
DimensionInfo.class);
if (elevationInfo != null && elevationInfo.isEnabled()) {
// handle "default"
List<Object> fixedElevations = new ArrayList<Object>(elevations);
for (int i = 0; i < fixedElevations.size(); i++) {
if (fixedElevations.get(i) == null) {
fixedElevations.set(i, getDefaultElevation(coverage));
}
}
readParameters = CoverageUtils.mergeParameter(parameterDescriptors, readParameters,
fixedElevations, "ELEVATION", "Elevation");
}
if (layerFilter != null && readParameters != null) {
// test for default [empty is replaced with INCLUDE filter] ]filter
for (int i = 0; i < readParameters.length; i++) {
GeneralParameterValue param = readParameters[i];
GeneralParameterDescriptor pd = param.getDescriptor();
if (pd.getName().getCode().equalsIgnoreCase("FILTER")) {
final ParameterValue pv = (ParameterValue) pd.createValue();
// if something different from the default INCLUDE filter is specified
if (layerFilter != Filter.INCLUDE) {
// override the default filter
pv.setValue(layerFilter);
readParameters[i] = pv;
}
break;
}
}
}
// custom dimensions
List<String> customDomains = new ArrayList(dimensions.getCustomDomains());
for (String domain : new ArrayList<String>(customDomains)) {
List<String> values = request.getCustomDimension(domain);
if (values != null) {
readParameters = CoverageUtils.mergeParameter(parameterDescriptors, readParameters,
values, domain);
customDomains.remove(domain);
}
}
// see if we have any custom domain for which we have to set the default value
if(!customDomains.isEmpty()) {
for (String name : customDomains) {
final DimensionInfo customInfo = metadata.get(ResourceInfo.CUSTOM_DIMENSION_PREFIX + name,
DimensionInfo.class);
if (customInfo != null && customInfo.isEnabled()) {
final ArrayList<String> val = new ArrayList<String>(1);
val.add(getDefaultCustomDimensionValue(name, coverage, String.class));
readParameters = CoverageUtils.mergeParameter(