/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer.format;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.apache.commons.io.IOUtils;
import org.geotools.data.FeatureReader;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
public class KMLFileFormatTest extends TestCase {
private KMLFileFormat kmlFileFormat;
static final String DOC_EL = "<kml xmlns=\"http://www.opengis.net/kml/2.2\">";
@Override
protected void setUp() throws Exception {
kmlFileFormat = new KMLFileFormat();
}
public void testParseFeatureTypeNoPlacemarks() throws IOException {
String kmlInput = DOC_EL + "</kml>";
try {
kmlFileFormat.parseFeatureTypes("foo", IOUtils.toInputStream(kmlInput));
} catch (IllegalArgumentException e) {
assertTrue(true);
return;
}
fail("Expected Illegal Argument Exception for no features");
}
public void testParseFeatureTypeMinimal() throws Exception {
String kmlInput = DOC_EL + "<Placemark></Placemark></kml>";
List<SimpleFeatureType> featureTypes = kmlFileFormat.parseFeatureTypes("foo",
IOUtils.toInputStream(kmlInput));
assertEquals("Unexpected number of feature types", 1, featureTypes.size());
SimpleFeatureType featureType = featureTypes.get(0);
assertEquals("Unexpected number of feature type attributes", 10,
featureType.getAttributeCount());
}
public void testExtendedUserData() throws Exception {
String kmlInput = DOC_EL + "<Placemark>" + "<ExtendedData>"
+ "<Data name=\"foo\"><value>bar</value></Data>"
+ "<Data name=\"quux\"><value>morx</value></Data>" + "</ExtendedData>"
+ "</Placemark></kml>";
List<SimpleFeatureType> featureTypes = kmlFileFormat.parseFeatureTypes("fleem",
IOUtils.toInputStream(kmlInput));
assertEquals("Unexpected number of feature types", 1, featureTypes.size());
SimpleFeatureType featureType = featureTypes.get(0);
assertEquals("Unexpected number of feature type attributes", 12,
featureType.getAttributeCount());
assertEquals("Invalid attribute descriptor", String.class, featureType.getDescriptor("foo")
.getType().getBinding());
assertEquals("Invalid attribute descriptor", String.class, featureType
.getDescriptor("quux").getType().getBinding());
}
public void testReadFeatureWithNameAndDescription() throws Exception {
String kmlInput = DOC_EL + "<Placemark><name>foo</name><description>bar</description></Placemark></kml>";
SimpleFeatureType featureType = kmlFileFormat.parseFeatureTypes("foo",
IOUtils.toInputStream(kmlInput)).get(0);
FeatureReader<SimpleFeatureType, SimpleFeature> reader = kmlFileFormat.read(featureType,
IOUtils.toInputStream(kmlInput));
assertTrue("No features found", reader.hasNext());
SimpleFeature feature = reader.next();
assertNotNull("Expecting feature", feature);
assertEquals("Invalid name attribute", "foo", feature.getAttribute("name"));
assertEquals("Invalid description attribute", "bar", feature.getAttribute("description"));
}
public void testReadFeatureWithUntypedExtendedData() throws Exception {
String kmlInput = DOC_EL + "<Placemark>" + "<ExtendedData>"
+ "<Data name=\"foo\"><value>bar</value></Data>"
+ "<Data name=\"quux\"><value>morx</value></Data>" + "</ExtendedData>"
+ "</Placemark></kml>";
SimpleFeatureType featureType = kmlFileFormat.parseFeatureTypes("foo",
IOUtils.toInputStream(kmlInput)).get(0);
FeatureReader<SimpleFeatureType, SimpleFeature> reader = kmlFileFormat.read(featureType,
IOUtils.toInputStream(kmlInput));
assertTrue("No features found", reader.hasNext());
SimpleFeature feature = (SimpleFeature) reader.next();
assertNotNull("Expecting feature", feature);
assertEquals("Invalid ext attr foo", "bar", feature.getAttribute("foo"));
assertEquals("Invalid ext attr quux", "morx", feature.getAttribute("quux"));
}
public void testReadFeatureWithTypedExtendedData() throws Exception {
String kmlInput = DOC_EL + "<Schema name=\"myschema\">"
+ "<SimpleField type=\"int\" name=\"foo\"></SimpleField>" + "</Schema>"
+ "<Placemark>" + "<ExtendedData>" + "<SchemaData schemaUrl=\"#myschema\">"
+ "<SimpleData name=\"foo\">42</SimpleData>" + "</SchemaData>" + "</ExtendedData>"
+ "</Placemark></kml>";
SimpleFeatureType featureType = kmlFileFormat.parseFeatureTypes("foo",
IOUtils.toInputStream(kmlInput)).get(0);
FeatureReader<SimpleFeatureType, SimpleFeature> reader = kmlFileFormat.read(featureType,
IOUtils.toInputStream(kmlInput));
assertTrue("No features found", reader.hasNext());
SimpleFeature feature = reader.next();
assertNotNull("Expecting feature", feature);
assertEquals("Invalid ext attr foo", 42, feature.getAttribute("foo"));
}
public void testMultipleSchemas() throws Exception {
String kmlInput = DOC_EL + "<Schema name=\"schema1\">"
+ "<SimpleField type=\"int\" name=\"foo\"></SimpleField>" + "</Schema>"
+ "<Schema name=\"schema2\">"
+ "<SimpleField type=\"float\" name=\"bar\"></SimpleField>" + "</Schema>"
+ "<Placemark>" + "<ExtendedData>" + "<SchemaData schemaUrl=\"#schema1\">"
+ "<SimpleData name=\"foo\">42</SimpleData>" + "</SchemaData>"
+ "<SchemaData schemaUrl=\"#schema2\">"
+ "<SimpleData name=\"bar\">4.2</SimpleData>" + "</SchemaData>" + "</ExtendedData>"
+ "</Placemark></kml>";
List<SimpleFeatureType> featureTypes = kmlFileFormat.parseFeatureTypes("multiple",
IOUtils.toInputStream(kmlInput));
assertEquals("Unexpected number of feature types", 1, featureTypes.size());
SimpleFeatureType ft = featureTypes.get(0);
FeatureReader<SimpleFeatureType, SimpleFeature> reader = kmlFileFormat.read(ft,
IOUtils.toInputStream(kmlInput));
SimpleFeature feature1 = reader.next();
assertNotNull("Expecting feature", feature1);
assertEquals("Invalid ext attr foo", 42, feature1.getAttribute("foo"));
assertEquals("Invalid ext attr bar", 4.2f, (Float) feature1.getAttribute("bar"), 0.01);
}
public void testTypedAndUntyped() throws Exception {
String kmlInput = DOC_EL + "<Schema name=\"myschema\">"
+ "<SimpleField type=\"int\" name=\"foo\"></SimpleField>" + "</Schema>"
+ "<Placemark>" + "<ExtendedData>" + "<SchemaData schemaUrl=\"#myschema\">"
+ "<SimpleData name=\"foo\">42</SimpleData>" + "</SchemaData>"
+ "<Data name=\"fleem\"><value>bar</value></Data>"
+ "<Data name=\"quux\"><value>morx</value></Data>" + "</ExtendedData>"
+ "</Placemark></kml>";
List<SimpleFeatureType> featureTypes = kmlFileFormat.parseFeatureTypes("typed-and-untyped",
IOUtils.toInputStream(kmlInput));
assertEquals("Unexpected number of feature types", 1, featureTypes.size());
SimpleFeatureType featureType = featureTypes.get(0);
FeatureReader<SimpleFeatureType, SimpleFeature> reader = kmlFileFormat.read(featureType,
IOUtils.toInputStream(kmlInput));
SimpleFeature feature = reader.next();
assertNotNull("Expecting feature", feature);
assertEquals("Invalid ext attr foo", 42, feature.getAttribute("foo"));
assertEquals("bar", feature.getAttribute("fleem"));
assertEquals("morx", feature.getAttribute("quux"));
}
public void testReadCustomSchema() throws Exception {
String kmlInput = DOC_EL + "<Schema name=\"myschema\">"
+ "<SimpleField type=\"int\" name=\"foo\"></SimpleField>" + "</Schema>"
+ "<myschema><foo>7</foo></myschema>" + "</kml>";
List<SimpleFeatureType> featureTypes = kmlFileFormat.parseFeatureTypes("custom-schema",
IOUtils.toInputStream(kmlInput));
assertEquals("Unexpected number of feature types", 1, featureTypes.size());
SimpleFeatureType featureType = featureTypes.get(0);
Map<Object, Object> userData = featureType.getUserData();
List<String> schemaNames = (List<String>) userData.get("schemanames");
assertEquals(1, schemaNames.size());
assertEquals("Did not find expected schema name metadata", "myschema", schemaNames.get(0));
FeatureReader<SimpleFeatureType, SimpleFeature> reader = kmlFileFormat.read(featureType,
IOUtils.toInputStream(kmlInput));
SimpleFeature feature = reader.next();
assertNotNull("Expecting feature", feature);
assertEquals("Invalid ext attr foo", 7, feature.getAttribute("foo"));
}
}