/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wcs2_0; import static org.geoserver.wcs2_0.util.RequestUtils.*; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import net.opengis.wcs20.DescribeCoverageType; import net.opengis.wcs20.DescribeEOCoverageSetType; import net.opengis.wcs20.GetCapabilitiesType; import net.opengis.wcs20.GetCoverageType; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.LayerInfo; import org.geoserver.config.GeoServer; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.platform.OWS20Exception; import org.geoserver.platform.ServiceException; import org.geoserver.wcs.WCSInfo; import org.geoserver.wcs.responses.CoverageResponseDelegateFinder; 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.NCNameResourceCodec; import org.geoserver.wcs2_0.util.StringUtils; import org.geoserver.wcs2_0.util.WCS20DescribeCoverageExtension; import org.geotools.util.logging.Logging; import org.geotools.xml.transform.TransformerBase; import org.opengis.coverage.grid.GridCoverage; /** * Default implementation of the Web Coverage Service 2.0 * * @author Emanuele Tajariol (etj) - GeoSolutions * @author Simone Giannecchini, GeoSolutions */ public class DefaultWebCoverageService20 implements WebCoverageService20 { protected Logger LOGGER = Logging.getLogger(DefaultWebCoverageService20.class); private MIMETypeMapper mimeMapper; private Catalog catalog; private GeoServer geoServer; private CoverageResponseDelegateFinder responseFactory; /** Utility class to map envelope dimension*/ private EnvelopeAxesLabelsMapper envelopeAxesMapper; /** Available extension points for the DescribeCoverage operation*/ private List<WCS20DescribeCoverageExtension> wcsDescribeCoverageExtensions; /** Boolean indicating that at least an extension point for the DescribeCoverage operation is available */ private boolean availableDescribeCovExtensions; public DefaultWebCoverageService20(GeoServer geoServer, CoverageResponseDelegateFinder responseFactory, EnvelopeAxesLabelsMapper envelopeDimensionsMapper,MIMETypeMapper mimemappe) { this.geoServer = geoServer; this.catalog = geoServer.getCatalog(); this.responseFactory = responseFactory; this.envelopeAxesMapper=envelopeDimensionsMapper; this.mimeMapper=mimemappe; this.wcsDescribeCoverageExtensions = GeoServerExtensions .extensions(WCS20DescribeCoverageExtension.class); this.availableDescribeCovExtensions = wcsDescribeCoverageExtensions != null && !wcsDescribeCoverageExtensions.isEmpty(); } @Override public WCSInfo getServiceInfo() { return geoServer.getService(WCSInfo.class); } @Override public TransformerBase getCapabilities(GetCapabilitiesType request) { checkService(request.getService()); return new GetCapabilities(getServiceInfo(),responseFactory).run(request); } @Override public WCS20DescribeCoverageTransformer describeCoverage(DescribeCoverageType request) { checkService(request.getService()); checkVersion(request.getVersion()); if( request.getCoverageId() == null || request.getCoverageId().isEmpty() ) { throw new OWS20Exception("Required parameter coverageId missing", WCS20Exception.WCS20ExceptionCode.EmptyCoverageIdList, "coverageId"); } // check coverages are legit List<String> badCoverageIds = new ArrayList<String>(); for (String encodedCoverageId : (List<String>)request.getCoverageId()) { String newCoverageID = encodedCoverageId; // Extension point for encoding the coverageId if (availableDescribeCovExtensions) { for (WCS20DescribeCoverageExtension ext : wcsDescribeCoverageExtensions) { newCoverageID = ext.handleCoverageId(newCoverageID); } } LayerInfo layer = NCNameResourceCodec.getCoverage(catalog, newCoverageID); if(layer == null) { badCoverageIds.add(encodedCoverageId); } } if(!badCoverageIds.isEmpty()) { String mergedIds = StringUtils.merge(badCoverageIds); throw new WCS20Exception("Could not find the requested coverage(s): " + mergedIds , WCS20Exception.WCS20ExceptionCode.NoSuchCoverage, "coverageId"); } WCSInfo wcs = getServiceInfo(); WCS20DescribeCoverageTransformer describeTransformer = new WCS20DescribeCoverageTransformer(wcs, catalog, responseFactory,envelopeAxesMapper,mimeMapper); describeTransformer.setEncoding(Charset.forName(wcs.getGeoServer().getSettings().getCharset())); return describeTransformer; } @Override public GridCoverage getCoverage(GetCoverageType request) { checkService(request.getService()); checkVersion(request.getVersion()); if( request.getCoverageId() == null || "".equals(request.getCoverageId()) ) { throw new OWS20Exception("Required parameter coverageId missing", WCS20Exception.WCS20ExceptionCode.EmptyCoverageIdList, "coverageId"); } return new GetCoverage(getServiceInfo(), catalog, envelopeAxesMapper, mimeMapper).run(request); } @Override public TransformerBase describeEOCoverageSet(DescribeEOCoverageSetType request) { throw new ServiceException("WCS-EO extension is not installed, thus the operation is not available"); } }