From 4407c6ab95e0ebcc8d2ca4ad84c3513fab561e19 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 16 May 2014 14:36:37 +0200 Subject: [PATCH] The LogAppender should be a single instance only. Fixes #3 --- .../BukkitTelnet/BukkitTelnet.java | 4 + .../BukkitTelnet/SocketListener.java | 10 +- .../BukkitTelnet/TelnetLogAppender.java | 119 ++++++++++++++++++ .../BukkitTelnet/TelnetServer.java | 10 +- .../BukkitTelnet/session/ClientSession.java | 18 +-- .../session/SessionLogAppender.java | 74 ----------- 6 files changed, 138 insertions(+), 97 deletions(-) create mode 100644 src/me/StevenLawson/BukkitTelnet/TelnetLogAppender.java delete mode 100644 src/me/StevenLawson/BukkitTelnet/session/SessionLogAppender.java diff --git a/src/me/StevenLawson/BukkitTelnet/BukkitTelnet.java b/src/me/StevenLawson/BukkitTelnet/BukkitTelnet.java index 4b372e4..a2ee283 100644 --- a/src/me/StevenLawson/BukkitTelnet/BukkitTelnet.java +++ b/src/me/StevenLawson/BukkitTelnet/BukkitTelnet.java @@ -1,5 +1,7 @@ package me.StevenLawson.BukkitTelnet; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; import org.bukkit.Server; import org.bukkit.plugin.java.JavaPlugin; @@ -23,6 +25,8 @@ public class BukkitTelnet extends JavaPlugin { TelnetConfig.getInstance().loadConfig(); + ((Logger) LogManager.getRootLogger()).addAppender(TelnetLogAppender.getInstance()); + TelnetServer.getInstance().startServer(); TelnetLogger.info(plugin.getName() + " v" + plugin.getDescription().getVersion() + " enabled"); diff --git a/src/me/StevenLawson/BukkitTelnet/SocketListener.java b/src/me/StevenLawson/BukkitTelnet/SocketListener.java index 938bca1..ab34fae 100644 --- a/src/me/StevenLawson/BukkitTelnet/SocketListener.java +++ b/src/me/StevenLawson/BukkitTelnet/SocketListener.java @@ -14,11 +14,12 @@ import java.util.logging.Logger; public class SocketListener extends Thread { private final ServerSocket serverSocket; - private final List clientSessions = new ArrayList(); + private final List clientSessions; public SocketListener(ServerSocket serverSocket) { this.serverSocket = serverSocket; + this.clientSessions = new ArrayList(); } @Override @@ -48,9 +49,14 @@ public class SocketListener extends Thread private void removeDisconnected() { final Iterator it = clientSessions.iterator(); + while (it.hasNext()) { - if (!it.next().syncIsConnected()) + final ClientSession session = it.next(); + + TelnetLogAppender.getInstance().removeSession(session); + + if (!session.syncIsConnected()) { it.remove(); } diff --git a/src/me/StevenLawson/BukkitTelnet/TelnetLogAppender.java b/src/me/StevenLawson/BukkitTelnet/TelnetLogAppender.java new file mode 100644 index 0000000..acda8c2 --- /dev/null +++ b/src/me/StevenLawson/BukkitTelnet/TelnetLogAppender.java @@ -0,0 +1,119 @@ +package me.StevenLawson.BukkitTelnet; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import me.StevenLawson.BukkitTelnet.session.ClientSession; +import me.StevenLawson.BukkitTelnet.session.FilterMode; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.appender.AbstractAppender; + +public class TelnetLogAppender extends AbstractAppender +{ + private final Set sessions; + private final SimpleDateFormat dateFormat; + + private TelnetLogAppender() + { + super("BukkitTelnet", null, null); + + this.sessions = new HashSet(); + this.dateFormat = new SimpleDateFormat("HH:mm:ss"); + + super.start(); + } + + public Set getSessions() + { + return Collections.unmodifiableSet(sessions); + } + + public boolean addSession(ClientSession session) + { + return sessions.add(session); + } + + public boolean removeSession(ClientSession session) + { + return sessions.remove(session); + } + + public void removeAllSesssions() + { + sessions.clear(); + } + + @Override + public void append(LogEvent event) + { + final String message = event.getMessage().getFormattedMessage(); + + for (ClientSession session : sessions) + { + if (!session.syncIsConnected()) + { + continue; + } + + if (session.getFilterMode() == FilterMode.CHAT_ONLY) + { + if (!(message.startsWith("<") + || message.startsWith("[Server") + || message.startsWith("[CONSOLE") || message.startsWith("[TotalFreedomMod] [ADMIN]"))) + { + return; + } + } + + if (session.getFilterMode() == FilterMode.NONCHAT_ONLY) + { + if (message.startsWith("<") + || message.startsWith("[Server") + || message.startsWith("[CONSOLE") + || message.startsWith("[TotalFreedomMod] [ADMIN]")) + { + return; + } + } + + session.printRawln(formatMessage(message, event)); + } + } + + private String formatMessage(String message, LogEvent event) + { + final StringBuilder builder = new StringBuilder(); + final Throwable ex = event.getThrown(); + + builder.append("["); + builder.append(dateFormat.format(event.getMillis())); + builder.append(" "); + builder.append(event.getLevel().name().toUpperCase()); + builder.append("]: "); + builder.append(message); + + if (ex != null) + { + StringWriter writer = new StringWriter(); + ex.printStackTrace(new PrintWriter(writer)); + builder.append(writer); + } + + return builder.toString(); + } + + public static TelnetLogAppender getInstance() + { + return TelnetLogAppenderHolder.INSTANCE; + } + + private static class TelnetLogAppenderHolder + { + private static final TelnetLogAppender INSTANCE = new TelnetLogAppender(); + } +} diff --git a/src/me/StevenLawson/BukkitTelnet/TelnetServer.java b/src/me/StevenLawson/BukkitTelnet/TelnetServer.java index d01a9e9..e9dae76 100644 --- a/src/me/StevenLawson/BukkitTelnet/TelnetServer.java +++ b/src/me/StevenLawson/BukkitTelnet/TelnetServer.java @@ -4,10 +4,6 @@ import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; import me.StevenLawson.BukkitTelnet.TelnetConfig.SimpleConfigEntries; public class TelnetServer @@ -48,7 +44,7 @@ public class TelnetServer } // Server socket - ServerSocket serversocket; + final ServerSocket serversocket; try { @@ -87,10 +83,10 @@ public class TelnetServer public static TelnetServer getInstance() { - return BT_TelnetServerHolder.INSTANCE; + return TelnetServerHolder.INSTANCE; } - private static class BT_TelnetServerHolder + private static class TelnetServerHolder { private static final TelnetServer INSTANCE = new TelnetServer(); } diff --git a/src/me/StevenLawson/BukkitTelnet/session/ClientSession.java b/src/me/StevenLawson/BukkitTelnet/session/ClientSession.java index e0dccbe..47c82ac 100644 --- a/src/me/StevenLawson/BukkitTelnet/session/ClientSession.java +++ b/src/me/StevenLawson/BukkitTelnet/session/ClientSession.java @@ -13,7 +13,9 @@ import java.util.Map; import java.util.regex.Pattern; import me.StevenLawson.BukkitTelnet.BukkitTelnet; import me.StevenLawson.BukkitTelnet.TelnetConfig; +import me.StevenLawson.BukkitTelnet.TelnetLogAppender; import me.StevenLawson.BukkitTelnet.TelnetLogger; +import me.StevenLawson.BukkitTelnet.TelnetServer; import me.StevenLawson.BukkitTelnet.Util; import org.apache.logging.log4j.LogManager; import org.bukkit.Bukkit; @@ -32,7 +34,6 @@ public final class ClientSession extends Thread private final String clientAddress; // private final SessionCommandSender commandSender; - private final SessionLogAppender logAppender; private FilterMode filterMode; // private BufferedWriter writer; @@ -46,7 +47,6 @@ public final class ClientSession extends Thread this.clientAddress = clientSocket.getInetAddress().getHostAddress(); this.username = ""; this.commandSender = new SessionCommandSender(this); - this.logAppender = new SessionLogAppender(this); this.filterMode = FilterMode.FULL; this.hasTerminated = false; @@ -92,11 +92,6 @@ public final class ClientSession extends Thread } } - private Logger getLogger() - { - return (Logger) LogManager.getRootLogger(); - } - public synchronized void syncTerminateSession() { if (hasTerminated) @@ -107,7 +102,7 @@ public final class ClientSession extends Thread hasTerminated = true; TelnetLogger.info("Closing connection: " + clientAddress + (username.isEmpty() ? "" : " (" + username + ")")); - getLogger().removeAppender(logAppender); + TelnetLogAppender.getInstance().removeSession(this); synchronized (clientSocket) { @@ -138,11 +133,6 @@ public final class ClientSession extends Thread return commandSender; } - public SessionLogAppender getAppender() - { - return logAppender; - } - public FilterMode getFilterMode() { return filterMode; @@ -384,7 +374,7 @@ public final class ClientSession extends Thread TelnetLogger.info(clientAddress + " logged in as \"" + username + "\"."); // Start feeding data to the client. - getLogger().addAppender(logAppender); + TelnetLogAppender.getInstance().addSession(this); // Process commands while (syncIsConnected()) diff --git a/src/me/StevenLawson/BukkitTelnet/session/SessionLogAppender.java b/src/me/StevenLawson/BukkitTelnet/session/SessionLogAppender.java deleted file mode 100644 index d42f24b..0000000 --- a/src/me/StevenLawson/BukkitTelnet/session/SessionLogAppender.java +++ /dev/null @@ -1,74 +0,0 @@ -package me.StevenLawson.BukkitTelnet.session; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.text.SimpleDateFormat; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; - -public class SessionLogAppender extends AbstractAppender -{ - private final ClientSession session; - private final SimpleDateFormat dateFormat; - - public SessionLogAppender(ClientSession session) - { - super("BukkitTelnet", null, null); - - this.session = session; - this.dateFormat = new SimpleDateFormat("HH:mm:ss"); - - start(); - } - - @Override - public void append(LogEvent event) - { - final String message = event.getMessage().getFormattedMessage(); - - if (session.getFilterMode() == FilterMode.CHAT_ONLY) - { - if (!(message.startsWith("<") - || message.startsWith("[Server") - || message.startsWith("[CONSOLE") || message.startsWith("[TotalFreedomMod] [ADMIN]"))) - { - return; - } - } - - if (session.getFilterMode() == FilterMode.NONCHAT_ONLY) - { - if (message.startsWith("<") - || message.startsWith("[Server") - || message.startsWith("[CONSOLE") - || message.startsWith("[TotalFreedomMod] [ADMIN]")) - { - return; - } - } - - session.printRawln(formatMessage(message, event)); - } - - private String formatMessage(String message, LogEvent event) - { - final StringBuilder builder = new StringBuilder(); - final Throwable ex = event.getThrown(); - - builder.append("["); - builder.append(dateFormat.format(event.getMillis())); - builder.append(" "); - builder.append(event.getLevel().name().toUpperCase()); - builder.append("]: "); - builder.append(message); - - if (ex != null) - { - StringWriter writer = new StringWriter(); - ex.printStackTrace(new PrintWriter(writer)); - builder.append(writer); - } - - return builder.toString(); - } -}