/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, 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.xml.ogc;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringBufferInputStream;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.filter.FilterDOMParser;
import org.geotools.test.TestData;
import org.geotools.xml.DocumentFactory;
import org.geotools.xml.DocumentWriter;
import org.geotools.xml.XMLHandlerHints;
import org.geotools.xml.filter.FilterSchema;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory2;
import org.opengis.filter.PropertyIsNull;
import org.opengis.filter.identity.FeatureId;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* This code uses the filter parser to generate test cases, and runs it through the encoder.
*
* TODO create the filters manually, and check the output.
*
* @author James MacGill, CCG
* @author Rob Hranac, TOPP
* @author David Zwiers
*
* @source $URL$
*/
public class XMLEncoderTest extends TestCase {
/** Standard logging instance */
protected static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger(
"org.geotools.filter");
/** Constructor with test name. */
String dataFolder = "";
public XMLEncoderTest(String testName) {
super(testName);
//_log.getLoggerRepository().setThreshold(Level.DEBUG);
LOGGER.finer("running XMLEncoderTests");
dataFolder = System.getProperty("dataFolder");
if( dataFolder == null){
try {
TestData.file( this, null );
} catch (IOException e) {
LOGGER.finer("data folder is unavailable" + dataFolder);
}
}
if (dataFolder == null) {
//then we are being run by maven
dataFolder = System.getProperty("basedir");
dataFolder = "file:////" + "tests/unit/testData"; //url.toString();
LOGGER.finer("data folder is " + dataFolder);
}
}
/**
* Main for test runner.
*
* @param args DOCUMENT ME!
*/
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
/**
* Required suite builder.
*
* @return A test suite for this unit test.
*/
public static Test suite() {
TestSuite suite = new TestSuite(XMLEncoderTest.class);
return suite;
}
public void test1() throws Exception {
Filter test = parseDocument("test1.xml");
assertNotNull( test );
StringWriter output = new StringWriter();
DocumentWriter.writeFragment( test, FilterSchema.getInstance(), output, null);
//System.out.println( output );
InputStream stream = new StringBufferInputStream( output.toString() );
Object o = DocumentFactory.getInstance( stream, new HashMap(), Level.FINEST );
assertNotNull( o );
assertEquals( test, o );
//LOGGER.fine("parsed filter is: " + test);
}
public void test3a() throws Exception {
Filter test = parseDocument("test3a.xml");
//LOGGER.fine("parsed filter is: " + test);
}
public void test3b() throws Exception {
Filter test = parseDocument("test3b.xml");
StringWriter output = new StringWriter();
DocumentWriter.writeFragment( test, FilterSchema.getInstance(), output, null);
//LOGGER.fine("parsed filter is: " + test);
}
public void test4() throws Exception {
Filter test = parseDocument("test4.xml");
StringWriter output = new StringWriter();
DocumentWriter.writeFragment( test, FilterSchema.getInstance(), output, null);
//LOGGER.fine("parsed filter is: " + test);
}
public void test5() throws Exception {
Filter test = parseDocument("test5.xml");
StringWriter output = new StringWriter();
DocumentWriter.writeFragment( test, FilterSchema.getInstance(), output, null);
//LOGGER.fine("parsed filter is: " + test);
}
public void test8() throws Exception {
Filter test = parseDocument("test8.xml");
StringWriter output = new StringWriter();
DocumentWriter.writeFragment(test,
FilterSchema.getInstance(), output, null);
//System.out.println(output);
//LOGGER.fine("parsed filter is: " + test);
}
public void test9() throws Exception {
Filter test = parseDocument("test9.xml");
StringWriter output = new StringWriter();
DocumentWriter.writeFragment( test, FilterSchema.getInstance(), output, null);
//LOGGER.fine("parsed filter is: " + test);
}
public void test12() throws Exception {
Filter test = parseDocument("test12.xml");
StringWriter output = new StringWriter();
DocumentWriter.writeFragment( test, FilterSchema.getInstance(), output, null);
// LOGGER.fine("parsed filter is: " + test);
}
public void test13() throws Exception {
Filter test = parseDocument("test13.xml");
StringWriter output = new StringWriter();
DocumentWriter.writeFragment( test, FilterSchema.getInstance(), output, null);
//LOGGER.fine("parsed filter is: " + test);
}
public void test14() throws Exception {
Filter test = parseDocument("test14.xml");
StringWriter output = new StringWriter();
DocumentWriter.writeFragment( test, FilterSchema.getInstance(), output, null);
//LOGGER.fine("parsed filter is: " + test);
}
public void test28() throws Exception {
Filter test = parseDocument("test28.xml");
StringWriter output = new StringWriter();
DocumentWriter.writeFragment( test, FilterSchema.getInstance(), output, null);
//System.out.println(output);
// LOGGER.fine("parsedfilter is: " + test);
}
public Filter parseDocument(String uri) throws Exception {
Filter filter = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse(TestData.getResource(this, uri).toExternalForm());
// LOGGER.fine("exporting " + uri);
// first grab a filter node
NodeList nodes = dom.getElementsByTagName("Filter");
for (int j = 0; j < nodes.getLength(); j++) {
Element filterNode = (Element) nodes.item(j);
NodeList list = filterNode.getChildNodes();
Node child = null;
for (int i = 0; i < list.getLength(); i++) {
child = list.item(i);
//_log.getLoggerRepository().setThreshold(Level.INFO);
if ((child == null)
|| (child.getNodeType() != Node.ELEMENT_NODE)) {
continue;
}
filter = FilterDOMParser.parseFilter(child);
StringWriter output = new StringWriter();
DocumentWriter.writeFragment(filter,
FilterSchema.getInstance(), output, null);
// System.out.println(output);
}
}
return filter;
}
// TODO test or ( null, and( fidFilter, null ) ) filter
public void testStrictHintComplexFilter() throws Exception {
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null);
PropertyIsNull null1=ff.isNull( ff.property("name") );
PropertyIsNull null2=ff.isNull( ff.property("geom") );
HashSet<FeatureId> set = new HashSet<FeatureId>();
set.add( ff.featureId("FID.1"));
Filter filter=ff.or( null2, ff.and( null1, ff.id( set ) ) );
StringWriter output = new StringWriter();
XMLHandlerHints hints = new XMLHandlerHints();
hints.put(XMLHandlerHints.FILTER_COMPLIANCE_STRICTNESS,
XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
DocumentWriter.writeFragment(filter, FilterSchema.getInstance(),
output, hints);
String string = output.toString().replaceAll("\\s", "");
String xml = "<Filterxmlns=\"http://www.opengis.net/ogc\"xmlns:gml=\"http://www.opengis.net/gml\">" +
"<PropertyIsNull><PropertyName>geom</PropertyName></PropertyIsNull>" +
"<Filter><FeatureIdfid=\"FID.1\"/></Filter>" +
"</Filter>";
assertEquals(
xml,
string);
// Note: Round trip doesn't work in this case because request may returns more features than "filter" will accept
}
public void testStrictHintOR() throws Exception {
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null);
HashSet<FeatureId> set = new HashSet<FeatureId>();
set.add( ff.featureId("FID.1"));
set.add( ff.featureId("FID.2"));
Filter filter=ff.id( set );
StringWriter output = new StringWriter();
XMLHandlerHints hints=new XMLHandlerHints();
hints.put(XMLHandlerHints.FILTER_COMPLIANCE_STRICTNESS, XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
DocumentWriter.writeFragment(filter,
FilterSchema.getInstance(), output, hints);
String string=output.toString().replaceAll("\\s", "");
// The following test fails with Java 1.6. May be caused by some iteration order dependent code.
if (TestData.isBaseJavaPlatform()) {
assertEquals("<Filterxmlns=\"http://www.opengis.net/ogc\"xmlns:gml=\"http://www.opengis.net/gml\"><FeatureIdfid=\"FID.1\"/><FeatureIdfid=\"FID.2\"/></Filter>",
string);
}
ByteArrayInputStream byteStream = new ByteArrayInputStream(output.toString().getBytes());
Filter roundTrip=(Filter) DocumentFactory.getInstance(byteStream, null, Level.OFF);
assertEquals(filter, roundTrip);
}
}