/*
* GeoTools - OpenSource mapping toolkit
* http://geotools.org
* (C) 2002-2006, Geotools Project Managment Committee (PMC)
*
* 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; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import org.geotools.gml.GMLFilterDocument;
import org.geotools.gml.GMLFilterGeometry;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.ParserAdapter;
import org.xml.sax.helpers.XMLFilterImpl;
public class FilterFilterTest extends TestCase {
public static void testWithoutFunction() throws Exception {
String filter = "" +
"" +
"" +
"" +
"" +
"the_geom" +
"" +
"" +
"-99.79800943339099,30.41833858217994 -99.79800943339099,30.71813913408305 -99.49820888148788,30.71813913408305 -99.49820888148788,30.41833858217994 -99.79800943339099,30.41833858217994" +
"" +
"" +
"" +
"" +
"the_geom" +
"-124.731422,24.955967 -66.969849,49.371735" +
"" +
"" +
"" +
"" +
"";
StringReader reader = new StringReader( filter );
InputSource requestSource = new InputSource(reader);
// instantiante parsers and content handlers
MyHandler contentHandler = new MyHandler();
FilterFilter filterParser = new FilterFilter(contentHandler, null);
GMLFilterGeometry geometryFilter = new GMLFilterGeometry(filterParser);
GMLFilterDocument documentFilter = new GMLFilterDocument(geometryFilter);
// read in XML file and parse to content handler
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
ParserAdapter adapter = new ParserAdapter(parser.getParser());
adapter.setContentHandler(documentFilter);
adapter.parse(requestSource);
assertEquals(contentHandler.filters.size(),1);
LogicFilterImpl f = (LogicFilterImpl) contentHandler.filters.get(0);
List sub = f.getSubFilters();
assertEquals(2,sub.size());
Filter f1 = (Filter) sub.get(0);
Filter f2 = (Filter) sub.get(1);
assertEquals(FilterType.GEOMETRY_INTERSECTS,f1.getFilterType());
assertEquals(FilterType.GEOMETRY_BBOX, f2.getFilterType());
}
public void testWithFunction() throws Exception {
String filter = "" +
"" +
"" +
"" +
"" +
"" +
"the_geom" +
"" +
"" +
"-99.79800943339099,30.41833858217994 -99.79800943339099,30.71813913408305 -99.49820888148788,30.71813913408305 -99.49820888148788,30.41833858217994 -99.79800943339099,30.41833858217994" +
"" +
"" +
"" +
"" +
"the_geom" +
"-124.731422,24.955967 -66.969849,49.371735" +
"" +
"" +
"" +
"the_geom" +
"Point" +
"" +
"" +
"" +
"" +
"";
StringReader reader = new StringReader( filter );
InputSource requestSource = new InputSource(reader);
// instantiante parsers and content handlers
MyHandler contentHandler = new MyHandler();
FilterFilter filterParser = new FilterFilter(contentHandler, null);
GMLFilterGeometry geometryFilter = new GMLFilterGeometry(filterParser);
GMLFilterDocument documentFilter = new GMLFilterDocument(geometryFilter);
// read in XML file and parse to content handler
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
ParserAdapter adapter = new ParserAdapter(parser.getParser());
adapter.setContentHandler(documentFilter);
adapter.parse(requestSource);
assertEquals(contentHandler.filters.size(),1);
}
public void testWithFunction2() throws Exception {
String filter = ""+
""+
""+
""+
""+
""+
""+
""+
"Feature"+
""+
""+
""+
""+
"the_geom"+
""+
"Point"+
""+
""+
""+
""+
""+
""+
""+
""+
""+
"the_geom"+
""+
"MultiPoint"+
""+
""+
""+
""+
""+
""+
""+
""+
"";
StringReader reader = new StringReader( filter );
InputSource requestSource = new InputSource(reader);
// instantiante parsers and content handlers
MyHandler contentHandler = new MyHandler();
FilterFilter filterParser = new FilterFilter(contentHandler, null);
GMLFilterGeometry geometryFilter = new GMLFilterGeometry(filterParser);
GMLFilterDocument documentFilter = new GMLFilterDocument(geometryFilter);
// Logger logger = Logger.getLogger("org.geotools.filter");
// logger.setLevel(Level.ALL);
// ConsoleHandler consoleHandler = new ConsoleHandler();
// consoleHandler.setLevel(Level.ALL);
// logger.addHandler(consoleHandler);
// read in XML file and parse to content handler
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
ParserAdapter adapter = new ParserAdapter(parser.getParser());
adapter.setContentHandler(documentFilter);
adapter.parse(requestSource);
// assertEquals(contentHandler.filters.size(),1);
}
/**
* As for GEOT-821, this test ensures that the filter parser makes proper use
* of the characters(...) method in ContentHandler to not truncate the content
* of attribute names
*
* @throws Exception
*/
public void testLargeFilter() throws Exception{
final int filterCount = 100;
String filter = "" +
"roadeventid" +
"" +
"";
for(int i = 0; i < filterCount; i++){
StringBuffer attName = new StringBuffer();
for(int repCount = 0; repCount <= i; repCount++){
attName.append("eventtype-" + repCount + "_");
}
filter += "" + attName + "" +
"literal-" + i + "" +
"";
}
filter += "" +
"" +
"" +
"";
StringReader reader = new StringReader( filter );
InputSource requestSource = new InputSource(reader);
// instantiante parsers and content handlers
MyHandler contentHandler = new MyHandler();
FilterFilter filterParser = new FilterFilter(contentHandler, null);
GMLFilterGeometry geometryFilter = new GMLFilterGeometry(filterParser);
GMLFilterDocument documentFilter = new GMLFilterDocument(geometryFilter);
Logger logger = Logger.getLogger("org.geotools.filter");
logger.setLevel(Level.INFO);
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.INFO);
logger.addHandler(consoleHandler);
// read in XML file and parse to content handler
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
ParserAdapter adapter = new ParserAdapter(parser.getParser());
adapter.setContentHandler(documentFilter);
adapter.parse(requestSource);
assertEquals(1, contentHandler.filters.size());
Filter f = (Filter)contentHandler.filters.get(0);
assertTrue(f instanceof LogicFilter);
assertEquals(FilterType.LOGIC_OR, f.getFilterType());
int i = 0;
for(Iterator filters = ((LogicFilter)f).getFilterIterator(); filters.hasNext(); i++){
CompareFilter subFitler = (CompareFilter)filters.next();
StringBuffer attName = new StringBuffer();
for(int repCount = 0; repCount <= i; repCount++){
attName.append("eventtype-" + repCount + "_");
}
String parsedName = ((AttributeExpression)subFitler.getLeftValue()).getAttributePath();
try{
assertEquals("at index " + i, attName.toString(), parsedName);
}catch(AssertionFailedError e){
Logger.getLogger("org.geotools.filter").warning("expected " + attName + ",\n but was " + parsedName);
throw e;
}
assertEquals("literal-" + i, ((LiteralExpression)subFitler.getRightValue()).getLiteral());
}
assertEquals(filterCount, i);
}
static class MyHandler extends XMLFilterImpl implements FilterHandler {
public List filters = new ArrayList();
public void filter(Filter filter) {
filters.add(filter);
}
}
}