The LogAppender should be a single instance only. Fixes #3
This commit is contained in:
parent
57890b0c76
commit
4407c6ab95
|
@ -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");
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue