/* (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.eo.response;
import static org.geoserver.ows.util.ResponseUtils.appendQueryString;
import static org.geoserver.ows.util.ResponseUtils.buildURL;
import java.io.IOException;
import java.util.List;
import net.opengis.wcs20.GetCapabilitiesType;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.DimensionInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.config.GeoServer;
import org.geoserver.ows.URLMangler;
import org.geoserver.ows.URLMangler.URLType;
import org.geoserver.ows.util.ResponseUtils;
import org.geoserver.wcs.WCSInfo;
import org.geoserver.wcs2_0.eo.EOCoverageResourceCodec;
import org.geoserver.wcs2_0.eo.WCSEOMetadata;
import org.geoserver.wcs2_0.response.WCSDimensionsHelper;
import org.geoserver.wcs2_0.response.WCSExtendedCapabilitiesProvider;
import org.geotools.coverage.grid.io.GridCoverage2DReader;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.NamespaceSupport;
/**
* Encodes the extensions to the WCS capabilities document
*
* @author Andrea Aime - GeoSolutions
*/
public class WCSEOExtendedCapabilitiesProvider extends WCSExtendedCapabilitiesProvider {
EOCoverageResourceCodec codec;
GeoServer gs;
public WCSEOExtendedCapabilitiesProvider(GeoServer gs, EOCoverageResourceCodec codec) {
this.codec = codec;
this.gs = gs;
}
private boolean isEarthObservationEnabled() {
WCSInfo wcs = gs.getService(WCSInfo.class);
Boolean enabled = wcs.getMetadata().get(WCSEOMetadata.ENABLED.key, Boolean.class);
return Boolean.TRUE.equals(enabled);
}
/**
* IGN : Do we still need to host this xsd ?
*/
public String[] getSchemaLocations(String schemaBaseURL) {
if(!isEarthObservationEnabled()) {
return new String[0];
}
String schemaLocation = ResponseUtils.buildURL(schemaBaseURL, "schemas/wcseo/1.0/wcsEOGetCapabilites.xsd",
null, URLType.RESOURCE);
return new String[] { WCSEOMetadata.NAMESPACE, schemaLocation };
}
@Override
public void registerNamespaces(NamespaceSupport namespaces) {
if(isEarthObservationEnabled()) {
namespaces.declarePrefix("wcseo", WCSEOMetadata.NAMESPACE);
}
}
@Override
public void encodeExtendedOperations(org.geoserver.ExtendedCapabilitiesProvider.Translator tx,
WCSInfo wcs, GetCapabilitiesType request) throws IOException {
if(!isEarthObservationEnabled()) {
return;
}
AttributesImpl attributes = new AttributesImpl();
attributes.addAttribute(null, "name", "name", null, "DescribeEOCoverageSet");
tx.start("ows:Operation", attributes);
final String url = appendQueryString(buildURL(request.getBaseUrl(), "wcs", null, URLMangler.URLType.SERVICE), "");
tx.start("ows:DCP");
tx.start("ows:HTTP");
attributes = new AttributesImpl();
attributes.addAttribute("", "xlink:href", "xlink:href", "", url);
element(tx, "ows:Get", null, attributes);
tx.end("ows:HTTP");
tx.end("ows:DCP");
attributes = new AttributesImpl();
attributes.addAttribute("", "xlink:href", "xlink:href", "", url);
tx.start("ows:DCP");
tx.start("ows:HTTP");
element(tx, "ows:Post", null, attributes);
tx.end("ows:HTTP");
tx.end("ows:DCP");
tx.end("ows:Operation");
Integer defaultCount = wcs.getMetadata().get(WCSEOMetadata.COUNT_DEFAULT.key, Integer.class);
if(defaultCount != null) {
tx.start("ows:Constraint", atts("name", "CountDefault"));
element(tx, "ows:NoValues", null, null);
element(tx, "ows:DefaultValue", String.valueOf(defaultCount), null);
tx.end("ows:Constraint");
}
}
@Override
public void encodeExtendedContents(org.geoserver.ExtendedCapabilitiesProvider.Translator tx,
WCSInfo wcs, List<CoverageInfo> coverages, GetCapabilitiesType request) throws IOException {
Boolean enabled = wcs.getMetadata().get(WCSEOMetadata.ENABLED.key, Boolean.class);
if(enabled == null || !enabled) {
return;
}
for (CoverageInfo ci : coverages) {
Boolean dataset = ci.getMetadata().get(WCSEOMetadata.DATASET.key, Boolean.class);
DimensionInfo time = ci.getMetadata().get(ResourceInfo.TIME, DimensionInfo.class);
if(dataset != null && dataset && time != null && time.isEnabled()) {
tx.start("wcseo:DatasetSeriesSummary");
ReferencedEnvelope bbox = ci.getLatLonBoundingBox();
tx.start("ows:WGS84BoundingBox");
element(tx, "ows:LowerCorner", bbox.getMinX() + " " + bbox.getMinY(), null);
element(tx, "ows:UpperCorner", bbox.getMaxX() + " " + bbox.getMaxY(), null);
tx.end("ows:WGS84BoundingBox");
String datasetId = codec.getDatasetName(ci);
element(tx, "wcseo:DatasetSeriesId", datasetId, null);
GridCoverage2DReader reader = (GridCoverage2DReader) ci.getGridCoverageReader(null, null);
WCSDimensionsHelper dimensionsHelper = new WCSDimensionsHelper(time, reader, null);
tx.start("gml:TimePeriod", atts("gml:id", datasetId + "__timeperiod"));
element(tx, "gml:beginPosition", dimensionsHelper.getBeginTime(), null);
element(tx, "gml:endPosition", dimensionsHelper.getEndTime(), null);
tx.end("gml:TimePeriod");
tx.end("wcseo:DatasetSeriesSummary");
}
}
}
private void element(org.geoserver.ExtendedCapabilitiesProvider.Translator tx, String element,
String content, AttributesImpl attributes) {
tx.start(element, attributes);
if(content != null) {
tx.chars(content);
}
tx.end(element);
}
Attributes atts(String... atts) {
AttributesImpl attributes = new AttributesImpl();
for (int i = 0; i < atts.length; i += 2) {
attributes.addAttribute(null, atts[i], atts[i], null, atts[i + 1]);
}
return attributes;
}
}