/* * 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); } } }