/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2010, Geomatys * * 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.geotoolkit.data.kml; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateSequence; import java.awt.Color; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; import java.util.Iterator; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.XMLStreamException; import org.geotoolkit.data.kml.model.IdAttributes; import org.geotoolkit.data.kml.model.Kml; import org.geotoolkit.data.kml.model.KmlException; import org.geotoolkit.data.kml.model.KmlModelConstants; import org.geotoolkit.data.kml.model.ListItem; import org.geotoolkit.data.kml.model.ListStyle; import org.geotoolkit.data.kml.model.Point; import org.geotoolkit.data.kml.model.Style; import org.geotoolkit.data.kml.xml.KmlReader; import org.geotoolkit.data.kml.xml.KmlWriter; import org.geotoolkit.xml.DomCompare; import org.junit.Test; import org.opengis.feature.Feature; import org.geotoolkit.data.kml.xml.KmlConstants; import org.xml.sax.SAXException; import static org.junit.Assert.*; /** * * @author Samuel Andrés * @module */ public class ListStyleTest extends org.geotoolkit.test.TestBase { private static final double DELTA = 0.000000000001; private static final String pathToTestFile = "src/test/resources/org/geotoolkit/data/kml/listStyle.kml"; @Test public void listStyleReadTest() throws IOException, XMLStreamException, URISyntaxException, KmlException { final Feature document; { final KmlReader reader = new KmlReader(); reader.setInput(new File(pathToTestFile)); final Kml kmlObjects = reader.read(); reader.dispose(); document = kmlObjects.getAbstractFeature(); assertEquals(KmlModelConstants.TYPE_DOCUMENT, document.getType()); assertEquals("ListStyle.kml", document.getPropertyValue(KmlConstants.TAG_NAME)); assertEquals(Boolean.TRUE, document.getPropertyValue(KmlConstants.TAG_OPEN)); } final Style style0, style1, style2; { final Iterator<?> i = ((Iterable<?>) document.getPropertyValue(KmlConstants.TAG_STYLE_SELECTOR)).iterator(); assertTrue("Expected at least one element.", i.hasNext()); style0 = (Style) i.next(); assertEquals(new Color(153, 102, 51, 255), style0.getListStyle().getBgColor()); assertEquals("bgColorExample", style0.getIdAttributes().getId()); assertTrue("Expected at least 2 elements.", i.hasNext()); style1 = (Style) i.next(); assertEquals(ListItem.CHECK_HIDE_CHILDREN, style1.getListStyle().getListItem()); assertEquals("checkHideChildrenExample", style1.getIdAttributes().getId()); assertTrue("Expected at least 3 elements.", i.hasNext()); style2 = (Style) i.next(); assertEquals(ListItem.RADIO_FOLDER, style2.getListStyle().getListItem()); assertEquals("radioFolderExample", style2.getIdAttributes().getId()); assertFalse("Expected exactly 3 elements.", i.hasNext()); } final Feature rootFolder; { final Iterator<?> i = ((Iterable<?>) document.getPropertyValue(KmlConstants.TAG_FEATURES)).iterator(); assertTrue("Expected at least one element.", i.hasNext()); rootFolder = (Feature) i.next(); assertEquals(KmlModelConstants.TYPE_FOLDER, rootFolder.getType()); assertEquals("ListStyle Examples", rootFolder.getPropertyValue(KmlConstants.TAG_NAME)); assertEquals(Boolean.TRUE, rootFolder.getPropertyValue(KmlConstants.TAG_OPEN)); assertFalse("Expected exactly one element.", i.hasNext()); } final Feature folder0, folder1, folder2; { final Iterator<?> i = ((Iterable<?>) rootFolder.getPropertyValue(KmlConstants.TAG_FEATURES)).iterator(); assertTrue("Expected at least one element.", i.hasNext()); folder0 = (Feature) i.next(); assertEquals("bgColor example", folder0.getPropertyValue(KmlConstants.TAG_NAME)); assertEquals(Boolean.TRUE, folder0.getPropertyValue(KmlConstants.TAG_OPEN)); assertEquals(new URI("#bgColorExample"), folder0.getPropertyValue(KmlConstants.TAG_STYLE_URL)); assertTrue("Expected at least 2 elements.", i.hasNext()); folder1 = (Feature) i.next(); assertEquals("checkHideChildren example", folder1.getPropertyValue(KmlConstants.TAG_NAME)); assertEquals(Boolean.TRUE, folder1.getPropertyValue(KmlConstants.TAG_OPEN)); assertEquals(new URI("#checkHideChildrenExample"), folder1.getPropertyValue(KmlConstants.TAG_STYLE_URL)); assertTrue("Expected at least 3 elements.", i.hasNext()); folder2 = (Feature) i.next(); assertEquals("radioFolder example", folder2.getPropertyValue(KmlConstants.TAG_NAME)); assertEquals(Boolean.TRUE, folder2.getPropertyValue(KmlConstants.TAG_OPEN)); assertEquals(new URI("#radioFolderExample"), folder2.getPropertyValue(KmlConstants.TAG_STYLE_URL)); assertFalse("Expected exactly 3 elements.", i.hasNext()); } // Folder 0 { final Iterator<?> i = ((Iterable<?>) folder0.getPropertyValue(KmlConstants.TAG_FEATURES)).iterator(); assertTrue("Expected at least one element.", i.hasNext()); Feature placemark = (Feature) i.next(); assertEquals("pl1", placemark.getPropertyValue(KmlConstants.TAG_NAME)); CoordinateSequence coordinates = ((Point) placemark.getPropertyValue(KmlConstants.TAG_GEOMETRY)).getCoordinateSequence(); assertEquals(1, coordinates.size()); assertEquals(-122.362815, coordinates.getCoordinate(0).x, DELTA); assertEquals( 37.822931, coordinates.getCoordinate(0).y, DELTA); assertEquals( 0, coordinates.getCoordinate(0).z, DELTA); assertTrue("Expected at least 2 elements.", i.hasNext()); placemark = (Feature) i.next(); assertEquals("pl2", placemark.getPropertyValue(KmlConstants.TAG_NAME)); coordinates = ((Point) placemark.getPropertyValue(KmlConstants.TAG_GEOMETRY)).getCoordinateSequence(); assertEquals( 1, coordinates.size()); assertEquals(-122.362825, coordinates.getCoordinate(0).x, DELTA); assertEquals( 37.822931, coordinates.getCoordinate(0).y, DELTA); assertEquals( 0, coordinates.getCoordinate(0).z, DELTA); assertTrue("Expected at least 3 elements.", i.hasNext()); placemark = (Feature) i.next(); assertEquals("pl3", placemark.getPropertyValue(KmlConstants.TAG_NAME)); coordinates = ((Point) placemark.getPropertyValue(KmlConstants.TAG_GEOMETRY)).getCoordinateSequence(); assertEquals( 1, coordinates.size()); assertEquals(-122.362835, coordinates.getCoordinate(0).x, DELTA); assertEquals( 37.822931, coordinates.getCoordinate(0).y, DELTA); assertEquals( 0, coordinates.getCoordinate(0).z, DELTA); assertFalse("Expected exactly 3 elements.", i.hasNext()); } // Folder 1 { final Iterator<?> i = ((Iterable<?>) folder1.getPropertyValue(KmlConstants.TAG_FEATURES)).iterator(); assertTrue("Expected at least one element.", i.hasNext()); Feature placemark = (Feature) i.next(); assertEquals("pl4", placemark.getPropertyValue(KmlConstants.TAG_NAME)); CoordinateSequence coordinates = ((Point) placemark.getPropertyValue(KmlConstants.TAG_GEOMETRY)).getCoordinateSequence(); assertEquals( 1, coordinates.size()); assertEquals(-122.362845, coordinates.getCoordinate(0).x, DELTA); assertEquals( 37.822941, coordinates.getCoordinate(0).y, DELTA); assertEquals( 0, coordinates.getCoordinate(0).z, DELTA); assertTrue("Expected at least 2 elements.", i.hasNext()); placemark = (Feature) i.next(); assertEquals("pl5", placemark.getPropertyValue(KmlConstants.TAG_NAME)); coordinates = ((Point) placemark.getPropertyValue(KmlConstants.TAG_GEOMETRY)).getCoordinateSequence(); assertEquals( 1, coordinates.size()); assertEquals(-122.362855, coordinates.getCoordinate(0).x, DELTA); assertEquals( 37.822941, coordinates.getCoordinate(0).y, DELTA); assertEquals( 0, coordinates.getCoordinate(0).z, DELTA); assertTrue("Expected at least 3 elements.", i.hasNext()); placemark = (Feature) i.next(); assertEquals("pl6", placemark.getPropertyValue(KmlConstants.TAG_NAME)); coordinates = ((Point) placemark.getPropertyValue(KmlConstants.TAG_GEOMETRY)).getCoordinateSequence(); assertEquals( 1, coordinates.size()); assertEquals(-122.362865, coordinates.getCoordinate(0).x, DELTA); assertEquals( 37.822941, coordinates.getCoordinate(0).y, DELTA); assertEquals( 0, coordinates.getCoordinate(0).z, DELTA); assertFalse("Expected exactly 3 elements.", i.hasNext()); } // Folder 2 { Iterator<?> i = ((Iterable<?>) folder2.getPropertyValue(KmlConstants.TAG_FEATURES)).iterator(); assertTrue("Expected at least one element.", i.hasNext()); Feature placemark = (Feature) i.next(); assertEquals("pl7", placemark.getPropertyValue(KmlConstants.TAG_NAME)); CoordinateSequence coordinates = ((Point) placemark.getPropertyValue(KmlConstants.TAG_GEOMETRY)).getCoordinateSequence(); assertEquals(1, coordinates.size()); assertEquals(-122.362875, coordinates.getCoordinate(0).x, DELTA); assertEquals(37.822951, coordinates.getCoordinate(0).y, DELTA); assertEquals(0, coordinates.getCoordinate(0).z, DELTA); assertTrue("Expected at least 2 elements.", i.hasNext()); placemark = (Feature) i.next(); assertEquals("pl8", placemark.getPropertyValue(KmlConstants.TAG_NAME)); coordinates = ((Point) placemark.getPropertyValue(KmlConstants.TAG_GEOMETRY)).getCoordinateSequence(); assertEquals( 1, coordinates.size()); assertEquals(-122.362885, coordinates.getCoordinate(0).x, DELTA); assertEquals( 37.822951, coordinates.getCoordinate(0).y, DELTA); assertEquals( 0, coordinates.getCoordinate(0).z, DELTA); assertTrue("Expected at least 3 elements.", i.hasNext()); placemark = (Feature) i.next(); assertEquals("pl9", placemark.getPropertyValue(KmlConstants.TAG_NAME)); coordinates = ((Point) placemark.getPropertyValue(KmlConstants.TAG_GEOMETRY)).getCoordinateSequence(); assertEquals( 1, coordinates.size()); assertEquals(-122.362895, coordinates.getCoordinate(0).x, DELTA); assertEquals( 37.822951, coordinates.getCoordinate(0).y, DELTA); assertEquals( 0, coordinates.getCoordinate(0).z, DELTA); assertFalse("Expected exactly 3 elements.", i.hasNext()); } } @Test public void listStyleWriteTest() throws KmlException, IOException, XMLStreamException, ParserConfigurationException, SAXException, URISyntaxException { final KmlFactory kmlFactory = DefaultKmlFactory.getInstance(); final Coordinate coordinate000 = kmlFactory.createCoordinate(-122.362815, 37.822931, 0); final Coordinate coordinate010 = kmlFactory.createCoordinate(-122.362825, 37.822931, 0); final Coordinate coordinate020 = kmlFactory.createCoordinate(-122.362835, 37.822931, 0); final Coordinate coordinate100 = kmlFactory.createCoordinate(-122.362845, 37.822941, 0); final Coordinate coordinate110 = kmlFactory.createCoordinate(-122.362855, 37.822941, 0); final Coordinate coordinate120 = kmlFactory.createCoordinate(-122.362865, 37.822941, 0); final Coordinate coordinate200 = kmlFactory.createCoordinate(-122.362875, 37.822951, 0); final Coordinate coordinate210 = kmlFactory.createCoordinate(-122.362885, 37.822951, 0); final Coordinate coordinate220 = kmlFactory.createCoordinate(-122.362895, 37.822951, 0); final CoordinateSequence coordinates00 = kmlFactory.createCoordinates(Arrays.asList(coordinate000)); final CoordinateSequence coordinates01 = kmlFactory.createCoordinates(Arrays.asList(coordinate010)); final CoordinateSequence coordinates02 = kmlFactory.createCoordinates(Arrays.asList(coordinate020)); final CoordinateSequence coordinates10 = kmlFactory.createCoordinates(Arrays.asList(coordinate100)); final CoordinateSequence coordinates11 = kmlFactory.createCoordinates(Arrays.asList(coordinate110)); final CoordinateSequence coordinates12 = kmlFactory.createCoordinates(Arrays.asList(coordinate120)); final CoordinateSequence coordinates20 = kmlFactory.createCoordinates(Arrays.asList(coordinate200)); final CoordinateSequence coordinates21 = kmlFactory.createCoordinates(Arrays.asList(coordinate210)); final CoordinateSequence coordinates22 = kmlFactory.createCoordinates(Arrays.asList(coordinate220)); final Point point00 = kmlFactory.createPoint(coordinates00); final Point point01 = kmlFactory.createPoint(coordinates01); final Point point02 = kmlFactory.createPoint(coordinates02); final Point point10 = kmlFactory.createPoint(coordinates10); final Point point11 = kmlFactory.createPoint(coordinates11); final Point point12 = kmlFactory.createPoint(coordinates12); final Point point20 = kmlFactory.createPoint(coordinates20); final Point point21 = kmlFactory.createPoint(coordinates21); final Point point22 = kmlFactory.createPoint(coordinates22); final Feature placemark00 = kmlFactory.createPlacemark(); placemark00.setPropertyValue(KmlConstants.TAG_NAME, "pl1"); placemark00.setPropertyValue(KmlConstants.TAG_GEOMETRY, point00); final Feature placemark01 = kmlFactory.createPlacemark(); placemark01.setPropertyValue(KmlConstants.TAG_NAME, "pl2"); placemark01.setPropertyValue(KmlConstants.TAG_GEOMETRY, point01); final Feature placemark02 = kmlFactory.createPlacemark(); placemark02.setPropertyValue(KmlConstants.TAG_NAME, "pl3"); placemark02.setPropertyValue(KmlConstants.TAG_GEOMETRY, point02); final Feature placemark10 = kmlFactory.createPlacemark(); placemark10.setPropertyValue(KmlConstants.TAG_NAME, "pl4"); placemark10.setPropertyValue(KmlConstants.TAG_GEOMETRY, point10); final Feature placemark11 = kmlFactory.createPlacemark(); placemark11.setPropertyValue(KmlConstants.TAG_NAME, "pl5"); placemark11.setPropertyValue(KmlConstants.TAG_GEOMETRY, point11); final Feature placemark12 = kmlFactory.createPlacemark(); placemark12.setPropertyValue(KmlConstants.TAG_NAME, "pl6"); placemark12.setPropertyValue(KmlConstants.TAG_GEOMETRY, point12); final Feature placemark20 = kmlFactory.createPlacemark(); placemark20.setPropertyValue(KmlConstants.TAG_NAME, "pl7"); placemark20.setPropertyValue(KmlConstants.TAG_GEOMETRY, point20); final Feature placemark21 = kmlFactory.createPlacemark(); placemark21.setPropertyValue(KmlConstants.TAG_NAME, "pl8"); placemark21.setPropertyValue(KmlConstants.TAG_GEOMETRY, point21); final Feature placemark22 = kmlFactory.createPlacemark(); placemark22.setPropertyValue(KmlConstants.TAG_NAME, "pl9"); placemark22.setPropertyValue(KmlConstants.TAG_GEOMETRY, point22); final Feature folder0 = kmlFactory.createFolder(); folder0.setPropertyValue(KmlConstants.TAG_NAME, "bgColor example"); folder0.setPropertyValue(KmlConstants.TAG_OPEN, Boolean.TRUE); folder0.setPropertyValue(KmlConstants.TAG_STYLE_URL, new URI("#bgColorExample")); folder0.setPropertyValue(KmlConstants.TAG_FEATURES, Arrays.asList(placemark00,placemark01,placemark02)); final Feature folder1 = kmlFactory.createFolder(); folder1.setPropertyValue(KmlConstants.TAG_NAME, "checkHideChildren example"); folder1.setPropertyValue(KmlConstants.TAG_OPEN, Boolean.TRUE); folder1.setPropertyValue(KmlConstants.TAG_STYLE_URL, new URI("#checkHideChildrenExample")); folder1.setPropertyValue(KmlConstants.TAG_FEATURES, Arrays.asList(placemark10,placemark11,placemark12)); final Feature folder2 = kmlFactory.createFolder(); folder2.setPropertyValue(KmlConstants.TAG_NAME, "radioFolder example"); folder2.setPropertyValue(KmlConstants.TAG_OPEN, Boolean.TRUE); folder2.setPropertyValue(KmlConstants.TAG_STYLE_URL, new URI("#radioFolderExample")); folder2.setPropertyValue(KmlConstants.TAG_FEATURES, Arrays.asList(placemark20,placemark21,placemark22)); final Feature folder = kmlFactory.createFolder(); folder.setPropertyValue(KmlConstants.TAG_NAME, "ListStyle Examples"); folder.setPropertyValue(KmlConstants.TAG_OPEN, Boolean.TRUE); folder.setPropertyValue(KmlConstants.TAG_FEATURES, Arrays.asList(folder0,folder1,folder2)); final ListStyle listStyle1 = kmlFactory.createListStyle(); listStyle1.setBgColor(new Color(153, 102, 51, 255)); final Style style1 = kmlFactory.createStyle(); style1.setListStyle(listStyle1); final IdAttributes idAttributes1 = kmlFactory.createIdAttributes("bgColorExample", null); style1.setIdAttributes(idAttributes1); final ListStyle listStyle2 = kmlFactory.createListStyle(); listStyle2.setListItem(ListItem.CHECK_HIDE_CHILDREN); final Style style2 = kmlFactory.createStyle(); style2.setListStyle(listStyle2); final IdAttributes idAttributes2 = kmlFactory.createIdAttributes("checkHideChildrenExample", null); style2.setIdAttributes(idAttributes2); final ListStyle listStyle3 = kmlFactory.createListStyle(); listStyle3.setListItem(ListItem.RADIO_FOLDER); final Style style3 = kmlFactory.createStyle(); style3.setListStyle(listStyle3); final IdAttributes idAttributes3 = kmlFactory.createIdAttributes("radioFolderExample", null); style3.setIdAttributes(idAttributes3); final Feature document = kmlFactory.createDocument(); document.setPropertyValue(KmlConstants.TAG_NAME, "ListStyle.kml"); document.setPropertyValue(KmlConstants.TAG_OPEN, Boolean.TRUE); document.setPropertyValue(KmlConstants.TAG_FEATURES, folder); document.setPropertyValue(KmlConstants.TAG_STYLE_SELECTOR, Arrays.asList(style1,style2,style3)); final Kml kml = kmlFactory.createKml(null, document, null, null); final File temp = File.createTempFile("testListStyle", ".kml"); temp.deleteOnExit(); final KmlWriter writer = new KmlWriter(); writer.setOutput(temp); writer.write(kml); writer.dispose(); DomCompare.compare(new File(pathToTestFile), temp); } }