/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.gwc.wmts;
import org.geoserver.gwc.wmts.dimensions.Dimension;
import org.geoserver.wms.WMS;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.xml.transform.TransformerBase;
import org.geotools.xml.transform.Translator;
import org.opengis.filter.Filter;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* XML transformer for the describe domains operation.
*/
class DescribeDomainsTransformer extends TransformerBase {
public DescribeDomainsTransformer(WMS wms) {
setIndentation(2);
setEncoding(wms.getCharSet());
}
@Override
public Translator createTranslator(ContentHandler handler) {
return new TranslatorSupport(handler);
}
class TranslatorSupport extends TransformerBase.TranslatorSupport {
public TranslatorSupport(ContentHandler handler) {
super(handler, null, null);
}
@Override
public void encode(Object object) throws IllegalArgumentException {
if (!(object instanceof Domains)) {
throw new IllegalArgumentException("Expected domains info but instead got: " + object.getClass().getCanonicalName());
}
Domains domains = (Domains) object;
Attributes nameSpaces = createAttributes(new String[]{
"xmlns", "http://demo.geo-solutions.it/share/wmts-multidim/wmts_multi_dimensional.xsd",
"xmlns:ows", "http://www.opengis.net/ows/1.1"
});
start("Domains", nameSpaces);
Map<String, Tuple<Integer, List<String>>> domainsValues = new HashMap<>();
ReferencedEnvelope referencedEnvelope = new ReferencedEnvelope();
domains.getDimensions().forEach(dimension -> {
Tuple<ReferencedEnvelope, Tuple<Integer, List<String>>> dimensionValues = dimension.getDomainValuesAsStrings(domains.getFilter());
referencedEnvelope.expandToInclude(dimensionValues.first);
domainsValues.put(dimension.getDimensionName(), dimensionValues.second);
});
handleBoundingBox(referencedEnvelope);
domainsValues.entrySet().forEach(dimensionValues -> handleDimension(dimensionValues.getKey(), dimensionValues.getValue()));
end("Domains");
}
private void handleBoundingBox(ReferencedEnvelope boundingBox) {
if (boundingBox == null) {
return;
}
start("SpaceDomain");
CoordinateReferenceSystem crs = boundingBox.getCoordinateReferenceSystem();
Attributes attributes = createAttributes(new String[]{
"CRS", crs == null ? "EPSG:4326" : CRS.toSRS(crs),
"minx", String.valueOf(boundingBox.getMinX()),
"miny", String.valueOf(boundingBox.getMinY()),
"maxx", String.valueOf(boundingBox.getMaxX()),
"maxy", String.valueOf(boundingBox.getMaxY()),
});
element("BoundingBox", "", attributes);
end("SpaceDomain");
}
private void handleDimension(String dimensionName, Tuple<Integer, List<String>> domainsValuesAsStrings) {
start("DimensionDomain");
element("ows:Identifier", dimensionName);
element("Domain", domainsValuesAsStrings.second.stream().collect(Collectors.joining(",")));
element("Size", String.valueOf(domainsValuesAsStrings.first));
end("DimensionDomain");
}
}
}