diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8a00ba7..fb9c150 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,12 +1,12 @@ [versions] -awaitility = "4.2.1" +awaitility = "4.3.0" checkstyle = "10.12.5" jackson = "2.17.2" jacoco = "0.8.12" -junit = "5.10.2" -junit-platform = "1.10.2" -spotbugs = "6.0.12" -spotbugs-annotations = "4.8.6" +junit = "6.1.0" +junit-platform = "6.1.0" +spotbugs = "6.5.6" +spotbugs-annotations = "4.10.2" spotless = "6.25.0" [libraries] diff --git a/src/main/java/dev/krotname/networkchat/network/ChatHistoryStore.java b/src/main/java/dev/krotname/networkchat/network/ChatHistoryStore.java index c8afa1a..e13e576 100644 --- a/src/main/java/dev/krotname/networkchat/network/ChatHistoryStore.java +++ b/src/main/java/dev/krotname/networkchat/network/ChatHistoryStore.java @@ -24,6 +24,7 @@ public final class ChatHistoryStore { private final Path historyFile; private final int historyLimit; private final List messages = new ArrayList<>(); + private final Object lock = new Object(); private final boolean enabled; private int corruptRecordCount; @@ -45,41 +46,49 @@ public static ChatHistoryStore open(Path historyFile, int historyLimit) { return new ChatHistoryStore(historyFile, historyLimit, true); } - public synchronized void save(ChatMessage message) { - if (!enabled || !isPersistable(message)) { - return; + public void save(ChatMessage message) { + synchronized (lock) { + if (!enabled || !isPersistable(message)) { + return; + } + messages.add(message); + trimToLimit(); + rewrite(); } - messages.add(message); - trimToLimit(); - rewrite(); } - public synchronized List recentRoomMessages(String roomName, int limit) { - if (limit <= 0) { - return List.of(); - } - List roomMessages = new ArrayList<>(); - for (ChatMessage message : messages) { - if (message.type() == MessageType.ROOM_TEXT && roomName.equals(message.room())) { - roomMessages.add(message); + public List recentRoomMessages(String roomName, int limit) { + synchronized (lock) { + if (limit <= 0) { + return List.of(); } + List roomMessages = new ArrayList<>(); + for (ChatMessage message : messages) { + if (message.type() == MessageType.ROOM_TEXT && roomName.equals(message.room())) { + roomMessages.add(message); + } + } + return last(roomMessages, limit); } - return last(roomMessages, limit); } - public synchronized Set knownRooms() { - Set rooms = new TreeSet<>(); - rooms.add(ChatMessage.GENERAL_ROOM); - for (ChatMessage message : messages) { - if (message.room() != null && !message.room().isBlank()) { - rooms.add(message.room()); + public Set knownRooms() { + synchronized (lock) { + Set rooms = new TreeSet<>(); + rooms.add(ChatMessage.GENERAL_ROOM); + for (ChatMessage message : messages) { + if (message.room() != null && !message.room().isBlank()) { + rooms.add(message.room()); + } } + return Collections.unmodifiableSet(rooms); } - return Collections.unmodifiableSet(rooms); } - public synchronized int corruptRecordCount() { - return corruptRecordCount; + public int corruptRecordCount() { + synchronized (lock) { + return corruptRecordCount; + } } private void load() {