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");