diff --git a/pom.xml b/pom.xml index 11a761e..33a61f2 100644 --- a/pom.xml +++ b/pom.xml @@ -63,11 +63,12 @@ http://ci.yumc.pw/job/${project.artifactId}/ - &a全新 2.X 版本 更多守护与优化 + §a全新 2.X 版本 更多守护与优化 - &c注意 &6- &aYum更新需要&d重启服务器!&c重启服务器!&4重启服务器!; - &b2.7.0 &6- &a完善能耗监控流程...; - &b &6- &a报错能耗添加日志记录; + §c注意 §6- §aYum更新需要§d重启服务器!§c重启服务器!§4重启服务器!; + §b2.7.0 §6- §d完善能耗监控流程...; + §b §6- §c报错§6/§d能耗§a添加日志记录; + §b §6- §a文件处理添加复制命令; DEBUG UTF-8 diff --git a/src/main/java/pw/yumc/Yum/commands/MonitorCommand.java b/src/main/java/pw/yumc/Yum/commands/MonitorCommand.java index d0f506b..5ac63ff 100644 --- a/src/main/java/pw/yumc/Yum/commands/MonitorCommand.java +++ b/src/main/java/pw/yumc/Yum/commands/MonitorCommand.java @@ -46,10 +46,12 @@ public class MonitorCommand implements CommandExecutor { private final String prefix = "§6[§bYum §a能耗监控§6] "; - private final String total = "§6总耗时: §a%.2f毫秒 "; - private final String count = "§6执行次数: §b%s次 "; - private final String avg = "§6平均耗时: §d%.5f毫秒!"; - private final String avg_warn = "§6平均耗时: §c%.5f毫秒!"; + private final String micprefix = " §6命令名称 §a总耗时 §b执行次数 §d平均耗时"; + private final String mieprefix = " §6事件名称 §a总耗时 §b执行次数 §d平均耗时"; + private final String mitprefix = " §6任务名称 §a总耗时 §b执行次数 §d平均耗时"; + private final String milist = "§6- §e%-20s §a%-9.2f §b%-9s §d%-9.5f"; + private final String mialist = "§6- §e%-20s §a%-9.2f §b%-9s"; + private final String miwlist = "§6- §c%-20s §a%-9.2f §b%-9s §c%-9.5f"; private final String reinject = prefix + "§a能耗监控器重载完毕!"; private final String injected = prefix + "§a插件 §b%s §a成功注入能耗监控器!"; @@ -93,18 +95,17 @@ public class MonitorCommand implements CommandExecutor { } } } + sender.sendMessage(micprefix); for (final Entry command : temp.entrySet()) { final org.bukkit.command.CommandExecutor executor = Reflect.on(command.getValue()).get("executor"); if (executor instanceof CommandInjector) { final CommandInjector injected = (CommandInjector) executor; - final StringBuffer str = new StringBuffer(); - str.append("§6- §e" + command.getValue().getName() + " "); - str.append(String.format(total, injected.totalTime / um)); - str.append(String.format(count, injected.count)); if (injected.count != 0) { - str.append(String.format(avg, injected.totalTime / um / injected.count)); + final double avgTime = injected.totalTime / um / injected.count; + sender.sendMessage(String.format(avgTime < 10 ? milist : miwlist, command.getValue().getName(), injected.totalTime / um, injected.count, avgTime)); + } else { + sender.sendMessage(String.format(mialist, command.getValue().getName(), injected.totalTime / um, injected.count)); } - e.getSender().sendMessage(str.toString()); } } } @@ -150,16 +151,10 @@ public class MonitorCommand implements CommandExecutor { } } } + sender.sendMessage(mieprefix); for (final String event : eventTotalTime.keySet()) { - final StringBuffer str = new StringBuffer(); - str.append(String.format("§6- §e%-25s ", event)); - str.append(String.format(total, eventTotalTime.get(event) / um)); - str.append(String.format(count, eventCount.get(event))); - if (eventCount.get(event) != 0) { - final double avgTime = eventTotalTime.get(event) / um / eventCount.get(event); - str.append(String.format(avgTime < 10 ? avg : avg_warn, avgTime)); - } - e.getSender().sendMessage(str.toString()); + final double avgTime = eventTotalTime.get(event) / um / eventCount.get(event); + sender.sendMessage(String.format(avgTime < 10 ? milist : miwlist, event, eventTotalTime.get(event) / um, eventCount.get(event), avgTime)); } } @@ -241,19 +236,18 @@ public class MonitorCommand implements CommandExecutor { } final List pendingTasks = Bukkit.getScheduler().getPendingTasks(); sender.sendMessage(prefix + "§6插件 §b" + pname + " §6的任务能耗如下!"); + sender.sendMessage(mitprefix); for (final BukkitTask pendingTask : pendingTasks) { if (pendingTask.getOwner().getName().equalsIgnoreCase(pname)) { final Runnable task = Reflect.on(pendingTask).get("task"); if (task instanceof TaskInjector) { final TaskInjector executor = (TaskInjector) task; - final StringBuffer str = new StringBuffer(); - str.append("§6- §e" + getClassName(executor.getOriginalTask().getClass()) + " "); - str.append(String.format(total, executor.totalTime / um)); - str.append(String.format(count, executor.count)); if (executor.count != 0) { - str.append(String.format(avg, executor.totalTime / um / executor.count)); + final double avgTime = executor.totalTime / um / executor.count; + sender.sendMessage(String.format(avgTime < 10 ? milist : miwlist, getClassName(executor.getOriginalTask().getClass()), executor.totalTime / um, executor.count, avgTime)); + } else { + sender.sendMessage(String.format(mialist, getClassName(executor.getOriginalTask().getClass()), executor.totalTime / um, executor.count)); } - e.getSender().sendMessage(str.toString()); } } } diff --git a/src/main/java/pw/yumc/Yum/inject/YumPluginLoader.java b/src/main/java/pw/yumc/Yum/inject/YumPluginLoader.java new file mode 100644 index 0000000..f8e848d --- /dev/null +++ b/src/main/java/pw/yumc/Yum/inject/YumPluginLoader.java @@ -0,0 +1,97 @@ +/** + * Created on 17 May 2014 by _MylesC + * Copyright 2014 + */ +package pw.yumc.Yum.inject; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.logging.Level; +import java.util.regex.Pattern; + +import org.bukkit.Bukkit; +import org.bukkit.Server; +import org.bukkit.event.Event; +import org.bukkit.event.Listener; +import org.bukkit.plugin.InvalidDescriptionException; +import org.bukkit.plugin.InvalidPluginException; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.PluginLoader; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.RegisteredListener; +import org.bukkit.plugin.UnknownDependencyException; +import org.bukkit.plugin.java.JavaPluginLoader; + +public class YumPluginLoader implements PluginLoader { + private final JavaPluginLoader internal_loader; + private final Server server; + + @SuppressWarnings("deprecation") + public YumPluginLoader(final Server instance) { + server = instance; + internal_loader = new JavaPluginLoader(instance); + } + + public static void cleanJavaPluginLoaders() { + final YumPluginLoader yumPluginLoader = new YumPluginLoader(Bukkit.getServer()); + final PluginManager spm = Bukkit.getPluginManager(); + try { + final Field field = spm.getClass().getDeclaredField("fileAssociations"); + field.setAccessible(true); + final Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + @SuppressWarnings("unchecked") + final Map map = (Map) field.get(spm); + final Iterator> iter = map.entrySet().iterator(); + while (iter.hasNext()) { + final Entry entry = iter.next(); + if (entry.getValue() instanceof JavaPluginLoader) { + entry.setValue(yumPluginLoader); + } + } + field.set(spm, map); + } catch (final Exception e) { + Bukkit.getServer().getLogger().log(Level.SEVERE, "Yum failed replacing the existing PluginLoader, contact the developers on YUMC!", e); + } + } + + @Override + public Map, Set> createRegisteredListeners(final Listener listener, final Plugin plugin) { + return internal_loader.createRegisteredListeners(listener, plugin); + } + + @Override + public void disablePlugin(final Plugin plugin) { + if (!plugin.getName().equalsIgnoreCase("Yum")) { + internal_loader.disablePlugin(plugin); + } + } + + @Override + public void enablePlugin(final Plugin arg0) { + internal_loader.enablePlugin(arg0); + } + + @Override + public PluginDescriptionFile getPluginDescription(final File arg0) throws InvalidDescriptionException { + return internal_loader.getPluginDescription(arg0); + } + + @Override + public Pattern[] getPluginFileFilters() { + return internal_loader.getPluginFileFilters(); + } + + @Override + public Plugin loadPlugin(final File arg0) throws InvalidPluginException, UnknownDependencyException { + return internal_loader.loadPlugin(arg0); + } + +} diff --git a/src/main/java/pw/yumc/Yum/listeners/PluginListener.java b/src/main/java/pw/yumc/Yum/listeners/PluginListener.java index e0651a2..48f01e8 100644 --- a/src/main/java/pw/yumc/Yum/listeners/PluginListener.java +++ b/src/main/java/pw/yumc/Yum/listeners/PluginListener.java @@ -9,6 +9,7 @@ import org.bukkit.event.server.PluginEnableEvent; import cn.citycraft.PluginHelper.bukkit.P; import cn.citycraft.PluginHelper.kit.PluginKit; import pw.yumc.Yum.api.YumAPI; +import pw.yumc.Yum.managers.ConfigManager; import pw.yumc.Yum.managers.MonitorManager; /** @@ -30,6 +31,9 @@ public class PluginListener implements Listener { @EventHandler public void onPluginEnable(final PluginEnableEvent e) { + if (ConfigManager.i().getMonitorIgnoreList().contains(e.getPlugin().getName())) { + return; + } MonitorManager.reset(e.getPlugin().getName()); PluginKit.runTaskLater(new Runnable() { @Override diff --git a/src/main/java/pw/yumc/Yum/managers/MonitorManager.java b/src/main/java/pw/yumc/Yum/managers/MonitorManager.java index c71adea..a027d56 100644 --- a/src/main/java/pw/yumc/Yum/managers/MonitorManager.java +++ b/src/main/java/pw/yumc/Yum/managers/MonitorManager.java @@ -16,6 +16,7 @@ import org.bukkit.plugin.Plugin; import cn.citycraft.PluginHelper.kit.LogKit; import cn.citycraft.PluginHelper.kit.PluginKit; +import cn.citycraft.PluginHelper.sql.DataBase; /** * @@ -41,6 +42,8 @@ public class MonitorManager { private final static Map event = new ConcurrentHashMap<>(); private final static Map cmd = new ConcurrentHashMap<>(); + private final static DataBase db = null; + private final static double um = 1000000.00; private final static LogKit mlog = new LogKit("monitor.log");