From 12f3d31525f2289e9dc7de307b5c603df7acb49a Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Mon, 10 Apr 2017 20:07:44 +0300 Subject: [PATCH] Changed the pool to a BlockingQueue, Broke Session saving Fix #75 --- .../main/java/com/djrapitops/plan/Plan.java | 8 +- .../plan/command/commands/SearchCommand.java | 14 +- .../plan/data/cache/DataCacheHandler.java | 57 ++++++-- .../plan/data/cache/InspectCacheHandler.java | 49 +------ .../plan/data/cache/SessionCache.java | 18 ++- .../cache/queue/DataCacheProcessQueue.java | 133 ++++++++++++++++++ .../plan/data/handling/InfoPoolProcessor.java | 30 ++++ .../plan/data/handling/LogoutHandling.java | 3 - .../plan/data/handling/info/LogoutInfo.java | 5 +- .../plan/data/listeners/PlanChatListener.java | 10 +- .../listeners/PlanDeathEventListener.java | 12 +- .../listeners/PlanGamemodeChangeListener.java | 10 +- .../data/listeners/PlanPlayerListener.java | 33 +++-- .../listeners/PlanPlayerMoveListener.java | 4 +- .../djrapitops/plan/utilities/Analysis.java | 2 +- Plan/src/main/resources/plugin.yml | 2 +- .../data/handling/LogoutHandlingTest.java | 10 +- .../data/handling/info/LogoutInfoTest.java | 19 +-- 18 files changed, 293 insertions(+), 126 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheProcessQueue.java diff --git a/Plan/src/main/java/com/djrapitops/plan/Plan.java b/Plan/src/main/java/com/djrapitops/plan/Plan.java index dc918fe94..aff31e0e0 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Plan.java +++ b/Plan/src/main/java/com/djrapitops/plan/Plan.java @@ -104,8 +104,8 @@ public class Plan extends JavaPlugin { } this.handler = new DataCacheHandler(this); - this.infoPoolProcessor = new InfoPoolProcessor(this); - infoPoolProcessor.startPoolTask(); +// this.infoPoolProcessor = new InfoPoolProcessor(this); +// infoPoolProcessor.startPoolTask(); this.inspectCache = new InspectCacheHandler(this); this.analysisCache = new AnalysisCacheHandler(this); registerListeners(); @@ -151,11 +151,11 @@ public class Plan extends JavaPlugin { uiServer.stop(); } Bukkit.getScheduler().cancelTasks(this); - if (handler != null) { - infoPoolProcessor.processPool(); + if (handler != null) { log(Phrase.CACHE_SAVE + ""); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.execute(() -> { +// infoPoolProcessor.processPool(); handler.saveCacheOnDisable(); }); diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/SearchCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/SearchCommand.java index 6992ce15f..8882b01b5 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/SearchCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/SearchCommand.java @@ -103,10 +103,16 @@ public class SearchCommand extends SubCommand { } else { sender.sendMessage(message); Player player = (Player) sender; - Bukkit.getServer().dispatchCommand( - Bukkit.getConsoleSender(), - "tellraw " + player.getName() + " [\"\",{\"text\":\"Click Me\",\"underlined\":true," - + "\"clickEvent\":{\"action\":\"open_url\",\"value\":\"" + url + "\"}}]"); + BukkitTask link = new BukkitRunnable() { + @Override + public void run() { + Bukkit.getServer().dispatchCommand( + Bukkit.getConsoleSender(), + "tellraw " + player.getName() + " [\"\",{\"text\":\"Click Me\",\"underlined\":true," + + "\"clickEvent\":{\"action\":\"open_url\",\"value\":\"" + url + "\"}}]"); + } + }.runTask(plugin); + } } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/DataCacheHandler.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/DataCacheHandler.java index bfd19985a..c08ed656e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/DataCacheHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/DataCacheHandler.java @@ -6,16 +6,23 @@ import main.java.com.djrapitops.plan.data.cache.queue.DataCacheClearQueue; import main.java.com.djrapitops.plan.utilities.NewPlayerCreator; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; 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.data.*; +import main.java.com.djrapitops.plan.data.cache.queue.DataCacheProcessQueue; +import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo; 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.comparators.HandlingInfoTimeComparator; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -40,6 +47,7 @@ public class DataCacheHandler extends LocationCache { // Queues private DataCacheSaveQueue saveTask; private DataCacheClearQueue clearTask; + private DataCacheProcessQueue processTask; private DataCacheGetQueue getTask; // Variables @@ -62,11 +70,12 @@ public class DataCacheHandler extends LocationCache { getTask = new DataCacheGetQueue(plugin); clearTask = new DataCacheClearQueue(plugin, this); + processTask = new DataCacheProcessQueue(plugin, this); saveTask = new DataCacheSaveQueue(plugin); timesSaved = 0; maxPlayers = plugin.getServer().getMaxPlayers(); - + try { commandUse = db.getCommandUse(); } catch (SQLException e) { @@ -164,6 +173,10 @@ public class DataCacheHandler extends LocationCache { } } + public void addToPool(HandlingInfo i) { + processTask.addToPool(i); + } + /** * Saves all data in the cache to Database and closes the database down. * Closes save clear and get tasks. @@ -172,11 +185,33 @@ public class DataCacheHandler extends LocationCache { saveTask.stop(); getTask.stop(); clearTask.stop(); + List toProcess = processTask.stop(); + Collections.sort(toProcess, new HandlingInfoTimeComparator()); + for (HandlingInfo i : toProcess) { + UserData uData = dataCache.get(i.getUuid()); + if (uData == null) { + DBCallableProcessor p = new DBCallableProcessor() { + @Override + public void process(UserData data) { + i.process(data); + } + }; + try { + db.giveUserDataToProcessors(i.getUuid(), p); + } catch (SQLException ex) { + plugin.toLog(this.getClass().getName(), ex); + } + } else { + i.process(uData); + } + } List data = new ArrayList<>(); + data.addAll(dataCache.values()); - data.parallelStream().forEach((userData) -> { - endSession(userData); - }); + data.parallelStream() + .forEach((userData) -> { + addSession(userData); + }); try { db.saveMultipleUserData(data); db.saveCommandUse(commandUse); @@ -197,6 +232,7 @@ public class DataCacheHandler extends LocationCache { public void process(UserData data) { data.addLocations(getLocationsForSaving(uuid)); clearLocations(uuid); + addSession(data); saveTask.scheduleForSave(data); scheludeForClear(uuid); } @@ -225,7 +261,8 @@ public class DataCacheHandler extends LocationCache { private void saveHandlerDataToCache(Player player) { long time = new Date().getTime(); UUID uuid = player.getUniqueId(); - plugin.getInfoPoolProcessor().addToPool(new ReloadInfo(uuid, time, player.getAddress().getAddress(), player.isBanned(), player.getDisplayName(), player.getGameMode())); +// plugin.getInfoPoolProcessor(). + addToPool(new ReloadInfo(uuid, time, player.getAddress().getAddress(), player.isBanned(), player.getDisplayName(), player.getGameMode())); } @@ -278,7 +315,7 @@ public class DataCacheHandler extends LocationCache { * @param player Player the new UserData is created for */ public void newPlayer(Player player) { - saveTask.scheduleNewPlayer(NewPlayerCreator.createNewPlayer(player)); + newPlayer(NewPlayerCreator.createNewPlayer(player)); } /** @@ -286,7 +323,11 @@ public class DataCacheHandler extends LocationCache { * @param player */ public void newPlayer(OfflinePlayer player) { - saveTask.scheduleNewPlayer(NewPlayerCreator.createNewPlayer(player)); + newPlayer(NewPlayerCreator.createNewPlayer(player)); + } + + public void newPlayer(UserData data) { + saveTask.scheduleNewPlayer(data); } /** @@ -349,7 +390,7 @@ public class DataCacheHandler extends LocationCache { public int getMaxPlayers() { return maxPlayers; } - + public void handleCommand(String command) { if (!commandUse.containsKey(command)) { commandUse.put(command, 0); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/InspectCacheHandler.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/InspectCacheHandler.java index bd664650a..b70794e87 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/InspectCacheHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/InspectCacheHandler.java @@ -18,7 +18,6 @@ public class InspectCacheHandler { private DataCacheHandler handler; private Plan plugin; private HashMap cache; - private HashMap clearTimes; /** * Class constructor @@ -29,29 +28,14 @@ public class InspectCacheHandler { this.handler = plugin.getHandler(); this.plugin = plugin; this.cache = new HashMap<>(); - this.clearTimes = new HashMap<>(); } - - /** - * Caches the UserData of user to the HashMap for X minutes. Data is removed - * from the cache automatically after 5 minutes with a BukkitRunnable - * - * @param uuid UUID of the player - */ - public void cache(UUID uuid) { - int minutes = Settings.CLEAR_INSPECT_CACHE.getNumber(); - if (minutes <= 0) { - minutes = 3; - } - cache(uuid, minutes); - } - + /** * * @param uuid - * @param minutes */ - public void cache(UUID uuid, int minutes) { + public void cache(UUID uuid) { +// plugin.getInfoPoolProcessor().process(uuid); DBCallableProcessor cacher = new DBCallableProcessor() { @Override public void process(UserData data) { @@ -59,33 +43,6 @@ public class InspectCacheHandler { } }; handler.getUserDataForProcessing(cacher, uuid, false); - long clearTime = new Date().toInstant().getEpochSecond() + (long) 60 * (long) minutes; - if (clearTimes.get(uuid) == null) { - clearTimes.put(uuid, (long) 0); - } - if (clearTimes.get(uuid) < clearTime) { - clearTimes.put(uuid, clearTime); - BukkitTask timedInspectCacheClearTask = (new BukkitRunnable() { - @Override - public void run() { - if (new Date().toInstant().getEpochSecond() - clearTimes.get(uuid) < 30) { - UserData uData = cache.get(uuid); - if (uData == null) { - this.cancel(); - return; - } - if (!uData.isAccessed()) { - clearFomCache(uuid); - } - } - this.cancel(); - } - }).runTaskLater(plugin, 60 * 20 * minutes); - } - } - - private void clearFomCache(UUID uuid) { - cache.remove(uuid); } /** diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/SessionCache.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/SessionCache.java index bf7bc9e71..cf6fb4641 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/SessionCache.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/SessionCache.java @@ -33,16 +33,22 @@ public class SessionCache { activeSessions.put(uuid, session); } - /** - * - * @param data - */ - public void endSession (UserData data) { - UUID uuid = data.getUuid(); + public void endSession(UUID uuid) { SessionData currentSession = activeSessions.get(uuid); if (currentSession != null) { long now = new Date().toInstant().getEpochSecond() * (long) 1000; currentSession.endSession(now); + } + } + + /** + * + * @param data + */ + public void addSession(UserData data) { + UUID uuid = data.getUuid(); + SessionData currentSession = activeSessions.get(uuid); + if (currentSession != null && currentSession.isValid()) { data.addSession(currentSession); activeSessions.remove(uuid); } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheProcessQueue.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheProcessQueue.java new file mode 100644 index 000000000..f850ae776 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheProcessQueue.java @@ -0,0 +1,133 @@ +package main.java.com.djrapitops.plan.data.cache.queue; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.stream.Collectors; +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.data.UserData; +import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor; +import main.java.com.djrapitops.plan.data.cache.DataCacheHandler; +import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo; +import main.java.com.djrapitops.plan.database.Database; + +/** + * + * @author Rsl1122 + */ +public class DataCacheProcessQueue { + + private BlockingQueue q; + private DataCacheHandler h; + private ProcessSetup s; + + /** + * + * @param plugin + * @param handler + */ + public DataCacheProcessQueue(Plan plugin, DataCacheHandler handler) { + h = handler; + q = new ArrayBlockingQueue(20000); + s = new ProcessSetup(); + s.go(q, plugin.getDB(), h); + } + + /** + * + * @param info + */ + public void addToPool(HandlingInfo info) { + try { + q.add(info); + } catch (IllegalStateException e) { +// getPlugin(Plan.class).logError(Phrase.ERROR_TOO_SMALL_QUEUE.parse("Save Queue", Settings.PROCESS_SAVE_LIMIT.getNumber() + "")); + } + } + + /** + * + * @param info + */ + public void addToPool(Collection info) { + try { + q.addAll(info); + } catch (IllegalStateException e) { +// getPlugin(Plan.class).logError(Phrase.ERROR_TOO_SMALL_QUEUE.parse("Save Queue", Settings.PROCESS_SAVE_LIMIT.getNumber() + "")); + } + } + + public boolean containsUUID(UUID uuid) { + return new ArrayList<>(q).stream().map(d -> d.getUuid()).collect(Collectors.toList()).contains(uuid); + } + + /** + * + * @return + */ + public List stop() { + return s.stop(); + } +} + +class ProcessConsumer implements Runnable { + + private final BlockingQueue queue; + private final DataCacheHandler handler; + private final Database db; + private boolean run; + + ProcessConsumer(BlockingQueue q, Database db, DataCacheHandler h) { + handler = h; + queue = q; + this.db = db; + run = true; + } + + @Override + public void run() { + try { + while (run) { + consume(queue.take()); + } + } catch (InterruptedException ex) { + } + } + + void consume(HandlingInfo info) { + DBCallableProcessor p = new DBCallableProcessor() { + @Override + public void process(UserData data) { + info.process(data); + } + }; + handler.getUserDataForProcessing(p, info.getUuid()); + } + + Collection stop() { + run = false; + return queue; + } +} + +class ProcessSetup { + + private ProcessConsumer one; + private ProcessConsumer two; + + void go(BlockingQueue q, Database db, DataCacheHandler h) { + one = new ProcessConsumer(q, db, h); + two = new ProcessConsumer(q, db, h); + new Thread(one).start(); + new Thread(two).start(); + } + + List stop() { + List i = new ArrayList<>(one.stop()); + i.addAll(two.stop()); + return i; + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/data/handling/InfoPoolProcessor.java b/Plan/src/main/java/com/djrapitops/plan/data/handling/InfoPoolProcessor.java index acbb8c9c5..e2777891b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/handling/InfoPoolProcessor.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/handling/InfoPoolProcessor.java @@ -6,6 +6,7 @@ package main.java.com.djrapitops.plan.data.handling; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -47,6 +48,9 @@ public class InfoPoolProcessor { public void processPool() { List toProcess = new ArrayList<>(pool); + if (toProcess.isEmpty()) { + return; + } try { pool.removeAll(toProcess); List uuids = toProcess.parallelStream().map(i -> i.getUuid()).distinct().collect(Collectors.toList()); @@ -66,6 +70,32 @@ public class InfoPoolProcessor { pool.addAll(toProcess); } } + + public void process(UUID uuid) { + List toProcess = new ArrayList<>(); + toProcess.addAll(pool.stream().filter(i -> i.getUuid().equals(uuid)).collect(Collectors.toList())); + if (toProcess.isEmpty()) { + return; + } + try { + pool.removeAll(toProcess); + List uuids = Arrays.asList(new UUID[]{uuid}); + Map userData = getAffectedUserData(uuids); + + Collections.sort(toProcess, new HandlingInfoTimeComparator()); + for (HandlingInfo r : toProcess) { + UserData data = userData.get(r.getUuid()); + if (data == null) { + pool.add(r); + continue; + } + r.process(data); + } + } catch (Exception e) { + plugin.toLog(this.getClass().getName(), e); + pool.addAll(toProcess); + } + } public Map getAffectedUserData(List uuids) { Map userData = new HashMap<>(); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/handling/LogoutHandling.java b/Plan/src/main/java/com/djrapitops/plan/data/handling/LogoutHandling.java index 55d269350..8b34acb98 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/handling/LogoutHandling.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/handling/LogoutHandling.java @@ -5,9 +5,7 @@ */ package main.java.com.djrapitops.plan.data.handling; -import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.data.UserData; -import static org.bukkit.plugin.java.JavaPlugin.getPlugin; /** * @@ -18,6 +16,5 @@ public class LogoutHandling { data.setPlayTime(data.getPlayTime() + (time - data.getLastPlayed())); data.setLastPlayed(time); data.updateBanned(banned); - getPlugin(Plan.class).getHandler().getSessionCache().endSession(data); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/handling/info/LogoutInfo.java b/Plan/src/main/java/com/djrapitops/plan/data/handling/info/LogoutInfo.java index 1c7548165..a482ebc3d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/handling/info/LogoutInfo.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/handling/info/LogoutInfo.java @@ -14,7 +14,8 @@ import org.bukkit.GameMode; * * @author Risto */ -public class LogoutInfo extends HandlingInfo{ +public class LogoutInfo extends HandlingInfo { + private boolean banned; private GamemodeInfo gmInfo; @@ -29,8 +30,8 @@ public class LogoutInfo extends HandlingInfo{ if (uData.getUuid() != uuid) { return false; } + LogoutHandling.processLogoutInfo(uData, time, banned); gmInfo.process(uData); - LogoutHandling.processLogoutInfo(uData, time, banned); return true; } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanChatListener.java b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanChatListener.java index 9bb618f4d..6a0039797 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanChatListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanChatListener.java @@ -1,7 +1,7 @@ package main.java.com.djrapitops.plan.data.listeners; import main.java.com.djrapitops.plan.Plan; -import main.java.com.djrapitops.plan.data.handling.InfoPoolProcessor; +import main.java.com.djrapitops.plan.data.cache.DataCacheHandler; import main.java.com.djrapitops.plan.data.handling.info.ChatInfo; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -16,7 +16,8 @@ import org.bukkit.event.player.AsyncPlayerChatEvent; public class PlanChatListener implements Listener { private final Plan plugin; - private final InfoPoolProcessor processor; +// private final InfoPoolProcessor processor; + private final DataCacheHandler handler; /** * Class Constructor. @@ -25,7 +26,8 @@ public class PlanChatListener implements Listener { */ public PlanChatListener(Plan plugin) { this.plugin = plugin; - processor = plugin.getInfoPoolProcessor(); +// processor = plugin.getInfoPoolProcessor(); + handler = plugin.getHandler(); } /** @@ -39,6 +41,6 @@ public class PlanChatListener implements Listener { return; } Player p = event.getPlayer(); - processor.addToPool(new ChatInfo(p.getUniqueId(), p.getDisplayName(), event.getMessage())); + handler.addToPool(new ChatInfo(p.getUniqueId(), p.getDisplayName(), event.getMessage())); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanDeathEventListener.java b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanDeathEventListener.java index 6a72411dc..8c3c85578 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanDeathEventListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanDeathEventListener.java @@ -2,7 +2,7 @@ package main.java.com.djrapitops.plan.data.listeners; import java.util.Date; import main.java.com.djrapitops.plan.Plan; -import main.java.com.djrapitops.plan.data.handling.InfoPoolProcessor; +import main.java.com.djrapitops.plan.data.cache.DataCacheHandler; import main.java.com.djrapitops.plan.data.handling.info.DeathInfo; import main.java.com.djrapitops.plan.data.handling.info.KillInfo; import org.bukkit.entity.LivingEntity; @@ -19,7 +19,8 @@ import org.bukkit.event.entity.EntityDeathEvent; public class PlanDeathEventListener implements Listener { private final Plan plugin; - private final InfoPoolProcessor processor; +// private final InfoPoolProcessor processor; + private final DataCacheHandler handler; /** * @@ -27,7 +28,8 @@ public class PlanDeathEventListener implements Listener { */ public PlanDeathEventListener(Plan plugin) { this.plugin = plugin; - this.processor = plugin.getInfoPoolProcessor(); +// this.processor = plugin.getInfoPoolProcessor(); + this.handler = plugin.getHandler(); } /** @@ -42,10 +44,10 @@ public class PlanDeathEventListener implements Listener { Player killer = dead.getKiller(); boolean killerIsPlayer = killer != null; if (killerIsPlayer) { - processor.addToPool(new KillInfo(killer.getUniqueId(), time, dead, killer.getInventory().getItemInMainHand().getType().name())); + handler.addToPool(new KillInfo(killer.getUniqueId(), time, dead, killer.getInventory().getItemInMainHand().getType().name())); } if (dead instanceof Player) { - processor.addToPool(new DeathInfo(((Player) dead).getUniqueId())); + handler.addToPool(new DeathInfo(((Player) dead).getUniqueId())); } } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanGamemodeChangeListener.java b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanGamemodeChangeListener.java index 7cd55e65d..c4244d000 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanGamemodeChangeListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanGamemodeChangeListener.java @@ -2,7 +2,7 @@ package main.java.com.djrapitops.plan.data.listeners; import java.util.Date; import main.java.com.djrapitops.plan.Plan; -import main.java.com.djrapitops.plan.data.handling.InfoPoolProcessor; +import main.java.com.djrapitops.plan.data.cache.DataCacheHandler; import main.java.com.djrapitops.plan.data.handling.info.GamemodeInfo; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -17,7 +17,8 @@ import org.bukkit.event.player.PlayerGameModeChangeEvent; public class PlanGamemodeChangeListener implements Listener { private final Plan plugin; - private final InfoPoolProcessor processor; +// private final InfoPoolProcessor processor; + private final DataCacheHandler handler; /** * Class Constructor. @@ -26,7 +27,8 @@ public class PlanGamemodeChangeListener implements Listener { */ public PlanGamemodeChangeListener(Plan plugin) { this.plugin = plugin; - processor = plugin.getInfoPoolProcessor(); +// processor = plugin.getInfoPoolProcessor(); + handler = plugin.getHandler(); } @@ -41,6 +43,6 @@ public class PlanGamemodeChangeListener implements Listener { return; } Player p = event.getPlayer(); - processor.addToPool(new GamemodeInfo(p.getUniqueId(), new Date().getTime(), event.getNewGameMode())); + handler.addToPool(new GamemodeInfo(p.getUniqueId(), new Date().getTime(), event.getNewGameMode())); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerListener.java b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerListener.java index f3caaf02d..1c33c1035 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerListener.java @@ -1,14 +1,14 @@ package main.java.com.djrapitops.plan.data.listeners; -import main.java.com.djrapitops.plan.data.cache.LocationCache; import java.util.Date; import java.util.UUID; import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.cache.DataCacheHandler; -import main.java.com.djrapitops.plan.data.handling.InfoPoolProcessor; import main.java.com.djrapitops.plan.data.handling.info.KickInfo; import main.java.com.djrapitops.plan.data.handling.info.LoginInfo; import main.java.com.djrapitops.plan.data.handling.info.LogoutInfo; +import main.java.com.djrapitops.plan.utilities.NewPlayerCreator; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -27,8 +27,7 @@ public class PlanPlayerListener implements Listener { private final Plan plugin; private final DataCacheHandler handler; - private final InfoPoolProcessor processor; - private final LocationCache locationH; +// private final InfoPoolProcessor processor; /** * Class Constructor. @@ -41,8 +40,7 @@ public class PlanPlayerListener implements Listener { public PlanPlayerListener(Plan plugin) { this.plugin = plugin; handler = plugin.getHandler(); - processor = plugin.getInfoPoolProcessor(); - locationH = handler.getLocationHandler(); +// handler = plugin.getInfoPoolProcessor(); } /** @@ -57,15 +55,19 @@ public class PlanPlayerListener implements Listener { public void onPlayerLogin(PlayerJoinEvent event) { Player player = event.getPlayer(); UUID uuid = player.getUniqueId(); - processor.addToPool(new LoginInfo(uuid, new Date().getTime(), player.getAddress().getAddress(), player.isBanned(), player.getDisplayName(), player.getGameMode(), 1)); - handler.getSessionCache().startSession(uuid); + handler.startSession(uuid); BukkitTask asyncNewPlayerCheckTask = (new BukkitRunnable() { @Override public void run() { + LoginInfo loginInfo = new LoginInfo(uuid, new Date().getTime(), player.getAddress().getAddress(), player.isBanned(), player.getDisplayName(), player.getGameMode(), 1); boolean isNewPlayer = !plugin.getDB().wasSeenBefore(uuid); if (isNewPlayer) { - handler.newPlayer(player); - } + UserData newUserData = NewPlayerCreator.createNewPlayer(player); + loginInfo.process(newUserData); + handler.newPlayer(newUserData); + } else { + handler.addToPool(loginInfo); + } this.cancel(); } }).runTaskAsynchronously(plugin); @@ -83,8 +85,9 @@ public class PlanPlayerListener implements Listener { public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); UUID uuid = player.getUniqueId(); - processor.addToPool(new LogoutInfo(uuid, new Date().getTime(), player.isBanned(), player.getGameMode())); - handler.saveCachedData(uuid); + handler.endSession(uuid); + handler.addToPool(new LogoutInfo(uuid, new Date().getTime(), player.isBanned(), player.getGameMode())); + handler.saveCachedData(uuid); } /** @@ -101,8 +104,8 @@ public class PlanPlayerListener implements Listener { } Player player = event.getPlayer(); UUID uuid = player.getUniqueId(); - processor.addToPool(new LogoutInfo(uuid, new Date().getTime(), player.isBanned(), player.getGameMode())); - processor.addToPool(new KickInfo(uuid)); - handler.saveCachedData(uuid); + handler.addToPool(new LogoutInfo(uuid, new Date().getTime(), player.isBanned(), player.getGameMode())); + handler.addToPool(new KickInfo(uuid)); + handler.saveCachedData(uuid); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerMoveListener.java b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerMoveListener.java index 34f6cdef4..1c9fc31a7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerMoveListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerMoveListener.java @@ -18,7 +18,6 @@ public class PlanPlayerMoveListener implements Listener { private final Plan plugin; private final DataCacheHandler handler; - private final LocationCache locationH; /** * Class Consturctor. @@ -28,7 +27,6 @@ public class PlanPlayerMoveListener implements Listener { public PlanPlayerMoveListener(Plan plugin) { this.plugin = plugin; handler = plugin.getHandler(); - locationH = handler.getLocationHandler(); } /** @@ -50,6 +48,6 @@ public class PlanPlayerMoveListener implements Listener { } UUID uuid = event.getPlayer().getUniqueId(); Location savedLocation = to.getBlock().getLocation(); - locationH.addLocation(uuid, savedLocation); + handler.addLocation(uuid, savedLocation); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/Analysis.java b/Plan/src/main/java/com/djrapitops/plan/utilities/Analysis.java index 4e31c03e6..5520cff16 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/Analysis.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/Analysis.java @@ -111,7 +111,7 @@ public class Analysis { return false; } uuids.stream().forEach((uuid) -> { - inspectCache.cache(uuid, 15); + inspectCache.cache(uuid); }); log(Phrase.ANALYSIS_FETCH_DATA + ""); while (rawData.size() != uuids.size()) { diff --git a/Plan/src/main/resources/plugin.yml b/Plan/src/main/resources/plugin.yml index 941a06310..c100f0761 100644 --- a/Plan/src/main/resources/plugin.yml +++ b/Plan/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: Plan author: Rsl1122 main: main.java.com.djrapitops.plan.Plan -version: 2.9.3 +version: 3.0.0 softdepend: - OnTime diff --git a/Plan/src/test/java/main/java/com/djrapitops/plan/data/handling/LogoutHandlingTest.java b/Plan/src/test/java/main/java/com/djrapitops/plan/data/handling/LogoutHandlingTest.java index 9a1de43bc..5654e686b 100644 --- a/Plan/src/test/java/main/java/com/djrapitops/plan/data/handling/LogoutHandlingTest.java +++ b/Plan/src/test/java/main/java/com/djrapitops/plan/data/handling/LogoutHandlingTest.java @@ -52,15 +52,9 @@ public class LogoutHandlingTest { data.setLastPlayed(10L); data.updateBanned(false); long time = 20L; - Exception ex = null; - try { - LogoutHandling.processLogoutInfo(data, time, true); - } catch (NullPointerException e) { - ex = e; - } - assertTrue("Didn't catch endSessionException", ex != null); + LogoutHandling.processLogoutInfo(data, time, true); assertTrue("Last Played wrong", data.getLastPlayed() == 20L); - assertTrue("Playtime wrong", data.getPlayTime()== 10L); + assertTrue("Playtime wrong", data.getPlayTime() == 10L); assertTrue("Banned wrong", data.isBanned()); } diff --git a/Plan/src/test/java/main/java/com/djrapitops/plan/data/handling/info/LogoutInfoTest.java b/Plan/src/test/java/main/java/com/djrapitops/plan/data/handling/info/LogoutInfoTest.java index 2963b5e17..53e756b43 100644 --- a/Plan/src/test/java/main/java/com/djrapitops/plan/data/handling/info/LogoutInfoTest.java +++ b/Plan/src/test/java/main/java/com/djrapitops/plan/data/handling/info/LogoutInfoTest.java @@ -30,7 +30,7 @@ import test.java.utils.TestInit; @RunWith(PowerMockRunner.class) @PrepareForTest(JavaPlugin.class) public class LogoutInfoTest { - + public LogoutInfoTest() { } @@ -47,7 +47,7 @@ public class LogoutInfoTest { PowerMock.replay(JavaPlugin.class); // PowerMock.verify(JavaPlugin.class); } - + @Test public void testProcess() { UserData data = new UserData(MockUtils.mockPlayer(), new DemographicsData()); @@ -57,18 +57,13 @@ public class LogoutInfoTest { Exception ex = null; data.setLastGamemode(GameMode.SURVIVAL); LogoutInfo i = new LogoutInfo(data.getUuid(), time, true, GameMode.CREATIVE); - try { - assertTrue(i.process(data)); - } catch (NullPointerException e) { - ex = e; - } - assertTrue("Caught endSessionException", ex != null); + assertTrue(i.process(data)); assertTrue("Last Played wrong", data.getLastPlayed() == 20L); - assertTrue("Playtime wrong", data.getPlayTime()== 10L); + assertTrue("Playtime wrong", data.getPlayTime() == 10L); assertTrue("Banned wrong", data.isBanned()); assertTrue("Didn't process gamemode", data.getLastGamemode() == GameMode.CREATIVE); } - + @Test public void testProcessWrongUUID() { UserData data = new UserData(MockUtils.mockPlayer(), new DemographicsData()); @@ -84,9 +79,9 @@ public class LogoutInfoTest { } assertTrue("Caught endSessionException", ex == null); assertTrue("Last Played wrong", data.getLastPlayed() == 10L); - assertTrue("Playtime wrong", data.getPlayTime()== 0L); + assertTrue("Playtime wrong", data.getPlayTime() == 0L); assertTrue("Banned wrong", !data.isBanned()); assertTrue("Didn't process gamemode", data.getLastGamemode() == GameMode.SURVIVAL); } - + }