From 407c355b15e6b1161ece6e943a002927abe8e4c7 Mon Sep 17 00:00:00 2001 From: Dan Van Atta Date: Sun, 21 Jul 2024 15:02:18 -0700 Subject: [PATCH] Refactor: simplify headless chat appender (#12742) --- .../game/server/HeadlessLaunchAction.java | 23 +------------- .../game/server/debug/ChatAppender.java | 31 ++++++++++++++----- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/game-app/game-headless/src/main/java/org/triplea/game/server/HeadlessLaunchAction.java b/game-app/game-headless/src/main/java/org/triplea/game/server/HeadlessLaunchAction.java index fd672b3476c..46fb0d5c7d2 100644 --- a/game-app/game-headless/src/main/java/org/triplea/game/server/HeadlessLaunchAction.java +++ b/game-app/game-headless/src/main/java/org/triplea/game/server/HeadlessLaunchAction.java @@ -1,9 +1,5 @@ package org.triplea.game.server; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.filter.ThresholdFilter; import com.google.common.annotations.VisibleForTesting; import games.strategy.engine.chat.Chat; import games.strategy.engine.chat.HeadlessChat; @@ -34,7 +30,6 @@ import java.util.Optional; import java.util.Set; import lombok.extern.slf4j.Slf4j; -import org.slf4j.LoggerFactory; import org.triplea.game.chat.ChatModel; import org.triplea.game.server.debug.ChatAppender; import org.triplea.java.ThreadRunner; @@ -132,27 +127,11 @@ public HeadlessAutoSaveFileUtils getAutoSaveFileUtils() { return new HeadlessAutoSaveFileUtils(); } - private void registerChatAppender(final Chat chat) { - Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - ChatAppender chatAppender = new ChatAppender(chat); - // prevent multiple chat appenders causing memory leak - // ideally this should happen in a shutdown operation somewhere though - logger.detachAppender(chatAppender.getName()); - - ThresholdFilter filter = new ThresholdFilter(); - filter.setLevel(Level.WARN.toString()); - filter.start(); - chatAppender.addFilter(filter); - chatAppender.setContext((LoggerContext) LoggerFactory.getILoggerFactory()); - chatAppender.start(); - logger.addAppender(chatAppender); - } - @Override public ChatModel createChatModel( String chatName, Messengers messengers, ClientNetworkBridge clientNetworkBridge) { Chat chat = new Chat(new MessengersChatTransmitter(chatName, messengers, clientNetworkBridge)); - registerChatAppender(chat); + ChatAppender.attach(chat); return new HeadlessChat(chat); } diff --git a/game-app/game-headless/src/main/java/org/triplea/game/server/debug/ChatAppender.java b/game-app/game-headless/src/main/java/org/triplea/game/server/debug/ChatAppender.java index c61d3f4d300..07112c0b579 100644 --- a/game-app/game-headless/src/main/java/org/triplea/game/server/debug/ChatAppender.java +++ b/game-app/game-headless/src/main/java/org/triplea/game/server/debug/ChatAppender.java @@ -1,10 +1,15 @@ package org.triplea.game.server.debug; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.filter.ThresholdFilter; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; import com.google.common.base.Preconditions; import games.strategy.engine.chat.Chat; -import java.util.List; +import java.util.stream.Stream; +import org.slf4j.LoggerFactory; /** * A {@link AppenderBase} that publishes log records to the chat subsystem. This allows a headless @@ -13,20 +18,32 @@ public final class ChatAppender extends AppenderBase { private final Chat chat; - public ChatAppender(final Chat chat) { + private ChatAppender(final Chat chat) { setName("chatMessage"); this.chat = Preconditions.checkNotNull(chat); } + public static void attach(Chat chat) { + Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + ChatAppender chatAppender = new ChatAppender(chat); + // prevent multiple chat appenders causing memory leak + // ideally this should happen in a shutdown operation somewhere though + logger.detachAppender(chatAppender.getName()); + + ThresholdFilter filter = new ThresholdFilter(); + filter.setLevel(Level.WARN.toString()); + filter.start(); + chatAppender.addFilter(filter); + chatAppender.setContext((LoggerContext) LoggerFactory.getILoggerFactory()); + chatAppender.start(); + logger.addAppender(chatAppender); + } + @Override protected void append(final ILoggingEvent record) { // format log message and send it to the chat window - formatChatMessage(record).stream() + Stream.of(record.getFormattedMessage().trim().split("\\n")) .map(message -> "[" + record.getLevel() + "] " + message) .forEach(chat::sendMessage); } - - private List formatChatMessage(final ILoggingEvent record) { - return List.of(record.getFormattedMessage().trim().split("\\n")); - } }