package com.prupe.mcpatcher; import com.prupe.mcpatcher.MCLogger$1; import com.prupe.mcpatcher.MCLogger$ErrorLevel; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; public class MCLogger { private static final HashMap<String, MCLogger> allLoggers = new HashMap(); public static final Level ERROR = new MCLogger$ErrorLevel(); private static final long FLOOD_INTERVAL = 1000L; private static final long FLOOD_REPORT_INTERVAL = 5000L; private static final int FLOOD_LIMIT = 100; private static final int FLOOD_LEVEL = Level.CONFIG.intValue(); private final String logPrefix; private final Logger logger; private boolean flooding; private long lastFloodReport; private int floodCount; private long lastMessage = System.currentTimeMillis(); private boolean enabled = false; public static MCLogger getLogger(String category) { return getLogger(category, category); } public static synchronized MCLogger getLogger(String category, String logPrefix) { MCLogger logger = (MCLogger)allLoggers.get(category); if (logger == null) { logger = new MCLogger(category, logPrefix); allLoggers.put(category, logger); } return logger; } private MCLogger(String category, String logPrefix) { this.logPrefix = logPrefix; this.logger = Logger.getLogger(category); this.logger.setLevel(Config.getLogLevel(category)); this.logger.setUseParentHandlers(false); this.logger.addHandler(new MCLogger$1(this)); } private boolean checkFlood() { long now = System.currentTimeMillis(); boolean showFloodMessage = false; if (now - this.lastMessage > 1000L) { if (this.flooding) { this.reportFlooding(now); this.flooding = false; } else { this.floodCount = 0; } } else if (this.flooding && now - this.lastFloodReport > 5000L) { this.reportFlooding(now); showFloodMessage = true; } this.lastMessage = now; ++this.floodCount; if (this.flooding) { return showFloodMessage; } else if (this.floodCount > 100) { this.flooding = true; this.lastFloodReport = now; this.reportFlooding(now); return false; } else { return true; } } private void reportFlooding(long now) { if (this.floodCount > 0) { this.logger.log(Level.WARNING, String.format("%d flood messages dropped in the last %ds", new Object[] {Integer.valueOf(this.floodCount), Long.valueOf((now - this.lastFloodReport) / 1000L)})); } this.floodCount = 0; this.lastFloodReport = now; } public boolean isLoggable(Level level) { return this.logger.isLoggable(level); } public void setLevel(Level level) { this.logger.setLevel(level); } public void log(Level level, String format, Object ... params) { if (this.isLoggable(level)) { if (level.intValue() >= FLOOD_LEVEL && !this.checkFlood()) { return; } this.logger.log(level, String.format(format, params)); } } public void severe(String format, Object ... params) { if (enabled) { this.log(Level.SEVERE, format, params); } } public void error(String format, Object ... params) { if (enabled) { this.log(ERROR, format, params); } } public void warning(String format, Object ... params) { if (enabled) { this.log(Level.WARNING, format, params); } } public void info(String format, Object ... params) { if (enabled) { this.log(Level.INFO, format, params); } } public void config(String format, Object ... params) { if (enabled) { this.log(Level.CONFIG, format, params); } } public void fine(String format, Object ... params) { if (enabled) { this.log(Level.FINE, format, params); } } public void finer(String format, Object ... params) { if (enabled) { this.log(Level.FINER, format, params); } } public void finest(String format, Object ... params) { if (enabled) { this.log(Level.FINEST, format, params); } } static String access$000(MCLogger x0) { return x0.logPrefix; } }