/* (c) 2014 - 2016 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.wms.wms_1_1_1;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo;
import static org.junit.Assert.assertEquals;
import org.geoserver.catalog.CatalogBuilder;
import org.geoserver.catalog.DimensionDefaultValueSetting;
import org.geoserver.catalog.DimensionInfo;
import org.geoserver.catalog.DimensionPresentation;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.DimensionDefaultValueSetting.Strategy;
import org.geoserver.catalog.impl.LayerGroupInfoImpl;
import org.geoserver.wms.WMSDimensionsTestSupport;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class DimensionsVectorCapabilitiesTest extends WMSDimensionsTestSupport {
@Test
public void testNoDimension() throws Exception {
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
// print(dom);
Element e = dom.getDocumentElement();
assertEquals("WMT_MS_Capabilities", e.getLocalName());
assertXpathEvaluatesTo("1", "count(//Layer[Name='sf:TimeElevation'])", dom);
assertXpathEvaluatesTo("0", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("0", "count(//Layer/Extent)", dom);
}
@Test
public void testDefaultElevationUnits() throws Exception {
setupVectorDimension(ResourceInfo.ELEVATION, "elevation", DimensionPresentation.LIST, null, null, null);
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
assertXpathEvaluatesTo(DimensionInfo.ELEVATION_UNITS, "//Layer/Dimension/@units", dom);
assertXpathEvaluatesTo(DimensionInfo.ELEVATION_UNIT_SYMBOL, "//Layer/Dimension/@unitSymbol", dom);
}
@Test
public void testEmptyDataSet() throws Exception {
for (DimensionPresentation p : DimensionPresentation.values()) {
setupVectorDimension(V_TIME_ELEVATION_EMPTY.getLocalPart(), ResourceInfo.TIME, "time",
p, null, null, null);
checkEmptyTimeDimensionAndExtent();
}
// clear time metadata
FeatureTypeInfo info = getCatalog().getFeatureTypeByName(V_TIME_ELEVATION_EMPTY.getLocalPart());
info.getMetadata().remove(ResourceInfo.TIME);
getCatalog().save(info);
for (DimensionPresentation p : DimensionPresentation.values()) {
setupVectorDimension(V_TIME_ELEVATION_EMPTY.getLocalPart(), ResourceInfo.ELEVATION,
"elevation", p, null, UNITS, UNIT_SYMBOL);
checkEmptyElevationDimensionAndExtent();
}
}
void checkEmptyElevationDimensionAndExtent() throws Exception {
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
Element e = dom.getDocumentElement();
assertEquals("WMT_MS_Capabilities", e.getLocalName());
// check dimension info exists
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo(UNITS, "//Layer/Dimension/@units", dom);
assertXpathEvaluatesTo(UNIT_SYMBOL, "//Layer/Dimension/@unitSymbol", dom);
// check we have the extent
assertXpathEvaluatesTo("1", "count(//Layer/Extent)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Extent/@name", dom);
assertXpathEvaluatesTo("0", "//Layer/Extent/@default", dom);
// and that it is empty
assertXpathEvaluatesTo("", "//Layer/Extent", dom);
}
void checkEmptyTimeDimensionAndExtent() throws Exception {
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
Element e = dom.getDocumentElement();
assertEquals("WMT_MS_Capabilities", e.getLocalName());
// check dimension info exists
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("time", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo("ISO8601", "//Layer/Dimension/@units", dom);
// check we have the extent
assertXpathEvaluatesTo("1", "count(//Layer/Extent)", dom);
assertXpathEvaluatesTo("time", "//Layer/Extent/@name", dom);
assertXpathEvaluatesTo(DimensionDefaultValueSetting.TIME_CURRENT, "//Layer/Extent/@default", dom);
// and that it is empty
assertXpathEvaluatesTo("", "//Layer/Extent", dom);
}
@Test
public void testElevationList() throws Exception {
setupVectorDimension(ResourceInfo.ELEVATION, "elevation", DimensionPresentation.LIST,
null, UNITS, UNIT_SYMBOL);
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
// print(dom);
// check dimension has been declared
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo(UNITS, "//Layer/Dimension/@units", dom);
assertXpathEvaluatesTo(UNIT_SYMBOL, "//Layer/Dimension/@unitSymbol", dom);
// check we have the extent
assertXpathEvaluatesTo("1", "count(//Layer/Extent)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Extent/@name", dom);
assertXpathEvaluatesTo("0.0", "//Layer/Extent/@default", dom);
assertXpathEvaluatesTo("0.0,1.0,2.0,3.0", "//Layer/Extent", dom);
}
@Test
public void testElevationContinuous() throws Exception {
setupVectorDimension(ResourceInfo.ELEVATION, "elevation",
DimensionPresentation.CONTINUOUS_INTERVAL, null, UNITS, UNIT_SYMBOL);
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
// print(dom);
// check dimension has been declared
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo(UNITS, "//Layer/Dimension/@units", dom);
assertXpathEvaluatesTo(UNIT_SYMBOL, "//Layer/Dimension/@unitSymbol", dom);
// check we have the extent
assertXpathEvaluatesTo("1", "count(//Layer/Extent)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Extent/@name", dom);
assertXpathEvaluatesTo("0.0", "//Layer/Extent/@default", dom);
assertXpathEvaluatesTo("0.0/3.0/0", "//Layer/Extent", dom);
}
@Test
public void testElevationDiscreteNoResolution() throws Exception {
setupVectorDimension(ResourceInfo.ELEVATION, "elevation",
DimensionPresentation.DISCRETE_INTERVAL, null, UNITS, UNIT_SYMBOL);
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
// print(dom);
// check dimension has been declared
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo(UNITS, "//Layer/Dimension/@units", dom);
assertXpathEvaluatesTo(UNIT_SYMBOL, "//Layer/Dimension/@unitSymbol", dom);
// check we have the extent
assertXpathEvaluatesTo("1", "count(//Layer/Extent)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Extent/@name", dom);
assertXpathEvaluatesTo("0.0", "//Layer/Extent/@default", dom);
assertXpathEvaluatesTo("0.0/3.0/1.0", "//Layer/Extent", dom);
}
@Test
public void testElevationDiscrerteManualResolution() throws Exception {
setupVectorDimension(ResourceInfo.ELEVATION, "elevation",
DimensionPresentation.DISCRETE_INTERVAL, 2.0, UNITS, UNIT_SYMBOL);
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
// print(dom);
// check dimension has been declared
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo(UNITS, "//Layer/Dimension/@units", dom);
assertXpathEvaluatesTo(UNIT_SYMBOL, "//Layer/Dimension/@unitSymbol", dom);
// check we have the extent
assertXpathEvaluatesTo("1", "count(//Layer/Extent)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Extent/@name", dom);
assertXpathEvaluatesTo("0.0", "//Layer/Extent/@default", dom);
assertXpathEvaluatesTo("0.0/3.0/2.0", "//Layer/Extent", dom);
}
@Test
public void testTimeList() throws Exception {
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.LIST, null, null, null);
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
//print(dom);
// check dimension has been declared
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("time", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo("ISO8601", "//Layer/Dimension/@units", dom);
// check we have the extent
assertXpathEvaluatesTo("1", "count(//Layer/Extent)", dom);
assertXpathEvaluatesTo("time", "//Layer/Extent/@name", dom);
assertXpathEvaluatesTo(DimensionDefaultValueSetting.TIME_CURRENT, "//Layer/Extent/@default", dom);
assertXpathEvaluatesTo("2011-05-01T00:00:00.000Z,2011-05-02T00:00:00.000Z,2011-05-03T00:00:00.000Z,2011-05-04T00:00:00.000Z", "//Layer/Extent", dom);
}
@Test
public void testTimeContinuous() throws Exception {
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.CONTINUOUS_INTERVAL,
null, null, null);
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
//print(dom);
// check dimension has been declared
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("time", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo("ISO8601", "//Layer/Dimension/@units", dom);
// check we have the extent
assertXpathEvaluatesTo("1", "count(//Layer/Extent)", dom);
assertXpathEvaluatesTo("time", "//Layer/Extent/@name", dom);
assertXpathEvaluatesTo(DimensionDefaultValueSetting.TIME_CURRENT, "//Layer/Extent/@default", dom);
assertXpathEvaluatesTo("2011-05-01T00:00:00.000Z/2011-05-04T00:00:00.000Z/PT1S", "//Layer/Extent", dom);
}
@Test
public void testTimeResolution() throws Exception {
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.DISCRETE_INTERVAL,
new Double(1000 * 60 * 60 * 24), null, null);
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
// print(dom);
// check dimension has been declared
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("time", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo("ISO8601", "//Layer/Dimension/@units", dom);
// check we have the extent
assertXpathEvaluatesTo("1", "count(//Layer/Extent)", dom);
assertXpathEvaluatesTo("time", "//Layer/Extent/@name", dom);
assertXpathEvaluatesTo(DimensionDefaultValueSetting.TIME_CURRENT, "//Layer/Extent/@default", dom);
assertXpathEvaluatesTo("2011-05-01T00:00:00.000Z/2011-05-04T00:00:00.000Z/P1D", "//Layer/Extent", dom);
}
@Test
public void testTimeContinuousInEarthObservationRootLayer() throws Exception {
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.CONTINUOUS_INTERVAL,
null, null, null);
LayerInfo rootLayer = getCatalog().getLayerByName("TimeElevation");
LayerGroupInfo eoProduct = new LayerGroupInfoImpl();
eoProduct.setName("EO Sample");
eoProduct.setMode(LayerGroupInfo.Mode.EO);
eoProduct.setRootLayer(rootLayer);
eoProduct.setRootLayerStyle(rootLayer.getDefaultStyle());
CatalogBuilder catBuilder = new CatalogBuilder(getCatalog());
catBuilder.calculateLayerGroupBounds(eoProduct);
eoProduct.getLayers().add(rootLayer);
getCatalog().add(eoProduct);
try {
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
print(dom);
// check dimension has been declared
assertXpathEvaluatesTo("1", "count(//Layer[Name[text() = 'EO Sample']]/Dimension)", dom);
assertXpathEvaluatesTo("time", "//Layer[Name[text() = 'EO Sample']]/Dimension/@name", dom);
assertXpathEvaluatesTo("ISO8601", "//Layer[Name[text() = 'EO Sample']]/Dimension/@units", dom);
// check we have the extent
assertXpathEvaluatesTo("1", "count(//Layer[Name[text() = 'EO Sample']]/Extent)", dom);
assertXpathEvaluatesTo("time", "//Layer[Name[text() = 'EO Sample']]/Extent/@name", dom);
assertXpathEvaluatesTo(DimensionDefaultValueSetting.TIME_CURRENT, "//Layer[Name[text() = 'EO Sample']]/Extent/@default", dom);
assertXpathEvaluatesTo("2011-05-01T00:00:00.000Z/2011-05-04T00:00:00.000Z/PT1S", "//Layer[Name[text() = 'EO Sample']]/Extent", dom);
} finally {
getCatalog().remove(eoProduct);
}
}
@Test
public void testDefaultTimeRangeFixed() throws Exception {
DimensionDefaultValueSetting defaultValueSetting = new DimensionDefaultValueSetting();
defaultValueSetting.setStrategyType(Strategy.FIXED);
defaultValueSetting.setReferenceValue("P1M/PRESENT");
setupResourceDimensionDefaultValue(V_TIME_ELEVATION, ResourceInfo.TIME, defaultValueSetting);
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
// print(dom);
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("time", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo("P1M/PRESENT", "//Layer/Extent/@default", dom);
}
@Test
public void testDefaultElevationRangeFixed() throws Exception {
DimensionDefaultValueSetting defaultValueSetting = new DimensionDefaultValueSetting();
defaultValueSetting.setStrategyType(Strategy.FIXED);
defaultValueSetting.setReferenceValue("-100/0");
setupResourceDimensionDefaultValue(V_TIME_ELEVATION, ResourceInfo.ELEVATION, defaultValueSetting);
Document dom = dom(get("wms?request=getCapabilities&version=1.1.1"), false);
// print(dom);
assertXpathEvaluatesTo("1", "count(//Layer/Dimension)", dom);
assertXpathEvaluatesTo("elevation", "//Layer/Dimension/@name", dom);
assertXpathEvaluatesTo("-100/0", "//Layer/Extent/@default", dom);
}
}