Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Essentials' logger breaking on 1.8.8-1.12.2 #4975

Merged
merged 1 commit into from
Jul 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 6 additions & 14 deletions Essentials/src/main/java/com/earth2me/essentials/Essentials.java
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ public ISettings getSettings() {
}

public void setupForTesting(final Server server) throws IOException, InvalidDescriptionException {
LOGGER = new BaseLoggerProvider(BUKKIT_LOGGER);
LOGGER = new BaseLoggerProvider(this, BUKKIT_LOGGER);
final File dataFolder = File.createTempFile("essentialstest", "");
if (!dataFolder.delete()) {
throw new IOException();
Expand Down Expand Up @@ -250,6 +250,7 @@ public void onEnable() {
BUKKIT_LOGGER.setParent(super.getLogger());
}
LOGGER = EssentialsLogger.getLoggerProvider(this);
EssentialsLogger.updatePluginLogger(this);

execTimer = new ExecuteTimer();
execTimer.start();
Expand Down Expand Up @@ -477,7 +478,7 @@ public void onEnable() {

final String timeroutput = execTimer.end();
if (getSettings().isDebug()) {
LOGGER.log(Level.INFO, "Essentials load {0}", timeroutput);
LOGGER.log(Level.INFO, "Essentials load " + timeroutput);
}
} catch (final NumberFormatException ex) {
handleCrash(ex);
Expand All @@ -488,15 +489,6 @@ public void onEnable() {
getBackup().setPendingShutdown(false);
}

@Override
public Logger getLogger() {
if (LOGGER != null) {
return LOGGER;
}

return super.getLogger();
}

// Returns our provider logger if available
public static Logger getWrappedLogger() {
if (LOGGER != null) {
Expand Down Expand Up @@ -755,10 +747,10 @@ public boolean onCommandEssentials(final CommandSender cSender, final Command co

if (bSenderBlock != null) {
if (getSettings().logCommandBlockCommands()) {
LOGGER.log(Level.INFO, "CommandBlock at {0},{1},{2} issued server command: /{3} {4}", new Object[] {bSenderBlock.getX(), bSenderBlock.getY(), bSenderBlock.getZ(), commandLabel, EssentialsCommand.getFinalArg(args, 0)});
LOGGER.log(Level.INFO, "CommandBlock at " + bSenderBlock.getX() + "," + bSenderBlock.getY() + "," + bSenderBlock.getZ() + " issued server command: /" + commandLabel + " " + EssentialsCommand.getFinalArg(args, 0));
}
} else if (user == null) {
LOGGER.log(Level.INFO, "{0} issued server command: /{1} {2}", new Object[] {cSender.getName(), commandLabel, EssentialsCommand.getFinalArg(args, 0)});
LOGGER.log(Level.INFO, cSender.getName()+ " issued server command: /" + commandLabel + " " + EssentialsCommand.getFinalArg(args, 0));
}

final CommandSource sender = new CommandSource(cSender);
Expand Down Expand Up @@ -1070,7 +1062,7 @@ public User getUser(final Player base) {

if (user == null) {
if (getSettings().isDebug()) {
LOGGER.log(Level.INFO, "Constructing new userfile from base player {0}", base.getName());
LOGGER.log(Level.INFO, "Constructing new userfile from base player " + base.getName());
}
user = new User(base, this);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,29 @@
import net.ess3.provider.providers.PaperLoggerProvider;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

public final class EssentialsLogger {
private final static Map<String, LoggerProvider> loggerProviders = new HashMap<>();
private final static MethodHandle loggerFieldHandle;

static {
try {
final Field loggerField = ReflUtil.getFieldCached(JavaPlugin.class, "logger");
//noinspection ConstantConditions
loggerFieldHandle = MethodHandles.lookup().unreflectSetter(loggerField);
} catch (Throwable t) {
throw new RuntimeException("Failed to get logger field handle", t);
}
}

private EssentialsLogger() {
}
Expand All @@ -22,16 +38,28 @@ public static LoggerProvider getLoggerProvider(final Plugin plugin) {
return loggerProviders.get(plugin.getName());
}

final Logger parentLogger = Logger.getLogger(plugin.getName());
final LoggerProvider provider;
if (ReflUtil.getClassCached("io.papermc.paper.adventure.providers.ComponentLoggerProviderImpl") != null) {
provider = new PaperLoggerProvider(plugin);
provider.setParent(parentLogger);
} else {
provider = new BaseLoggerProvider(Logger.getLogger(plugin.getName()));
provider = new BaseLoggerProvider(plugin, parentLogger);
provider.setParent(parentLogger);
}
loggerProviders.put(plugin.getName(), provider);
return provider;
}

public static void updatePluginLogger(final Plugin plugin) {
final LoggerProvider provider = getLoggerProvider(plugin);
try {
loggerFieldHandle.invoke(plugin, provider);
} catch (Throwable e) {
provider.log(Level.SEVERE, "Failed to update " + plugin.getName() + " logger", e);
}
}

public static LoggerProvider getLoggerProvider(final String pluginName) {
if (loggerProviders.containsKey(pluginName)) {
return loggerProviders.get(pluginName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

public class EssentialsAntiBuild extends JavaPlugin implements IAntiBuild {
private final transient Map<AntiBuildConfig, Boolean> settingsBoolean = new EnumMap<>(AntiBuildConfig.class);
Expand All @@ -29,6 +28,7 @@ public void onEnable() {
if (essPlugin == null || !essPlugin.isEnabled()) {
return;
}
EssentialsLogger.updatePluginLogger(this);
ess = new EssentialsConnect(essPlugin, this);

final EssentialsAntiBuildListener blockListener = new EssentialsAntiBuildListener(this);
Expand All @@ -39,16 +39,6 @@ public void onEnable() {
}
}

@Override
public Logger getLogger() {
try {
return EssentialsLogger.getLoggerProvider(this);
} catch (Throwable ignored) {
// In case Essentials isn't installed/loaded
return super.getLogger();
}
}

@Override
public boolean checkProtectionItems(final AntiBuildConfig list, final Material mat) {
final List<Material> itemList = settingsList.get(list);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import static com.earth2me.essentials.I18n.tl;

Expand All @@ -23,6 +22,7 @@ public class EssentialsChat extends JavaPlugin {

@Override
public void onEnable() {
EssentialsLogger.updatePluginLogger(this);
final PluginManager pluginManager = getServer().getPluginManager();
ess = (IEssentials) pluginManager.getPlugin("Essentials");
if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion())) {
Expand All @@ -47,16 +47,6 @@ public void onEnable() {
}
}

@Override
public Logger getLogger() {
try {
return EssentialsLogger.getLoggerProvider(this);
} catch (Throwable ignored) {
// In case Essentials isn't installed/loaded
return super.getLogger();
}
}

@Override
public boolean onCommand(final CommandSender sender, final Command command, final String commandLabel, final String[] args) {
metrics.markCommand(command.getName(), true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public class EssentialsDiscord extends JavaPlugin implements IEssentialsModule {

@Override
public void onEnable() {
EssentialsLogger.updatePluginLogger(this);
ess = (IEssentials) getServer().getPluginManager().getPlugin("Essentials");
if (ess == null || !ess.isEnabled()) {
setEnabled(false);
Expand Down Expand Up @@ -67,16 +68,6 @@ public void onEnable() {
}
}

@Override
public Logger getLogger() {
try {
return EssentialsLogger.getLoggerProvider(this);
} catch (Throwable ignored) {
// In case Essentials isn't installed/loaded
return super.getLogger();
}
}

public static Logger getWrappedLogger() {
try {
return EssentialsLogger.getLoggerProvider("EssentialsDiscord");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class EssentialsGeoIP extends JavaPlugin {

@Override
public void onEnable() {
EssentialsLogger.updatePluginLogger(this);
final PluginManager pm = getServer().getPluginManager();
final IEssentials ess = (IEssentials) pm.getPlugin("Essentials");
if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion())) {
Expand All @@ -39,14 +40,4 @@ public void onEnable() {
}
}

@Override
public Logger getLogger() {
try {
return EssentialsLogger.getLoggerProvider(this);
} catch (Throwable ignored) {
// In case Essentials isn't installed/loaded
return super.getLogger();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

public class EssentialsProtect extends JavaPlugin implements IProtect {
private final Map<ProtectConfig, Boolean> settingsBoolean = new EnumMap<>(ProtectConfig.class);
Expand All @@ -26,6 +25,7 @@ public class EssentialsProtect extends JavaPlugin implements IProtect {

@Override
public void onEnable() {
EssentialsLogger.updatePluginLogger(this);
final PluginManager pm = this.getServer().getPluginManager();
final Plugin essPlugin = pm.getPlugin("Essentials");
if (essPlugin == null || !essPlugin.isEnabled()) {
Expand All @@ -40,16 +40,6 @@ public void onEnable() {
}
}

@Override
public Logger getLogger() {
try {
return EssentialsLogger.getLoggerProvider(this);
} catch (Throwable ignored) {
// In case Essentials isn't installed/loaded
return super.getLogger();
}
}

private void initialize(final PluginManager pm, final Plugin essPlugin) {
getLogger().log(Level.INFO, "Continuing to enable Protect.");
ess = new EssentialsConnect(essPlugin, this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public class EssentialsSpawn extends JavaPlugin implements IEssentialsSpawn {

@Override
public void onEnable() {
EssentialsLogger.updatePluginLogger(this);
final PluginManager pluginManager = getServer().getPluginManager();
ess = (IEssentials) pluginManager.getPlugin("Essentials");
if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion())) {
Expand Down Expand Up @@ -56,16 +57,6 @@ public void onEnable() {
}
}

@Override
public Logger getLogger() {
try {
return EssentialsLogger.getLoggerProvider(this);
} catch (Throwable ignored) {
// In case Essentials isn't installed/loaded
return super.getLogger();
}
}

public static Logger getWrappedLogger() {
try {
return EssentialsLogger.getLoggerProvider("EssentialsSpawn");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ static void updatePresence() {

@Override
public void onEnable() {
EssentialsLogger.updatePluginLogger(this);
instance = this;

final PluginManager pluginManager = getServer().getPluginManager();
Expand Down Expand Up @@ -62,16 +63,6 @@ public void onEnable() {
}
}

@Override
public Logger getLogger() {
try {
return EssentialsLogger.getLoggerProvider(this);
} catch (Throwable ignored) {
// In case Essentials isn't installed/loaded
return super.getLogger();
}
}

public static Logger getWrappedLogger() {
try {
return EssentialsLogger.getLoggerProvider("EssentialsXMPP");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package net.ess3.provider;

import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginLogger;

import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.LogRecord;

public abstract class LoggerProvider extends Logger {
public LoggerProvider(final String name) {
super(name, null);
public abstract class LoggerProvider extends PluginLogger {
public LoggerProvider(final Plugin plugin) {
super(plugin);
}

protected abstract void doTheLog(Level level, String message, Throwable throwable);
Expand All @@ -22,6 +25,11 @@ public void log(Level level, String msg, Throwable thrown) {
doTheLog(level, msg, thrown);
}

@Override
public void log(LogRecord logRecord) {
doTheLog(logRecord.getLevel(), logRecord.getMessage(), logRecord.getThrown());
}

@Override
public void warning(String message) {
doTheLog(Level.WARNING, message);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
package net.ess3.provider.providers;

import net.ess3.provider.LoggerProvider;
import org.bukkit.plugin.Plugin;

import java.util.logging.Level;
import java.util.logging.Logger;

public class BaseLoggerProvider extends LoggerProvider {
private final Logger logger;

public BaseLoggerProvider(final Logger logger) {
super(logger.getName());
public BaseLoggerProvider(final Plugin plugin, final Logger logger) {
super(plugin);
this.logger = logger;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class PaperLoggerProvider extends LoggerProvider {
private final ComponentLogger logger;

public PaperLoggerProvider(final Plugin plugin) {
super(plugin.getComponentLogger().getName());
super(plugin);
this.logger = plugin.getComponentLogger();
}

Expand Down