mirror of
https://github.com/PaperMC/Waterfall.git
synced 2025-02-02 04:51:32 +01:00
1634 lines
59 KiB
Diff
1634 lines
59 KiB
Diff
From ae6d9010ecdfd204ce171afea813452392a5c647 Mon Sep 17 00:00:00 2001
|
|
From: Minecrell <minecrell@minecrell.net>
|
|
Date: Fri, 22 Sep 2017 12:46:47 +0200
|
|
Subject: [PATCH] Use Log4j2 for logging and TerminalConsoleAppender for
|
|
console
|
|
|
|
|
|
diff --git a/bootstrap/pom.xml b/bootstrap/pom.xml
|
|
index 5ec5faf7..f9ec2c1c 100644
|
|
--- a/bootstrap/pom.xml
|
|
+++ b/bootstrap/pom.xml
|
|
@@ -49,6 +49,9 @@
|
|
<Main-Class>net.md_5.bungee.Bootstrap</Main-Class>
|
|
<Implementation-Version>${describe}</Implementation-Version>
|
|
<Specification-Version>${maven.build.timestamp}</Specification-Version>
|
|
+
|
|
+ <!-- Log4j includes custom classes for Java 9+ (#293) -->
|
|
+ <Multi-Release>true</Multi-Release>
|
|
</manifestEntries>
|
|
</archive>
|
|
</configuration>
|
|
@@ -76,7 +79,17 @@
|
|
</excludes>
|
|
</filter>
|
|
</filters>
|
|
+ <transformers>
|
|
+ <transformer implementation="com.github.edwgiz.maven_shade_plugin.log4j2_cache_transformer.PluginsCacheFileTransformer" />
|
|
+ </transformers>
|
|
</configuration>
|
|
+ <dependencies>
|
|
+ <dependency>
|
|
+ <groupId>com.github.edwgiz</groupId>
|
|
+ <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
|
|
+ <version>2.15</version>
|
|
+ </dependency>
|
|
+ </dependencies>
|
|
</plugin>
|
|
</plugins>
|
|
</build>
|
|
diff --git a/log4j/pom.xml b/log4j/pom.xml
|
|
new file mode 100644
|
|
index 00000000..1ef8c1f9
|
|
--- /dev/null
|
|
+++ b/log4j/pom.xml
|
|
@@ -0,0 +1,48 @@
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+ <modelVersion>4.0.0</modelVersion>
|
|
+
|
|
+ <parent>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>waterfall-parent</artifactId>
|
|
+ <version>1.19-R0.1-SNAPSHOT</version>
|
|
+ <relativePath>../pom.xml</relativePath>
|
|
+ </parent>
|
|
+
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>waterfall-log4j</artifactId>
|
|
+ <version>1.19-R0.1-SNAPSHOT</version>
|
|
+ <packaging>jar</packaging>
|
|
+
|
|
+ <name>Waterfall-Log4J</name>
|
|
+ <description>Simplistic and performant Log4j2 based logger and console API designed for use with Waterfall and Minecraft related applications.</description>
|
|
+
|
|
+ <properties>
|
|
+ <log4j2.version>2.20.0</log4j2.version>
|
|
+ </properties>
|
|
+
|
|
+ <dependencies>
|
|
+ <!-- Log4j -->
|
|
+ <dependency>
|
|
+ <groupId>org.apache.logging.log4j</groupId>
|
|
+ <artifactId>log4j-core</artifactId>
|
|
+ <version>${log4j2.version}</version>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>org.apache.logging.log4j</groupId>
|
|
+ <artifactId>log4j-iostreams</artifactId>
|
|
+ <version>${log4j2.version}</version>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>org.apache.logging.log4j</groupId>
|
|
+ <artifactId>log4j-jul</artifactId>
|
|
+ <version>${log4j2.version}</version>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>com.lmax</groupId>
|
|
+ <artifactId>disruptor</artifactId>
|
|
+ <version>3.4.4</version>
|
|
+ <scope>runtime</scope>
|
|
+ </dependency>
|
|
+ </dependencies>
|
|
+</project>
|
|
diff --git a/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/Log4JLogHandler.java b/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/Log4JLogHandler.java
|
|
new file mode 100644
|
|
index 00000000..63f66d3c
|
|
--- /dev/null
|
|
+++ b/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/Log4JLogHandler.java
|
|
@@ -0,0 +1,59 @@
|
|
+package io.github.waterfallmc.waterfall.log4j;
|
|
+
|
|
+import com.google.common.base.Strings;
|
|
+import org.apache.logging.log4j.Level;
|
|
+import org.apache.logging.log4j.LogManager;
|
|
+import org.apache.logging.log4j.Logger;
|
|
+import org.apache.logging.log4j.jul.LevelTranslator;
|
|
+import org.apache.logging.log4j.message.MessageFormatMessage;
|
|
+
|
|
+import java.util.Map;
|
|
+import java.util.MissingResourceException;
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
+import java.util.logging.Handler;
|
|
+import java.util.logging.LogRecord;
|
|
+
|
|
+/**
|
|
+ * A {@link Handler} that forwards all log messages to the Log4J logger.
|
|
+ *
|
|
+ * <p>We don't use Log4J's custom JUL LogManager currently, because it breaks
|
|
+ * adding custom handlers to JUL loggers. Some plugins may depend on that
|
|
+ * functionality...</p>
|
|
+ */
|
|
+class Log4JLogHandler extends Handler {
|
|
+
|
|
+ private final Map<String, Logger> cache = new ConcurrentHashMap<>();
|
|
+
|
|
+ @Override
|
|
+ public void publish(LogRecord record) {
|
|
+ if (!isLoggable(record)) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ Logger logger = cache.computeIfAbsent(Strings.nullToEmpty(record.getLoggerName()), LogManager::getLogger);
|
|
+
|
|
+ String message = record.getMessage();
|
|
+ if (record.getResourceBundle() != null) {
|
|
+ try {
|
|
+ message = record.getResourceBundle().getString(message);
|
|
+ } catch (MissingResourceException ignored) {
|
|
+ }
|
|
+ }
|
|
+
|
|
+ final Level level = LevelTranslator.toLevel(record.getLevel());
|
|
+ if (record.getParameters() != null && record.getParameters().length > 0) {
|
|
+ logger.log(level, new MessageFormatMessage(message, record.getParameters()), record.getThrown());
|
|
+ } else {
|
|
+ logger.log(level, message, record.getThrown());
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void flush() {
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void close() {
|
|
+ }
|
|
+
|
|
+}
|
|
diff --git a/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/WaterfallLogger.java b/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/WaterfallLogger.java
|
|
new file mode 100644
|
|
index 00000000..e046897a
|
|
--- /dev/null
|
|
+++ b/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/WaterfallLogger.java
|
|
@@ -0,0 +1,34 @@
|
|
+package io.github.waterfallmc.waterfall.log4j;
|
|
+
|
|
+import org.apache.logging.log4j.Level;
|
|
+import org.apache.logging.log4j.LogManager;
|
|
+import org.apache.logging.log4j.io.IoBuilder;
|
|
+import java.util.logging.Handler;
|
|
+import java.util.logging.Logger;
|
|
+
|
|
+public final class WaterfallLogger {
|
|
+
|
|
+ private WaterfallLogger() {
|
|
+ }
|
|
+
|
|
+ public static Logger create() {
|
|
+ org.apache.logging.log4j.Logger redirect = LogManager.getRootLogger();
|
|
+ System.setOut(IoBuilder.forLogger(redirect).setLevel(Level.INFO).buildPrintStream());
|
|
+ System.setErr(IoBuilder.forLogger(redirect).setLevel(Level.ERROR).buildPrintStream());
|
|
+
|
|
+ Logger root = Logger.getLogger("");
|
|
+ root.setUseParentHandlers(false);
|
|
+
|
|
+ // Remove existing handlers
|
|
+ for (Handler handler : root.getHandlers()) {
|
|
+ root.removeHandler(handler);
|
|
+ }
|
|
+
|
|
+ // Setup forward log handler
|
|
+ root.setLevel(java.util.logging.Level.ALL); // Log4j will handle filtering the log
|
|
+ root.addHandler(new Log4JLogHandler());
|
|
+
|
|
+ return Logger.getLogger("BungeeCord");
|
|
+ }
|
|
+
|
|
+}
|
|
diff --git a/log4j/src/main/resources/log4j2.component.properties b/log4j/src/main/resources/log4j2.component.properties
|
|
new file mode 100644
|
|
index 00000000..e43f5dac
|
|
--- /dev/null
|
|
+++ b/log4j/src/main/resources/log4j2.component.properties
|
|
@@ -0,0 +1,2 @@
|
|
+log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
|
|
+log4j.skipJansi=true
|
|
diff --git a/log4j/src/main/resources/log4j2.xml b/log4j/src/main/resources/log4j2.xml
|
|
new file mode 100644
|
|
index 00000000..cfd039cd
|
|
--- /dev/null
|
|
+++ b/log4j/src/main/resources/log4j2.xml
|
|
@@ -0,0 +1,22 @@
|
|
+<?xml version="1.0" encoding="UTF-8"?>
|
|
+<Configuration status="warn" shutdownHook="disable">
|
|
+ <Appenders>
|
|
+ <TerminalConsole name="TerminalConsole">
|
|
+ <PatternLayout pattern="%highlightError{[%d{HH:mm:ss} %level]: %minecraftFormatting{%msg}%n%xEx}" />
|
|
+ </TerminalConsole>
|
|
+ <RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz" immediateFlush="false">
|
|
+ <PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %minecraftFormatting{%msg}{strip}%n" />
|
|
+ <Policies>
|
|
+ <TimeBasedTriggeringPolicy />
|
|
+ <OnStartupTriggeringPolicy />
|
|
+ </Policies>
|
|
+ </RollingRandomAccessFile>
|
|
+ </Appenders>
|
|
+
|
|
+ <Loggers>
|
|
+ <Root level="info">
|
|
+ <AppenderRef ref="TerminalConsole" />
|
|
+ <AppenderRef ref="File" />
|
|
+ </Root>
|
|
+ </Loggers>
|
|
+</Configuration>
|
|
diff --git a/pom.xml b/pom.xml
|
|
index 5fff5a09..6d3fedae 100644
|
|
--- a/pom.xml
|
|
+++ b/pom.xml
|
|
@@ -55,12 +55,13 @@
|
|
<module>chat</module>
|
|
<module>config</module>
|
|
<module>event</module>
|
|
- <module>log</module>
|
|
+ <!--<module>log</module>-->
|
|
+ <module>log4j</module>
|
|
<module>module</module>
|
|
<module>protocol</module>
|
|
<module>proxy</module>
|
|
<module>query</module>
|
|
- <module>slf4j</module>
|
|
+ <!--<module>slf4j</module>-->
|
|
<module>native</module>
|
|
</modules>
|
|
|
|
diff --git a/proxy/pom.xml b/proxy/pom.xml
|
|
index e004f988..368df864 100644
|
|
--- a/proxy/pom.xml
|
|
+++ b/proxy/pom.xml
|
|
@@ -71,7 +71,7 @@
|
|
</dependency>
|
|
<dependency>
|
|
<groupId>io.github.waterfallmc</groupId>
|
|
- <artifactId>waterfall-log</artifactId>
|
|
+ <artifactId>waterfall-log4j</artifactId>
|
|
<version>${project.version}</version>
|
|
<scope>compile</scope>
|
|
</dependency>
|
|
@@ -93,12 +93,13 @@
|
|
<version>${project.version}</version>
|
|
<scope>compile</scope>
|
|
</dependency>
|
|
+ <!-- // Waterfall - We already bundle an slf4j impl
|
|
<dependency>
|
|
<groupId>net.md-5</groupId>
|
|
<artifactId>bungeecord-slf4j</artifactId>
|
|
<version>${project.version}</version>
|
|
<scope>compile</scope>
|
|
- </dependency>
|
|
+ </dependency> // Waterfall - We already bundle an slf4j impl -->
|
|
<dependency>
|
|
<groupId>net.sf.jopt-simple</groupId>
|
|
<artifactId>jopt-simple</artifactId>
|
|
@@ -130,6 +131,35 @@
|
|
<version>1.9.10</version>
|
|
<scope>runtime</scope>
|
|
</dependency>
|
|
+ <!-- Waterfall start - Console improvements - bring back slf4j-->
|
|
+ <dependency>
|
|
+ <groupId>org.slf4j</groupId>
|
|
+ <artifactId>slf4j-jdk14</artifactId>
|
|
+ <version>1.7.36</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>net.minecrell</groupId>
|
|
+ <artifactId>terminalconsoleappender</artifactId>
|
|
+ <version>1.3.0</version>
|
|
+ <exclusions>
|
|
+ <exclusion>
|
|
+ <groupId>org.apache.logging.log4j</groupId>
|
|
+ <artifactId>log4j-core</artifactId>
|
|
+ </exclusion>
|
|
+ <exclusion>
|
|
+ <groupId>org.jline</groupId>
|
|
+ <artifactId>jline-terminal</artifactId>
|
|
+ </exclusion>
|
|
+ </exclusions>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>org.jline</groupId>
|
|
+ <artifactId>jline-terminal-jansi</artifactId>
|
|
+ <version>3.21.0</version>
|
|
+ <scope>runtime</scope>
|
|
+ </dependency>
|
|
+ <!-- Waterfall end -->
|
|
</dependencies>
|
|
|
|
<!-- Waterfall start - copy license files into jar -->
|
|
diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/console/WaterfallConsole.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/console/WaterfallConsole.java
|
|
new file mode 100644
|
|
index 00000000..765d24bc
|
|
--- /dev/null
|
|
+++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/console/WaterfallConsole.java
|
|
@@ -0,0 +1,39 @@
|
|
+package io.github.waterfallmc.waterfall.console;
|
|
+
|
|
+import net.md_5.bungee.BungeeCord;
|
|
+import net.md_5.bungee.api.ChatColor;
|
|
+import net.md_5.bungee.api.ProxyServer;
|
|
+import net.md_5.bungee.api.chat.ComponentBuilder;
|
|
+import net.minecrell.terminalconsole.SimpleTerminalConsole;
|
|
+import org.jline.reader.LineReader;
|
|
+import org.jline.reader.LineReaderBuilder;
|
|
+
|
|
+public final class WaterfallConsole extends SimpleTerminalConsole {
|
|
+
|
|
+ @Override
|
|
+ protected LineReader buildReader(LineReaderBuilder builder) {
|
|
+ ProxyServer proxy = ProxyServer.getInstance();
|
|
+ return super.buildReader(builder
|
|
+ .appName(proxy.getName())
|
|
+ );
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected boolean isRunning() {
|
|
+ return BungeeCord.getInstance().isRunning;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected void runCommand(String command) {
|
|
+ ProxyServer proxy = ProxyServer.getInstance();
|
|
+ if (!proxy.getPluginManager().dispatchCommand(proxy.getConsole(), command)) {
|
|
+ proxy.getConsole().sendMessage(new ComponentBuilder("Command not found").color(ChatColor.RED).create());
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected void shutdown() {
|
|
+ ProxyServer.getInstance().stop();
|
|
+ }
|
|
+
|
|
+}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
index 166565a7..71bb3d9d 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
@@ -48,7 +48,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|
import java.util.logging.Handler;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
-import jline.console.ConsoleReader;
|
|
import lombok.Getter;
|
|
import lombok.Setter;
|
|
import lombok.Synchronized;
|
|
@@ -81,15 +80,11 @@ import net.md_5.bungee.command.CommandEnd;
|
|
import net.md_5.bungee.command.CommandIP;
|
|
import net.md_5.bungee.command.CommandPerms;
|
|
import net.md_5.bungee.command.CommandReload;
|
|
-import net.md_5.bungee.command.ConsoleCommandCompleter;
|
|
import net.md_5.bungee.command.ConsoleCommandSender;
|
|
import net.md_5.bungee.compress.CompressFactory;
|
|
import net.md_5.bungee.conf.Configuration;
|
|
import net.md_5.bungee.conf.YamlConfig;
|
|
import net.md_5.bungee.forge.ForgeConstants;
|
|
-import net.md_5.bungee.log.BungeeLogger;
|
|
-import net.md_5.bungee.log.LoggingForwardHandler;
|
|
-import net.md_5.bungee.log.LoggingOutputStream;
|
|
import net.md_5.bungee.module.ModuleManager;
|
|
import net.md_5.bungee.netty.PipelineUtils;
|
|
import net.md_5.bungee.protocol.DefinedPacket;
|
|
@@ -98,8 +93,6 @@ import net.md_5.bungee.protocol.packet.PluginMessage;
|
|
import net.md_5.bungee.query.RemoteQuery;
|
|
import net.md_5.bungee.scheduler.BungeeScheduler;
|
|
import net.md_5.bungee.util.CaseInsensitiveMap;
|
|
-import org.fusesource.jansi.AnsiConsole;
|
|
-import org.slf4j.impl.JDK14LoggerFactory;
|
|
|
|
/**
|
|
* Main BungeeCord proxy class.
|
|
@@ -159,8 +152,12 @@ public class BungeeCord extends ProxyServer
|
|
private final File pluginsFolder = new File( "plugins" );
|
|
@Getter
|
|
private final BungeeScheduler scheduler = new BungeeScheduler();
|
|
+ // Waterfall start - Remove ConsoleReader for JLine 3 update
|
|
+ /*
|
|
@Getter
|
|
private final ConsoleReader consoleReader;
|
|
+ */
|
|
+ // Waterfall end
|
|
@Getter
|
|
private final Logger logger;
|
|
public final Gson gson = new GsonBuilder()
|
|
@@ -204,6 +201,8 @@ public class BungeeCord extends ProxyServer
|
|
// BungeeCord. This version is only used when extracting the libraries to their temp folder.
|
|
System.setProperty( "library.jansi.version", "BungeeCord" );
|
|
|
|
+ // Waterfall start - Use TerminalConsoleAppender and Log4J
|
|
+ /*
|
|
AnsiConsole.systemInstall();
|
|
consoleReader = new ConsoleReader();
|
|
consoleReader.setExpandEvents( false );
|
|
@@ -228,6 +227,9 @@ public class BungeeCord extends ProxyServer
|
|
// since it applies a nice looking format and also writes to the logfile.
|
|
System.setErr( new PrintStream( new LoggingOutputStream( logger, Level.SEVERE ), true ) );
|
|
System.setOut( new PrintStream( new LoggingOutputStream( logger, Level.INFO ), true ) );
|
|
+ */
|
|
+ logger = io.github.waterfallmc.waterfall.log4j.WaterfallLogger.create();
|
|
+ // Waterfall end
|
|
|
|
pluginManager = new PluginManager( this );
|
|
getPluginManager().registerCommand( null, new CommandReload() );
|
|
@@ -504,10 +506,7 @@ public class BungeeCord extends ProxyServer
|
|
|
|
getLogger().info( "Thank you and goodbye" );
|
|
// Need to close loggers after last message!
|
|
- for ( Handler handler : getLogger().getHandlers() )
|
|
- {
|
|
- handler.close();
|
|
- }
|
|
+ org.apache.logging.log4j.LogManager.shutdown(); // Waterfall
|
|
|
|
// Unlock the thread before optionally calling system exit, which might invoke this function again.
|
|
// If that happens, the system will obtain the lock, and then see that isRunning == false and return without doing anything.
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java b/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java
|
|
index c81a4430..96a9998d 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java
|
|
@@ -68,6 +68,9 @@ public class BungeeCordLauncher
|
|
|
|
if ( !options.has( "noconsole" ) )
|
|
{
|
|
+ // Waterfall start - Use TerminalConsoleAppender
|
|
+ new io.github.waterfallmc.waterfall.console.WaterfallConsole().start();
|
|
+ /*
|
|
String line;
|
|
while ( bungee.isRunning && ( line = bungee.getConsoleReader().readLine( ">" ) ) != null )
|
|
{
|
|
@@ -76,6 +79,8 @@ public class BungeeCordLauncher
|
|
bungee.getConsole().sendMessage( new ComponentBuilder( "Command not found" ).color( ChatColor.RED ).create() );
|
|
}
|
|
}
|
|
+ */
|
|
+ // Waterfall end
|
|
}
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandCompleter.java b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandCompleter.java
|
|
deleted file mode 100644
|
|
index 3e5ca394..00000000
|
|
--- a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandCompleter.java
|
|
+++ /dev/null
|
|
@@ -1,38 +0,0 @@
|
|
-package net.md_5.bungee.command;
|
|
-
|
|
-import java.util.ArrayList;
|
|
-import java.util.List;
|
|
-import java.util.Locale;
|
|
-import java.util.Map;
|
|
-import java.util.stream.Collectors;
|
|
-import jline.console.completer.Completer;
|
|
-import lombok.RequiredArgsConstructor;
|
|
-import net.md_5.bungee.api.ProxyServer;
|
|
-
|
|
-@RequiredArgsConstructor
|
|
-public class ConsoleCommandCompleter implements Completer
|
|
-{
|
|
-
|
|
- private final ProxyServer proxy;
|
|
-
|
|
- @Override
|
|
- public int complete(String buffer, int cursor, List<CharSequence> candidates)
|
|
- {
|
|
- int lastSpace = buffer.lastIndexOf( ' ' );
|
|
- if ( lastSpace == -1 )
|
|
- {
|
|
- String lowerCase = buffer.toLowerCase( Locale.ROOT );
|
|
- candidates.addAll( proxy.getPluginManager().getCommands().stream()
|
|
- .map( Map.Entry::getKey )
|
|
- .filter( (name) -> name.toLowerCase( Locale.ROOT ).startsWith( lowerCase ) )
|
|
- .collect( Collectors.toList() ) );
|
|
- } else
|
|
- {
|
|
- List<String> suggestions = new ArrayList<>();
|
|
- proxy.getPluginManager().dispatchCommand( proxy.getConsole(), buffer, suggestions );
|
|
- candidates.addAll( suggestions );
|
|
- }
|
|
-
|
|
- return ( lastSpace == -1 ) ? cursor - buffer.length() : cursor - ( buffer.length() - lastSpace - 1 );
|
|
- }
|
|
-}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java b/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
|
|
index 9ec4920e..d3abee44 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
|
|
@@ -44,7 +44,7 @@ public class ModuleManager
|
|
ModuleVersion bungeeVersion = ModuleVersion.parse( proxy.getVersion() );
|
|
if ( bungeeVersion == null )
|
|
{
|
|
- System.out.println( "Couldn't detect bungee version. Custom build?" );
|
|
+ proxy.getLogger().warning( "Couldn't detect bungee version. Custom build?" ); // Waterfall - Use logger
|
|
return;
|
|
}
|
|
|
|
diff --git a/slf4j/nb-configuration.xml b/slf4j/nb-configuration.xml
|
|
deleted file mode 100644
|
|
index 7e465924..00000000
|
|
--- a/slf4j/nb-configuration.xml
|
|
+++ /dev/null
|
|
@@ -1,31 +0,0 @@
|
|
-<?xml version="1.0" encoding="UTF-8"?>
|
|
-<project-shared-configuration>
|
|
- <!--
|
|
- This file contains additional configuration written by modules in the NetBeans IDE.
|
|
- The configuration is intended to be shared among all the users of project and
|
|
- therefore it is assumed to be part of version control checkout.
|
|
- Without this configuration present, some functionality in the IDE may be limited or fail altogether.
|
|
- -->
|
|
- <properties xmlns="http://www.netbeans.org/ns/maven-properties-data/1">
|
|
- <!--
|
|
- Properties that influence various parts of the IDE, especially code formatting and the like.
|
|
- You can copy and paste the single properties, into the pom.xml file and the IDE will pick them up.
|
|
- That way multiple projects can share the same settings (useful for formatting rules for example).
|
|
- Any value defined here will override the pom.xml file value but is only applicable to the current project.
|
|
- -->
|
|
- <org-netbeans-modules-editor-indent.CodeStyle.usedProfile>project</org-netbeans-modules-editor-indent.CodeStyle.usedProfile>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.classDeclBracePlacement>NEW_LINE</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.classDeclBracePlacement>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.otherBracePlacement>NEW_LINE</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.otherBracePlacement>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.methodDeclBracePlacement>NEW_LINE</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.methodDeclBracePlacement>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinMethodCallParens>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinMethodCallParens>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinSwitchParens>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinSwitchParens>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinCatchParens>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinCatchParens>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinTryParens>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinTryParens>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinSynchronizedParens>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinSynchronizedParens>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinArrayInitBrackets>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinArrayInitBrackets>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinParens>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinParens>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinWhileParens>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinWhileParens>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinIfParens>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinIfParens>
|
|
- <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinForParens>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceWithinForParens>
|
|
- </properties>
|
|
-</project-shared-configuration>
|
|
diff --git a/slf4j/pom.xml b/slf4j/pom.xml
|
|
deleted file mode 100644
|
|
index 1716c3cf..00000000
|
|
--- a/slf4j/pom.xml
|
|
+++ /dev/null
|
|
@@ -1,35 +0,0 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
- <modelVersion>4.0.0</modelVersion>
|
|
-
|
|
- <parent>
|
|
- <groupId>net.md-5</groupId>
|
|
- <artifactId>bungeecord-parent</artifactId>
|
|
- <version>1.19-R0.1-SNAPSHOT</version>
|
|
- <relativePath>../pom.xml</relativePath>
|
|
- </parent>
|
|
-
|
|
- <groupId>net.md-5</groupId>
|
|
- <artifactId>bungeecord-slf4j</artifactId>
|
|
- <version>1.19-R0.1-SNAPSHOT</version>
|
|
- <packaging>jar</packaging>
|
|
-
|
|
- <name>BungeeCord-SLF4J</name>
|
|
- <description>Wrapper over SLF4J for BungeeCord purposes.</description>
|
|
-
|
|
- <properties>
|
|
- <checkstyle.skip>true</checkstyle.skip>
|
|
- <maven.deploy.skip>true</maven.deploy.skip>
|
|
- <maven.javadoc.skip>true</maven.javadoc.skip>
|
|
- </properties>
|
|
-
|
|
- <dependencies>
|
|
- <dependency>
|
|
- <groupId>org.slf4j</groupId>
|
|
- <artifactId>slf4j-api</artifactId>
|
|
- <version>1.7.36</version>
|
|
- <scope>compile</scope>
|
|
- </dependency>
|
|
- </dependencies>
|
|
-</project>
|
|
diff --git a/slf4j/src/main/java/org/slf4j/impl/JDK14LoggerAdapter.java b/slf4j/src/main/java/org/slf4j/impl/JDK14LoggerAdapter.java
|
|
deleted file mode 100644
|
|
index 49589454..00000000
|
|
--- a/slf4j/src/main/java/org/slf4j/impl/JDK14LoggerAdapter.java
|
|
+++ /dev/null
|
|
@@ -1,700 +0,0 @@
|
|
-/**
|
|
- * Copyright (c) 2004-2011 QOS.ch
|
|
- * All rights reserved.
|
|
- *
|
|
- * Permission is hereby granted, free of charge, to any person obtaining
|
|
- * a copy of this software and associated documentation files (the
|
|
- * "Software"), to deal in the Software without restriction, including
|
|
- * without limitation the rights to use, copy, modify, merge, publish,
|
|
- * distribute, sublicense, and/or sell copies of the Software, and to
|
|
- * permit persons to whom the Software is furnished to do so, subject to
|
|
- * the following conditions:
|
|
- *
|
|
- * The above copyright notice and this permission notice shall be
|
|
- * included in all copies or substantial portions of the Software.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
- *
|
|
- */
|
|
-package org.slf4j.impl;
|
|
-
|
|
-import java.util.logging.Level;
|
|
-import java.util.logging.LogRecord;
|
|
-
|
|
-import org.slf4j.Logger;
|
|
-import org.slf4j.Marker;
|
|
-import org.slf4j.event.EventConstants;
|
|
-import org.slf4j.event.LoggingEvent;
|
|
-import org.slf4j.helpers.FormattingTuple;
|
|
-import org.slf4j.helpers.MarkerIgnoringBase;
|
|
-import org.slf4j.helpers.MessageFormatter;
|
|
-import org.slf4j.spi.LocationAwareLogger;
|
|
-
|
|
-/**
|
|
- * A wrapper over {@link java.util.logging.Logger java.util.logging.Logger} in
|
|
- * conformity with the {@link Logger} interface. Note that the logging levels
|
|
- * mentioned in this class refer to those defined in the java.util.logging
|
|
- * package.
|
|
- *
|
|
- * @author Ceki Gülcü
|
|
- * @author Peter Royal
|
|
- */
|
|
-public final class JDK14LoggerAdapter extends MarkerIgnoringBase implements LocationAwareLogger {
|
|
-
|
|
- private static final long serialVersionUID = -8053026990503422791L;
|
|
-
|
|
- transient final java.util.logging.Logger logger;
|
|
-
|
|
- // WARN: JDK14LoggerAdapter constructor should have only package access so
|
|
- // that only JDK14LoggerFactory be able to create one.
|
|
- JDK14LoggerAdapter(java.util.logging.Logger logger) {
|
|
- this.logger = logger;
|
|
- this.name = logger.getName();
|
|
- }
|
|
-
|
|
- /**
|
|
- * Is this logger instance enabled for the FINEST level?
|
|
- *
|
|
- * @return True if this Logger is enabled for level FINEST, false otherwise.
|
|
- */
|
|
- public boolean isTraceEnabled() {
|
|
- return logger.isLoggable(Level.FINEST);
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message object at level FINEST.
|
|
- *
|
|
- * @param msg
|
|
- * - the message object to be logged
|
|
- */
|
|
- public void trace(String msg) {
|
|
- if (logger.isLoggable(Level.FINEST)) {
|
|
- log(SELF, Level.FINEST, msg, null);
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at level FINEST according to the specified format and
|
|
- * argument.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for level FINEST.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arg
|
|
- * the argument
|
|
- */
|
|
- public void trace(String format, Object arg) {
|
|
- if (logger.isLoggable(Level.FINEST)) {
|
|
- FormattingTuple ft = MessageFormatter.format(format, arg);
|
|
- log(SELF, Level.FINEST, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at level FINEST according to the specified format and
|
|
- * arguments.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the FINEST level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arg1
|
|
- * the first argument
|
|
- * @param arg2
|
|
- * the second argument
|
|
- */
|
|
- public void trace(String format, Object arg1, Object arg2) {
|
|
- if (logger.isLoggable(Level.FINEST)) {
|
|
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
|
|
- log(SELF, Level.FINEST, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at level FINEST according to the specified format and
|
|
- * arguments.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the FINEST level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param argArray
|
|
- * an array of arguments
|
|
- */
|
|
- public void trace(String format, Object... argArray) {
|
|
- if (logger.isLoggable(Level.FINEST)) {
|
|
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
|
|
- log(SELF, Level.FINEST, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log an exception (throwable) at level FINEST with an accompanying message.
|
|
- *
|
|
- * @param msg
|
|
- * the message accompanying the exception
|
|
- * @param t
|
|
- * the exception (throwable) to log
|
|
- */
|
|
- public void trace(String msg, Throwable t) {
|
|
- if (logger.isLoggable(Level.FINEST)) {
|
|
- log(SELF, Level.FINEST, msg, t);
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Is this logger instance enabled for the FINE level?
|
|
- *
|
|
- * @return True if this Logger is enabled for level FINE, false otherwise.
|
|
- */
|
|
- public boolean isDebugEnabled() {
|
|
- return logger.isLoggable(Level.FINE);
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message object at level FINE.
|
|
- *
|
|
- * @param msg
|
|
- * - the message object to be logged
|
|
- */
|
|
- public void debug(String msg) {
|
|
- if (logger.isLoggable(Level.FINE)) {
|
|
- log(SELF, Level.FINE, msg, null);
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at level FINE according to the specified format and argument.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for level FINE.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arg
|
|
- * the argument
|
|
- */
|
|
- public void debug(String format, Object arg) {
|
|
- if (logger.isLoggable(Level.FINE)) {
|
|
- FormattingTuple ft = MessageFormatter.format(format, arg);
|
|
- log(SELF, Level.FINE, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at level FINE according to the specified format and
|
|
- * arguments.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the FINE level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arg1
|
|
- * the first argument
|
|
- * @param arg2
|
|
- * the second argument
|
|
- */
|
|
- public void debug(String format, Object arg1, Object arg2) {
|
|
- if (logger.isLoggable(Level.FINE)) {
|
|
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
|
|
- log(SELF, Level.FINE, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at level FINE according to the specified format and
|
|
- * arguments.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the FINE level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param argArray
|
|
- * an array of arguments
|
|
- */
|
|
- public void debug(String format, Object... argArray) {
|
|
- if (logger.isLoggable(Level.FINE)) {
|
|
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
|
|
- log(SELF, Level.FINE, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log an exception (throwable) at level FINE with an accompanying message.
|
|
- *
|
|
- * @param msg
|
|
- * the message accompanying the exception
|
|
- * @param t
|
|
- * the exception (throwable) to log
|
|
- */
|
|
- public void debug(String msg, Throwable t) {
|
|
- if (logger.isLoggable(Level.FINE)) {
|
|
- log(SELF, Level.FINE, msg, t);
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Is this logger instance enabled for the INFO level?
|
|
- *
|
|
- * @return True if this Logger is enabled for the INFO level, false otherwise.
|
|
- */
|
|
- public boolean isInfoEnabled() {
|
|
- return logger.isLoggable(Level.INFO);
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message object at the INFO level.
|
|
- *
|
|
- * @param msg
|
|
- * - the message object to be logged
|
|
- */
|
|
- public void info(String msg) {
|
|
- if (logger.isLoggable(Level.INFO)) {
|
|
- log(SELF, Level.INFO, msg, null);
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at level INFO according to the specified format and argument.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the INFO level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arg
|
|
- * the argument
|
|
- */
|
|
- public void info(String format, Object arg) {
|
|
- if (logger.isLoggable(Level.INFO)) {
|
|
- FormattingTuple ft = MessageFormatter.format(format, arg);
|
|
- log(SELF, Level.INFO, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at the INFO level according to the specified format and
|
|
- * arguments.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the INFO level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arg1
|
|
- * the first argument
|
|
- * @param arg2
|
|
- * the second argument
|
|
- */
|
|
- public void info(String format, Object arg1, Object arg2) {
|
|
- if (logger.isLoggable(Level.INFO)) {
|
|
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
|
|
- log(SELF, Level.INFO, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at level INFO according to the specified format and
|
|
- * arguments.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the INFO level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param argArray
|
|
- * an array of arguments
|
|
- */
|
|
- public void info(String format, Object... argArray) {
|
|
- if (logger.isLoggable(Level.INFO)) {
|
|
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
|
|
- log(SELF, Level.INFO, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log an exception (throwable) at the INFO level with an accompanying
|
|
- * message.
|
|
- *
|
|
- * @param msg
|
|
- * the message accompanying the exception
|
|
- * @param t
|
|
- * the exception (throwable) to log
|
|
- */
|
|
- public void info(String msg, Throwable t) {
|
|
- if (logger.isLoggable(Level.INFO)) {
|
|
- log(SELF, Level.INFO, msg, t);
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Is this logger instance enabled for the WARNING level?
|
|
- *
|
|
- * @return True if this Logger is enabled for the WARNING level, false
|
|
- * otherwise.
|
|
- */
|
|
- public boolean isWarnEnabled() {
|
|
- return logger.isLoggable(Level.WARNING);
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message object at the WARNING level.
|
|
- *
|
|
- * @param msg
|
|
- * - the message object to be logged
|
|
- */
|
|
- public void warn(String msg) {
|
|
- if (logger.isLoggable(Level.WARNING)) {
|
|
- log(SELF, Level.WARNING, msg, null);
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at the WARNING level according to the specified format and
|
|
- * argument.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the WARNING level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arg
|
|
- * the argument
|
|
- */
|
|
- public void warn(String format, Object arg) {
|
|
- if (logger.isLoggable(Level.WARNING)) {
|
|
- FormattingTuple ft = MessageFormatter.format(format, arg);
|
|
- log(SELF, Level.WARNING, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at the WARNING level according to the specified format and
|
|
- * arguments.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the WARNING level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arg1
|
|
- * the first argument
|
|
- * @param arg2
|
|
- * the second argument
|
|
- */
|
|
- public void warn(String format, Object arg1, Object arg2) {
|
|
- if (logger.isLoggable(Level.WARNING)) {
|
|
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
|
|
- log(SELF, Level.WARNING, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at level WARNING according to the specified format and
|
|
- * arguments.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the WARNING level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param argArray
|
|
- * an array of arguments
|
|
- */
|
|
- public void warn(String format, Object... argArray) {
|
|
- if (logger.isLoggable(Level.WARNING)) {
|
|
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
|
|
- log(SELF, Level.WARNING, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log an exception (throwable) at the WARNING level with an accompanying
|
|
- * message.
|
|
- *
|
|
- * @param msg
|
|
- * the message accompanying the exception
|
|
- * @param t
|
|
- * the exception (throwable) to log
|
|
- */
|
|
- public void warn(String msg, Throwable t) {
|
|
- if (logger.isLoggable(Level.WARNING)) {
|
|
- log(SELF, Level.WARNING, msg, t);
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Is this logger instance enabled for level SEVERE?
|
|
- *
|
|
- * @return True if this Logger is enabled for level SEVERE, false otherwise.
|
|
- */
|
|
- public boolean isErrorEnabled() {
|
|
- return logger.isLoggable(Level.SEVERE);
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message object at the SEVERE level.
|
|
- *
|
|
- * @param msg
|
|
- * - the message object to be logged
|
|
- */
|
|
- public void error(String msg) {
|
|
- if (logger.isLoggable(Level.SEVERE)) {
|
|
- log(SELF, Level.SEVERE, msg, null);
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at the SEVERE level according to the specified format and
|
|
- * argument.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the SEVERE level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arg
|
|
- * the argument
|
|
- */
|
|
- public void error(String format, Object arg) {
|
|
- if (logger.isLoggable(Level.SEVERE)) {
|
|
- FormattingTuple ft = MessageFormatter.format(format, arg);
|
|
- log(SELF, Level.SEVERE, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at the SEVERE level according to the specified format and
|
|
- * arguments.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the SEVERE level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arg1
|
|
- * the first argument
|
|
- * @param arg2
|
|
- * the second argument
|
|
- */
|
|
- public void error(String format, Object arg1, Object arg2) {
|
|
- if (logger.isLoggable(Level.SEVERE)) {
|
|
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
|
|
- log(SELF, Level.SEVERE, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log a message at level SEVERE according to the specified format and
|
|
- * arguments.
|
|
- *
|
|
- * <p>
|
|
- * This form avoids superfluous object creation when the logger is disabled
|
|
- * for the SEVERE level.
|
|
- * </p>
|
|
- *
|
|
- * @param format
|
|
- * the format string
|
|
- * @param arguments
|
|
- * an array of arguments
|
|
- */
|
|
- public void error(String format, Object... arguments) {
|
|
- if (logger.isLoggable(Level.SEVERE)) {
|
|
- FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
|
|
- log(SELF, Level.SEVERE, ft.getMessage(), ft.getThrowable());
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log an exception (throwable) at the SEVERE level with an accompanying
|
|
- * message.
|
|
- *
|
|
- * @param msg
|
|
- * the message accompanying the exception
|
|
- * @param t
|
|
- * the exception (throwable) to log
|
|
- */
|
|
- public void error(String msg, Throwable t) {
|
|
- if (logger.isLoggable(Level.SEVERE)) {
|
|
- log(SELF, Level.SEVERE, msg, t);
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Log the message at the specified level with the specified throwable if any.
|
|
- * This method creates a LogRecord and fills in caller date before calling
|
|
- * this instance's JDK14 logger.
|
|
- *
|
|
- * See bug report #13 for more details.
|
|
- *
|
|
- * @param level
|
|
- * @param msg
|
|
- * @param t
|
|
- */
|
|
- private void log(String callerFQCN, Level level, String msg, Throwable t) {
|
|
- // millis and thread are filled by the constructor
|
|
- LogRecord record = new LogRecord(level, msg);
|
|
- record.setLoggerName(getName());
|
|
- record.setThrown(t);
|
|
- // Note: parameters in record are not set because SLF4J only
|
|
- // supports a single formatting style
|
|
- fillCallerData(callerFQCN, record);
|
|
- logger.log(record);
|
|
- }
|
|
-
|
|
- static String SELF = JDK14LoggerAdapter.class.getName();
|
|
- static String SUPER = MarkerIgnoringBase.class.getName();
|
|
-
|
|
- private static final boolean FILL_CALLER_DATA = Boolean.getBoolean( "net.md_5.bungee.slf4j-caller-data" );
|
|
-
|
|
- /**
|
|
- * Fill in caller data if possible.
|
|
- *
|
|
- * @param record
|
|
- * The record to update
|
|
- */
|
|
- final private void fillCallerData(String callerFQCN, LogRecord record) {
|
|
- if ( !FILL_CALLER_DATA )
|
|
- {
|
|
- return;
|
|
- }
|
|
- StackTraceElement[] steArray = new Throwable().getStackTrace();
|
|
-
|
|
- int selfIndex = -1;
|
|
- for (int i = 0; i < steArray.length; i++) {
|
|
- final String className = steArray[i].getClassName();
|
|
- if (className.equals(callerFQCN) || className.equals(SUPER)) {
|
|
- selfIndex = i;
|
|
- break;
|
|
- }
|
|
- }
|
|
-
|
|
- int found = -1;
|
|
- for (int i = selfIndex + 1; i < steArray.length; i++) {
|
|
- final String className = steArray[i].getClassName();
|
|
- if (!(className.equals(callerFQCN) || className.equals(SUPER))) {
|
|
- found = i;
|
|
- break;
|
|
- }
|
|
- }
|
|
-
|
|
- if (found != -1) {
|
|
- StackTraceElement ste = steArray[found];
|
|
- // setting the class name has the side effect of setting
|
|
- // the needToInferCaller variable to false.
|
|
- record.setSourceClassName(ste.getClassName());
|
|
- record.setSourceMethodName(ste.getMethodName());
|
|
- }
|
|
- }
|
|
-
|
|
- public void log(Marker marker, String callerFQCN, int level, String message, Object[] argArray, Throwable t) {
|
|
- Level julLevel = slf4jLevelIntToJULLevel(level);
|
|
- // the logger.isLoggable check avoids the unconditional
|
|
- // construction of location data for disabled log
|
|
- // statements. As of 2008-07-31, callers of this method
|
|
- // do not perform this check. See also
|
|
- // http://jira.qos.ch/browse/SLF4J-81
|
|
- if (logger.isLoggable(julLevel)) {
|
|
- log(callerFQCN, julLevel, message, t);
|
|
- }
|
|
- }
|
|
-
|
|
- private Level slf4jLevelIntToJULLevel(int slf4jLevelInt) {
|
|
- Level julLevel;
|
|
- switch (slf4jLevelInt) {
|
|
- case LocationAwareLogger.TRACE_INT:
|
|
- julLevel = Level.FINEST;
|
|
- break;
|
|
- case LocationAwareLogger.DEBUG_INT:
|
|
- julLevel = Level.FINE;
|
|
- break;
|
|
- case LocationAwareLogger.INFO_INT:
|
|
- julLevel = Level.INFO;
|
|
- break;
|
|
- case LocationAwareLogger.WARN_INT:
|
|
- julLevel = Level.WARNING;
|
|
- break;
|
|
- case LocationAwareLogger.ERROR_INT:
|
|
- julLevel = Level.SEVERE;
|
|
- break;
|
|
- default:
|
|
- throw new IllegalStateException("Level number " + slf4jLevelInt + " is not recognized.");
|
|
- }
|
|
- return julLevel;
|
|
- }
|
|
-
|
|
- /**
|
|
- * @since 1.7.15
|
|
- */
|
|
- public void log(LoggingEvent event) {
|
|
- Level julLevel = slf4jLevelIntToJULLevel(event.getLevel().toInt());
|
|
- if (logger.isLoggable(julLevel)) {
|
|
- LogRecord record = eventToRecord(event, julLevel);
|
|
- logger.log(record);
|
|
- }
|
|
- }
|
|
-
|
|
- private LogRecord eventToRecord(LoggingEvent event, Level julLevel) {
|
|
- String format = event.getMessage();
|
|
- Object[] arguments = event.getArgumentArray();
|
|
- FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
|
|
- if (ft.getThrowable() != null && event.getThrowable() != null) {
|
|
- throw new IllegalArgumentException("both last element in argument array and last argument are of type Throwable");
|
|
- }
|
|
-
|
|
- Throwable t = event.getThrowable();
|
|
- if (ft.getThrowable() != null) {
|
|
- t = ft.getThrowable();
|
|
- throw new IllegalStateException("fix above code");
|
|
- }
|
|
-
|
|
- LogRecord record = new LogRecord(julLevel, ft.getMessage());
|
|
- record.setLoggerName(event.getLoggerName());
|
|
- record.setMillis(event.getTimeStamp());
|
|
- record.setSourceClassName(EventConstants.NA_SUBST);
|
|
- record.setSourceMethodName(EventConstants.NA_SUBST);
|
|
-
|
|
- record.setThrown(t);
|
|
- return record;
|
|
- }
|
|
-}
|
|
diff --git a/slf4j/src/main/java/org/slf4j/impl/JDK14LoggerFactory.java b/slf4j/src/main/java/org/slf4j/impl/JDK14LoggerFactory.java
|
|
deleted file mode 100644
|
|
index 2d6eaaf8..00000000
|
|
--- a/slf4j/src/main/java/org/slf4j/impl/JDK14LoggerFactory.java
|
|
+++ /dev/null
|
|
@@ -1,73 +0,0 @@
|
|
-/**
|
|
- * Copyright (c) 2004-2011 QOS.ch
|
|
- * All rights reserved.
|
|
- *
|
|
- * Permission is hereby granted, free of charge, to any person obtaining
|
|
- * a copy of this software and associated documentation files (the
|
|
- * "Software"), to deal in the Software without restriction, including
|
|
- * without limitation the rights to use, copy, modify, merge, publish,
|
|
- * distribute, sublicense, and/or sell copies of the Software, and to
|
|
- * permit persons to whom the Software is furnished to do so, subject to
|
|
- * the following conditions:
|
|
- *
|
|
- * The above copyright notice and this permission notice shall be
|
|
- * included in all copies or substantial portions of the Software.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
- *
|
|
- */
|
|
-package org.slf4j.impl;
|
|
-
|
|
-import org.slf4j.Logger;
|
|
-import org.slf4j.ILoggerFactory;
|
|
-
|
|
-import java.util.concurrent.ConcurrentHashMap;
|
|
-import java.util.concurrent.ConcurrentMap;
|
|
-
|
|
-/**
|
|
- * JDK14LoggerFactory is an implementation of {@link ILoggerFactory} returning
|
|
- * the appropriately named {@link JDK14LoggerAdapter} instance.
|
|
- *
|
|
- * @author Ceki Gülcü
|
|
- */
|
|
-public class JDK14LoggerFactory implements ILoggerFactory {
|
|
-
|
|
- // key: name (String), value: a JDK14LoggerAdapter;
|
|
- ConcurrentMap<String, Logger> loggerMap;
|
|
- public static java.util.logging.Logger LOGGER; // BungeeCord
|
|
-
|
|
- public JDK14LoggerFactory() {
|
|
- loggerMap = new ConcurrentHashMap<String, Logger>();
|
|
- // ensure jul initialization. see SLF4J-359
|
|
- // note that call to java.util.logging.LogManager.getLogManager() fails on the Google App Engine platform. See SLF4J-363
|
|
- java.util.logging.Logger.getLogger("");
|
|
- }
|
|
-
|
|
- /*
|
|
- * (non-Javadoc)
|
|
- *
|
|
- * @see org.slf4j.ILoggerFactory#getLogger(java.lang.String)
|
|
- */
|
|
- public Logger getLogger(String name) {
|
|
- // the root logger is called "" in JUL
|
|
- if (name.equalsIgnoreCase(Logger.ROOT_LOGGER_NAME)) {
|
|
- name = "";
|
|
- }
|
|
-
|
|
- Logger slf4jLogger = loggerMap.get(name);
|
|
- if (slf4jLogger != null)
|
|
- return slf4jLogger;
|
|
- else {
|
|
- java.util.logging.Logger julLogger = LOGGER; // BungeeCord - TODO: per-plugin loggers
|
|
- Logger newInstance = new JDK14LoggerAdapter(julLogger);
|
|
- Logger oldInstance = loggerMap.putIfAbsent(name, newInstance);
|
|
- return oldInstance == null ? newInstance : oldInstance;
|
|
- }
|
|
- }
|
|
-}
|
|
diff --git a/slf4j/src/main/java/org/slf4j/impl/StaticLoggerBinder.java b/slf4j/src/main/java/org/slf4j/impl/StaticLoggerBinder.java
|
|
deleted file mode 100644
|
|
index ebf8ae11..00000000
|
|
--- a/slf4j/src/main/java/org/slf4j/impl/StaticLoggerBinder.java
|
|
+++ /dev/null
|
|
@@ -1,80 +0,0 @@
|
|
-/**
|
|
- * Copyright (c) 2004-2011 QOS.ch
|
|
- * All rights reserved.
|
|
- *
|
|
- * Permission is hereby granted, free of charge, to any person obtaining
|
|
- * a copy of this software and associated documentation files (the
|
|
- * "Software"), to deal in the Software without restriction, including
|
|
- * without limitation the rights to use, copy, modify, merge, publish,
|
|
- * distribute, sublicense, and/or sell copies of the Software, and to
|
|
- * permit persons to whom the Software is furnished to do so, subject to
|
|
- * the following conditions:
|
|
- *
|
|
- * The above copyright notice and this permission notice shall be
|
|
- * included in all copies or substantial portions of the Software.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
- *
|
|
- */
|
|
-package org.slf4j.impl;
|
|
-
|
|
-import org.slf4j.ILoggerFactory;
|
|
-import org.slf4j.LoggerFactory;
|
|
-import org.slf4j.spi.LoggerFactoryBinder;
|
|
-
|
|
-/**
|
|
- * The binding of {@link LoggerFactory} class with an actual instance of
|
|
- * {@link ILoggerFactory} is performed using information returned by this class.
|
|
- *
|
|
- * @author Ceki Gülcü
|
|
- */
|
|
-public class StaticLoggerBinder implements LoggerFactoryBinder {
|
|
-
|
|
- /**
|
|
- * The unique instance of this class.
|
|
- *
|
|
- */
|
|
- private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();
|
|
-
|
|
- /**
|
|
- * Return the singleton of this class.
|
|
- *
|
|
- * @return the StaticLoggerBinder singleton
|
|
- */
|
|
- public static final StaticLoggerBinder getSingleton() {
|
|
- return SINGLETON;
|
|
- }
|
|
-
|
|
- /**
|
|
- * Declare the version of the SLF4J API this implementation is compiled against.
|
|
- * The value of this field is modified with each major release.
|
|
- */
|
|
- // to avoid constant folding by the compiler, this field must *not* be final
|
|
- public static String REQUESTED_API_VERSION = "1.6.99"; // !final
|
|
-
|
|
- private static final String loggerFactoryClassStr = org.slf4j.impl.JDK14LoggerFactory.class.getName();
|
|
-
|
|
- /** The ILoggerFactory instance returned by the {@link #getLoggerFactory} method
|
|
- * should always be the same object
|
|
- */
|
|
- private final ILoggerFactory loggerFactory;
|
|
-
|
|
- private StaticLoggerBinder() {
|
|
- // Note: JCL gets substituted at build time by an appropriate Ant task
|
|
- loggerFactory = new org.slf4j.impl.JDK14LoggerFactory();
|
|
- }
|
|
-
|
|
- public ILoggerFactory getLoggerFactory() {
|
|
- return loggerFactory;
|
|
- }
|
|
-
|
|
- public String getLoggerFactoryClassStr() {
|
|
- return loggerFactoryClassStr;
|
|
- }
|
|
-}
|
|
diff --git a/slf4j/src/main/java/org/slf4j/impl/StaticMDCBinder.java b/slf4j/src/main/java/org/slf4j/impl/StaticMDCBinder.java
|
|
deleted file mode 100644
|
|
index 0a1dcb4c..00000000
|
|
--- a/slf4j/src/main/java/org/slf4j/impl/StaticMDCBinder.java
|
|
+++ /dev/null
|
|
@@ -1,68 +0,0 @@
|
|
-/**
|
|
- * Copyright (c) 2004-2011 QOS.ch
|
|
- * All rights reserved.
|
|
- *
|
|
- * Permission is hereby granted, free of charge, to any person obtaining
|
|
- * a copy of this software and associated documentation files (the
|
|
- * "Software"), to deal in the Software without restriction, including
|
|
- * without limitation the rights to use, copy, modify, merge, publish,
|
|
- * distribute, sublicense, and/or sell copies of the Software, and to
|
|
- * permit persons to whom the Software is furnished to do so, subject to
|
|
- * the following conditions:
|
|
- *
|
|
- * The above copyright notice and this permission notice shall be
|
|
- * included in all copies or substantial portions of the Software.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
- *
|
|
- */
|
|
-package org.slf4j.impl;
|
|
-
|
|
-import org.slf4j.helpers.BasicMDCAdapter;
|
|
-import org.slf4j.spi.MDCAdapter;
|
|
-
|
|
-/**
|
|
- * This implementation is bound to {@link BasicMDCAdapter}.
|
|
- *
|
|
- * @author Ceki Gülcü
|
|
- */
|
|
-public class StaticMDCBinder {
|
|
-
|
|
- /**
|
|
- * The unique instance of this class.
|
|
- */
|
|
- public static final StaticMDCBinder SINGLETON = new StaticMDCBinder();
|
|
-
|
|
- private StaticMDCBinder() {
|
|
- }
|
|
-
|
|
- /**
|
|
- * Return the singleton of this class.
|
|
- *
|
|
- * @return the StaticMDCBinder singleton
|
|
- * @since 1.7.14
|
|
- */
|
|
- public static final StaticMDCBinder getSingleton() {
|
|
- return SINGLETON;
|
|
- }
|
|
-
|
|
- /**
|
|
- * Currently this method always returns an instance of
|
|
- * {@link BasicMDCAdapter}.
|
|
- */
|
|
- public MDCAdapter getMDCA() {
|
|
- // note that this method is invoked only from within the static initializer of
|
|
- // the org.slf4j.MDC class.
|
|
- return new BasicMDCAdapter();
|
|
- }
|
|
-
|
|
- public String getMDCAdapterClassStr() {
|
|
- return BasicMDCAdapter.class.getName();
|
|
- }
|
|
-}
|
|
diff --git a/slf4j/src/main/java/org/slf4j/impl/StaticMarkerBinder.java b/slf4j/src/main/java/org/slf4j/impl/StaticMarkerBinder.java
|
|
deleted file mode 100644
|
|
index 21a48df6..00000000
|
|
--- a/slf4j/src/main/java/org/slf4j/impl/StaticMarkerBinder.java
|
|
+++ /dev/null
|
|
@@ -1,77 +0,0 @@
|
|
-/**
|
|
- * Copyright (c) 2004-2011 QOS.ch
|
|
- * All rights reserved.
|
|
- *
|
|
- * Permission is hereby granted, free of charge, to any person obtaining
|
|
- * a copy of this software and associated documentation files (the
|
|
- * "Software"), to deal in the Software without restriction, including
|
|
- * without limitation the rights to use, copy, modify, merge, publish,
|
|
- * distribute, sublicense, and/or sell copies of the Software, and to
|
|
- * permit persons to whom the Software is furnished to do so, subject to
|
|
- * the following conditions:
|
|
- *
|
|
- * The above copyright notice and this permission notice shall be
|
|
- * included in all copies or substantial portions of the Software.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
- *
|
|
- */
|
|
-package org.slf4j.impl;
|
|
-
|
|
-import org.slf4j.IMarkerFactory;
|
|
-import org.slf4j.MarkerFactory;
|
|
-import org.slf4j.helpers.BasicMarkerFactory;
|
|
-import org.slf4j.spi.MarkerFactoryBinder;
|
|
-
|
|
-/**
|
|
- *
|
|
- * The binding of {@link MarkerFactory} class with an actual instance of
|
|
- * {@link IMarkerFactory} is performed using information returned by this class.
|
|
- *
|
|
- * @author Ceki Gülcü
|
|
- */
|
|
-public class StaticMarkerBinder implements MarkerFactoryBinder {
|
|
-
|
|
- /**
|
|
- * The unique instance of this class.
|
|
- */
|
|
- public static final StaticMarkerBinder SINGLETON = new StaticMarkerBinder();
|
|
-
|
|
- final IMarkerFactory markerFactory = new BasicMarkerFactory();
|
|
-
|
|
- private StaticMarkerBinder() {
|
|
- }
|
|
-
|
|
- /**
|
|
- * Return the singleton of this class.
|
|
- *
|
|
- * @return the StaticMarkerBinder singleton
|
|
- * @since 1.7.14
|
|
- */
|
|
- public static StaticMarkerBinder getSingleton() {
|
|
- return SINGLETON;
|
|
- }
|
|
-
|
|
- /**
|
|
- * Currently this method always returns an instance of
|
|
- * {@link BasicMarkerFactory}.
|
|
- */
|
|
- public IMarkerFactory getMarkerFactory() {
|
|
- return markerFactory;
|
|
- }
|
|
-
|
|
- /**
|
|
- * Currently, this method returns the class name of
|
|
- * {@link BasicMarkerFactory}.
|
|
- */
|
|
- public String getMarkerFactoryClassStr() {
|
|
- return BasicMarkerFactory.class.getName();
|
|
- }
|
|
-
|
|
-}
|
|
--
|
|
2.40.1
|
|
|