/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2012, 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.gml3.v3_2;
import com.vividsolutions.jts.geom.MultiPolygon;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.StringReader;
import java.net.URL;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import junit.framework.TestCase;
import org.apache.commons.io.FileUtils;
import org.eclipse.xsd.XSDSchema;
import org.geotools.data.DataUtilities;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.geotools.referencing.CRS;
import org.geotools.xml.Parser;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.w3c.dom.Document;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
import org.xml.sax.SAXException;
/**
*
*
* @source $URL$
*/
public class GMLParsingTest extends TestCase {
public void testGML() throws Exception {
XSDSchema gml = GML.getInstance().getSchema();
assertFalse( gml.getTypeDefinitions().isEmpty() );
}
public void testParseFeatureCollection() throws Exception {
File schema = File.createTempFile("test", "xsd");
schema.deleteOnExit();
FileUtils.copyURLToFile(getClass().getResource("test.xsd"), schema);
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
getClass().getResourceAsStream( "test.xml" )
);
URL schemaURL = DataUtilities.fileToURL( schema.getAbsoluteFile() );
dom.getDocumentElement().setAttribute( "xsi:schemaLocation", "http://www.geotools.org/test " + schemaURL.getFile() );
ByteArrayOutputStream out = new ByteArrayOutputStream();
TransformerFactory.newInstance().newTransformer().transform(
new DOMSource( dom ), new StreamResult( out ) );
GMLConfiguration config = new GMLConfiguration();
Parser p = new Parser( config );
Object o = p.parse( new ByteArrayInputStream( out.toByteArray() ) );
assertTrue( o instanceof FeatureCollection );
FeatureCollection features = (FeatureCollection) o;
assertEquals( 3, features.size() );
FeatureIterator fi = features.features();
try {
for ( int i = 0; i < 3; i++ ) {
assertTrue( fi.hasNext() );
SimpleFeature f = (SimpleFeature) fi.next();
assertTrue( f.getDefaultGeometry() instanceof Point );
Point point = (Point) f.getDefaultGeometry();
assertEquals( i/1d, point.getX(), 0.1 );
assertEquals( i/1d, point.getX(), 0.1 );
assertEquals( i, f.getAttribute( "count" ) );
}
}
finally {
fi.close();
}
}
/**
* Parse an srsName from a gml:Point.
*
* @param srsName the srsName attribute on the gml:Point
* @return the parsed CoordinateReferenceSystem
*/
private static CoordinateReferenceSystem parsePointSrsname(String srsName) {
Parser parser = new Parser(new GMLConfiguration());
String text = "<gml:Point " //
+ "xmlns:gml=\"http://www.opengis.net/gml/3.2\" " //
+ "srsName=\"" + srsName + "\">" //
+ "<gml:pos>1 2</gml:pos>" //
+ "</gml:Point>";
try {
Point point = (Point) parser.parse(new StringReader(text));
return (CoordinateReferenceSystem) point.getUserData();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* Test parsing of an srsName in EPSG code format.
*/
public void testParseEpsgSrsname() throws Exception {
assertEquals(CRS.decode("EPSG:4326"), parsePointSrsname("EPSG:4326"));
}
/**
* Test parsing of an srsName in OGC HTTP URL format.
*/
public void testParseOgcHttpUrlSrsname() throws Exception {
assertEquals(CRS.decode("EPSG:4326"),
parsePointSrsname("http://www.opengis.net/gml/srs/epsg.xml#4326"));
}
/**
* Test parsing of an srsName in OGC URN Experimental format.
*/
public void testParseOgcUrnExperimentalSrsname() throws Exception {
assertEquals(CRS.decode("EPSG:4326"), parsePointSrsname("urn:x-ogc:def:crs:EPSG::4326"));
}
/**
* Test parsing of an srsName in OGC URN format.
*/
public void testParseOgcUrnSrsname() throws Exception {
assertEquals(CRS.decode("EPSG:4326"), parsePointSrsname("urn:ogc:def:crs:EPSG::4326"));
}
/**
* Test parsing of an srsName in OGC HTTP URI format.
*/
public void testParseOgcHttpUriSrsname() throws Exception {
assertEquals(CRS.decode("EPSG:4326"),
parsePointSrsname("http://www.opengis.net/def/crs/EPSG/0/4326"));
}
public void testCoordinateList() throws IOException, SAXException, ParserConfigurationException{
GMLConfiguration gml = new GMLConfiguration(true);
Parser p = new Parser(gml);
Object multiSurface = p.parse(getClass().getResourceAsStream("surfacePatches.xml"));
assertFalse(multiSurface instanceof String);
assertTrue("wrong element type", multiSurface instanceof MultiPolygon);
MultiPolygon geom = (MultiPolygon) multiSurface;
assertFalse(geom.isEmpty());
}
public void testSurfacememberPatches() throws IOException, SAXException, ParserConfigurationException{
GMLConfiguration gml = new GMLConfiguration(true);
Parser p = new Parser(gml);
Object multiSurface = p.parse(getClass().getResourceAsStream("surfacememberPatches.xml"));
assertFalse(multiSurface instanceof String);
assertTrue("wrong element type", multiSurface instanceof MultiPolygon);
MultiPolygon geom = (MultiPolygon) multiSurface;
assertFalse(geom.isEmpty());
}
public void testNestedInteriors() throws IOException, SAXException, ParserConfigurationException{
GMLConfiguration gml = new GMLConfiguration(true);
Parser p = new Parser(gml);
Object multiSurface = p.parse(getClass().getResourceAsStream("nestedInteriors.xml"));
assertFalse(multiSurface instanceof String);
assertTrue("wrong element type", multiSurface instanceof MultiPolygon);
MultiPolygon geom = (MultiPolygon) multiSurface;
assertFalse(geom.isEmpty());
}
}