// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.io; import java.io.BufferedWriter; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.text.DateFormat; import org.openstreetmap.josm.data.notes.Note; import org.openstreetmap.josm.data.notes.NoteComment; import org.openstreetmap.josm.data.osm.NoteData; import org.openstreetmap.josm.data.osm.User; import org.openstreetmap.josm.tools.date.DateUtils; /** * Class to write a collection of notes out to XML. * The format is that of the note dump file with the addition of one * attribute in the comment element to indicate if the comment is a new local * comment that has not been uploaded to the OSM server yet. */ public class NoteWriter extends XmlWriter { private final DateFormat iso8601Format = DateUtils.newIsoDateTimeFormat(); /** * Create a NoteWriter that will write to the given PrintWriter * @param out PrintWriter to write XML to */ public NoteWriter(PrintWriter out) { super(out); } /** * Create a NoteWriter that will write to a given OutputStream. * @param out OutputStream to write XML to */ public NoteWriter(OutputStream out) { super(new PrintWriter(new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8)))); } /** * Write notes to designated output target * @param data Note collection to write */ public void write(NoteData data) { out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); out.println("<osm-notes>"); for (Note note : data.getNotes()) { out.print(" <note "); out.print("id=\"" + note.getId() + "\" "); out.print("lat=\"" + note.getLatLon().lat() + "\" "); out.print("lon=\"" + note.getLatLon().lon() + "\" "); out.print("created_at=\"" + iso8601Format.format(note.getCreatedAt()) + "\" "); if (note.getClosedAt() != null) { out.print("closed_at=\"" + iso8601Format.format(note.getClosedAt()) + "\" "); } out.println(">"); for (NoteComment comment : note.getComments()) { writeComment(comment); } out.println(" </note>"); } out.println("</osm-notes>"); out.flush(); } private void writeComment(NoteComment comment) { out.print(" <comment"); out.print(" action=\"" + comment.getNoteAction() + "\" "); out.print("timestamp=\"" + iso8601Format.format(comment.getCommentTimestamp()) + "\" "); if (comment.getUser() != null && !comment.getUser().equals(User.getAnonymous())) { out.print("uid=\"" + comment.getUser().getId() + "\" "); out.print("user=\"" + encode(comment.getUser().getName()) + "\" "); } out.print("is_new=\"" + comment.isNew() + "\" "); out.print(">"); out.print(encode(comment.getText(), false)); out.println("</comment>"); } }