/* (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.wms;
import static org.junit.Assert.assertTrue;
import java.sql.Date;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.xml.namespace.QName;
import org.geoserver.catalog.DimensionInfo;
import org.geoserver.catalog.DimensionPresentation;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.impl.DimensionInfoImpl;
import org.geoserver.data.test.MockData;
import org.geoserver.data.test.SystemTestData;
import org.geotools.data.FeatureSource;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.geotools.util.DateRange;
import org.geotools.util.NumberRange;
import org.junit.Before;
import org.junit.Test;
import org.opengis.filter.Filter;
/**
*
* @author Ian Schneider <ischneider@opengeo.org>
*/
public class WMSTest extends WMSTestSupport {
static final QName TIME_WITH_START_END = new QName(MockData.SF_URI, "TimeWithStartEnd", MockData.SF_PREFIX);
WMS wms;
@Override
protected void onSetUp(SystemTestData testData) throws Exception {
super.onSetUp(testData);
testData.addVectorLayer(TIME_WITH_START_END,Collections.EMPTY_MAP,"TimeElevationWithStartEnd.properties",
getClass(),getCatalog());
}
protected void setupStartEndTimeDimension(String featureTypeName, String dimension, String start, String end) {
FeatureTypeInfo info = getCatalog().getFeatureTypeByName(featureTypeName);
DimensionInfo di = new DimensionInfoImpl();
di.setEnabled(true);
di.setAttribute(start);
di.setEndAttribute(end);
di.setPresentation(DimensionPresentation.LIST);
info.getMetadata().put(dimension, di);
getCatalog().save(info);
}
@Before
public void setWMS() throws Exception {
wms = new WMS(getGeoServer());
}
@Test
public void testGetTimeElevationToFilterStartEndDate() throws Exception {
setupStartEndTimeDimension(TIME_WITH_START_END.getLocalPart(), "time", "startTime", "endTime");
setupStartEndTimeDimension(TIME_WITH_START_END.getLocalPart(), "elevation", "startElevation", "endElevation");
/* Reference for test assertions
TimeElevation.0=0|2012-02-11|2012-02-12|1|2
TimeElevation.1=1|2012-02-12|2012-02-13|2|3
TimeElevation.2=2|2012-02-11|2012-02-14|1|3
*/
doTimeElevationFilter( Date.valueOf("2012-02-10"), null);
doTimeElevationFilter( Date.valueOf("2012-02-11"), null, 0, 2);
doTimeElevationFilter( Date.valueOf("2012-02-12"), null, 0, 1, 2);
doTimeElevationFilter( Date.valueOf("2012-02-13"), null, 1, 2);
doTimeElevationFilter( Date.valueOf("2012-02-15"), null);
//Test start and end before all ranges.
doTimeElevationFilter(
new DateRange(Date.valueOf("2012-02-09"), Date.valueOf("2012-02-10")), null
);
//Test start before and end during a range.
doTimeElevationFilter(
new DateRange(Date.valueOf("2012-02-09"), Date.valueOf("2012-02-11")), null,
0, 2
);
//Test start on and end after or during a range.
doTimeElevationFilter(
new DateRange(Date.valueOf("2012-02-11"), Date.valueOf("2012-02-13")), null,
0, 1, 2
);
//Test start before and end after all ranges.
doTimeElevationFilter(
new DateRange(Date.valueOf("2012-02-09"), Date.valueOf("2012-02-14")), null,
0, 1, 2
);
//Test start during and end after a range.
doTimeElevationFilter(
new DateRange(Date.valueOf("2012-02-13"), Date.valueOf("2012-02-14")), null,
1,2
);
//Test start during and end during a range.
doTimeElevationFilter(
new DateRange(Date.valueOf("2012-02-12"), Date.valueOf("2012-02-13")), null,
0,1,2
);
//Test start and end after all ranges.
doTimeElevationFilter(
new DateRange(Date.valueOf("2012-02-15"), Date.valueOf("2012-02-16")), null
);
doTimeElevationFilter( null, 0);
doTimeElevationFilter( null, 1, 0 , 2);
doTimeElevationFilter( null, 2, 0 , 1, 2);
doTimeElevationFilter( null, 3, 1 , 2);
doTimeElevationFilter( null, 4);
doTimeElevationFilter( null, new NumberRange(Integer.class,-1,0));
doTimeElevationFilter( null, new NumberRange(Integer.class,-1,1),0,2);
doTimeElevationFilter( null, new NumberRange(Integer.class,1,3),0,1,2);
doTimeElevationFilter( null, new NumberRange(Integer.class,-1,4),0,1,2);
doTimeElevationFilter( null, new NumberRange(Integer.class,3,4),1,2);
doTimeElevationFilter( null, new NumberRange(Integer.class,4,5));
// combined date/elevation - this should be an 'and' filter
doTimeElevationFilter( Date.valueOf("2012-02-12"), 2, 0, 1, 2);
// disjunct verification
doTimeElevationFilter( Date.valueOf("2012-02-11"), 3, 2);
}
public void doTimeElevationFilter( Object time, Object elevation, Integer... expectedIds) throws Exception {
FeatureTypeInfo timeWithStartEnd = getCatalog().getFeatureTypeByName(TIME_WITH_START_END.getLocalPart());
FeatureSource fs = timeWithStartEnd.getFeatureSource(null, null);
List times = time == null ? null : Arrays.asList(time);
List elevations = elevation == null ? null : Arrays.asList(elevation);
Filter filter = wms.getTimeElevationToFilter(times, elevations, timeWithStartEnd);
FeatureCollection features = fs.getFeatures(filter);
Set<Integer> results = new HashSet<Integer>();
FeatureIterator it = features.features();
try {
while (it.hasNext()) {
results.add( (Integer) it.next().getProperty("id").getValue());
}
} finally {
it.close();
}
assertTrue("expected " + Arrays.toString(expectedIds) + " but got " + results,
results.containsAll(Arrays.asList(expectedIds)));
assertTrue("expected " + Arrays.toString(expectedIds) + " but got " + results,
Arrays.asList(expectedIds).containsAll(results));
}
}