// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.JunctionChecker.writing;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.Channel;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.ChannelDiGraph;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.OSMEntity;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.OSMNode;
/**
* @author joerg
*/
public class OSMXMLWriter {
String filename;
ChannelDiGraph digraph;
XMLStreamWriter writer;
public OSMXMLWriter(String filename, ChannelDiGraph digraph) {
this.filename = filename;
this.digraph = digraph;
}
public void writeXML() throws FileNotFoundException, XMLStreamException {
XMLOutputFactory factory = XMLOutputFactory.newInstance();
writer = factory.createXMLStreamWriter(
new FileOutputStream(filename));
// Der XML-Header wird erzeugt
writer.writeStartDocument("utf-8", "1.0");
// Zuerst wird das Wurzelelement mit Attribut geschrieben
writer.writeStartElement("osm");
writer.writeAttribute("version", "0.6");
writer.writeAttribute("generator", "channelGenerator");
writer.writeEmptyElement("bounds");
writer.writeAttribute("minlat", Double.toString(digraph.getBbbottom()));
writer.writeAttribute("minlon", Double.toString(digraph.getBbleft()));
writer.writeAttribute("maxlat", Double.toString(digraph.getBbtop()));
writer.writeAttribute("maxlon", Double.toString(digraph.getBbright()));
OSMNode[] nodes = digraph.getAllOSMNodes();
for (int i = 0; i < nodes.length; i++) {
//writer.writeStartElement("node");
writer.writeEmptyElement("node");
writeAttributes(nodes[i]);
}
ArrayList<Channel> ways = digraph.getChannels();
for (int i = 0; i < ways.size(); i++) {
writer.writeStartElement("way");
writer.writeAttribute("id", Integer.toString(ways.get(i).getNewid()));
writeAttributes(ways.get(i).getWay());
writer.writeEmptyElement("nd");
writer.writeAttribute("ref", Long.toString(ways.get(i).getFromNode().getId()));
//writer.writeEndElement();
writer.writeEmptyElement("nd");
writer.writeAttribute("ref", Long.toString(ways.get(i).getToNode().getId()));
//writer.writeEndElement();
HashMap<String, String> tags = ways.get(i).getWay().getHashmap();
Set<String> keys = tags.keySet();
String t;
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
t = iterator.next();
writer.writeEmptyElement("tag");
writer.writeAttribute("k", t);
writer.writeAttribute("v", tags.get(t));
}
writer.writeEmptyElement("tag");
writer.writeAttribute("k", "ID");
writer.writeAttribute("v", Integer.toString(ways.get(i).getNewid()));
writer.writeEmptyElement("tag");
writer.writeAttribute("k", "SCC");
if (ways.get(i).isStrongConnected()) {
writer.writeAttribute("v", "true");
} else {
writer.writeAttribute("v", "false");
}
writer.writeEndElement();
}
writer.writeEndElement();
writer.writeEndDocument();
writer.close();
}
private void writeAttributes(OSMEntity ent) throws FileNotFoundException, XMLStreamException {
if (ent instanceof OSMNode) {
writer.writeAttribute("id", Long.toString(ent.getId()));
writer.writeAttribute("lat", Double.toString(((OSMNode) ent).getLatitude()));
writer.writeAttribute("lon", Double.toString(((OSMNode) ent).getLongitude()));
}
if (ent.getTimestamp() != null) {
writer.writeAttribute("timestamp", ent.getTimestamp());
}
if (ent.isVisible())
writer.writeAttribute("visible", "true");
else writer.writeAttribute("visible", "false");
writer.writeAttribute("version", Integer.toString(ent.getVersion()));
}
}