Added Qinspect and Qanalyze commands, found bugs

- Sessions sometimes reset
- Playtime not correctly calculated.
This commit is contained in:
Rsl1122 2017-04-28 16:57:00 +03:00
parent 9d77cf1790
commit 59021f815c
14 changed files with 350 additions and 59 deletions

View File

@ -116,9 +116,11 @@ public enum Phrase {
CMD_MATCH(COLOR_SEC.color() + " Matching player: " + COLOR_TER.color()),
//
CMD_USG_ANALYZE("View the Server Analysis"),
CMD_USG_QANALYZE("View the Server QuickAnalysis"),
CMD_USG_HELP("Show command list."),
CMD_USG_INFO("View Version of Plan"),
CMD_USG_INSPECT("Inspect Player's Data"),
CMD_USG_QINSPECT("QuickInspect Player's Data"),
CMD_USG_MANAGE("Database managment command"),
CMD_USG_MANAGE_BACKUP("Backup a database to .db file"),
CMD_USG_MANAGE_RESTORE("Restore a database from a backup file"),

View File

@ -31,7 +31,9 @@ public class PlanCommand implements CommandExecutor {
commands = new ArrayList<>();
commands.add(new HelpCommand(plugin, this));
commands.add(new InspectCommand(plugin));
commands.add(new QuickInspectCommand(plugin));
commands.add(new AnalyzeCommand(plugin));
commands.add(new QuickAnalyzeCommand(plugin));
commands.add(new SearchCommand(plugin));
commands.add(new InfoCommand(plugin));
commands.add(new ReloadCommand(plugin));

View File

@ -8,6 +8,7 @@ import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
@ -54,11 +55,10 @@ public class AnalyzeCommand extends SubCommand {
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
if (!Settings.WEBSERVER_ENABLED.isTrue()) {
if (!Settings.SHOW_ALTERNATIVE_IP.isTrue()) {
sender.sendMessage(Phrase.ERROR_WEBSERVER_OFF_ANALYSIS.toString());
return true;
} else {
sendAnalysisMessage(sender);
return true;
if (!Settings.USE_ALTERNATIVE_UI.isTrue()) {
sender.sendMessage(Phrase.ERROR_WEBSERVER_OFF_ANALYSIS + "");
return true;
}
}
}
sender.sendMessage(Phrase.GRABBING_DATA_MESSAGE + "");
@ -98,21 +98,25 @@ public class AnalyzeCommand extends SubCommand {
* @throws CommandException
*/
public void sendAnalysisMessage(CommandSender sender) throws CommandException {
boolean textUI = Settings.USE_ALTERNATIVE_UI.isTrue();
sender.sendMessage(Phrase.CMD_ANALYZE_HEADER + "");
// Link
String url = HtmlUtils.getServerAnalysisUrl();
String message = Phrase.CMD_LINK + "";
boolean console = !(sender instanceof Player);
if (console) {
sender.sendMessage(message + url);
if (textUI) {
sender.sendMessage(TextUI.getAnalysisMessages());
} else {
sender.sendMessage(message);
Player player = (Player) sender;
Bukkit.getServer().dispatchCommand(
Bukkit.getConsoleSender(),
"tellraw " + player.getName() + " [\"\",{\"text\":\"" + Phrase.CMD_CLICK_ME + "\",\"underlined\":true,"
+ "\"clickEvent\":{\"action\":\"open_url\",\"value\":\"" + url + "\"}}]");
// Link
String url = HtmlUtils.getServerAnalysisUrl();
String message = Phrase.CMD_LINK + "";
boolean console = !(sender instanceof Player);
if (console) {
sender.sendMessage(message + url);
} else {
sender.sendMessage(message);
Player player = (Player) sender;
Bukkit.getServer().dispatchCommand(
Bukkit.getConsoleSender(),
"tellraw " + player.getName() + " [\"\",{\"text\":\"" + Phrase.CMD_CLICK_ME + "\",\"underlined\":true,"
+ "\"clickEvent\":{\"action\":\"open_url\",\"value\":\"" + url + "\"}}]");
}
}
sender.sendMessage(Phrase.CMD_FOOTER + "");
}

View File

@ -8,6 +8,7 @@ import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler;
import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.UUIDFetcher;
@ -57,13 +58,10 @@ public class InspectCommand extends SubCommand {
final boolean useAlternativeIP = Settings.SHOW_ALTERNATIVE_IP.isTrue();
if (!Settings.WEBSERVER_ENABLED.isTrue()) {
if (!useAlternativeIP) {
if (Settings.USE_ALTERNATIVE_UI.isTrue()) {
sender.sendMessage(Phrase.CMD_PASS_PLANLITE + "");
//TODO CREATE TEXT UI
} else {
if (!Settings.USE_ALTERNATIVE_UI.isTrue()) {
sender.sendMessage(Phrase.ERROR_WEBSERVER_OFF_INSPECT + "");
return true;
}
return true;
}
}
String playerName = MiscUtils.getPlayerName(args, sender);
@ -107,22 +105,26 @@ public class InspectCommand extends SubCommand {
timesrun++;
if (inspectCache.isCached(uuid)) {
sender.sendMessage(Phrase.CMD_INSPECT_HEADER + playerName);
// Link
String url = HtmlUtils.getInspectUrl(playerName);
String message = Phrase.CMD_LINK + "";
boolean console = !(sender instanceof Player);
if (console) {
sender.sendMessage(message + url);
if (Settings.USE_ALTERNATIVE_UI.isTrue()) {
sender.sendMessage(TextUI.getInspectMessages(uuid));
} else {
sender.sendMessage(message);
Player player = (Player) sender;
Bukkit.getServer().dispatchCommand(
Bukkit.getConsoleSender(),
"tellraw " + player.getName() + " [\"\",{\"text\":\"" + Phrase.CMD_CLICK_ME + "\",\"underlined\":true,"
+ "\"clickEvent\":{\"action\":\"open_url\",\"value\":\"" + url + "\"}}]");
}
// Link
String url = HtmlUtils.getInspectUrl(playerName);
String message = Phrase.CMD_LINK + "";
boolean console = !(sender instanceof Player);
if (console) {
sender.sendMessage(message + url);
} else {
sender.sendMessage(message);
Player player = (Player) sender;
Bukkit.getServer().dispatchCommand(
Bukkit.getConsoleSender(),
"tellraw " + player.getName() + " [\"\",{\"text\":\"" + Phrase.CMD_CLICK_ME + "\",\"underlined\":true,"
+ "\"clickEvent\":{\"action\":\"open_url\",\"value\":\"" + url + "\"}}]");
}
sender.sendMessage(Phrase.CMD_RESULTS_AVAILABLE.parse(available + ""));
sender.sendMessage(Phrase.CMD_RESULTS_AVAILABLE.parse(available + ""));
}
sender.sendMessage(Phrase.CMD_FOOTER + "");
this.cancel();
}

View File

@ -0,0 +1,87 @@
package main.java.com.djrapitops.plan.command.commands;
import java.util.Date;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
/**
* This subcommand is used to run the analysis and access the /server link.
*
* @author Rsl1122
*/
public class QuickAnalyzeCommand extends SubCommand {
private Plan plugin;
private AnalysisCacheHandler analysisCache;
/**
* Subcommand Constructor.
*
* @param plugin Current instance of Plan
*/
public QuickAnalyzeCommand(Plan plugin) {
super("qanalyze, qanalyse, qanalysis", Permissions.QUICK_ANALYZE, Phrase.CMD_USG_QANALYZE.parse(), CommandType.CONSOLE, "");
this.plugin = plugin;
analysisCache = plugin.getAnalysisCache();
}
/**
* Subcommand qanalyze (QuickAnalyze).
*
* Updates AnalysisCache if last refresh was over 60 seconds ago and sends
* player the text ui msgs about analysis data
*
* @param sender
* @param cmd
* @param commandLabel
* @param args
* @return true in all cases.
*/
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
sender.sendMessage(Phrase.GRABBING_DATA_MESSAGE + "");
if (!analysisCache.isCached()) {
int bootAnID = plugin.getBootAnalysisTaskID();
if (bootAnID != -1) {
plugin.getServer().getScheduler().cancelTask(bootAnID);
}
analysisCache.updateCache();
} else if (new Date().getTime() - analysisCache.getData().getRefreshDate() > 60000) {
analysisCache.updateCache();
}
BukkitTask analysisMessageSenderTask = (new BukkitRunnable() {
private int timesrun = 0;
@Override
public void run() {
timesrun++;
if (analysisCache.isCached()) {
sender.sendMessage(Phrase.CMD_ANALYZE_HEADER + "");
sender.sendMessage(TextUI.getAnalysisMessages());
sender.sendMessage(Phrase.CMD_FOOTER + "");
this.cancel();
}
if (timesrun > 10) {
sender.sendMessage(Phrase.COMMAND_TIMEOUT.parse("Analysis"));
this.cancel();
}
}
}).runTaskTimer(plugin, 1 * 20, 5 * 20);
return true;
}
}

View File

@ -0,0 +1,113 @@
package main.java.com.djrapitops.plan.command.commands;
import java.util.UUID;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler;
import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.UUIDFetcher;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
/**
* This command is used to cache UserData to InspectCache and display the link.
*
* @author Rsl1122
*/
public class QuickInspectCommand extends SubCommand {
private Plan plugin;
private InspectCacheHandler inspectCache;
/**
* Class Constructor.
*
* @param plugin Current instance of Plan
*/
public QuickInspectCommand(Plan plugin) {
super("qinspect", Permissions.QUICK_INSPECT, Phrase.CMD_USG_QINSPECT + "", CommandType.CONSOLE_WITH_ARGUMENTS, Phrase.ARG_PLAYER + "");
this.plugin = plugin;
inspectCache = plugin.getInspectCache();
}
/**
* Subcommand qinspect (QuickInspect).
*
* Adds player's data from DataCache/DB to the InspectCache
*
* @param sender args is empty, can not be Console.
* @param cmd
* @param commandLabel
* @param args Player's name or nothing - if empty sender's name is used.
* @return true in all cases.
*/
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
String playerName = MiscUtils.getPlayerName(args, sender, Permissions.QUICK_INSPECT_OTHER);
BukkitTask inspectTask = (new BukkitRunnable() {
@Override
public void run() {
UUID uuid;
try {
uuid = UUIDFetcher.getUUIDOf(playerName);
if (uuid == null) {
throw new Exception("Username doesn't exist.");
}
} catch (Exception e) {
sender.sendMessage(Phrase.USERNAME_NOT_VALID.toString());
this.cancel();
return;
}
OfflinePlayer p = Bukkit.getOfflinePlayer(uuid);
if (!p.hasPlayedBefore()) {
sender.sendMessage(Phrase.USERNAME_NOT_SEEN.toString());
this.cancel();
return;
}
if (!plugin.getDB().wasSeenBefore(uuid)) {
sender.sendMessage(Phrase.USERNAME_NOT_KNOWN.toString());
this.cancel();
return;
}
sender.sendMessage(Phrase.GRABBING_DATA_MESSAGE + "");
inspectCache.cache(uuid);
int configValue = Settings.CLEAR_INSPECT_CACHE.getNumber();
if (configValue <= 0) {
configValue = 4;
}
final int available = configValue;
BukkitTask inspectMessageSenderTask = (new BukkitRunnable() {
private int timesrun = 0;
@Override
public void run() {
timesrun++;
if (inspectCache.isCached(uuid)) {
sender.sendMessage(Phrase.CMD_INSPECT_HEADER + playerName);
sender.sendMessage(TextUI.getInspectMessages(uuid));
sender.sendMessage(Phrase.CMD_FOOTER + "");
this.cancel();
}
if (timesrun > 10) {
sender.sendMessage(Phrase.COMMAND_TIMEOUT.parse("Qinspect"));
this.cancel();
}
}
}).runTaskTimer(plugin, 1 * 20, 5 * 20);
}
}).runTaskAsynchronously(plugin);
return true;
}
}

View File

@ -576,7 +576,7 @@ public class AnalysisData {
*
* @return
*/
public long getTotalkills() {
public long getTotalPlayerKills() {
return totalkills;
}
@ -584,7 +584,7 @@ public class AnalysisData {
*
* @return
*/
public long getTotalmobkills() {
public long getTotalMobKills() {
return totalmobkills;
}
@ -592,7 +592,7 @@ public class AnalysisData {
*
* @return
*/
public long getTotaldeaths() {
public long getTotalDeaths() {
return totaldeaths;
}

View File

@ -16,11 +16,13 @@ import main.java.com.djrapitops.plan.data.cache.queue.DataCacheGetQueue;
import main.java.com.djrapitops.plan.data.cache.queue.DataCacheProcessQueue;
import main.java.com.djrapitops.plan.data.cache.queue.DataCacheSaveQueue;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import main.java.com.djrapitops.plan.data.handling.info.LogoutInfo;
import main.java.com.djrapitops.plan.data.handling.info.ReloadInfo;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.utilities.NewPlayerCreator;
import main.java.com.djrapitops.plan.utilities.comparators.HandlingInfoTimeComparator;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
@ -207,6 +209,12 @@ public class DataCacheHandler extends LocationCache {
* Closes save clear and get tasks.
*/
public void saveCacheOnDisable() {
long time = new Date().getTime();
for (Player p : Bukkit.getOnlinePlayers()) {
UUID uuid = p.getUniqueId();
endSession(uuid);
processTask.addToPool(new LogoutInfo(uuid, time, p.isBanned(), p.getGameMode(), getSession(uuid)));
}
saveTask.stop();
getTask.stop();
clearTask.stop();
@ -215,11 +223,10 @@ public class DataCacheHandler extends LocationCache {
processUnprocessedHandlingInfo(toProcess);
List<UserData> data = new ArrayList<>();
data.addAll(dataCache.values());
data.parallelStream()
.forEach((userData) -> {
endSession(userData.getUuid());
addSession(userData);
});
// data.parallelStream()
// .forEach((userData) -> {
// addSession(userData);
// });
try {
db.saveMultipleUserData(data);
db.saveCommandUse(commandUse);

View File

@ -102,17 +102,13 @@ class ClearConsumer implements Runnable {
class ClearSetup {
private ClearConsumer one;
private ClearConsumer two;
void go(BlockingQueue<UUID> q, DataCacheHandler handler) {
one = new ClearConsumer(q, handler);
two = new ClearConsumer(q, handler);
new Thread(one).start();
new Thread(two).start();
}
void stop() {
one.stop();
two.stop();
}
}

View File

@ -0,0 +1,68 @@
package main.java.com.djrapitops.plan.ui;
import java.util.UUID;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.AnalysisData;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler;
import main.java.com.djrapitops.plan.utilities.AnalysisUtils;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import org.bukkit.ChatColor;
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
/**
*
* @author Rsl1122
*/
public class TextUI {
public static String[] getInspectMessages(UUID uuid) {
InspectCacheHandler inspectCache = getPlugin(Plan.class).getInspectCache();
if (!inspectCache.isCached(uuid)) {
return new String[]{"Error has occurred, please retry."};
}
UserData d = inspectCache.getFromCache(uuid);
ChatColor main = Phrase.COLOR_MAIN.color();
ChatColor sec = Phrase.COLOR_SEC.color();
ChatColor ter = Phrase.COLOR_TER.color();
boolean active = AnalysisUtils.isActive(d.getLastPlayed(), d.getPlayTime(), d.getLoginTimes());
boolean banned = d.isBanned();
boolean online = d.isOnline();
String ball = sec + " " + Phrase.BALL + main;
return new String[]{
sec + " " + Phrase.BALL + (banned ? ChatColor.DARK_RED + " Banned" : ter + (active ? " Active" : " Inactive")) + (online ? ChatColor.GREEN + " Online" : ChatColor.RED + " Offline"),
ball + " Registered: " + sec + FormatUtils.formatTimeStamp(d.getRegistered() + ""),
ball + " Last seen: " + sec + FormatUtils.formatTimeStamp(d.getLastPlayed() + ""),
ball + " Playtime: " + sec + FormatUtils.formatTimeAmount(d.getPlayTime() + ""),
ball + " Login times: " + sec + d.getLoginTimes(),
ball + " Average session length: " + sec + FormatUtils.formatTimeAmount(AnalysisUtils.average(AnalysisUtils.transformSessionDataToLengths(d.getSessions())) + ""),
ball + " Kills: " + sec + d.getPlayerKills().size() + main + " Mobs: " + sec + d.getMobKills() + main + " Deaths: " + sec + d.getDeaths(),
ball + " Geolocation: " + sec + d.getDemData().getGeoLocation()
};
}
public static String[] getAnalysisMessages() {
AnalysisCacheHandler analysisCache = getPlugin(Plan.class).getAnalysisCache();
if (!analysisCache.isCached()) {
return new String[]{"Error has occurred, please retry."};
}
AnalysisData d = analysisCache.getData();
ChatColor main = Phrase.COLOR_MAIN.color();
ChatColor sec = Phrase.COLOR_SEC.color();
ChatColor ter = Phrase.COLOR_TER.color();
String ball = sec + " " + Phrase.BALL + main;
return new String[]{
ball + " Total Players: " + sec + d.getTotal(),
ball + " Active: " + sec + d.getActive() + main + " Inactive: " + sec + d.getInactive() + main + " Single join: " + sec + d.getJoinleaver() + main + " Banned: " + sec + d.getBanned(),
ball + " New Players 24h: " + sec + d.getNewPlayersDay() + main + " 7d: " + sec + d.getNewPlayersWeek() + main + " 30d: " + sec + d.getNewPlayersMonth(),
"",
ball + " Total Playtime: " + sec + FormatUtils.formatTimeAmount(d.getTotalPlayTime() + "") + main + " Player Avg: " + sec + FormatUtils.formatTimeAmount(d.getAveragePlayTime() + ""),
ball + " Average Session Length: " + sec + FormatUtils.formatTimeAmount(d.getSessionAverage() + ""),
ball + " Total Logintimes: " + sec + d.getTotalLoginTimes(),
ball + " Kills: " + sec + d.getTotalPlayerKills() + main + " Mobs: " + sec + d.getTotalMobKills() + main + " Deaths: " + sec + d.getTotalDeaths()
};
}
}

View File

@ -28,6 +28,13 @@ import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.GameMode;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import static org.bukkit.Bukkit.getOfflinePlayer;
import static org.bukkit.Bukkit.getOfflinePlayer;
import static org.bukkit.Bukkit.getOfflinePlayer;
import static org.bukkit.Bukkit.getOfflinePlayer;
import static org.bukkit.Bukkit.getOfflinePlayer;
import static org.bukkit.Bukkit.getOfflinePlayer;
import static org.bukkit.Bukkit.getOfflinePlayer;
/**
*

View File

@ -53,9 +53,9 @@ public class PlaceholderUtils {
replaceMap.put("%totallogins%", "" + data.getTotalLoginTimes());
replaceMap.put("%top20mostactive%", data.getTop20ActivePlayers());
replaceMap.put("%recentlogins%", data.getRecentPlayers());
replaceMap.put("%deaths%", data.getTotaldeaths() + "");
replaceMap.put("%playerkills%", data.getTotalkills() + "");
replaceMap.put("%mobkills%", data.getTotalmobkills() + "");
replaceMap.put("%deaths%", data.getTotalDeaths() + "");
replaceMap.put("%playerkills%", data.getTotalPlayerKills() + "");
replaceMap.put("%mobkills%", data.getTotalMobKills() + "");
Plan plugin = getPlugin(Plan.class);
replaceMap.put("%version%", plugin.getDescription().getVersion());
replaceMap.put("%planlite%", "");

View File

@ -38,18 +38,18 @@ import test.java.utils.TestInit;
@RunWith(PowerMockRunner.class)
@PrepareForTest({JavaPlugin.class})
public class DataCacheSaveQueueTest {
private Plan plan;
private Database db;
private boolean calledSaveUserData;
private boolean calledSaveUserData2;
/**
*
*/
public DataCacheSaveQueueTest() {
}
/**
*
*/
@ -78,12 +78,12 @@ public class DataCacheSaveQueueTest {
calledSaveUserData2 = true;
}
calledSaveUserData = true;
}
};
when(plan.getDB()).thenReturn(db);
}
/**
*
*/
@ -138,6 +138,7 @@ public class DataCacheSaveQueueTest {
/**
*
*/
@Ignore("Inconsistant")
@Test
public void testContainsUUID() {
DataCacheSaveQueue q = new DataCacheSaveQueue(plan);
@ -151,7 +152,8 @@ public class DataCacheSaveQueueTest {
*
* @throws InterruptedException
*/
@Ignore @Test
@Ignore
@Test
public void testStop() throws InterruptedException {
DataCacheSaveQueue q = new DataCacheSaveQueue(plan);
UserData data = new UserData(MockUtils.mockPlayer(), new DemographicsData());
@ -160,5 +162,5 @@ public class DataCacheSaveQueueTest {
q.scheduleNewPlayer(data);
assertTrue(!calledSaveUserData);
}
}

View File

@ -82,6 +82,7 @@ public class DatabaseTest {
EasyMock.expect(JavaPlugin.getPlugin(Plan.class)).andReturn(plan);
EasyMock.expect(JavaPlugin.getPlugin(Plan.class)).andReturn(plan);
EasyMock.expect(JavaPlugin.getPlugin(Plan.class)).andReturn(plan);
EasyMock.expect(JavaPlugin.getPlugin(Plan.class)).andReturn(plan);
PowerMock.replay(JavaPlugin.class);
// PowerMock.verify(JavaPlugin.class);
File f = new File(plan.getDataFolder(), "Errors.txt");