test.gov.nasa.worldwind.ogc.kml.KMLTest Maven / Gradle / Ivy
/*
* Copyright (C) 2012 United States Government as represented by the Administrator of the
* National Aeronautics and Space Administration.
* All Rights Reserved.
*/
package gov.nasa.worldwind.ogc.kml;
import gov.nasa.worldwind.exception.WWRuntimeException;
import gov.nasa.worldwind.geom.*;
import gov.nasa.worldwind.ogc.kml.gx.GXConstants;
import gov.nasa.worldwind.util.WWIO;
import gov.nasa.worldwind.util.xml.*;
import gov.nasa.worldwind.util.xml.atom.AtomConstants;
import gov.nasa.worldwind.util.xml.xal.XALConstants;
import junit.framework.*;
import junit.textui.TestRunner;
import org.junit.*;
import java.io.*;
import java.net.URL;
import java.util.*;
/**
* @author tag
* @version $Id: KMLTest.java 1961 2014-04-25 19:25:18Z dcollins $
*/
public class KMLTest
{
public static void main(String[] args)
{
TestSuite testSuite = new TestSuite();
testSuite.addTestSuite(BasicTests.class);
new TestRunner().doRun(testSuite);
}
public static class BasicTests extends TestCase
{
@Before
public void setUp()
{
}
protected StringBuilder newDocument()
{
StringBuilder sb = new StringBuilder("");
sb.append("");
return sb;
}
protected StringBuilder newPrefixedDocument()
{
StringBuilder sb = new StringBuilder("");
sb.append("");
return sb;
}
protected void endDocument(StringBuilder sb)
{
sb.append(" ");
}
protected void endPrefixedDocument(StringBuilder sb)
{
sb.append("");
}
protected KMLRoot newParsedRoot(StringBuilder sb)
{
KMLRoot root;
try
{
root = new KMLRoot(this.createInputStream(sb), KMLConstants.KML_MIME_TYPE);
return root.parse();
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
protected KMLRoot newParsedRoot(StringBuilder sb, boolean suppressLogging)
{
KMLRoot root;
try
{
root = new KMLRoot(this.createInputStream(sb), KMLConstants.KML_MIME_TYPE);
if (suppressLogging)
this.suppressLogging(root);
return root.parse();
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
protected void suppressLogging(KMLRoot root)
{
root.setNotificationListener(new XMLParserNotificationListener()
{
public void notify(XMLParserNotification notification)
{
// Do nothing. This prevents logging of notification messages.
}
});
}
protected InputStream createInputStream(StringBuilder sb)
{
return WWIO.getInputStreamFromString(sb.toString());
}
@After
public void tearDown()
{
}
public void testRootElement()
{
StringBuilder sb = this.newDocument();
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
assertNull("KML root hint is not null", root.getHint());
}
public void testRootHint()
{
StringBuilder sb = this.newDocument();
sb = new StringBuilder(sb.toString().replace("");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLDocument);
assertEquals("Object ID not as expected", feature.getId(), ID);
assertEquals("Target ID not as expected", feature.getTargetId(), targetID);
}
public void testUnassignedAbstractObjectAttributes()
{
StringBuilder sb = this.newDocument();
sb.append("");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLDocument);
assertNull("ID not null", feature.getId());
assertNull("Target ID not null", feature.getTargetId());
}
@SuppressWarnings({"ConstantConditions"})
public void testAbstractFeatureAttributes()
{
String name = "XXXYYYZZZ";
boolean visibility = true;
boolean open = false;
String address = "100 LALA LANE";
String phoneNumber = "1-800-888-999";
String snippet = "5";
String description = "This is a test";
String styleUrl = "http://worldwind.arc.nasa.gov";
// TODO view
// TODO region
// TODO xal:address details
// TODO style selector
// TODO time
// TODO extended data
StringBuilder sb = this.newDocument();
sb.append("");
sb.append("").append(name).append(" ");
sb.append("").append(visibility ? "1" : "0").append(" ");
sb.append("").append(open ? "1" : "0").append(" ");
sb.append("").append(address).append("");
sb.append("").append(phoneNumber).append(" ");
sb.append("").append(snippet).append(" ");
sb.append("").append(description).append(" ");
sb.append("").append(styleUrl).append(" ");
String linkHref = "http://worldwind.arc.nasa.gov";
String linkRel = "thisIsLinkRel";
String linkType = "thisIsLinkType";
String linkHreflang = "thisIsLinkHrefLang";
String linkTitle = "this is Link Title";
int linkLength = 5;
String linkBase = "thisIsLinkBase";
String linkLang = "thisIsLinkLang";
sb.append(" ");
String authorName = "Author C. Bookwriter";
String authorEmail = "[email protected]";
String authorUri = "http://worldwind.arc.nasa.gov";
sb.append("");
sb.append("").append(authorName).append(" ");
sb.append("").append(authorEmail).append(" ");
sb.append("").append(authorUri).append(" ");
sb.append(" ");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLDocument);
assertEquals("Name not as expected", feature.getName(), name);
assertEquals("Visibility not as expected", feature.getVisibility().booleanValue(), visibility);
assertEquals("Open not as expected", feature.getOpen().booleanValue(), open);
assertEquals("Address not as expected", feature.getAddress(), address);
assertEquals("Phone number not as expected", feature.getPhoneNumber(), phoneNumber);
assertEquals("Snippet not as expected", feature.getSnippet(), snippet);
assertEquals("Description not as expected", feature.getDescription(), description);
assertEquals("Style URL not as expected", feature.getStyleUrl().getCharacters(), styleUrl);
assertEquals("Link href not as expected", feature.getLink().getHref(), linkHref);
assertEquals("Link rel not as expected", feature.getLink().getRel(), linkRel);
assertEquals("Link type not as expected", feature.getLink().getType(), linkType);
assertEquals("Link hreflang not as expected", feature.getLink().getHreflang(), linkHreflang);
assertEquals("Link title not as expected", feature.getLink().getTitle(), linkTitle);
assertEquals("Link length not as expected", feature.getLink().getLength().intValue(), linkLength);
assertEquals("Link base not as expected", feature.getLink().getBase(), linkBase);
assertEquals("Link lang not as expected", feature.getLink().getLang(), linkLang);
assertEquals("Author name not as expected", feature.getAuthor().getName(), authorName);
assertEquals("Author email not as expected", feature.getAuthor().getEmail(), authorEmail);
assertEquals("Author URI not as expected", feature.getAuthor().getUri(), authorUri);
}
@SuppressWarnings({"ConstantConditions"})
public void testUnassignedAbstractFeatureAttributes()
{
StringBuilder sb = this.newDocument();
sb.append("");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLDocument);
assertNull("Name not null", feature.getName());
assertNull("Visibility not null", feature.getVisibility());
assertNull("Open not null", feature.getOpen());
assertNull("Address not null", feature.getAddress());
assertNull("Phone number not null", feature.getPhoneNumber());
assertNull("Snippet not null", feature.getSnippet());
assertNull("Description not null", feature.getDescription());
assertNull("Style URL not null", feature.getStyleUrl());
assertNull("View not null", feature.getView());
assertNull("Region not null", feature.getRegion());
assertNull("Author not null", feature.getAuthor());
assertNull("Link not null", feature.getLink());
assertNull("Address details not null", feature.getAddressDetails());
assertEquals("Style selectors not empty", 0, feature.getStyleSelectors().size());
assertNull("Time not null", feature.getTimePrimitive());
assertNull("Extended data not null", feature.getExtendedData());
}
@SuppressWarnings({"ConstantConditions"})
public void testPrefixUsage()
{
String altitudeMode = "absolute";
boolean extrude = true;
Position coords = Position.fromDegrees(23.56, -18.3, 9);
StringBuilder sb = this.newPrefixedDocument();
sb.append("");
sb.append("");
sb.append("").append(extrude ? "1" : "0").append(" ");
sb.append("").append(altitudeMode).append(" ");
sb.append("");
sb.append(coords.getLongitude().degrees).append(",");
sb.append(coords.getLatitude().degrees).append(",");
sb.append(coords.getElevation());
sb.append(" ");
sb.append(" ");
sb.append(" ");
this.endPrefixedDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLPlacemark);
KMLAbstractGeometry geometry = ((KMLPlacemark) feature).getGeometry();
assertTrue("Placemark geometry is not as expected", geometry instanceof KMLPoint);
KMLPoint point = (KMLPoint) geometry;
assertEquals("Altitude mode not as expected", point.getAltitudeMode(), altitudeMode);
assertEquals("Extrude not as expected", point.isExtrude(), extrude);
assertEquals("Coordinates not as expected", point.getCoordinates(), coords);
}
@SuppressWarnings({"ConstantConditions"})
public void testNoDefaultNamespace()
{
String altitudeMode = "absolute";
boolean extrude = true;
Position coords = Position.fromDegrees(23.56, -18.3, 9);
StringBuilder sb = new StringBuilder("");
sb.append("");
sb.append("");
sb.append("");
sb.append("").append(extrude ? "1" : "0").append(" ");
sb.append("").append(altitudeMode).append(" ");
sb.append("");
sb.append(coords.getLongitude().degrees).append(",");
sb.append(coords.getLatitude().degrees).append(",");
sb.append(coords.getElevation());
sb.append(" ");
sb.append(" ");
sb.append(" ");
sb.append(" ");
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLPlacemark);
KMLAbstractGeometry geometry = ((KMLPlacemark) feature).getGeometry();
assertTrue("Placemark geometry is not as expected", geometry instanceof KMLPoint);
KMLPoint point = (KMLPoint) geometry;
assertEquals("Altitude mode not as expected", point.getAltitudeMode(), altitudeMode);
assertEquals("Extrude not as expected", point.isExtrude(), extrude);
assertEquals("Coordinates not as expected", point.getCoordinates(), coords);
}
@SuppressWarnings({"ConstantConditions"})
public void testPoint()
{
String altitudeMode = "absolute";
boolean extrude = true;
Position coords = Position.fromDegrees(23.56, -18.3, 9);
StringBuilder sb = this.newDocument();
sb.append("");
sb.append("");
sb.append("").append(extrude ? "1" : "0").append(" ");
sb.append("").append(altitudeMode).append(" ");
sb.append("");
sb.append(coords.getLongitude().degrees).append(",");
sb.append(coords.getLatitude().degrees).append(",");
sb.append(coords.getElevation());
sb.append(" ");
sb.append(" ");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLPlacemark);
KMLAbstractGeometry geometry = ((KMLPlacemark) feature).getGeometry();
assertTrue("Placemark geometry is not as expected", geometry instanceof KMLPoint);
KMLPoint point = (KMLPoint) geometry;
assertEquals("Altitude mode not as expected", point.getAltitudeMode(), altitudeMode);
assertEquals("Extrude not as expected", point.isExtrude(), extrude);
assertEquals("Coordinates not as expected", point.getCoordinates(), coords);
}
@SuppressWarnings({"ConstantConditions"})
public void testLinearRing()
{
String altitudeMode = "clampToGround";
boolean extrude = true;
boolean tessellate = false;
List coords = new ArrayList();
coords.add(Position.fromDegrees(23.56, -18.3, 9));
coords.add(Position.fromDegrees(24.56, -19.3, 8));
coords.add(Position.fromDegrees(25.56, -17.3, 99));
StringBuilder sb = this.newDocument();
sb.append("");
sb.append("");
sb.append("").append(extrude ? "1" : "0").append(" ");
sb.append("").append(tessellate ? "1" : "0").append(" ");
sb.append("").append(altitudeMode).append(" ");
sb.append("");
for (Position p : coords)
{
sb.append(p.getLongitude().degrees).append(",");
sb.append(p.getLatitude().degrees).append(",");
sb.append(p.getElevation()).append(" ");
}
sb.append(" ");
sb.append(" ");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLPlacemark);
KMLAbstractGeometry geometry = ((KMLPlacemark) feature).getGeometry();
assertTrue("Placemark geometry is not as expected", geometry instanceof KMLLinearRing);
KMLLinearRing ring = (KMLLinearRing) geometry;
assertEquals("Altitude mode not as expected", ring.getAltitudeMode(), altitudeMode);
assertEquals("Extrude not as expected", ring.isExtrude(), extrude);
assertEquals("Tessellate not as expected", ring.getTessellate().booleanValue(), tessellate);
assertEquals("Coordinates not as expected", ring.getCoordinates().list, coords);
}
@SuppressWarnings({"ConstantConditions"})
public void testLineString()
{
String altitudeMode = "clampToGround";
boolean extrude = false;
boolean tessellate = true;
List coords = new ArrayList();
coords.add(Position.fromDegrees(23.56, -18.3, 9));
coords.add(Position.fromDegrees(24.56, -19.3, 8));
coords.add(Position.fromDegrees(25.56, -17.3, 99));
StringBuilder sb = this.newDocument();
sb.append("");
sb.append("");
sb.append("").append(extrude ? "1" : "0").append(" ");
sb.append("").append(tessellate ? "1" : "0").append(" ");
sb.append("").append(altitudeMode).append(" ");
sb.append("");
for (Position p : coords)
{
sb.append(p.getLongitude().degrees).append(",");
sb.append(p.getLatitude().degrees).append(",");
sb.append(p.getElevation()).append(" ");
}
sb.append(" ");
sb.append(" ");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLPlacemark);
KMLAbstractGeometry geometry = ((KMLPlacemark) feature).getGeometry();
assertTrue("Placemark geometry is not as expected", geometry instanceof KMLLineString);
KMLLineString ring = (KMLLineString) geometry;
assertEquals("Altitude mode not as expected", ring.getAltitudeMode(), altitudeMode);
assertEquals("Extrude not as expected", ring.isExtrude(), extrude);
assertEquals("Tessellate not as expected", ring.getTessellate().booleanValue(), tessellate);
assertEquals("Coordinates not as expected", ring.getCoordinates().list, coords);
}
@SuppressWarnings({"ConstantConditions"})
public void testPolygon()
{
String altitudeMode = "clampToGround";
boolean extrude = false;
boolean tessellate = true;
String outerAltitudeMode = "clampToSeaFloor";
boolean outerExtrude = true;
boolean outerTessellate = false;
String innerAltitudeMode = "absolute";
boolean innerExtrude = true;
boolean innerTessellate = true;
List outerCoords = new ArrayList();
outerCoords.add(Position.fromDegrees(23.56, -18.3, 9));
outerCoords.add(Position.fromDegrees(24.56, -19.3, 8));
outerCoords.add(Position.fromDegrees(25.56, -17.3, 99));
List innerCoords = new ArrayList();
innerCoords.add(Position.fromDegrees(22.56, -18.3, 1));
innerCoords.add(Position.fromDegrees(21.56, -19.3, 2));
innerCoords.add(Position.fromDegrees(20.56, -17.3, 3));
StringBuilder sb = this.newDocument();
sb.append("");
sb.append("");
sb.append("").append(extrude ? "1" : "0").append(" ");
sb.append("").append(tessellate ? "1" : "0").append(" ");
sb.append("").append(altitudeMode).append(" ");
sb.append("");
sb.append("");
sb.append("").append(outerExtrude ? "1" : "0").append(" ");
sb.append("").append(outerTessellate ? "1" : "0").append(" ");
sb.append("").append(outerAltitudeMode).append(" ");
sb.append("");
for (Position p : outerCoords)
{
sb.append(p.getLongitude().degrees).append(",");
sb.append(p.getLatitude().degrees).append(",");
sb.append(p.getElevation()).append(" ");
}
sb.append(" ");
sb.append(" ");
sb.append(" ");
sb.append("");
sb.append("");
sb.append("").append(innerExtrude ? "1" : "0").append(" ");
sb.append("").append(innerTessellate ? "1" : "0").append(" ");
sb.append("").append(innerAltitudeMode).append(" ");
sb.append("");
for (Position p : innerCoords)
{
sb.append(p.getLongitude().degrees).append(",");
sb.append(p.getLatitude().degrees).append(",");
sb.append(p.getElevation()).append(" ");
}
sb.append(" ");
sb.append(" ");
sb.append(" ");
sb.append(" ");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLPlacemark);
KMLAbstractGeometry geometry = ((KMLPlacemark) feature).getGeometry();
assertTrue("Placemark geometry is not as expected", geometry instanceof KMLPolygon);
KMLPolygon pgon = (KMLPolygon) geometry;
assertEquals("Altitude mode not as expected", pgon.getAltitudeMode(), altitudeMode);
assertEquals("Extrude not as expected", pgon.isExtrude(), extrude);
assertEquals("Tessellate not as expected", pgon.getTessellate().booleanValue(), tessellate);
assertEquals("Outer coordinates not as expected", pgon.getOuterBoundary().getCoordinates().list,
outerCoords);
assertEquals("Outer altitude mode not as expected", pgon.getOuterBoundary().getAltitudeMode(),
outerAltitudeMode);
assertEquals("Outer extrude not as expected", pgon.getOuterBoundary().isExtrude(),
outerExtrude);
assertEquals("Outer tessellate not as expected", pgon.getOuterBoundary().getTessellate().booleanValue(),
outerTessellate);
Iterable innerBoundaries = pgon.getInnerBoundaries();
assertNotNull(innerBoundaries);
assertTrue(innerBoundaries.iterator().hasNext());
KMLLinearRing innerBoundary = innerBoundaries.iterator().next();
assertNotNull(innerBoundary);
assertEquals("Inner coordinates not as expected", innerBoundary.getCoordinates().list,
innerCoords);
assertEquals("Inner altitude mode not as expected", innerBoundary.getAltitudeMode(),
innerAltitudeMode);
assertEquals("Inner extrude not as expected", innerBoundary.isExtrude(),
innerExtrude);
assertEquals("Inner tessellate not as expected", innerBoundary.getTessellate().booleanValue(),
innerTessellate);
}
public void testSimpleDataType()
{
String item = "Test a String";
String name = "SimpleData Name";
StringBuilder sb = this.newDocument();
sb.append("");
sb.append("").append(item).append(" ");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLPlacemark);
KMLSimpleData dataItem = ((KMLPlacemark) feature).getSimpleData();
assertNotNull("No SimpleData", dataItem);
assertEquals("SimpleData name not as expected", dataItem.getName(), name);
assertEquals("SimpleData string not as expected", dataItem.getCharacters(), item);
}
public void testUnrecognizedElement()
{
String item = "Test a String";
String name = "SimpleData Name";
StringBuilder sb = this.newDocument();
sb.append("");
sb.append("");
sb.append("").append(item).append(" ");
sb.append(" ");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb, true);
assertNotNull("KML root is null", root);
for (Map.Entry field : root.getFields().getEntries())
{
if (field.getKey().equals("Unrecognized") && field.getValue() instanceof UnrecognizedXMLEventParser)
{
UnrecognizedXMLEventParser uField = (UnrecognizedXMLEventParser) field.getValue();
Object o = uField.getField("Placemark");
assertNotNull("No SimpleData", o);
assertTrue("Unrecognized object not as expected", o instanceof KMLPlacemark);
KMLSimpleData dataItem = ((KMLPlacemark) o).getSimpleData();
assertNotNull("No SimpleData", dataItem);
assertEquals("SimpleData name not as expected", dataItem.getName(), name);
assertEquals("SimpleData string not as expected", dataItem.getCharacters(), item);
return;
}
}
assertTrue("Unrecognized element not found", true);
}
@SuppressWarnings({"ConstantConditions"})
public void testCoordinatesParser()
{
// Test parsing coordinates separated by newline and tab characters instead of just spaces
List separators = Arrays.asList("\n", "\n\r", "\t");
List coords = new ArrayList();
coords.add(Position.fromDegrees(23.56, -18.3, 9));
coords.add(Position.fromDegrees(24.56, -19.3, 8));
coords.add(Position.fromDegrees(25.56, -17.3, 99));
StringBuilder sb = this.newDocument();
sb.append("");
sb.append("");
sb.append("");
Iterator separator = separators.iterator();
for (Position p : coords)
{
sb.append(p.getLongitude().degrees).append(",");
sb.append(p.getLatitude().degrees).append(",");
sb.append(p.getElevation()).append(
separator.next()); // Separate coordinate tuple with newline instead of space
}
sb.append(" ");
sb.append(" ");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb);
assertNotNull("KML root is null", root);
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLPlacemark);
KMLAbstractGeometry geometry = ((KMLPlacemark) feature).getGeometry();
assertTrue("Placemark geometry is not as expected", geometry instanceof KMLLinearRing);
KMLLinearRing ring = (KMLLinearRing) geometry;
assertEquals("Coordinates not as expected", ring.getCoordinates().list, coords);
}
/** Test coordinate tokenizer with a mix of well formed and not so well formed input. */
public void testCoordinatesTokenizer()
{
List coords = new ArrayList();
coords.add(Position.fromDegrees(23.56, -18.3, 9));
coords.add(Position.fromDegrees(56.0, 34.9, 2));
coords.add(Position.fromDegrees(19, 56.9));
coords.add(Position.fromDegrees(23.9, 90, 44));
coords.add(Position.fromDegrees(18, 12.3, 8));
coords.add(Position.fromDegrees(57, 3.3, -110.9));
coords.add(Position.fromDegrees(80.1, 50, -23.1));
// Test with well formed coordinate tuples, and also tuples with spaces to ensure that the tokenizer
// is able to handle input that is not well formed.
String coordString = "-18.3,23.56,9 34.9, 56.0, 2 \t56.9, 19 90.0,23.9,44 "
+ " 12.3,18,8,3.3,57,-110.9,50,80.1,-23.1";
KMLCoordinateTokenizer tokenizer = new KMLCoordinateTokenizer(coordString);
List positions = new ArrayList();
while (tokenizer.hasMoreTokens())
{
positions.add(tokenizer.nextPosition());
}
assertEquals("Coordinates not as expected", coords, positions);
}
public void testNestedUnrecognizedElement()
{
String item = "Test a String";
String name = "SimpleData Name";
StringBuilder sb = this.newDocument();
sb.append("");
sb.append("");
sb.append("");
sb.append("").append(item).append(" ");
sb.append(" ");
sb.append(" ");
sb.append(" ");
this.endDocument(sb);
KMLRoot root = this.newParsedRoot(sb, true);
assertNotNull("KML root is null", root);
KMLAbstractFeature doc = root.getFeature();
assertNotNull("Document is null", doc);
assertTrue("Unrecognized object not as expected", doc instanceof KMLDocument);
for (Map.Entry field : doc.getFields().getEntries())
{
if (field.getKey().equals("Unrecognized") && field.getValue() instanceof UnrecognizedXMLEventParser)
{
UnrecognizedXMLEventParser uField = (UnrecognizedXMLEventParser) field.getValue();
Object o = uField.getField("Placemark");
assertNotNull("No SimpleData", o);
assertTrue("Unrecognized object not as expected", o instanceof KMLPlacemark);
KMLSimpleData dataItem = ((KMLPlacemark) o).getSimpleData();
assertNotNull("No SimpleData", dataItem);
assertEquals("SimpleData name not as expected", dataItem.getName(), name);
assertEquals("SimpleData string not as expected", dataItem.getCharacters(), item);
return;
}
}
assertTrue("Unrecognized element not found", true);
}
protected String parserMessage;
protected void establishNotificationCatcher(KMLRoot root)
{
this.parserMessage = null;
root.setNotificationListener(new XMLParserNotificationListener()
{
public void notify(XMLParserNotification notificationEvent)
{
if (parserMessage == null)
parserMessage = notificationEvent.toString();
}
});
}
protected void verifyNoNotification(String sourceDoc)
{
assertNull("Parser notification occurred\n" + sourceDoc + ":" + this.parserMessage, this.parserMessage);
}
protected KMLRoot openAndParseFile(String sourceDoc)
{
KMLRoot root;
try
{
root = new KMLRoot(new File(sourceDoc));
this.establishNotificationCatcher(root);
root.parse();
this.verifyNoNotification(sourceDoc);
assertNotNull("KML root is null", root);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
return root;
}
public void testGoogleTutorialExample01()
{
KMLRoot root = this.openAndParseFile("testData/KML/GoogleTutorialExample01.kml");
KMLAbstractFeature feature = root.getFeature();
assertTrue("Root feature is not as expected", feature instanceof KMLPlacemark);
assertEquals("Incorrect name", "Simple placemark", feature.getName());
assertEquals("Incorrect description",
"Attached to the ground. Intelligently places itself\n"
+ " at the height of the underlying terrain.",
feature.getDescription());
KMLAbstractGeometry geometry = ((KMLPlacemark) feature).getGeometry();
assertTrue("Geometry not a Point", geometry instanceof KMLPoint);
Position coords = ((KMLPoint) geometry).getCoordinates();
assertEquals("Incorrect latitude", Angle.fromDegrees(37.42228990140251), coords.getLatitude());
assertEquals("Incorrect longitude", Angle.fromDegrees(-122.0822035425683), coords.getLongitude());
assertEquals("Incorrect altitude", 0d, coords.getAltitude());
}
public void testGoogleTutorialExample02()
{
KMLRoot root = this.openAndParseFile("testData/KML/GoogleTutorialExample02.kml");
KMLAbstractFeature document = root.getFeature();
assertTrue("Root feature is not as expected", document instanceof KMLDocument);
List features = ((KMLDocument) document).getFeatures();
assertEquals("Incorrect number of features", 1, features.size());
assertTrue("Root feature is not as expected", features.get(0) instanceof KMLPlacemark);
KMLPlacemark placemark = (KMLPlacemark) features.get(0);
assertEquals("Incorrect name", "CDATA example", placemark.getName());
String s =
"\n"
+ " CDATA Tags are useful!
\n"
+ " Text is more readable and\n"
+ " easier to write when you can avoid using entity\n"
+ " references.
\n"
+ " ";
assertFalse("Description string not trimmed", s.equals(placemark.getDescription()));
assertEquals("Incorrect description", s.trim(), placemark.getDescription());
KMLAbstractGeometry geometry = placemark.getGeometry();
assertTrue("Geometry not a Point", geometry instanceof KMLPoint);
Position coords = ((KMLPoint) geometry).getCoordinates();
assertEquals("Incorrect latitude", Angle.fromDegrees(14.996729), coords.getLatitude());
assertEquals("Incorrect longitude", Angle.fromDegrees(102.595626), coords.getLongitude());
assertEquals("Incorrect altitude", 0d, coords.getAltitude());
}
public void testGoogleTutorialExample03()
{
KMLRoot root = this.openAndParseFile("testData/KML/GoogleTutorialExample03.kml");
KMLAbstractFeature document = root.getFeature();
assertTrue("Root feature is not as expected", document instanceof KMLDocument);
List features = ((KMLDocument) document).getFeatures();
assertEquals("Incorrect number of features", 1, features.size());
assertTrue("Root feature is not as expected", features.get(0) instanceof KMLPlacemark);
KMLPlacemark placemark = (KMLPlacemark) features.get(0);
assertEquals("Incorrect name", "Entity references example", placemark.getName());
assertEquals("Incorrect description",
"Entity references are hard to type!
Text\n "
+ "is more readable and easier to write when you can avoid using\n "
+ "entity references.
",
placemark.getDescription());
KMLAbstractGeometry geometry = placemark.getGeometry();
assertTrue("Geometry not a Point", geometry instanceof KMLPoint);
Position coords = ((KMLPoint) geometry).getCoordinates();
assertEquals("Incorrect latitude", Angle.fromDegrees(14.998518), coords.getLatitude());
assertEquals("Incorrect longitude", Angle.fromDegrees(102.594411), coords.getLongitude());
assertEquals("Incorrect altitude", 0d, coords.getAltitude());
}
public void testGoogleTutorialExample04()
{
KMLRoot root = this.openAndParseFile("testData/KML/GoogleTutorialExample04.kml");
KMLAbstractFeature document = root.getFeature();
assertTrue("Root feature is not as expected", document instanceof KMLFolder);
assertEquals("Incorrect name", "Ground Overlays", document.getName());
assertEquals("Incorrect description", "Examples of ground overlays", document.getDescription());
List features = ((KMLFolder) document).getFeatures();
assertEquals("Incorrect number of features", 1, features.size());
assertTrue("Root feature is not as expected", features.get(0) instanceof KMLGroundOverlay);
KMLGroundOverlay overlay = (KMLGroundOverlay) features.get(0);
assertEquals("Incorrect name", "Large-scale overlay on terrain", overlay.getName());
assertEquals("Incorrect description",
"Overlay shows Mount Etna erupting\n"
+ " on July 13th, 2001.", overlay.getDescription());
KMLIcon icon = overlay.getIcon();
assertNotNull("Overlay icon is null", icon);
assertEquals("Incorrect icon href", "https://developers.google.com/kml/documentation/images/etna.jpg",
icon.getHref());
KMLLatLonBox box = overlay.getLatLonBox();
assertNotNull("Overlay LatLonBox is null", box);
assertEquals("Incorrect box north", 37.91904192681665, box.getNorth());
assertEquals("Incorrect box south", 37.46543388598137, box.getSouth());
assertEquals("Incorrect box east", 15.35832653742206, box.getEast());
assertEquals("Incorrect box west", 14.60128369746704, box.getWest());
}
public void testStyleReference()
{
KMLRoot root = this.openAndParseFile("testData/KML/StyleReferences.kml");
KMLAbstractFeature document = root.getFeature();
assertTrue("Root feature is not as expected", document instanceof KMLDocument);
List features = ((KMLDocument) document).getFeatures();
assertEquals("Incorrect number of features", 1, features.size());
assertTrue("Document feature is not as expected", features.get(0) instanceof KMLPlacemark);
List styles = document.getStyleSelectors();
assertEquals("Incorrect number of styles", 1, styles.size());
// // TODO: re-enable w/o relying on getStyleUrlResolved
// KMLPlacemark placemark = (KMLPlacemark) features.get(0);
// assertEquals("Incorrect name", "Building 41", placemark.getName());
// assertEquals("Incorrect styleUrl", "#transBluePoly", placemark.getStyleUrl().getCharacters());
// assertNotNull("Style is null", placemark.getStyleUrlResolved());
//
// assertTrue("Placemark feature is not as expected", placemark.getGeometry() instanceof KMLPolygon);
// KMLPolygon pgon = (KMLPolygon) placemark.getGeometry();
// assertEquals("Incorrect extrude value", (Boolean) true, pgon.getExtrude());
// assertEquals("Incorrect altitude mode", "relativeToGround", pgon.getAltitudeMode());
//
// KMLStyle style = placemark.getStyleUrlResolved();
// KMLLineStyle lineStyle = style.getLineStyle();
// assertNotNull("LineStyle is null", lineStyle);
// assertEquals("Line style width is not as expected", 1.5, lineStyle.getWidth());
//
// KMLPolyStyle polyStyle = style.getPolyStyle();
// assertNotNull("PolyStyle is null", polyStyle);
// assertEquals("Poly style color is not as expected", "7dff0000", polyStyle.getColor());
}
public void testKMZFromFileURL()
{
try
{
File file = new File("testData/KML/kmztest01.kmz");
KMLRoot root = KMLRoot.create(new URL("file:///" + file.getAbsolutePath().replace(" ", "%20")));
root.parse();
String[] fileNames = new String[]
{
"files/BurjOverlay.png",
"files/CNOverlay.png",
"files/EmpireOverlay.png",
"files/PetronasOverlay.png",
"files/SearsOverlay.png",
"files/ShanghaiOverlay.png",
"files/TaipeiOverlay.png",
"files/TurningOverlay.png",
"files/ContinueOverlay.png",
"files/camera_mode.png",
"files/3DBuildingsLayer3.png",
};
for (String name : fileNames)
{
InputStream is = root.getKMLDoc().getSupportFileStream(name);
assertNotNull("Support file not found in KMZ: " + name, is);
}
}
catch (Exception e)
{
e.printStackTrace();
throw new WWRuntimeException();
}
}
}
}