/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2015-2016, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.data.wfs.internal.v2_0.storedquery;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.opengis.wfs20.FeatureTypeType;
import net.opengis.wfs20.ParameterExpressionType;
import net.opengis.wfs20.ParameterType;
import net.opengis.wfs20.StoredQueryDescriptionType;
import net.opengis.wfs20.Wfs20Factory;
import org.geotools.data.wfs.internal.WFSConfig;
import org.geotools.data.wfs.internal.v2_0.FeatureTypeInfoImpl;
import org.geotools.filter.FilterFactoryImpl;
import org.junit.Before;
import org.junit.Test;
import org.opengis.filter.Filter;
public class ParameterTypeFactoryTest {
Wfs20Factory wfs20Factory;
FeatureTypeInfoImpl featureType;
StoredQueryConfiguration config;
StoredQueryDescriptionType desc;
@Before
public void setup() {
wfs20Factory = Wfs20Factory.eINSTANCE;
config = new StoredQueryConfiguration();
// Empty featureType
FeatureTypeType ftt = wfs20Factory.createFeatureTypeType();
ftt.setDefaultCRS("EPSG:1234");
featureType = new FeatureTypeInfoImpl(ftt, new WFSConfig());
desc = wfs20Factory.createStoredQueryDescriptionType();
}
// One parameter, no view params, no mappings => no parameters
@Test
public void testSimple() {
ParameterExpressionType param1 = wfs20Factory.createParameterExpressionType();
param1.setName("foo");
desc.getParameter().add(param1);
ParameterTypeFactory factory = new ParameterTypeFactory(config, desc, featureType);
List<ParameterType> params = factory.buildStoredQueryParameters(new HashMap<String, String>(), null);
assertEquals(0, params.size());
}
// One parameter, one view params (which matches), no mappings => single parameter
@Test
public void testSingleParameter() {
ParameterExpressionType param1 = wfs20Factory.createParameterExpressionType();
param1.setName("foo");
desc.getParameter().add(param1);
ParameterTypeFactory factory = new ParameterTypeFactory(config, desc, featureType);
Map<String, String> viewParams = new HashMap<String, String>();
viewParams.put("foo", "bar");
List<ParameterType> params = factory.buildStoredQueryParameters(viewParams, null);
assertEquals(1, params.size());
ParameterType tmp = params.get(0);
assertEquals("foo", tmp.getName());
assertEquals("bar", tmp.getValue());
}
// One parameter, one view params (which does not match), no mappings => no parameters
@Test
public void testUndefinedViewParameter() {
ParameterExpressionType param1 = wfs20Factory.createParameterExpressionType();
param1.setName("foo");
desc.getParameter().add(param1);
ParameterTypeFactory factory = new ParameterTypeFactory(config, desc, featureType);
Map<String, String> viewParams = new HashMap<String, String>();
viewParams.put("not-defined-in-spec", "bar");
List<ParameterType> params = factory.buildStoredQueryParameters(viewParams, null);
assertEquals(0, params.size());
}
// One parameter, no view params, default value mappings => default mapping
@Test
public void testDefaultMapping() {
ParameterExpressionType param1 = wfs20Factory.createParameterExpressionType();
param1.setName("foo");
desc.getParameter().add(param1);
ParameterMappingDefaultValue paramMapping = new ParameterMappingDefaultValue();
paramMapping.setParameterName("foo");
paramMapping.setDefaultValue("tiger");
config.getStoredQueryParameterMappings().add(paramMapping);
ParameterTypeFactory factory = new ParameterTypeFactory(config, desc, featureType);
Map<String, String> viewParams = new HashMap<String, String>();
List<ParameterType> params = factory.buildStoredQueryParameters(viewParams, null);
assertEquals(1, params.size());
ParameterType tmp = params.get(0);
assertEquals("foo", tmp.getName());
assertEquals("tiger", tmp.getValue());
}
// One parameter, view param for it, default value mappings => view param wins
@Test
public void testDefaultMappingOverridden() {
ParameterExpressionType param1 = wfs20Factory.createParameterExpressionType();
param1.setName("foo");
desc.getParameter().add(param1);
ParameterMappingDefaultValue paramMapping = new ParameterMappingDefaultValue();
paramMapping.setParameterName("foo");
paramMapping.setDefaultValue("tiger");
config.getStoredQueryParameterMappings().add(paramMapping);
ParameterTypeFactory factory = new ParameterTypeFactory(config, desc, featureType);
Map<String, String> viewParams = new HashMap<String, String>();
viewParams.put("foo", "bar");
List<ParameterType> params = factory.buildStoredQueryParameters(viewParams, null);
assertEquals(1, params.size());
ParameterType tmp = params.get(0);
assertEquals("foo", tmp.getName());
assertEquals("bar", tmp.getValue());
}
// One parameter, no view params, expression mappings (literals only) => test expression value
@Test
public void testCQLExpressionParameterLiterals() {
ParameterExpressionType param1 = wfs20Factory.createParameterExpressionType();
param1.setName("foo");
desc.getParameter().add(param1);
ParameterMappingExpressionValue paramMapping = new ParameterMappingExpressionValue();
paramMapping.setParameterName("foo");
paramMapping.setExpressionLanguage("CQL");
paramMapping.setExpression("numberFormat('0.0', 1+1*2)");
config.getStoredQueryParameterMappings().add(paramMapping);
ParameterTypeFactory factory = new ParameterTypeFactory(config, desc, featureType);
Map<String, String> viewParams = new HashMap<String, String>();
List<ParameterType> params = factory.buildStoredQueryParameters(viewParams, null);
assertEquals(1, params.size());
ParameterType tmp = params.get(0);
assertEquals("foo", tmp.getName());
assertEquals("3.0", tmp.getValue());
}
// Test that bbox parameters from the context are mapped appropriately
@Test
public void testCQLExpressionParameterContextBboxMappings() {
desc.getParameter().addAll(Arrays.asList(
createParam("param1"),
createParam("param2"),
createParam("param3"),
createParam("param4")));
config.getStoredQueryParameterMappings().addAll(Arrays.asList(
createBboxExpressionParam("param1", "bboxMinX"),
createBboxExpressionParam("param2", "bboxMinY"),
createBboxExpressionParam("param3", "bboxMaxX"),
createBboxExpressionParam("param4", "bboxMaxY")));
ParameterTypeFactory factory = new ParameterTypeFactory(config, desc, featureType);
Map<String, String> viewParams = new HashMap<String, String>();
Filter f = new FilterFactoryImpl().bbox("nada", -10.0, -5.0, 10.0, 5.0, "WGS:84");
List<ParameterType> params = factory.buildStoredQueryParameters(viewParams, f);
assertEquals(4, params.size());
// Current implementation preserves order and this code takes advantage of it. Preserving
// the order is not paramount, though
ParameterType tmp = params.get(0);
assertEquals("param1", tmp.getName());
assertEquals("-10.0", tmp.getValue());
tmp = params.get(1);
assertEquals("param2", tmp.getName());
assertEquals("-5.0", tmp.getValue());
tmp = params.get(2);
assertEquals("param3", tmp.getName());
assertEquals("10.0", tmp.getValue());
tmp = params.get(3);
assertEquals("param4", tmp.getName());
assertEquals("5.0", tmp.getValue());
}
private ParameterExpressionType createParam(String name) {
ParameterExpressionType ret = wfs20Factory.createParameterExpressionType();
ret.setName(name);
return ret;
}
private ParameterMappingExpressionValue createBboxExpressionParam(String name, String ctx) {
ParameterMappingExpressionValue ret = new ParameterMappingExpressionValue();
ret.setParameterName(name);
ret.setExpressionLanguage("CQL");
ret.setExpression("numberFormat('0.0', "+ctx+")");
return ret;
}
// One parameter, no view params, expression mappings (defaultSRS) => test expression value
@Test
public void testCQLExpressionSRS() {
ParameterExpressionType param1 = wfs20Factory.createParameterExpressionType();
param1.setName("foo");
desc.getParameter().add(param1);
ParameterMappingExpressionValue paramMapping = new ParameterMappingExpressionValue();
paramMapping.setParameterName("foo");
paramMapping.setExpressionLanguage("CQL");
paramMapping.setExpression("defaultSRS");
config.getStoredQueryParameterMappings().add(paramMapping);
ParameterTypeFactory factory = new ParameterTypeFactory(config, desc, featureType);
Map<String, String> viewParams = new HashMap<String, String>();
List<ParameterType> params = factory.buildStoredQueryParameters(viewParams, null);
assertEquals(1, params.size());
ParameterType tmp = params.get(0);
assertEquals("foo", tmp.getName());
assertEquals("EPSG:1234", tmp.getValue());
}
// One parameter, no declared view params, expression mappings (viewparam) => test expression value
@Test
public void testCQLExpressionViewParamMapping() {
ParameterExpressionType param1 = wfs20Factory.createParameterExpressionType();
param1.setName("foo");
desc.getParameter().add(param1);
ParameterMappingExpressionValue paramMapping = new ParameterMappingExpressionValue();
paramMapping.setParameterName("foo");
paramMapping.setExpressionLanguage("CQL");
paramMapping.setExpression("viewparam:mapped");
config.getStoredQueryParameterMappings().add(paramMapping);
ParameterTypeFactory factory = new ParameterTypeFactory(config, desc, featureType);
Map<String, String> viewParams = new HashMap<String, String>();
viewParams.put("mapped", "stuff");
List<ParameterType> params = factory.buildStoredQueryParameters(viewParams, null);
assertEquals(1, params.size());
ParameterType tmp = params.get(0);
assertEquals("foo", tmp.getName());
assertEquals("stuff", tmp.getValue());
}
@Test
public void testCQLExpressionStringConcatenation() {
ParameterExpressionType param1 = wfs20Factory.createParameterExpressionType();
param1.setName("foo");
desc.getParameter().add(param1);
ParameterMappingExpressionValue paramMapping = new ParameterMappingExpressionValue();
paramMapping.setParameterName("foo");
paramMapping.setExpressionLanguage("CQL");
paramMapping.setExpression("concatenate(numberFormat('0.0', 1+1*2), ',10')");
config.getStoredQueryParameterMappings().add(paramMapping);
ParameterTypeFactory factory = new ParameterTypeFactory(config, desc, featureType);
Map<String, String> viewParams = new HashMap<String, String>();
List<ParameterType> params = factory.buildStoredQueryParameters(viewParams, null);
assertEquals(1, params.size());
ParameterType tmp = params.get(0);
assertEquals("foo", tmp.getName());
assertEquals("3.0,10", tmp.getValue());
}
}