/*
* 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;
* 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.geotoolkit.data.osm.xml;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.geotoolkit.data.osm.model.Bound;
import org.geotoolkit.data.osm.model.ChangeSet;
import org.geotoolkit.data.osm.model.MemberType;
import org.geotoolkit.data.osm.model.Transaction;
import org.geotoolkit.data.osm.model.TransactionType;
import org.apache.sis.internal.util.UnmodifiableArrayList;
import org.geotoolkit.data.osm.model.OSMModelConstants;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import org.opengis.feature.Feature;
/**
*
* @author Johann Sorel (Geomatys)
* @module
*/
public class OSMXMLWriterTest extends org.geotoolkit.test.TestBase {
private static final GeometryFactory GF = new GeometryFactory();
public OSMXMLWriterTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
@Test
public void testChangeSetWrite() throws Exception {
final File file = File.createTempFile("osmChangeSet", ".xml");
file.deleteOnExit();
final Date date = new Date();
final Feature user = OSMModelConstants.TYPE_USER.newInstance();
user.setPropertyValue("uid", 23);
user.setPropertyValue("user", "jean");
ChangeSet cs = new ChangeSet(13, user, date.getTime(), Boolean.TRUE,
Bound.create(10, 30, 5, 45),
Collections.singletonMap("created_by", "geotoolkit"));
final OSMXMLWriter writer = new OSMXMLWriter();
writer.setOutput(file);
writer.writeStartDocument();
writer.writeOSMTag();
writer.writeChangeSet(cs);
writer.writeEndDocument();
writer.dispose();
final OSMXMLReader reader = new OSMXMLReader();
reader.setInput(file);
Object ob = reader.next();
assertFalse(reader.hasNext());
reader.dispose();
assertTrue(ob instanceof ChangeSet);
ChangeSet csRead = (ChangeSet) ob;
assertEquals(cs, csRead);
}
@Test
public void testTransactionWrite() throws Exception {
final File file = File.createTempFile("osmTransaction", ".xml");
file.deleteOnExit();
final List<Feature> created = new ArrayList<>();
final Feature n1 = OSMModelConstants.TYPE_NODE.newInstance();
n1.setPropertyValue("point", GF.createPoint(new Coordinate(45.3, 12.1)));
n1.setPropertyValue("id", -1l);
n1.setPropertyValue("version", 465);
n1.setPropertyValue("changeset", 789);
n1.setPropertyValue("timestamp", new Date().getTime());
n1.setPropertyValue("tags", Arrays.asList(createTag("tagKey", "tagValue")));
final Feature n2 = OSMModelConstants.TYPE_NODE.newInstance();
n2.setPropertyValue("point", GF.createPoint(new Coordinate(45.3, 12.1)));
n2.setPropertyValue("id", -1l);
n2.setPropertyValue("version", 465);
n2.setPropertyValue("changeset", 789);
n2.setPropertyValue("timestamp", new Date().getTime());
n2.setPropertyValue("tags", Arrays.asList(createTag("tagKey2", "tagValue3")));
final Feature way1 = OSMModelConstants.TYPE_WAY.newInstance();
way1.setPropertyValue("id", -1l);
way1.setPropertyValue("version", 461);
way1.setPropertyValue("changeset", 786);
way1.setPropertyValue("timestamp", new Date().getTime());
way1.setPropertyValue("tags", Arrays.asList(createTag("tagKey4", "tagValue5")));
way1.setPropertyValue("nd", Arrays.asList(-1l,-2l));
final Feature way2 = OSMModelConstants.TYPE_WAY.newInstance();
way2.setPropertyValue("id", -1l);
way2.setPropertyValue("version", 461);
way2.setPropertyValue("changeset", 783);
way2.setPropertyValue("timestamp", new Date().getTime());
way2.setPropertyValue("tags", Arrays.asList(createTag("tagKey6", "tagValue7")));
way2.setPropertyValue("nd", Arrays.asList(-456l,-329l));
final Feature rel = OSMModelConstants.TYPE_RELATION.newInstance();
rel.setPropertyValue("id", 12l);
rel.setPropertyValue("version", 89);
rel.setPropertyValue("changeset", 222);
rel.setPropertyValue("timestamp", new Date().getTime());
rel.setPropertyValue("tags", Arrays.asList(createTag("tagKey8", "tagValue9")));
rel.setPropertyValue("members", Arrays.asList(createMember(48, MemberType.NODE, "border")));
created.add(n1);
created.add(n2);
created.add(way1);
created.add(way2);
created.add(rel);
// created.add( new Node(45.3, 12.1, -1, 465, 789, null, new Date().getTime(), Collections.singletonMap("tagKey", "tagValue")) );
// created.add( new Node(45.3, 12.1, -2, 465, 789, null, new Date().getTime(), Collections.singletonMap("tagKey2", "tagValue3")) );
// created.add(new Way(UnmodifiableArrayList.wrap(new Long[]{-1l,-2l}),
// -1, 461, 786, null, new Date().getTime(), Collections.singletonMap("tagKey4", "tagValue5")) );
// created.add(new Way(UnmodifiableArrayList.wrap(new Long[]{456l,329l}),
// -1, 467, 783, null, new Date().getTime(), Collections.singletonMap("tagKey6", "tagValue7")) );
// created.add(new Relation(UnmodifiableArrayList.wrap( new Member[]{new Member(48, MemberType.NODE, "border")}),
// 12, 89, 222, User.NONE, new Date().getTime(), Collections.singletonMap("tagKey8", "tagValue9")));
final Transaction trans1 = new Transaction(TransactionType.CREATE, created, "1.0.1", "GeotoolKit1.org");
final Transaction trans2 = new Transaction(TransactionType.MODIFY, created, "1.0.2", "GeotoolKit2.org");
final Transaction trans3 = new Transaction(TransactionType.DELETE, created, "1.0.3", "GeotoolKit3.org");
final OSMXMLWriter writer = new OSMXMLWriter();
writer.setOutput(file);
writer.writeStartDocument();
writer.writeOSMChangeTag("version", "generator");
writer.writeTransaction(trans1);
writer.writeTransaction(trans2);
writer.writeTransaction(trans3);
writer.writeEndDocument();
writer.dispose();
final OSMXMLReader reader = new OSMXMLReader();
reader.setInput(file);
Transaction r1 = (Transaction) reader.next();
Transaction r2 = (Transaction) reader.next();
Transaction r3 = (Transaction) reader.next();
assertFalse(reader.hasNext());
reader.dispose();
assertEquals(trans1, r1);
assertEquals(trans2, r2);
assertEquals(trans3, r3);
}
private static Feature createTag(String key, String value){
final Feature tag = OSMModelConstants.TYPE_TAG.newInstance();
tag.setPropertyValue("k", key);
tag.setPropertyValue("v", value);
return tag;
}
private static Feature createMember(long ref, MemberType type, String role){
final Feature member = OSMModelConstants.TYPE_RELATION_MEMBER.newInstance();
member.setPropertyValue("ref", ref);
member.setPropertyValue("type", type);
member.setPropertyValue("role", role);
return member;
}
}