/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wcs2_0.eo;
import static org.geoserver.wcs2_0.util.RequestUtils.checkService;
import static org.geoserver.wcs2_0.util.RequestUtils.checkVersion;
import java.util.ArrayList;
import java.util.List;
import net.opengis.wcs20.DescribeEOCoverageSetType;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.config.GeoServer;
import org.geoserver.platform.OWS20Exception;
import org.geoserver.platform.OWS20Exception.OWSExceptionCode;
import org.geoserver.platform.ServiceException;
import org.geoserver.wcs.WCSInfo;
import org.geoserver.wcs.responses.CoverageResponseDelegateFinder;
import org.geoserver.wcs2_0.eo.response.DescribeEOCoverageSetTransformer;
import org.geoserver.wcs2_0.exception.WCS20Exception;
import org.geoserver.wcs2_0.response.MIMETypeMapper;
import org.geoserver.wcs2_0.response.WCS20DescribeCoverageTransformer;
import org.geoserver.wcs2_0.util.EnvelopeAxesLabelsMapper;
import org.geoserver.wcs2_0.util.StringUtils;
/**
* AOP interceptor running DescribeEOCoverageSet for WCS 2.O EO
*
* @author Andrea Aime - GeoSolutions
*/
public class DescribeEOCoverageSetInterceptor implements MethodInterceptor {
EOCoverageResourceCodec resourceCodec;
private GeoServer geoServer;
private Catalog catalog;
private CoverageResponseDelegateFinder responseFactory;
private EnvelopeAxesLabelsMapper envelopeAxesMapper;
private MIMETypeMapper mimemapper;
public DescribeEOCoverageSetInterceptor(GeoServer geoServer,
CoverageResponseDelegateFinder responseFactory,
EnvelopeAxesLabelsMapper envelopeDimensionsMapper, MIMETypeMapper mimemappe,
EOCoverageResourceCodec resourceCodec) {
this.geoServer = geoServer;
this.catalog = geoServer.getCatalog();
this.responseFactory = responseFactory;
this.envelopeAxesMapper = envelopeDimensionsMapper;
this.mimemapper = mimemappe;
this.resourceCodec = resourceCodec;
}
public WCSInfo getServiceInfo() {
return geoServer.getService(WCSInfo.class);
}
private boolean isEarthObservationEnabled() {
WCSInfo wcs = getServiceInfo();
Boolean enabled = wcs.getMetadata().get(WCSEOMetadata.ENABLED.key, Boolean.class);
return Boolean.TRUE.equals(enabled);
}
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
if (invocation.getMethod().getName().equals("describeEOCoverageSet") && isEarthObservationEnabled()) {
try {
DescribeEOCoverageSetType dcs = (DescribeEOCoverageSetType) invocation
.getArguments()[0];
return describeEOCoverageSet(dcs);
} catch (Exception e) {
if (e instanceof ServiceException) {
throw e;
} else {
throw new ServiceException(e);
}
}
} else {
return invocation.proceed();
}
}
private Object describeEOCoverageSet(DescribeEOCoverageSetType dcs) {
checkService(dcs.getService());
checkVersion(dcs.getVersion());
if (dcs.getEoId() == null || dcs.getEoId().isEmpty()) {
throw new OWS20Exception("Required parameter eoID missing", new OWSExceptionCode(
"emptyEoIdList", 404), "eoid");
}
// check coverages are legit
List<String> badCoverageIds = new ArrayList<String>();
for (String datasetId : (List<String>) dcs.getEoId()) {
CoverageInfo layer = resourceCodec.getDatasetCoverage(datasetId);
if (layer == null) {
badCoverageIds.add(datasetId);
}
}
if (!badCoverageIds.isEmpty()) {
String mergedIds = StringUtils.merge(badCoverageIds);
throw new WCS20Exception("Could not find the requested coverage(s): " + mergedIds,
new OWSExceptionCode("noSuchEODataset", 404), "eoid");
}
WCS20DescribeCoverageTransformer tx = new WCS20DescribeCoverageTransformer(
getServiceInfo(), catalog, responseFactory, envelopeAxesMapper, mimemapper);
return new DescribeEOCoverageSetTransformer(getServiceInfo(), resourceCodec, envelopeAxesMapper, tx);
}
}