commit ea73ad8aa3cd8d47aefa54d67f76221bff116b93
Author: Simon Legner <Simon.Legner@gmail.com>
Date:   2021-03-24 00:14:36 +0100

    see #14176 - Migrate Note/NoteComment to Instant

diff --git a/src/org/openstreetmap/josm/data/notes/Note.java b/src/org/openstreetmap/josm/data/notes/Note.java
index 9d0890d5c..3e1967f15 100644
--- a/src/org/openstreetmap/josm/data/notes/Note.java
+++ b/src/org/openstreetmap/josm/data/notes/Note.java
@@ -3,14 +3,13 @@ package org.openstreetmap.josm.data.notes;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Comparator;
-import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
  * A map note. It always has at least one comment since a comment is required to create a note on osm.org.
@@ -65,8 +64,8 @@ public class Note {
 
     private long id;
     private LatLon latLon;
-    private Date createdAt;
-    private Date closedAt;
+    private Instant createdAt;
+    private Instant closedAt;
     private State state;
     private List<NoteComment> comments = new ArrayList<>();
 
@@ -106,32 +105,32 @@ public class Note {
      * Returns the date at which this note was submitted.
      * @return Date that this note was submitted
      */
-    public Date getCreatedAt() {
-        return DateUtils.cloneDate(createdAt);
+    public Instant getCreatedAt() {
+        return createdAt;
     }
 
     /**
      * Sets date at which this note has been created.
      * @param createdAt date at which this note has been created
      */
-    public void setCreatedAt(Date createdAt) {
-        this.createdAt = DateUtils.cloneDate(createdAt);
+    public void setCreatedAt(Instant createdAt) {
+        this.createdAt = createdAt;
     }
 
     /**
      * Returns the date at which this note was closed.
      * @return Date that this note was closed. Null if it is still open.
      */
-    public Date getClosedAt() {
-        return DateUtils.cloneDate(closedAt);
+    public Instant getClosedAt() {
+        return closedAt;
     }
 
     /**
      * Sets date at which this note has been closed.
      * @param closedAt date at which this note has been closed
      */
-    public void setClosedAt(Date closedAt) {
-        this.closedAt = DateUtils.cloneDate(closedAt);
+    public void setClosedAt(Instant closedAt) {
+        this.closedAt = closedAt;
     }
 
     /**
@@ -190,7 +189,7 @@ public class Note {
      */
     public void updateWith(Note note) {
         this.comments = note.comments;
-        this.createdAt = DateUtils.cloneDate(note.createdAt);
+        this.createdAt = note.createdAt;
         this.id = note.id;
         this.state = note.state;
         this.latLon = note.latLon;
diff --git a/src/org/openstreetmap/josm/data/notes/NoteComment.java b/src/org/openstreetmap/josm/data/notes/NoteComment.java
index c3bac11ec..651478f3b 100644
--- a/src/org/openstreetmap/josm/data/notes/NoteComment.java
+++ b/src/org/openstreetmap/josm/data/notes/NoteComment.java
@@ -1,11 +1,10 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.notes;
 
+import java.time.Instant;
 import java.util.Comparator;
-import java.util.Date;
 
 import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
  * Represents a comment made on a note. All notes have at least on comment
@@ -16,7 +15,7 @@ public class NoteComment {
 
     private final String text;
     private final User user;
-    private final Date commentTimestamp;
+    private final Instant commentTimestamp;
     private final Action action;
 
     //not currently used. I'm planning on using this to keep track of new actions that need to be uploaded
@@ -49,10 +48,10 @@ public class NoteComment {
      * @param action The action associated with this comment
      * @param isNew Whether or not this comment is new and needs to be uploaded
      */
-    public NoteComment(Date createDate, User user, String commentText, Action action, boolean isNew) {
+    public NoteComment(Instant createDate, User user, String commentText, Action action, boolean isNew) {
         this.text = commentText;
         this.user = user;
-        this.commentTimestamp = DateUtils.cloneDate(createDate);
+        this.commentTimestamp = createDate;
         this.action = action;
         this.isNew = isNew;
     }
@@ -77,8 +76,8 @@ public class NoteComment {
      * Returns the time at which this comment was created.
      * @return The time at which this comment was created
      */
-    public Date getCommentTimestamp() {
-        return DateUtils.cloneDate(commentTimestamp);
+    public Instant getCommentTimestamp() {
+        return commentTimestamp;
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/osm/NoteData.java b/src/org/openstreetmap/josm/data/osm/NoteData.java
index de7eff7e7..a18e3fdc7 100644
--- a/src/org/openstreetmap/josm/data/osm/NoteData.java
+++ b/src/org/openstreetmap/josm/data/osm/NoteData.java
@@ -1,11 +1,11 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.osm;
 
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -176,10 +176,10 @@ public class NoteData implements Data {
             throw new IllegalArgumentException("Comment can not be blank when creating a note");
         }
         Note note = new Note(location);
-        note.setCreatedAt(new Date());
+        note.setCreatedAt(Instant.now());
         note.setState(State.OPEN);
         note.setId(newNoteId--);
-        NoteComment comment = new NoteComment(new Date(), getCurrentUser(), text, NoteComment.Action.OPENED, true);
+        NoteComment comment = new NoteComment(Instant.now(), getCurrentUser(), text, NoteComment.Action.OPENED, true);
         note.addComment(comment);
         if (Logging.isDebugEnabled()) {
             Logging.debug("Created note {0} with comment: {1}", note.getId(), text);
@@ -203,7 +203,7 @@ public class NoteData implements Data {
         if (Logging.isDebugEnabled()) {
             Logging.debug("Adding comment to note {0}: {1}", note.getId(), text);
         }
-        NoteComment comment = new NoteComment(new Date(), getCurrentUser(), text, NoteComment.Action.COMMENTED, true);
+        NoteComment comment = new NoteComment(Instant.now(), getCurrentUser(), text, NoteComment.Action.COMMENTED, true);
         note.addComment(comment);
         dataUpdated();
     }
@@ -223,10 +223,10 @@ public class NoteData implements Data {
         if (Logging.isDebugEnabled()) {
             Logging.debug("closing note {0} with comment: {1}", note.getId(), text);
         }
-        NoteComment comment = new NoteComment(new Date(), getCurrentUser(), text, NoteComment.Action.CLOSED, true);
+        NoteComment comment = new NoteComment(Instant.now(), getCurrentUser(), text, NoteComment.Action.CLOSED, true);
         note.addComment(comment);
         note.setState(State.CLOSED);
-        note.setClosedAt(new Date());
+        note.setClosedAt(Instant.now());
         dataUpdated();
     }
 
@@ -243,7 +243,7 @@ public class NoteData implements Data {
             throw new IllegalStateException("Cannot reopen a note that isn't closed");
         }
         Logging.debug("reopening note {0} with comment: {1}", note.getId(), text);
-        NoteComment comment = new NoteComment(new Date(), getCurrentUser(), text, NoteComment.Action.REOPENED, true);
+        NoteComment comment = new NoteComment(Instant.now(), getCurrentUser(), text, NoteComment.Action.REOPENED, true);
         note.addComment(comment);
         note.setState(State.OPEN);
         dataUpdated();
diff --git a/src/org/openstreetmap/josm/io/NoteReader.java b/src/org/openstreetmap/josm/io/NoteReader.java
index b66db63b5..6020360af 100644
--- a/src/org/openstreetmap/josm/io/NoteReader.java
+++ b/src/org/openstreetmap/josm/io/NoteReader.java
@@ -5,8 +5,8 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 import java.util.Optional;
@@ -59,7 +59,7 @@ public class NoteReader {
         private long commentUid;
         private String commentUsername;
         private Action noteAction;
-        private Date commentCreateDate;
+        private Instant commentCreateDate;
         private boolean commentIsNew;
         private List<Note> notes;
         private String commentText;
@@ -99,7 +99,7 @@ public class NoteReader {
                 commentUid = Long.parseLong(Optional.ofNullable(attrs.getValue("uid")).orElse("0"));
                 commentUsername = attrs.getValue("user");
                 noteAction = Action.valueOf(attrs.getValue("action").toUpperCase(Locale.ENGLISH));
-                commentCreateDate = DateUtils.fromString(attrs.getValue("timestamp"));
+                commentCreateDate = DateUtils.parseInstant(attrs.getValue("timestamp"));
                 commentIsNew = Boolean.parseBoolean(Optional.ofNullable(attrs.getValue("is_new")).orElse("false"));
                 break;
             default: // Do nothing
@@ -142,13 +142,13 @@ public class NoteReader {
                 thisNote.setState(Note.State.valueOf(buffer.toString().toUpperCase(Locale.ENGLISH)));
                 break;
             case "date_created":
-                thisNote.setCreatedAt(DateUtils.fromString(buffer.toString()));
+                thisNote.setCreatedAt(DateUtils.parseInstant(buffer.toString()));
                 break;
             case "date_closed":
-                thisNote.setClosedAt(DateUtils.fromString(buffer.toString()));
+                thisNote.setClosedAt(DateUtils.parseInstant(buffer.toString()));
                 break;
             case "date":
-                commentCreateDate = DateUtils.fromString(buffer.toString());
+                commentCreateDate = DateUtils.parseInstant(buffer.toString());
                 break;
             case "user":
                 commentUsername = buffer.toString();
@@ -204,11 +204,11 @@ public class NoteReader {
             note.setState(Note.State.OPEN);
         } else {
             note.setState(Note.State.CLOSED);
-            note.setClosedAt(DateUtils.fromString(closedTimeStr));
+            note.setClosedAt(DateUtils.parseInstant(closedTimeStr));
         }
         String createdAt = attrs.apply("created_at");
         if (createdAt != null) {
-            note.setCreatedAt(DateUtils.fromString(createdAt));
+            note.setCreatedAt(DateUtils.parseInstant(createdAt));
         }
         return note;
     }
diff --git a/src/org/openstreetmap/josm/io/NoteWriter.java b/src/org/openstreetmap/josm/io/NoteWriter.java
index a403ca13f..00fe4beb8 100644
--- a/src/org/openstreetmap/josm/io/NoteWriter.java
+++ b/src/org/openstreetmap/josm/io/NoteWriter.java
@@ -12,7 +12,6 @@ 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.
@@ -52,9 +51,9 @@ public class NoteWriter extends XmlWriter {
             out.print("id=\"" + note.getId() + "\" ");
             out.print("lat=\"" + LatLon.cDdHighPrecisionFormatter.format(ll.lat()) + "\" ");
             out.print("lon=\"" + LatLon.cDdHighPrecisionFormatter.format(ll.lon()) + "\" ");
-            out.print("created_at=\"" + DateUtils.fromDate(note.getCreatedAt()) + "\" ");
+            out.print("created_at=\"" + note.getCreatedAt() + "\" ");
             if (note.getClosedAt() != null) {
-                out.print("closed_at=\"" + DateUtils.fromDate(note.getClosedAt()) + "\" ");
+                out.print("closed_at=\"" + note.getClosedAt() + "\" ");
             }
 
             out.println(">");
@@ -71,7 +70,7 @@ public class NoteWriter extends XmlWriter {
     private void writeComment(NoteComment comment) {
         out.print("    <comment");
         out.print(" action=\"" + comment.getNoteAction() + "\" ");
-        out.print("timestamp=\"" + DateUtils.fromDate(comment.getCommentTimestamp()) + "\" ");
+        out.print("timestamp=\"" + comment.getCommentTimestamp() + "\" ");
         if (comment.getUser() != null && !comment.getUser().equals(User.getAnonymous())) {
             out.print("uid=\"" + comment.getUser().getId() + "\" ");
             out.print("user=\"" + encode(comment.getUser().getName()) + "\" ");
diff --git a/test/unit/org/openstreetmap/josm/data/notes/NoteCommentTest.java b/test/unit/org/openstreetmap/josm/data/notes/NoteCommentTest.java
index 1b37bb9ee..17a080c66 100644
--- a/test/unit/org/openstreetmap/josm/data/notes/NoteCommentTest.java
+++ b/test/unit/org/openstreetmap/josm/data/notes/NoteCommentTest.java
@@ -5,7 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import java.util.Date;
+import java.time.Instant;
 
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
@@ -30,7 +30,7 @@ class NoteCommentTest {
      */
     @Test
     void testNoteComment() {
-        NoteComment comment = new NoteComment(new Date(), null, "foo", null, true);
+        NoteComment comment = new NoteComment(Instant.now(), null, "foo", null, true);
         assertEquals("foo", comment.toString());
         assertTrue(comment.isNew());
         comment.setNew(false);
diff --git a/test/unit/org/openstreetmap/josm/data/notes/NoteTest.java b/test/unit/org/openstreetmap/josm/data/notes/NoteTest.java
index 7dfc60775..60d5e9ed5 100644
--- a/test/unit/org/openstreetmap/josm/data/notes/NoteTest.java
+++ b/test/unit/org/openstreetmap/josm/data/notes/NoteTest.java
@@ -4,7 +4,7 @@ package org.openstreetmap.josm.data.notes;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 
-import java.util.Date;
+import java.time.Instant;
 
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
@@ -35,7 +35,7 @@ class NoteTest {
     void testToString() {
         Note note = new Note(LatLon.ZERO);
         assertEquals("Note 0: null", note.toString());
-        note.addComment(new NoteComment(new Date(), null, "foo", null, true));
+        note.addComment(new NoteComment(Instant.now(), null, "foo", null, true));
         assertEquals("Note 0: foo", note.toString());
     }
 
@@ -64,8 +64,8 @@ class NoteTest {
             .suppress(Warning.NONFINAL_FIELDS)
             .withPrefabValues(LatLon.class, LatLon.ZERO, new LatLon(1, 1))
             .withPrefabValues(NoteComment.class,
-                    new NoteComment(new Date(), null, "foo", null, true),
-                    new NoteComment(new Date(), null, "bar", null, false))
+                    new NoteComment(Instant.now(), null, "foo", null, true),
+                    new NoteComment(Instant.now(), null, "bar", null, false))
             .verify();
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java
index 5f05f78df..f0a3f0e41 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java
@@ -3,7 +3,7 @@ package org.openstreetmap.josm.gui.dialogs;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import java.util.Date;
+import java.time.Instant;
 
 import javax.swing.JLabel;
 import javax.swing.JList;
@@ -34,8 +34,8 @@ class NotesDialogTest {
     @Test
     void testMultiLineNoteRendering() {
         Note note = new Note(LatLon.ZERO);
-        note.setCreatedAt(new Date());
-        note.addComment(new NoteComment(new Date(), User.createLocalUser(null), "foo\nbar\n\nbaz:\nfoo", null, false));
+        note.setCreatedAt(Instant.now());
+        note.addComment(new NoteComment(Instant.now(), User.createLocalUser(null), "foo\nbar\n\nbaz:\nfoo", null, false));
         assertEquals("0: foo; bar; baz: foo",
                 ((JLabel) new NoteRenderer().getListCellRendererComponent(new JList<>(), note, 0, false, false)).getText());
     }
