/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2011, 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.filter.v2_0.bindings;
import java.util.List;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.filter.v1_1.FilterMockData;
import org.geotools.filter.v2_0.FES;
import org.geotools.filter.v2_0.FESTestSupport;
import org.opengis.filter.And;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.Id;
import org.opengis.filter.Or;
import org.opengis.filter.PropertyIsBetween;
import org.opengis.filter.PropertyIsEqualTo;
import org.opengis.filter.expression.Function;
import org.opengis.filter.expression.Literal;
import org.opengis.filter.expression.PropertyName;
import org.opengis.filter.spatial.BBOX;
import org.opengis.filter.spatial.Overlaps;
import org.opengis.filter.spatial.Within;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.vividsolutions.jts.geom.Polygon;
public class FilterTypeBindingTest extends FESTestSupport {
public void testParseId() throws Exception {
String xml =
"<fes:Filter xmlns:fes='http://www.opengis.net/fes/2.0'>" +
"<fes:ResourceId rid='InWaterA_1M.1234' version='1'/>" +
"</fes:Filter>";
buildDocument(xml);
Id f = (Id) parse();
assertNotNull(f);
assertEquals(1, f.getIdentifiers().size());
assertEquals("InWaterA_1M.1234", f.getIdentifiers().iterator().next().getID());
}
public void testParseSpatial() throws Exception {
String xml =
"<fes:Filter" +
" xmlns:fes='http://www.opengis.net/fes/2.0' " +
" xmlns:gml='http://www.opengis.net/gml/3.2' " +
" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
" xsi:schemaLocation='http://www.opengis.net/fes/2.0 http://schemas.opengis.net/filter/2.0/filterAll.xsd" +
" http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd'> " +
" <fes:Overlaps> " +
" <fes:ValueReference>Geometry</fes:ValueReference> " +
" <gml:Polygon gml:id='P1' srsName='urn:ogc:def:crs:EPSG::4326'> " +
" <gml:exterior> " +
" <gml:LinearRing> " +
" <gml:posList>10 10 20 20 30 30 40 40 10 10</gml:posList> " +
" </gml:LinearRing> " +
" </gml:exterior> " +
" </gml:Polygon> " +
" </fes:Overlaps> " +
"</fes:Filter> ";
buildDocument(xml);
Overlaps f = (Overlaps) parse();
assertNotNull(f);
PropertyName e1 = (PropertyName) f.getExpression1();
assertEquals("Geometry", e1.getPropertyName());
Literal e2 = (Literal) f.getExpression2();
assertTrue(e2.getValue() instanceof Polygon);
}
public void testParseLogical() throws Exception {
String xml =
"<fes:Filter " +
" xmlns:fes='http://www.opengis.net/fes/2.0' " +
" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
" xsi:schemaLocation='http://www.opengis.net/fes/2.0 " +
" http://schemas.opengis.net/filter/2.0/filterAll.xsd'> " +
" <fes:And> " +
" <fes:Or> " +
" <fes:PropertyIsEqualTo> " +
" <fes:ValueReference>FIELD1</fes:ValueReference> " +
" <fes:Literal>10</fes:Literal> " +
" </fes:PropertyIsEqualTo> " +
" <fes:PropertyIsEqualTo> " +
" <fes:ValueReference>FIELD1</fes:ValueReference> " +
" <fes:Literal>20</fes:Literal> " +
" </fes:PropertyIsEqualTo> " +
" </fes:Or> " +
" <fes:PropertyIsEqualTo> " +
" <fes:ValueReference>STATUS</fes:ValueReference> " +
" <fes:Literal>VALID</fes:Literal> " +
" </fes:PropertyIsEqualTo> " +
" </fes:And> " +
"</fes:Filter> ";
buildDocument(xml);
And f = (And) parse();
assertNotNull(f);
assertEquals(2, f.getChildren().size());
Or f1 = (Or) f.getChildren().get(0);
assertEquals(2, f1.getChildren().size());
PropertyIsEqualTo f11 = (PropertyIsEqualTo) f1.getChildren().get(0);
assertEquals("FIELD1", ((PropertyName)f11.getExpression1()).getPropertyName());
assertEquals("10", ((Literal)f11.getExpression2()).evaluate(null, String.class));
PropertyIsEqualTo f12 = (PropertyIsEqualTo) f1.getChildren().get(1);
assertEquals("FIELD1", ((PropertyName)f12.getExpression1()).getPropertyName());
assertEquals("20", ((Literal)f12.getExpression2()).evaluate(null, String.class));
PropertyIsEqualTo f2 = (PropertyIsEqualTo) f.getChildren().get(1);
assertEquals("STATUS", ((PropertyName)f2.getExpression1()).getPropertyName());
assertEquals("VALID", ((Literal)f2.getExpression2()).evaluate(null, String.class));
}
public void testParse1() throws Exception {
String xml =
"<fes:Filter " +
" xmlns:fes='http://www.opengis.net/fes/2.0' " +
" xmlns:gml='http://www.opengis.net/gml/3.2' " +
" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
" xsi:schemaLocation='http://www.opengis.net/fes/2.0 " +
" http://schemas.opengis.net/filter/2.0/filterAll.xsd " +
" http://www.opengis.net/gml/3.2 " +
" http://schemas.opengis.net/gml/3.2.1/gml.xsd'> " +
" <fes:And> " +
" <fes:Within> " +
" <fes:ValueReference>WKB_GEOM</fes:ValueReference> " +
" <gml:Polygon gml:id='P1' srsName='urn:ogc:def:crs:EPSG::4326'> " +
" <gml:exterior> " +
" <gml:LinearRing> " +
" <gml:posList>10 10 20 20 30 30 40 40 10 10</gml:posList> " +
" </gml:LinearRing> " +
" </gml:exterior> " +
" </gml:Polygon> " +
" </fes:Within> " +
" <fes:PropertyIsBetween> " +
" <fes:ValueReference>DEPTH</fes:ValueReference> " +
" <fes:LowerBoundary> " +
" <fes:Literal>400</fes:Literal> " +
" </fes:LowerBoundary> " +
" <fes:UpperBoundary> " +
" <fes:Literal>800</fes:Literal> " +
" </fes:UpperBoundary> " +
" </fes:PropertyIsBetween> " +
" </fes:And> " +
"</fes:Filter>";
buildDocument(xml);
And f = (And) parse();
assertNotNull(f);
assertEquals(2, f.getChildren().size());
Within f1 = (Within) f.getChildren().get(0);
assertEquals("WKB_GEOM", ((PropertyName)f1.getExpression1()).getPropertyName());
assertTrue(f1.getExpression2().evaluate(null) instanceof Polygon);
PropertyIsBetween f2 = (PropertyIsBetween) f.getChildren().get(1);
assertEquals("DEPTH", ((PropertyName)f2.getExpression()).getPropertyName());
assertEquals(400, f2.getLowerBoundary().evaluate(null, Integer.class).intValue());
assertEquals(800, f2.getUpperBoundary().evaluate(null, Integer.class).intValue());
}
public void testEncodeId() throws Exception {
Document doc = encode(FilterMockData.id(), FES.Filter);
assertEquals("fes:Filter", doc.getDocumentElement().getNodeName());
assertEquals(3, getElementsByQName(doc, FES.ResourceId).getLength());
}
public void testEncodeRsourceId() throws Exception {
Document doc = encode(FilterMockData.resourceId(), FES.Filter);
assertEquals("fes:Filter", doc.getDocumentElement().getNodeName());
print(doc);
assertEquals(4, getElementsByQName(doc, FES.ResourceId).getLength());
}
public void testEncodeSpatial() throws Exception {
Document doc = encode(FilterMockData.intersects(), FES.Filter);
assertEquals("fes:Filter", doc.getDocumentElement().getNodeName());
Element e = getElementByQName(doc, FES.Intersects);
assertNotNull(e);
assertNotNull(getElementByQName(e, FES.ValueReference));
assertNotNull(getElementByQName(e, FES.Literal));
}
public void testEncodeComparison() throws Exception {
Document doc = encode(FilterMockData.propertyIsEqualTo(), FES.Filter);
assertEquals("fes:Filter", doc.getDocumentElement().getNodeName());
Element e = getElementByQName(doc, FES.PropertyIsEqualTo);
assertNotNull(e);
assertEquals("true", e.getAttribute("matchCase"));
assertNotNull(getElementByQName(e, FES.ValueReference));
assertNotNull(getElementByQName(e, FES.Literal));
}
public void testEncodeLogic() throws Exception {
Document doc = encode(FilterMockData.and(), FES.Filter);
assertEquals("fes:Filter", doc.getDocumentElement().getNodeName());
Element e = getElementByQName(doc, FES.And);
assertNotNull(e);
assertNotNull(getElementByQName(e, FES.PropertyIsEqualTo));
assertNotNull(getElementByQName(e, FES.PropertyIsNotEqualTo));
}
public void testParseGmlWithoutSchemaLocation() throws Exception {
String xml =
"<fes:Filter xmlns:gml='http://www.opengis.net/gml/3.2' xmlns:fes='http://www.opengis.net/fes/2.0'> " +
" <fes:BBOX> " +
" <fes:ValueReference>it.geosolutions:the_geom</fes:ValueReference> " +
" <gml:Envelope srsName='urn:ogc:def:crs:EPSG::2154'> " +
" <gml:lowerCorner>834021 6504682</gml:lowerCorner> " +
" <gml:upperCorner>943396 6604240</gml:upperCorner> " +
" </gml:Envelope> " +
" </fes:BBOX> " +
"</fes:Filter> ";
buildDocument(xml);
BBOX f = (BBOX) parse();
assertTrue(f.getExpression1() instanceof PropertyName);
assertTrue(f.getExpression2() instanceof Literal);
}
public void testParseExtendedOperator() throws Exception {
final FilterFactory ff = CommonFactoryFinder.getFilterFactory(null);
String xml =
"<fes:Filter " +
"xmlns:fes='http://www.opengis.net/fes/2.0' xmlns:myops='http://www.someserver.com/myops/1.0'> " +
" <myops:strMatches> " +
" <fes:ValueReference>bar</fes:ValueReference> " +
" <fes:Literal>baz</fes:Literal> " +
" </myops:strMatches> " +
"</fes:Filter>";
buildDocument(xml);
PropertyIsEqualTo f = (PropertyIsEqualTo) parse();
assertTrue(f.getExpression1() instanceof Function);
assertTrue(f.getExpression2() instanceof Literal);
xml =
"<fes:Filter " +
"xmlns:fes='http://www.opengis.net/fes/2.0' xmlns:myops='http://www.someserver.com/myops/1.0'> " +
" <fes:And> " +
" <myops:strMatches> " +
" <fes:ValueReference>bar</fes:ValueReference> " +
" <fes:Literal>baz</fes:Literal> " +
" </myops:strMatches> " +
" <fes:PropertyIsBetween> " +
"<fes:ValueReference>Person/age</fes:ValueReference> " +
" <fes:LowerBoundary> " +
" <fes:Literal>18</fes:Literal> " +
" </fes:LowerBoundary> " +
" <fes:UpperBoundary> " +
" <fes:Literal>200</fes:Literal> " +
" </fes:UpperBoundary> " +
" </fes:PropertyIsBetween> " +
" </fes:And> " +
"</fes:Filter>";
buildDocument(xml);
And a = (And) parse();
List<Filter> ch = a.getChildren();
assertEquals(2, ch.size());
assertTrue(ch.get(0) instanceof PropertyIsEqualTo || ch.get(0) instanceof PropertyIsBetween);
assertTrue(ch.get(1) instanceof PropertyIsEqualTo || ch.get(1) instanceof PropertyIsBetween);
}
}