The LogAppender should be a single instance only. Fixes #3

This commit is contained in:
unknown 2014-05-16 14:36:37 +02:00
parent 57890b0c76
commit 4407c6ab95
6 changed files with 138 additions and 97 deletions

View File

@ -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");

View File

@ -14,11 +14,12 @@ import java.util.logging.Logger;
public class SocketListener extends Thread
{
private final ServerSocket serverSocket;
private final List<ClientSession> clientSessions = new ArrayList<ClientSession>();
private final List<ClientSession> clientSessions;
public SocketListener(ServerSocket serverSocket)
{
this.serverSocket = serverSocket;
this.clientSessions = new ArrayList<ClientSession>();
}
@Override
@ -48,9 +49,14 @@ public class SocketListener extends Thread
private void removeDisconnected()
{
final Iterator<ClientSession> it = clientSessions.iterator();
while (it.hasNext())
{
if (!it.next().syncIsConnected())
final ClientSession session = it.next();
TelnetLogAppender.getInstance().removeSession(session);
if (!session.syncIsConnected())
{
it.remove();
}

View File

@ -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<ClientSession> sessions;
private final SimpleDateFormat dateFormat;
private TelnetLogAppender()
{
super("BukkitTelnet", null, null);
this.sessions = new HashSet<ClientSession>();
this.dateFormat = new SimpleDateFormat("HH:mm:ss");
super.start();
}
public Set<ClientSession> 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();
}
}

View File

@ -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();
}

View File

@ -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())

View File

@ -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();
}
}