From 437345cded0728b7975d845b4a1e6c652c5f9051 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Mon, 21 Aug 2017 17:55:49 +0300 Subject: [PATCH 1/6] Changes WorldTimes to work with GMTimes, Breaks the Database, Grathering & Analysis. --- .../com/djrapitops/plan/data/UserData.java | 2 +- .../plan/data/analysis/WorldPart.java | 6 +- .../plan/data/handling/PlaytimeHandling.java | 2 +- .../djrapitops/plan/data/time/WorldTimes.java | 86 +++++++-- .../plan/database/databases/SQLDB.java | 38 ++-- .../plan/database/tables/UsersTable.java | 72 +++---- .../plan/utilities/PlaceholderUtils.java | 5 +- .../plan/utilities/analysis/Analysis.java | 8 +- .../data/handling/info/LoginInfoTest.java | 2 +- .../data/handling/info/LogoutInfoTest.java | 2 +- .../data/handling/info/ReloadInfoTest.java | 2 +- .../plan/data/time/WorldTimesTest.java | 180 ++++++++++++++++++ .../plan/database/DatabaseTest.java | 8 +- 13 files changed, 321 insertions(+), 92 deletions(-) create mode 100644 Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java diff --git a/Plan/src/main/java/com/djrapitops/plan/data/UserData.java b/Plan/src/main/java/com/djrapitops/plan/data/UserData.java index 2497d2f24..9a4668cc8 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/UserData.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/UserData.java @@ -67,7 +67,7 @@ public class UserData { accessing = 0; this.gmTimes = new GMTimes(gm); - this.worldTimes = new WorldTimes(); +// TODO REMOVE this.worldTimes = new WorldTimes(); this.uuid = uuid; this.name = name; diff --git a/Plan/src/main/java/com/djrapitops/plan/data/analysis/WorldPart.java b/Plan/src/main/java/com/djrapitops/plan/data/analysis/WorldPart.java index 46687850f..431cb71c3 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/analysis/WorldPart.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/analysis/WorldPart.java @@ -1,8 +1,6 @@ package main.java.com.djrapitops.plan.data.analysis; -import main.java.com.djrapitops.plan.data.time.WorldTimes; import main.java.com.djrapitops.plan.ui.html.graphs.WorldPieCreator; -import main.java.com.djrapitops.plan.utilities.FormatUtils; import java.util.HashMap; import java.util.Map; @@ -31,8 +29,8 @@ public class WorldPart extends RawData { @Override protected void analyse() { - WorldTimes t = new WorldTimes(worldTimes); - addValue("worldTotal", FormatUtils.formatTimeAmount(t.getTotal())); +// TODO WorldTimes t = new WorldTimes(worldTimes); +// addValue("worldTotal", FormatUtils.formatTimeAmount(t.getTotal())); addValue("worldSeries", WorldPieCreator.createSeriesData(worldTimes)); } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/handling/PlaytimeHandling.java b/Plan/src/main/java/com/djrapitops/plan/data/handling/PlaytimeHandling.java index aa94f9ca0..f8c481fd4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/handling/PlaytimeHandling.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/handling/PlaytimeHandling.java @@ -27,6 +27,6 @@ public class PlaytimeHandling { } WorldTimes worldTimes = data.getWorldTimes(); - worldTimes.changeState(worldName, playTime); +// TODO worldTimes.changeState(worldName, playTime); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java b/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java index 938ac8800..bdeb603eb 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java @@ -1,6 +1,10 @@ package main.java.com.djrapitops.plan.data.time; +import main.java.com.djrapitops.plan.utilities.MiscUtils; + +import java.util.HashMap; import java.util.Map; +import java.util.Optional; /** * TimeKeeper class that tracks the time spent in each World based on Playtime. @@ -8,37 +12,85 @@ import java.util.Map; * @author Rsl1122 * @since 3.6.0 */ -// TODO Change WorldTimes to use GMTimes per world. -public class WorldTimes extends TimeKeeper { +public class WorldTimes { - public WorldTimes(Map times, String lastState, long lastStateChange) { - super(times, lastState, lastStateChange); + private final Map worldTimes; + private String currentWorld; + private String currentGamemode; + + /** + * Creates a new Empty WorldTimes object. + * + * @param startingWorld World to start the calculations at. + * @param startingGM GameMode to start the calculations at. + */ + public WorldTimes(String startingWorld, String startingGM) { + worldTimes = new HashMap<>(); + currentWorld = startingWorld; + currentGamemode = startingGM; + addWorld(startingWorld, startingGM, MiscUtils.getTime()); } - public WorldTimes(String lastState, long lastStateChange) { - super(lastState, lastStateChange); + public WorldTimes(Map times, String lastWorld, String lastGM) { + worldTimes = times; + currentWorld = lastWorld; + currentGamemode = lastGM; } - public WorldTimes(String lastState) { - super(lastState); + private void addWorld(String worldName, String gameMode, long changeTime) { + worldTimes.put(worldName, new GMTimes(gameMode, changeTime)); } - public WorldTimes(Map times, long lastStateChange) { - super(times, null, lastStateChange); + public void updateState(String worldName, String gameMode, long changeTime) { + GMTimes currentGMTimes = worldTimes.get(currentWorld); + + GMTimes newGMTimes = worldTimes.get(worldName); + if (newGMTimes == null) { + addWorld(worldName, gameMode, currentGMTimes.getLastStateChange()); + } + currentGMTimes.changeState(gameMode, changeTime); + for (GMTimes gmTimes : worldTimes.values()) { + gmTimes.setLastStateChange(changeTime); + } + worldTimes.put(currentWorld, currentGMTimes); + currentWorld = worldName; + currentGamemode = gameMode; } - public WorldTimes(Map times) { - super(times); + public Optional getWorldPlaytime(String world) { + GMTimes gmTimes = worldTimes.get(world); + if (gmTimes != null) { + return Optional.of(gmTimes.getTotal()); + } + return Optional.empty(); } - public WorldTimes() { - super(); + public Optional getGMTimes(String world) { + GMTimes gmTimes = worldTimes.get(world); + if (gmTimes != null) { + return Optional.of(gmTimes); + } + return Optional.empty(); } @Override - public String getState() { - String state = super.getState(); - return state != null ? state : "Unknown"; + public String toString() { + StringBuilder b = new StringBuilder("WorldTimes (Current: " + currentWorld + "){\n"); + for (Map.Entry entry : worldTimes.entrySet()) { + b.append("World '").append(entry.getKey()).append("':\n"); + GMTimes value = entry.getValue(); + b.append(" Total: ").append(value.getTotal()).append("\n"); + b.append(" ").append(value.toString()).append("\n"); + } + b.append("}"); + return b.toString(); } + public String getCurrentWorld() { + return currentWorld; + } + + public String getCurrentGamemode() { + return currentGamemode; + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java index b15186a8b..f8ae773b8 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java @@ -374,10 +374,10 @@ public abstract class SQLDB extends Database { data.getGmTimes().setTimes(gmTimes); Map worldTimes = worldTimesTable.getWorldTimes(userId); WorldTimes worldT = data.getWorldTimes(); - worldT.setTimes(worldTimes); - if (worldT.getLastStateChange() == 0) { - worldT.setLastStateChange(data.getPlayTime()); - } +// worldT.setTimes(worldTimes); //TODO +// if (worldT.getLastStateChange() == 0) { +// worldT.setLastStateChange(data.getPlayTime()); +// } List sessions = sessionsTable.getSessionData(userId); data.addSessions(sessions); @@ -448,10 +448,10 @@ public abstract class SQLDB extends Database { uData.setPlayerKills(playerKills.get(id)); uData.getGmTimes().setTimes(gmTimes.get(id)); WorldTimes worldT = uData.getWorldTimes(); - worldT.setTimes(worldTimes.get(id)); - if (worldT.getLastStateChange() == 0) { - worldT.setLastStateChange(uData.getPlayTime()); - } +// worldT.setTimes(worldTimes.get(id)); //TODO +// if (worldT.getLastStateChange() == 0) { +// worldT.setLastStateChange(uData.getPlayTime()); +// } } Benchmark.stop("Database", "Get UserData for " + uuidsCol.size()); @@ -493,13 +493,13 @@ public abstract class SQLDB extends Database { Map> worldTimes = new HashMap<>(); // Put in data set - List worldNames = data.stream() - .map(UserData::getWorldTimes) - .map(WorldTimes::getTimes) - .map(Map::keySet) - .flatMap(Collection::stream) - .distinct() - .collect(Collectors.toList()); +// List worldNames = data.stream() //TODO +// .map(UserData::getWorldTimes) +// .map(WorldTimes::getTimes) +// .map(Map::keySet) +// .flatMap(Collection::stream) +// .distinct() +// .collect(Collectors.toList()); for (Map.Entry entrySet : userDatas.entrySet()) { UUID uuid = entrySet.getKey(); @@ -518,7 +518,7 @@ public abstract class SQLDB extends Database { kills.put(id, new ArrayList<>(uData.getPlayerKills())); sessions.put(id, new ArrayList<>(uData.getSessions())); gmTimes.put(id, new HashMap<>(uData.getGmTimes().getTimes())); - worldTimes.put(id, new HashMap<>(uData.getWorldTimes().getTimes())); +// TODO worldTimes.put(id, new HashMap<>(uData.getWorldTimes().getTimes())); } // Save @@ -527,7 +527,7 @@ public abstract class SQLDB extends Database { killsTable.savePlayerKills(kills, uuids); sessionsTable.saveSessionData(sessions); gmTimesTable.saveGMTimes(gmTimes); - worldTable.saveWorlds(worldNames); +// TODO worldTable.saveWorlds(worldNames); worldTimesTable.saveWorldTimes(worldTimes); commit(); userDatas.values().stream() @@ -562,8 +562,8 @@ public abstract class SQLDB extends Database { ipsTable.saveIPList(userId, new HashSet<>(data.getIps())); killsTable.savePlayerKills(userId, new ArrayList<>(data.getPlayerKills())); gmTimesTable.saveGMTimes(userId, data.getGmTimes().getTimes()); - worldTable.saveWorlds(new HashSet<>(data.getWorldTimes().getTimes().keySet())); - worldTimesTable.saveWorldTimes(userId, data.getWorldTimes().getTimes()); +// TODO worldTable.saveWorlds(new HashSet<>(data.getWorldTimes().getTimes().keySet())); +// worldTimesTable.saveWorldTimes(userId, data.getWorldTimes().getTimes()); data.stopAccessing(); commit(); Benchmark.stop("Database", "Save Single UserData"); diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java index 593de0209..2ec7059cb 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java @@ -370,13 +370,13 @@ public class UsersTable extends Table { data.setDeaths(set.getInt(columnDeaths)); data.setMobKills(set.getInt(columnMobKills)); WorldTimes worldTimes = data.getWorldTimes(); - worldTimes.setLastStateChange(set.getLong(columnLastWorldSwapTime)); - String lastWorld = set.getString(columnLastWorld); - if (!"Unknown".equals(lastWorld)) { - worldTimes.setState(lastWorld); - } else { - worldTimes.setLastStateChange(playTime); - } +// TODO worldTimes.setLastStateChange(set.getLong(columnLastWorldSwapTime)); +// String lastWorld = set.getString(columnLastWorld); +// if (!"Unknown".equals(lastWorld)) { +// worldTimes.setState(lastWorld); +// } else { +// worldTimes.setLastStateChange(playTime); +// } return data; } } finally { @@ -415,13 +415,13 @@ public class UsersTable extends Table { data.setDeaths(set.getInt(columnDeaths)); data.setMobKills(set.getInt(columnMobKills)); WorldTimes worldTimes = data.getWorldTimes(); - worldTimes.setLastStateChange(set.getLong(columnLastWorldSwapTime)); - String lastWorld = set.getString(columnLastWorld); - if (!"Unknown".equals(lastWorld)) { - worldTimes.setState(lastWorld); - } else { - worldTimes.setLastStateChange(playTime); - } +// TODO worldTimes.setLastStateChange(set.getLong(columnLastWorldSwapTime)); +// String lastWorld = set.getString(columnLastWorld); +// if (!"Unknown".equals(lastWorld)) { +// worldTimes.setState(lastWorld); +// } else { +// worldTimes.setLastStateChange(playTime); +// } datas.add(data); } } finally { @@ -454,13 +454,13 @@ public class UsersTable extends Table { data.setDeaths(set.getInt(columnDeaths)); data.setMobKills(set.getInt(columnMobKills)); WorldTimes worldTimes = data.getWorldTimes(); - worldTimes.setLastStateChange(set.getLong(columnLastWorldSwapTime)); - String lastWorld = set.getString(columnLastWorld); - if (!"Unknown".equals(lastWorld)) { - worldTimes.setState(lastWorld); - } else { - worldTimes.setLastStateChange(playTime); - } +// TODO worldTimes.setLastStateChange(set.getLong(columnLastWorldSwapTime)); +// String lastWorld = set.getString(columnLastWorld); +// if (!"Unknown".equals(lastWorld)) { +// worldTimes.setState(lastWorld); +// } else { +// worldTimes.setLastStateChange(playTime); +// } } } finally { close(set); @@ -497,13 +497,13 @@ public class UsersTable extends Table { gmTimes.setState(set.getString(columnLastGM)); gmTimes.setLastStateChange(set.getLong(columnLastGMSwapTime)); WorldTimes worldTimes = uData.getWorldTimes(); - worldTimes.setLastStateChange(set.getLong(columnLastWorldSwapTime)); - String lastWorld = set.getString(columnLastWorld); - if (!"Unknown".equals(lastWorld)) { - worldTimes.setState(lastWorld); - } else { - worldTimes.setLastStateChange(playTime); - } +// TODO worldTimes.setLastStateChange(set.getLong(columnLastWorldSwapTime)); +// String lastWorld = set.getString(columnLastWorld); +// if (!"Unknown".equals(lastWorld)) { +// worldTimes.setState(lastWorld); +// } else { +// worldTimes.setLastStateChange(playTime); +// } } } finally { close(set); @@ -540,8 +540,8 @@ public class UsersTable extends Table { statement.setString(12, data.getName()); statement.setLong(13, data.getRegistered()); WorldTimes worldTimes = data.getWorldTimes(); - statement.setString(14, worldTimes.getState()); - statement.setLong(15, worldTimes.getLastStateChange()); +// TODO statement.setString(14, worldTimes.getState()); +// statement.setLong(15, worldTimes.getLastStateChange()); statement.setString(16, uuid.toString()); update = statement.executeUpdate(); } @@ -565,8 +565,8 @@ public class UsersTable extends Table { statement.setString(13, data.getName()); statement.setLong(14, data.getRegistered()); WorldTimes worldTimes = data.getWorldTimes(); - statement.setString(15, worldTimes.getState()); - statement.setLong(16, worldTimes.getLastStateChange()); +// TODO statement.setString(15, worldTimes.getState()); +// statement.setLong(16, worldTimes.getLastStateChange()); statement.execute(); } } finally { @@ -701,8 +701,8 @@ public class UsersTable extends Table { statement.setLong(14, uData.getRegistered()); WorldTimes worldTimes = uData.getWorldTimes(); - statement.setString(15, worldTimes.getState()); - statement.setLong(16, worldTimes.getLastStateChange()); +// TODO statement.setString(15, worldTimes.getState()); +// statement.setLong(16, worldTimes.getLastStateChange()); statement.addBatch(); } @@ -759,8 +759,8 @@ public class UsersTable extends Table { statement.setString(12, uData.getName()); statement.setLong(13, uData.getRegistered()); WorldTimes worldTimes = uData.getWorldTimes(); - statement.setString(14, worldTimes.getState()); - statement.setLong(15, worldTimes.getLastStateChange()); +// TODO statement.setString(14, worldTimes.getState()); +// statement.setLong(15, worldTimes.getLastStateChange()); statement.setString(16, uuid.toString()); statement.addBatch(); uData.stopAccessing(); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java index 26da280a9..e12fe5aeb 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java @@ -7,7 +7,6 @@ import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.time.WorldTimes; import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator; -import main.java.com.djrapitops.plan.ui.html.graphs.WorldPieCreator; import java.io.Serializable; import java.util.*; @@ -79,8 +78,8 @@ public class PlaceholderUtils { Set sessions = new HashSet<>(data.getSessions()); replaceMap.put("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessions)); WorldTimes worldTimes = data.getWorldTimes(); - replaceMap.put("worldSeries", WorldPieCreator.createSeriesData(worldTimes.getTimes())); - replaceMap.put("worldTotal", FormatUtils.formatTimeAmount(worldTimes.getTotal())); +// TODO replaceMap.put("worldSeries", WorldPieCreator.createSeriesData(worldTimes.getTimes())); +// replaceMap.put("worldTotal", FormatUtils.formatTimeAmount(worldTimes.getTotal())); //TODO Plugin Tab content Web API //TODO Player Plugin tab code. diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java index 4be514ada..ba89405bc 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java @@ -277,10 +277,10 @@ public class Analysis { } } } - Map worldTimes = uData.getWorldTimes().getTimes(); - for (Map.Entry world : worldTimes.entrySet()) { - worldPart.addToWorld(world.getKey(), world.getValue()); - } +// TODO Map worldTimes = uData.getWorldTimes().getTimes(); +// for (Map.Entry world : worldTimes.entrySet()) { +// worldPart.addToWorld(world.getKey(), world.getValue()); +// } final long playTime = uData.getPlayTime(); playtime.addToPlaytime(playTime); diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/LoginInfoTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/LoginInfoTest.java index 59b2dab5d..0f6d72859 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/LoginInfoTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/LoginInfoTest.java @@ -63,6 +63,6 @@ public class LoginInfoTest { String geo = data.getGeolocation(); assertTrue("Wrong location " + geo, geo.equals("United States")); assertEquals("CREATIVE", data.getGmTimes().getState()); - assertEquals("World", data.getWorldTimes().getState()); +// TODO assertEquals("World", data.getWorldTimes().getState()); } } diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/LogoutInfoTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/LogoutInfoTest.java index 2ff92c731..955f82aa0 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/LogoutInfoTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/LogoutInfoTest.java @@ -49,7 +49,7 @@ public class LogoutInfoTest { assertTrue("Playtime wrong", data.getPlayTime() == 10L); assertTrue("Banned wrong", data.isBanned()); assertEquals("CREATIVE", data.getGmTimes().getState()); - assertEquals("World", data.getWorldTimes().getState()); +// TODO assertEquals("World", data.getWorldTimes().getState()); assertEquals(1, data.getSessions().size()); } } diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/ReloadInfoTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/ReloadInfoTest.java index 329e38ded..04bfc7108 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/ReloadInfoTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/handling/info/ReloadInfoTest.java @@ -63,6 +63,6 @@ public class ReloadInfoTest { assertEquals(nick, data.getLastNick()); assertEquals("United States", data.getGeolocation()); assertEquals("CREATIVE", data.getGmTimes().getState()); - assertEquals("World", data.getWorldTimes().getState()); +// TODO assertEquals("World", data.getWorldTimes().getState()); } } diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java new file mode 100644 index 000000000..52cff0aff --- /dev/null +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java @@ -0,0 +1,180 @@ +package test.java.main.java.com.djrapitops.plan.data.time; + +import main.java.com.djrapitops.plan.data.time.GMTimes; +import main.java.com.djrapitops.plan.data.time.WorldTimes; +import org.junit.Before; +import org.junit.Test; +import test.java.utils.RandomData; + +import java.util.*; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +/** + * @author Rsl1122 + */ +public class WorldTimesTest { + + private long time; + private WorldTimes test; + private final String worldOne = "ONE"; + private final String worldTwo = "TWO"; + + private final String[] gms = GMTimes.getGMKeyArray(); + + @Before + public void setUp() throws Exception { + test = new WorldTimes(worldOne, gms[0]); + Optional gmTimes = test.getGMTimes(worldOne); + gmTimes.ifPresent(gmTimes1 -> + time = gmTimes1.getLastStateChange() + ); + System.out.println(test); + } + + @Test + public void testWorldChange() { + long changeTime = time + 1000L; + test.updateState(worldTwo, gms[0], changeTime); + System.out.println(test); + assertEquals(1000L, (long) test.getWorldPlaytime(worldOne).get()); + assertEquals(1000L, test.getGMTimes(worldOne).get().getTime(gms[0])); + } + + @Test + public void testGMChange() { + long changeTime = time + 1000L; + test.updateState(worldOne, gms[0], changeTime); + System.out.println(test); + assertEquals(1000L, (long) test.getWorldPlaytime(worldOne).get()); + assertEquals(1000L, test.getGMTimes(worldOne).get().getTime(gms[0])); + } + + @Test + public void testBothTwiceChange() { + long changeTime = time + 1000L; + long changeTime2 = changeTime + 1000L; + test.updateState(worldTwo, gms[2], changeTime); + System.out.println(test); + assertEquals(1000L, (long) test.getWorldPlaytime(worldOne).get()); + assertEquals(1000L, test.getGMTimes(worldOne).get().getTime(gms[0])); + test.updateState(worldOne, gms[1], changeTime2); + System.out.println(test); + assertEquals(1000L, (long) test.getWorldPlaytime(worldOne).get()); + assertEquals(1000L, test.getGMTimes(worldOne).get().getTime(gms[0])); + assertEquals(1000L, test.getGMTimes(worldTwo).get().getTime(gms[2])); + } + + @Test + public void testLotOfChanges() { + long amount = 1000L; + String[] worlds = new String[]{worldOne, worldTwo}; + + Map> testedW = new HashMap<>(); + testedW.put(worldOne, new ArrayList<>()); + testedW.put(worldTwo, new ArrayList<>()); + + String lastWorld = worldOne; + String lastGM = gms[0]; + for (int i = 1; i <= 50; i++) { + int wRndm = RandomData.randomInt(0, worlds.length); + int gmRndm = RandomData.randomInt(0, gms.length); + + String world = worlds[wRndm]; + String gm = gms[gmRndm]; + testedW.get(lastWorld).add(lastGM); + lastGM = gm; + lastWorld = world; + + long time = i * amount + this.time; + + printCurrentState(testedW, i, gm, world); + test.updateState(world, gm, time); + } + + long worldOneCount = testedW.get(worldOne).size(); + long worldTwoCount = testedW.get(worldTwo).size(); + long worldTimeOne = worldOneCount * amount; + long worldTimeTwo = worldTwoCount * amount; + + long time1 = 0L; + long time2 = 0L; + Optional worldPlaytime = test.getWorldPlaytime(worldOne); + if (worldPlaytime.isPresent()) { + time1 += worldPlaytime.get(); + } + Optional worldPlaytime2 = test.getWorldPlaytime(worldTwo); + if (worldPlaytime2.isPresent()) { + time2 += worldPlaytime2.get(); + } + System.out.println(test); + + // Tests World time calculation. + assertEquals(amount * 50, time1 + time2); + assertEquals(worldTimeOne, time1); + assertEquals(worldTimeTwo, time2); + + // Tests GM Time calculation + for (Map.Entry> entry : testedW.entrySet()) { + String world = entry.getKey(); + List gmList = entry.getValue(); + for (int i = 0; i < gms.length; i++) { + final String lookFor = gms[i]; + long gmCount = gmList.stream().filter(gmNum -> gmNum.equals(lookFor)).count(); + + Optional gmTimes = test.getGMTimes(world); + + if (gmTimes.isPresent()) { + long expected = gmCount * amount; + long actual = gmTimes.get().getTime(lookFor); + assertEquals(world + ": " + lookFor + ": " + expected + " Actual: " + actual, expected, actual); + } else { + fail("GM Times can't not be present."); + } + } + } + } + + private void printCurrentState(Map> testedW, int i, String gm, String world) { + int sizeW1 = testedW.get(worldOne).size(); + int sizeW2 = testedW.get(worldTwo).size(); + + StringBuilder b = new StringBuilder(""+i); + while (b.length() < 3) { + b.append(" "); + } + b.append(world).append(":").append(gm).append(": "); + while (b.length() < 18) { + b.append(" "); + } + b.append(sizeW1); + + while (b.length() < 21) { + b.append(" "); + } + + for (final String lookFor : gms) { + long count = testedW.get(worldOne).stream().filter(gmNum -> gmNum.equals(lookFor)).count(); + b.append(" ").append(count); + } + while (b.length() < 29) { + b.append(" "); + } + b.append(" |"); + for (final String lookFor : gms) { + long count = testedW.get(worldTwo).stream().filter(gmNum -> gmNum.equals(lookFor)).count(); + b.append(" ").append(count); + } + while (b.length() < 40) { + b.append(" "); + } + b.append(" ") + .append(sizeW2) + .append(" = ") + .append(sizeW1 + sizeW2); + System.out.println(b.toString()); + } + + // TODO Test where SessionData is ended, check if worldTimes & session length add up. +} \ No newline at end of file diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/database/DatabaseTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/database/DatabaseTest.java index 623308492..0798e9cf9 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/database/DatabaseTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/database/DatabaseTest.java @@ -224,9 +224,9 @@ public class DatabaseTest { gmTimes.setState("SURVIVAL"); gmTimes.setLastStateChange(10L); WorldTimes worldTimes = data.getWorldTimes(); - worldTimes.setTime("World", 20L); - worldTimes.setState("World"); - worldTimes.setLastStateChange(10L); +// TODO worldTimes.setTime("World", 20L); +// worldTimes.setState("World"); +// worldTimes.setLastStateChange(10L); db.saveUserData(data); data.addNickname("TestUpdateForSave"); db.saveUserData(data); @@ -261,7 +261,7 @@ public class DatabaseTest { db.init(); UserData data = MockUtils.mockUser(); data.getGmTimes().setAllGMTimes(5L, 10L, 15L, 20L); - data.getWorldTimes().setTime("World", 20L); +// TODO data.getWorldTimes().setTime("World", 20L); data.addIpAddress(InetAddress.getByName("185.64.113.61")); data.addSession(new SessionData(1286349L, 2342978L)); data.addNickname("TestNick"); From 6bd14e03fec6f240c007ae18b727102de737c44e Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Mon, 21 Aug 2017 18:29:40 +0300 Subject: [PATCH 2/6] Replace the big test with a more specific test. --- .../plan/data/time/WorldTimesTest.java | 118 +++++++++--------- 1 file changed, 60 insertions(+), 58 deletions(-) diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java index 52cff0aff..2332b7677 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java @@ -9,7 +9,7 @@ import test.java.utils.RandomData; import java.util.*; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import static org.junit.Assert.assertTrue; /** * @author Rsl1122 @@ -67,7 +67,7 @@ public class WorldTimesTest { } @Test - public void testLotOfChanges() { + public void testLotOfChangesWorldTime() { long amount = 1000L; String[] worlds = new String[]{worldOne, worldTwo}; @@ -89,7 +89,6 @@ public class WorldTimesTest { long time = i * amount + this.time; - printCurrentState(testedW, i, gm, world); test.updateState(world, gm, time); } @@ -114,66 +113,69 @@ public class WorldTimesTest { assertEquals(amount * 50, time1 + time2); assertEquals(worldTimeOne, time1); assertEquals(worldTimeTwo, time2); - - // Tests GM Time calculation - for (Map.Entry> entry : testedW.entrySet()) { - String world = entry.getKey(); - List gmList = entry.getValue(); - for (int i = 0; i < gms.length; i++) { - final String lookFor = gms[i]; - long gmCount = gmList.stream().filter(gmNum -> gmNum.equals(lookFor)).count(); - - Optional gmTimes = test.getGMTimes(world); - - if (gmTimes.isPresent()) { - long expected = gmCount * amount; - long actual = gmTimes.get().getTime(lookFor); - assertEquals(world + ": " + lookFor + ": " + expected + " Actual: " + actual, expected, actual); - } else { - fail("GM Times can't not be present."); - } - } - } } - private void printCurrentState(Map> testedW, int i, String gm, String world) { - int sizeW1 = testedW.get(worldOne).size(); - int sizeW2 = testedW.get(worldTwo).size(); + @Test + public void testGMTrackingSingleWorld() { + long changeTime = time + 1000L; + long changeTime2 = changeTime + 1000L; + GMTimes gmTimes = test.getGMTimes(worldOne).get(); + test.updateState(worldOne, "CREATIVE", changeTime); + assertTrue(1000L == gmTimes.getTime("SURVIVAL")); + assertTrue(0L == gmTimes.getTime("CREATIVE")); + test.updateState(worldOne, "ADVENTURE", changeTime2); + assertTrue(1000L == gmTimes.getTime("SURVIVAL")); + assertTrue(1000L == gmTimes.getTime("CREATIVE")); + assertTrue(0L == gmTimes.getTime("ADVENTURE")); + } - StringBuilder b = new StringBuilder(""+i); - while (b.length() < 3) { - b.append(" "); - } - b.append(world).append(":").append(gm).append(": "); - while (b.length() < 18) { - b.append(" "); - } - b.append(sizeW1); + @Test + public void testGMTrackingTwoWorlds() { + long changeTime = time + 1000L; + long changeTime2 = time + 2000L; + GMTimes worldOneGMTimes = test.getGMTimes(worldOne).get(); + test.updateState(worldOne, "CREATIVE", changeTime); + test.updateState(worldOne, "ADVENTURE", changeTime2); + // Same state as above. - while (b.length() < 21) { - b.append(" "); - } + test.updateState(worldTwo, "SURVIVAL", time + 3000L); + assertTrue(1000L == worldOneGMTimes.getTime("SURVIVAL")); + assertTrue(1000L == worldOneGMTimes.getTime("CREATIVE")); + assertTrue(1000L == worldOneGMTimes.getTime("ADVENTURE")); - for (final String lookFor : gms) { - long count = testedW.get(worldOne).stream().filter(gmNum -> gmNum.equals(lookFor)).count(); - b.append(" ").append(count); - } - while (b.length() < 29) { - b.append(" "); - } - b.append(" |"); - for (final String lookFor : gms) { - long count = testedW.get(worldTwo).stream().filter(gmNum -> gmNum.equals(lookFor)).count(); - b.append(" ").append(count); - } - while (b.length() < 40) { - b.append(" "); - } - b.append(" ") - .append(sizeW2) - .append(" = ") - .append(sizeW1 + sizeW2); - System.out.println(b.toString()); + GMTimes worldTwoGMTimes = test.getGMTimes(worldTwo).get(); + + assertTrue(0L == worldTwoGMTimes.getTime("SURVIVAL")); + assertTrue(0L == worldTwoGMTimes.getTime("CREATIVE")); + assertTrue(0L == worldTwoGMTimes.getTime("ADVENTURE")); + + test.updateState(worldTwo, "CREATIVE", time + 4000L); + + assertTrue(1000L == worldOneGMTimes.getTime("SURVIVAL")); + assertTrue(1000L == worldOneGMTimes.getTime("CREATIVE")); + assertTrue(1000L == worldOneGMTimes.getTime("ADVENTURE")); + + assertTrue(1000L == worldTwoGMTimes.getTime("SURVIVAL")); + assertTrue(0L == worldTwoGMTimes.getTime("CREATIVE")); + + test.updateState(worldTwo, "CREATIVE", time + 5000L); + assertTrue(1000L == worldTwoGMTimes.getTime("SURVIVAL")); + assertTrue(1000L == worldTwoGMTimes.getTime("CREATIVE")); + + // No change should occur. + test.updateState(worldOne, "ADVENTURE", time + 5000L); + assertTrue(1000L == worldOneGMTimes.getTime("ADVENTURE")); + assertTrue(1000L == worldTwoGMTimes.getTime("CREATIVE")); + test.updateState(worldTwo, "CREATIVE", time + 5000L); + System.out.println(test); + test.updateState(worldOne, "ADVENTURE", time + 6000L); + System.out.println(test); + assertTrue(1000L == worldOneGMTimes.getTime("ADVENTURE")); + assertTrue(2000L == worldTwoGMTimes.getTime("CREATIVE")); + + test.updateState(worldTwo, "ADVENTURE", time + 7000L); + assertTrue(2000L == worldTwoGMTimes.getTime("CREATIVE")); + assertTrue(2000L == worldOneGMTimes.getTime("ADVENTURE")); } // TODO Test where SessionData is ended, check if worldTimes & session length add up. From 75ccecce02a2bfc85f7fb5234fc834ea4a75fbe2 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Mon, 21 Aug 2017 18:55:07 +0300 Subject: [PATCH 3/6] Fixed WorldTimes, now works as intended. --- .../djrapitops/plan/data/time/WorldTimes.java | 14 +++-- .../plan/data/time/WorldTimesTest.java | 55 ++++++++++--------- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java b/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java index bdeb603eb..ff9dc61a8 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java @@ -43,16 +43,18 @@ public class WorldTimes { public void updateState(String worldName, String gameMode, long changeTime) { GMTimes currentGMTimes = worldTimes.get(currentWorld); - - GMTimes newGMTimes = worldTimes.get(worldName); - if (newGMTimes == null) { - addWorld(worldName, gameMode, currentGMTimes.getLastStateChange()); + if (worldName.equals(currentWorld)) { + currentGMTimes.changeState(gameMode, changeTime); + } else { + GMTimes newGMTimes = worldTimes.get(worldName); + if (newGMTimes == null) { + addWorld(worldName, gameMode, currentGMTimes.getLastStateChange()); + } + currentGMTimes.changeState(currentGamemode, changeTime); } - currentGMTimes.changeState(gameMode, changeTime); for (GMTimes gmTimes : worldTimes.values()) { gmTimes.setLastStateChange(changeTime); } - worldTimes.put(currentWorld, currentGMTimes); currentWorld = worldName; currentGamemode = gameMode; } diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java index 2332b7677..d3a7667bd 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java @@ -9,7 +9,6 @@ import test.java.utils.RandomData; import java.util.*; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; /** * @author Rsl1122 @@ -121,12 +120,12 @@ public class WorldTimesTest { long changeTime2 = changeTime + 1000L; GMTimes gmTimes = test.getGMTimes(worldOne).get(); test.updateState(worldOne, "CREATIVE", changeTime); - assertTrue(1000L == gmTimes.getTime("SURVIVAL")); - assertTrue(0L == gmTimes.getTime("CREATIVE")); + assertEquals(1000L, gmTimes.getTime("SURVIVAL")); + assertEquals(0L, gmTimes.getTime("CREATIVE")); test.updateState(worldOne, "ADVENTURE", changeTime2); - assertTrue(1000L == gmTimes.getTime("SURVIVAL")); - assertTrue(1000L == gmTimes.getTime("CREATIVE")); - assertTrue(0L == gmTimes.getTime("ADVENTURE")); + assertEquals(1000L, gmTimes.getTime("SURVIVAL")); + assertEquals(1000L, gmTimes.getTime("CREATIVE")); + assertEquals(0L, gmTimes.getTime("ADVENTURE")); } @Test @@ -136,46 +135,48 @@ public class WorldTimesTest { GMTimes worldOneGMTimes = test.getGMTimes(worldOne).get(); test.updateState(worldOne, "CREATIVE", changeTime); test.updateState(worldOne, "ADVENTURE", changeTime2); - // Same state as above. + assertEquals(1000L, worldOneGMTimes.getTime("SURVIVAL")); + assertEquals(1000L, worldOneGMTimes.getTime("CREATIVE")); + assertEquals(0L, worldOneGMTimes.getTime("ADVENTURE")); test.updateState(worldTwo, "SURVIVAL", time + 3000L); - assertTrue(1000L == worldOneGMTimes.getTime("SURVIVAL")); - assertTrue(1000L == worldOneGMTimes.getTime("CREATIVE")); - assertTrue(1000L == worldOneGMTimes.getTime("ADVENTURE")); - GMTimes worldTwoGMTimes = test.getGMTimes(worldTwo).get(); + assertEquals(1000L, worldOneGMTimes.getTime("SURVIVAL")); + assertEquals(1000L, worldOneGMTimes.getTime("CREATIVE")); + assertEquals(1000L, worldOneGMTimes.getTime("ADVENTURE")); - assertTrue(0L == worldTwoGMTimes.getTime("SURVIVAL")); - assertTrue(0L == worldTwoGMTimes.getTime("CREATIVE")); - assertTrue(0L == worldTwoGMTimes.getTime("ADVENTURE")); + assertEquals(0L, worldTwoGMTimes.getTime("SURVIVAL")); + assertEquals(0L, worldTwoGMTimes.getTime("CREATIVE")); + assertEquals(0L, worldTwoGMTimes.getTime("ADVENTURE")); test.updateState(worldTwo, "CREATIVE", time + 4000L); - assertTrue(1000L == worldOneGMTimes.getTime("SURVIVAL")); - assertTrue(1000L == worldOneGMTimes.getTime("CREATIVE")); - assertTrue(1000L == worldOneGMTimes.getTime("ADVENTURE")); + assertEquals(1000L, worldOneGMTimes.getTime("SURVIVAL")); + assertEquals(1000L, worldOneGMTimes.getTime("CREATIVE")); + assertEquals(1000L, worldOneGMTimes.getTime("ADVENTURE")); - assertTrue(1000L == worldTwoGMTimes.getTime("SURVIVAL")); - assertTrue(0L == worldTwoGMTimes.getTime("CREATIVE")); + assertEquals(1000L, worldTwoGMTimes.getTime("SURVIVAL")); + assertEquals(0L, worldTwoGMTimes.getTime("CREATIVE")); test.updateState(worldTwo, "CREATIVE", time + 5000L); - assertTrue(1000L == worldTwoGMTimes.getTime("SURVIVAL")); - assertTrue(1000L == worldTwoGMTimes.getTime("CREATIVE")); + assertEquals(1000L, worldTwoGMTimes.getTime("SURVIVAL")); + assertEquals(1000L, worldTwoGMTimes.getTime("CREATIVE")); // No change should occur. test.updateState(worldOne, "ADVENTURE", time + 5000L); - assertTrue(1000L == worldOneGMTimes.getTime("ADVENTURE")); - assertTrue(1000L == worldTwoGMTimes.getTime("CREATIVE")); + System.out.println(test); + assertEquals(1000L, worldOneGMTimes.getTime("ADVENTURE")); + assertEquals(1000L, worldTwoGMTimes.getTime("CREATIVE")); test.updateState(worldTwo, "CREATIVE", time + 5000L); System.out.println(test); test.updateState(worldOne, "ADVENTURE", time + 6000L); System.out.println(test); - assertTrue(1000L == worldOneGMTimes.getTime("ADVENTURE")); - assertTrue(2000L == worldTwoGMTimes.getTime("CREATIVE")); + assertEquals(1000L, worldOneGMTimes.getTime("ADVENTURE")); + assertEquals(2000L, worldTwoGMTimes.getTime("CREATIVE")); test.updateState(worldTwo, "ADVENTURE", time + 7000L); - assertTrue(2000L == worldTwoGMTimes.getTime("CREATIVE")); - assertTrue(2000L == worldOneGMTimes.getTime("ADVENTURE")); + assertEquals(2000L, worldTwoGMTimes.getTime("CREATIVE")); + assertEquals(2000L, worldOneGMTimes.getTime("ADVENTURE")); } // TODO Test where SessionData is ended, check if worldTimes & session length add up. From b6dcafb18bdfccb5f86519faf9a946b1f9b7c1aa Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Mon, 21 Aug 2017 19:11:28 +0300 Subject: [PATCH 4/6] Removed need for WorldTimes Optionals. --- .../djrapitops/plan/data/time/WorldTimes.java | 41 ++++++++++++----- .../plan/data/time/WorldTimesTest.java | 46 ++++++++----------- 2 files changed, 48 insertions(+), 39 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java b/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java index ff9dc61a8..63e028ee1 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java @@ -4,10 +4,9 @@ import main.java.com.djrapitops.plan.utilities.MiscUtils; import java.util.HashMap; import java.util.Map; -import java.util.Optional; /** - * TimeKeeper class that tracks the time spent in each World based on Playtime. + * Class that tracks the time spent in each World based on GMTimes. * * @author Rsl1122 * @since 3.6.0 @@ -59,20 +58,42 @@ public class WorldTimes { currentGamemode = gameMode; } - public Optional getWorldPlaytime(String world) { + /** + * Used to get a total playtime of a world. + * + * @param world World name being checked. + * @return total milliseconds spent in a world. + */ + public long getWorldPlaytime(String world) { GMTimes gmTimes = worldTimes.get(world); if (gmTimes != null) { - return Optional.of(gmTimes.getTotal()); + return gmTimes.getTotal(); } - return Optional.empty(); + return 0; } - public Optional getGMTimes(String world) { + public long getTotal() { + return worldTimes.values().stream() + .mapToLong(GMTimes::getTotal) + .sum(); + } + + /** + * Used for Quick access to time of each GameMode. + *

+ * Should not be used for changing state, + * because if player has not played in the world, + * an empty GMTimes is given, with 0 as playtime + * + * @param world World name being checked. + * @return GMTimes object with play times of each GameMode. + */ + public GMTimes getGMTimes(String world) { GMTimes gmTimes = worldTimes.get(world); if (gmTimes != null) { - return Optional.of(gmTimes); + return gmTimes; } - return Optional.empty(); + return new GMTimes(); } @Override @@ -91,8 +112,4 @@ public class WorldTimes { public String getCurrentWorld() { return currentWorld; } - - public String getCurrentGamemode() { - return currentGamemode; - } } diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java index d3a7667bd..a4a91f572 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java @@ -6,7 +6,10 @@ import org.junit.Before; import org.junit.Test; import test.java.utils.RandomData; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import static org.junit.Assert.assertEquals; @@ -25,10 +28,7 @@ public class WorldTimesTest { @Before public void setUp() throws Exception { test = new WorldTimes(worldOne, gms[0]); - Optional gmTimes = test.getGMTimes(worldOne); - gmTimes.ifPresent(gmTimes1 -> - time = gmTimes1.getLastStateChange() - ); + time = test.getGMTimes(worldOne).getLastStateChange(); System.out.println(test); } @@ -37,8 +37,8 @@ public class WorldTimesTest { long changeTime = time + 1000L; test.updateState(worldTwo, gms[0], changeTime); System.out.println(test); - assertEquals(1000L, (long) test.getWorldPlaytime(worldOne).get()); - assertEquals(1000L, test.getGMTimes(worldOne).get().getTime(gms[0])); + assertEquals(1000L, (long) test.getWorldPlaytime(worldOne)); + assertEquals(1000L, test.getGMTimes(worldOne).getTime(gms[0])); } @Test @@ -46,8 +46,8 @@ public class WorldTimesTest { long changeTime = time + 1000L; test.updateState(worldOne, gms[0], changeTime); System.out.println(test); - assertEquals(1000L, (long) test.getWorldPlaytime(worldOne).get()); - assertEquals(1000L, test.getGMTimes(worldOne).get().getTime(gms[0])); + assertEquals(1000L, (long) test.getWorldPlaytime(worldOne)); + assertEquals(1000L, test.getGMTimes(worldOne).getTime(gms[0])); } @Test @@ -56,13 +56,13 @@ public class WorldTimesTest { long changeTime2 = changeTime + 1000L; test.updateState(worldTwo, gms[2], changeTime); System.out.println(test); - assertEquals(1000L, (long) test.getWorldPlaytime(worldOne).get()); - assertEquals(1000L, test.getGMTimes(worldOne).get().getTime(gms[0])); + assertEquals(1000L, (long) test.getWorldPlaytime(worldOne)); + assertEquals(1000L, test.getGMTimes(worldOne).getTime(gms[0])); test.updateState(worldOne, gms[1], changeTime2); System.out.println(test); - assertEquals(1000L, (long) test.getWorldPlaytime(worldOne).get()); - assertEquals(1000L, test.getGMTimes(worldOne).get().getTime(gms[0])); - assertEquals(1000L, test.getGMTimes(worldTwo).get().getTime(gms[2])); + assertEquals(1000L, (long) test.getWorldPlaytime(worldOne)); + assertEquals(1000L, test.getGMTimes(worldOne).getTime(gms[0])); + assertEquals(1000L, test.getGMTimes(worldTwo).getTime(gms[2])); } @Test @@ -96,16 +96,8 @@ public class WorldTimesTest { long worldTimeOne = worldOneCount * amount; long worldTimeTwo = worldTwoCount * amount; - long time1 = 0L; - long time2 = 0L; - Optional worldPlaytime = test.getWorldPlaytime(worldOne); - if (worldPlaytime.isPresent()) { - time1 += worldPlaytime.get(); - } - Optional worldPlaytime2 = test.getWorldPlaytime(worldTwo); - if (worldPlaytime2.isPresent()) { - time2 += worldPlaytime2.get(); - } + long time1 = test.getWorldPlaytime(worldOne); + long time2 = test.getWorldPlaytime(worldTwo); System.out.println(test); // Tests World time calculation. @@ -118,7 +110,7 @@ public class WorldTimesTest { public void testGMTrackingSingleWorld() { long changeTime = time + 1000L; long changeTime2 = changeTime + 1000L; - GMTimes gmTimes = test.getGMTimes(worldOne).get(); + GMTimes gmTimes = test.getGMTimes(worldOne); test.updateState(worldOne, "CREATIVE", changeTime); assertEquals(1000L, gmTimes.getTime("SURVIVAL")); assertEquals(0L, gmTimes.getTime("CREATIVE")); @@ -132,7 +124,7 @@ public class WorldTimesTest { public void testGMTrackingTwoWorlds() { long changeTime = time + 1000L; long changeTime2 = time + 2000L; - GMTimes worldOneGMTimes = test.getGMTimes(worldOne).get(); + GMTimes worldOneGMTimes = test.getGMTimes(worldOne); test.updateState(worldOne, "CREATIVE", changeTime); test.updateState(worldOne, "ADVENTURE", changeTime2); assertEquals(1000L, worldOneGMTimes.getTime("SURVIVAL")); @@ -140,7 +132,7 @@ public class WorldTimesTest { assertEquals(0L, worldOneGMTimes.getTime("ADVENTURE")); test.updateState(worldTwo, "SURVIVAL", time + 3000L); - GMTimes worldTwoGMTimes = test.getGMTimes(worldTwo).get(); + GMTimes worldTwoGMTimes = test.getGMTimes(worldTwo); assertEquals(1000L, worldOneGMTimes.getTime("SURVIVAL")); assertEquals(1000L, worldOneGMTimes.getTime("CREATIVE")); assertEquals(1000L, worldOneGMTimes.getTime("ADVENTURE")); From 7fd9960c8ac4216754dd4268f896b74910f75a6d Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Mon, 21 Aug 2017 19:19:17 +0300 Subject: [PATCH 5/6] Removed need for WorldTimes Optionals. --- .../djrapitops/plan/data/time/WorldTimes.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java b/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java index 63e028ee1..5c2482e32 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/time/WorldTimes.java @@ -9,7 +9,7 @@ import java.util.Map; * Class that tracks the time spent in each World based on GMTimes. * * @author Rsl1122 - * @since 3.6.0 + * @since 4.0.0 */ public class WorldTimes { @@ -30,16 +30,26 @@ public class WorldTimes { addWorld(startingWorld, startingGM, MiscUtils.getTime()); } - public WorldTimes(Map times, String lastWorld, String lastGM) { + /** + * Re-Creates an existing WorldTimes object for viewing. + * + * @param times Map of each World's GMTimes object. + */ + public WorldTimes(Map times) { worldTimes = times; - currentWorld = lastWorld; - currentGamemode = lastGM; } private void addWorld(String worldName, String gameMode, long changeTime) { worldTimes.put(worldName, new GMTimes(gameMode, changeTime)); } + /** + * Updates the time status to match the new state. + * + * @param worldName World name of the world swapped to. + * @param gameMode GameMode name of the gm swapped to. + * @param changeTime Epoch ms the change occurred. + */ public void updateState(String worldName, String gameMode, long changeTime) { GMTimes currentGMTimes = worldTimes.get(currentWorld); if (worldName.equals(currentWorld)) { @@ -109,7 +119,12 @@ public class WorldTimes { return b.toString(); } - public String getCurrentWorld() { - return currentWorld; + /** + * Used to get the Map for saving. + * + * @return Current time map. + */ + public Map getWorldTimes() { + return worldTimes; } } From 67df66cc317fbd366359b828da77baa60f7f5bc2 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Mon, 21 Aug 2017 19:19:33 +0300 Subject: [PATCH 6/6] Removed GMTimesTable --- .../djrapitops/plan/data/time/GMTimes.java | 13 +- .../djrapitops/plan/database/Database.java | 14 - .../plan/database/databases/SQLDB.java | 14 +- .../plan/database/tables/GMTimesTable.java | 354 ------------------ 4 files changed, 8 insertions(+), 387 deletions(-) delete mode 100644 Plan/src/main/java/com/djrapitops/plan/database/tables/GMTimesTable.java diff --git a/Plan/src/main/java/com/djrapitops/plan/data/time/GMTimes.java b/Plan/src/main/java/com/djrapitops/plan/data/time/GMTimes.java index ab37aadad..76d393887 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/time/GMTimes.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/time/GMTimes.java @@ -12,11 +12,10 @@ import java.util.Map; */ public class GMTimes extends TimeKeeper { - // TODO Make private once GMTimesTable is removed - public static final String SURVIVAL = "SURVIVAL"; - public static final String CREATIVE = "CREATIVE"; - public static final String ADVENTURE = "ADVENTURE"; - public static final String SPECTATOR = "SPECTATOR"; + private static final String SURVIVAL = "SURVIVAL"; + private static final String CREATIVE = "CREATIVE"; + private static final String ADVENTURE = "ADVENTURE"; + private static final String SPECTATOR = "SPECTATOR"; public GMTimes(Map times, String lastState, long lastStateChange) { super(times, lastState, lastStateChange); @@ -67,8 +66,8 @@ public class GMTimes extends TimeKeeper { } } - public void resetTimes(long playtime) { - resetState(SURVIVAL, playtime); + public void resetTimes(long time) { + resetState(SURVIVAL, time); resetState(CREATIVE); resetState(ADVENTURE); resetState(SPECTATOR); diff --git a/Plan/src/main/java/com/djrapitops/plan/database/Database.java b/Plan/src/main/java/com/djrapitops/plan/database/Database.java index 8cb41e91b..628dd2eff 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/Database.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/Database.java @@ -28,11 +28,6 @@ public abstract class Database { */ protected UsersTable usersTable; - /** - * Table representing plan_gamemodetimes in the database. - */ - protected GMTimesTable gmTimesTable; - /** * Table representing plan_kills in the database. */ @@ -294,15 +289,6 @@ public abstract class Database { return sessionsTable; } - /** - * Used to get the gm times table. - * - * @return Table representing plan_gamemodetimes - */ - public GMTimesTable getGmTimesTable() { - return gmTimesTable; - } - /** * Used to get the kills table. * diff --git a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java index f8ae773b8..7b5947d75 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java @@ -45,7 +45,6 @@ public abstract class SQLDB extends Database { usingMySQL = getName().equals("MySQL"); usersTable = new UsersTable(this, usingMySQL); - gmTimesTable = new GMTimesTable(this, usingMySQL); sessionsTable = new SessionsTable(this, usingMySQL); killsTable = new KillsTable(this, usingMySQL); ipsTable = new IPsTable(this, usingMySQL); @@ -226,7 +225,7 @@ public abstract class SQLDB extends Database { */ public Table[] getAllTables() { return new Table[]{ - usersTable, gmTimesTable, ipsTable, + usersTable, ipsTable, nicknamesTable, sessionsTable, killsTable, commandUseTable, tpsTable, worldTable, worldTimesTable, securityTable}; @@ -237,7 +236,7 @@ public abstract class SQLDB extends Database { */ public Table[] getAllTablesInRemoveOrder() { return new Table[]{ - gmTimesTable, ipsTable, + ipsTable, nicknamesTable, sessionsTable, killsTable, worldTimesTable, worldTable, usersTable, commandUseTable, tpsTable}; @@ -320,7 +319,6 @@ public abstract class SQLDB extends Database { boolean success = userId != -1 && ipsTable.removeUserIPs(userId) && nicknamesTable.removeUserNicknames(userId) - && gmTimesTable.removeUserGMTimes(userId) && sessionsTable.removeUserSessions(userId) && killsTable.removeUserKillsAndVictims(userId) && worldTimesTable.removeUserWorldTimes(userId) @@ -369,9 +367,6 @@ public abstract class SQLDB extends Database { List ips = ipsTable.getIPAddresses(userId); data.addIpAddresses(ips); - - Map gmTimes = gmTimesTable.getGMTimes(userId); - data.getGmTimes().setTimes(gmTimes); Map worldTimes = worldTimesTable.getWorldTimes(userId); WorldTimes worldT = data.getWorldTimes(); // worldT.setTimes(worldTimes); //TODO @@ -419,7 +414,6 @@ public abstract class SQLDB extends Database { Map> ipList = ipsTable.getIPList(ids); Map> playerKills = killsTable.getPlayerKills(ids, idUuidRel); Map> sessionData = sessionsTable.getSessionData(ids); - Map> gmTimes = gmTimesTable.getGMTimes(ids); Map> worldTimes = worldTimesTable.getWorldTimes(ids); Log.debug("Database", @@ -431,7 +425,6 @@ public abstract class SQLDB extends Database { " IPs: " + ipList.size(), " Kills: " + playerKills.size(), " Sessions: " + sessionData.size(), - " GM Times: " + gmTimes.size(), " World Times: " + worldTimes.size() ); @@ -446,7 +439,6 @@ public abstract class SQLDB extends Database { } uData.addSessions(sessionData.get(id)); uData.setPlayerKills(playerKills.get(id)); - uData.getGmTimes().setTimes(gmTimes.get(id)); WorldTimes worldT = uData.getWorldTimes(); // worldT.setTimes(worldTimes.get(id)); //TODO // if (worldT.getLastStateChange() == 0) { @@ -526,7 +518,6 @@ public abstract class SQLDB extends Database { ipsTable.saveIPList(ips); killsTable.savePlayerKills(kills, uuids); sessionsTable.saveSessionData(sessions); - gmTimesTable.saveGMTimes(gmTimes); // TODO worldTable.saveWorlds(worldNames); worldTimesTable.saveWorldTimes(worldTimes); commit(); @@ -561,7 +552,6 @@ public abstract class SQLDB extends Database { nicknamesTable.saveNickList(userId, new HashSet<>(data.getNicknames()), data.getLastNick()); ipsTable.saveIPList(userId, new HashSet<>(data.getIps())); killsTable.savePlayerKills(userId, new ArrayList<>(data.getPlayerKills())); - gmTimesTable.saveGMTimes(userId, data.getGmTimes().getTimes()); // TODO worldTable.saveWorlds(new HashSet<>(data.getWorldTimes().getTimes().keySet())); // worldTimesTable.saveWorldTimes(userId, data.getWorldTimes().getTimes()); data.stopAccessing(); diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/GMTimesTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/GMTimesTable.java deleted file mode 100644 index 54bb28ba0..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/GMTimesTable.java +++ /dev/null @@ -1,354 +0,0 @@ -package main.java.com.djrapitops.plan.database.tables; - -import com.djrapitops.plugin.utilities.Verify; -import main.java.com.djrapitops.plan.Log; -import main.java.com.djrapitops.plan.data.time.GMTimes; -import main.java.com.djrapitops.plan.database.Container; -import main.java.com.djrapitops.plan.database.DBUtils; -import main.java.com.djrapitops.plan.database.databases.SQLDB; -import main.java.com.djrapitops.plan.database.sql.Sql; -import main.java.com.djrapitops.plan.database.sql.TableSqlParser; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; - -/** - * @author Rsl1122 - * @deprecated GM Times moved to WorldTable - */ -@Deprecated -public class GMTimesTable extends UserIDTable { - - private final String columnSurvivalTime; - private final String columnCreativeTime; - private final String columnAdventureTime; - private final String columnSpectatorTime; - - - /** - * @param db - * @param usingMySQL - */ - public GMTimesTable(SQLDB db, boolean usingMySQL) { - super("plan_gamemodetimes", db, usingMySQL); - columnUserID = "user_id"; - columnSurvivalTime = "SURVIVAL"; - columnCreativeTime = "CREATIVE"; - columnAdventureTime = "ADVENTURE"; - columnSpectatorTime = "SPECTATOR"; - } - - /** - * @return - */ - @Override - public boolean createTable() { - UsersTable usersTable = db.getUsersTable(); - try { - execute(TableSqlParser.createTable(tableName) - .column(columnUserID, Sql.INT).notNull() - .column(columnSurvivalTime, Sql.LONG).notNull() - .column(columnCreativeTime, Sql.LONG).notNull() - .column(columnAdventureTime, Sql.LONG).notNull() - .column(columnSpectatorTime, Sql.LONG).notNull() - .foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID()) - .toString() - ); - return true; - } catch (SQLException ex) { - Log.toLog(this.getClass().getName(), ex); - return false; - } - } - - /** - * @param userId - * @return - */ - public boolean removeUserGMTimes(int userId) { - return super.removeDataOf(userId); - } - - /** - * @param userId - * @return - * @throws SQLException - */ - public Map getGMTimes(int userId) throws SQLException { - PreparedStatement statement = null; - ResultSet set = null; - try { - statement = prepareStatement("SELECT * FROM " + tableName + " WHERE (" + columnUserID + "=?)"); - statement.setInt(1, userId); - set = statement.executeQuery(); - HashMap times = new HashMap<>(); - - while (set.next()) { - times.put(GMTimes.SURVIVAL, set.getLong(columnSurvivalTime)); - times.put(GMTimes.CREATIVE, set.getLong(columnCreativeTime)); - times.put(GMTimes.ADVENTURE, set.getLong(columnAdventureTime)); - times.put(GMTimes.SPECTATOR, set.getLong(columnSpectatorTime)); - } - - return times; - } finally { - close(set); - close(statement); - } - } - - public Map> getGMTimes(Collection userIds) throws SQLException { - PreparedStatement statement = null; - ResultSet set = null; - Map> times = new HashMap<>(); - try { - statement = prepareStatement("SELECT * FROM " + tableName); - set = statement.executeQuery(); - - while (set.next()) { - Map gmTimes = new HashMap<>(); - int id = set.getInt(columnUserID); - if (!userIds.contains(id)) { - continue; - } - - gmTimes.put(GMTimes.SURVIVAL, set.getLong(columnSurvivalTime)); - gmTimes.put(GMTimes.CREATIVE, set.getLong(columnCreativeTime)); - gmTimes.put(GMTimes.ADVENTURE, set.getLong(columnAdventureTime)); - gmTimes.put(GMTimes.SPECTATOR, set.getLong(columnSpectatorTime)); - times.put(id, gmTimes); - } - - return times; - } finally { - close(set); - close(statement); - } - } - - /** - * @param userId - * @param gamemodeTimes - * @throws SQLException - */ - public void saveGMTimes(int userId, Map gamemodeTimes) throws SQLException { - if (Verify.isEmpty(gamemodeTimes)) { - return; - } - - PreparedStatement statement = null; - String[] gms = GMTimes.getGMKeyArray(); - - int update; - try { - statement = prepareStatement( - "UPDATE " + tableName + " SET " - + columnSurvivalTime + "=?, " - + columnCreativeTime + "=?, " - + columnAdventureTime + "=?, " - + columnSpectatorTime + "=? " - + " WHERE (" + columnUserID + "=?)"); - statement.setInt(5, userId); - - for (int i = 0; i < gms.length; i++) { - Long time = gamemodeTimes.get(gms[i]); - statement.setLong(i + 1, time != null ? time : 0); - } - - update = statement.executeUpdate(); - } finally { - close(statement); - } - - if (update == 0) { - addNewGMTimesRow(userId, gamemodeTimes); - } - } - - private Set getSavedIDs() throws SQLException { - PreparedStatement statement = null; - ResultSet set = null; - try { - statement = prepareStatement("SELECT " + columnUserID + " FROM " + tableName); - set = statement.executeQuery(); - Set ids = new HashSet<>(); - while (set.next()) { - ids.add(set.getInt(columnUserID)); - } - return ids; - } finally { - close(set); - close(statement); - } - } - - public void saveGMTimes(Map> gamemodeTimes) throws SQLException { - if (Verify.isEmpty(gamemodeTimes)) { - return; - } - - Set savedIDs = getSavedIDs(); - - Map gmTimes = new HashMap<>(); - - for (Map.Entry> entrySet : gamemodeTimes.entrySet()) { - int userID = entrySet.getKey(); - - if (!savedIDs.contains(userID)) { - continue; - } - - Map gmTimesMap = entrySet.getValue(); - gmTimes.put(userID, new GMTimes(gmTimesMap)); - } - - List>> batches = DBUtils.splitIntoBatchesWithID(gmTimes); - - batches.forEach(batch -> { - try { - saveGMTimesBatch(batch); - } catch (SQLException e) { - Log.toLog("GMTimesTable.saveGMTimes", e); - } - }); - - gamemodeTimes.keySet().removeAll(savedIDs); - - addNewGMTimesRows(gamemodeTimes); - } - - private void saveGMTimesBatch(List> batch) throws SQLException { - if (batch.isEmpty()) { - return; - } - - String[] gms = GMTimes.getGMKeyArray(); - Set savedIDs = getSavedIDs(); - - PreparedStatement statement = null; - try { - statement = prepareStatement( - "UPDATE " + tableName + " SET " - + columnSurvivalTime + "=?, " - + columnCreativeTime + "=?, " - + columnAdventureTime + "=?, " - + columnSpectatorTime + "=? " - + " WHERE (" + columnUserID + "=?)"); - - for (Container data : batch) { - int id = data.getId(); - - if (!savedIDs.contains(id)) { - continue; - } - - statement.setInt(5, id); - - for (int i = 0; i < gms.length; i++) { - Map times = data.getObject().getTimes(); - Long time = times.get(gms[i]); - - statement.setLong(i + 1, time != null ? time : 0); - } - - statement.addBatch(); - } - - statement.executeBatch(); - } finally { - close(statement); - } - } - - private void addNewGMTimesRows(Map> gamemodeTimes) { - if (Verify.isEmpty(gamemodeTimes)) { - return; - } - - Map gmTimes = new HashMap<>(); - - for (Map.Entry> entrySet : gamemodeTimes.entrySet()) { - int userID = entrySet.getKey(); - Map gmTimesMap = entrySet.getValue(); - gmTimes.put(userID, new GMTimes(gmTimesMap)); - } - - List>> batches = DBUtils.splitIntoBatchesWithID(gmTimes); - - batches.forEach(batch -> { - try { - addNewGMTimesBatch(batch); - } catch (SQLException e) { - Log.toLog("GMTimesTable.addNewGMTimesRows", e); - } - }); - } - - private void addNewGMTimesBatch(List> batch) throws SQLException { - if (batch.isEmpty()) { - return; - } - - String[] gms = GMTimes.getGMKeyArray(); - - PreparedStatement statement = null; - try { - statement = prepareStatement( - "INSERT INTO " + tableName + " (" - + columnUserID + ", " - + columnSurvivalTime + ", " - + columnCreativeTime + ", " - + columnAdventureTime + ", " - + columnSpectatorTime - + ") VALUES (?, ?, ?, ?, ?)"); - - for (Container data : batch) { - statement.setInt(1, data.getId()); - - for (int i = 0; i < gms.length; i++) { - Map times = data.getObject().getTimes(); - Long time = times.get(gms[i]); - - statement.setLong(i + 2, time != null ? time : 0); - } - - statement.addBatch(); - } - - statement.executeBatch(); - } finally { - close(statement); - } - } - - private void addNewGMTimesRow(int userId, Map gamemodeTimes) throws SQLException { - if (Verify.isEmpty(gamemodeTimes)) { - return; - } - - PreparedStatement statement = null; - String[] gms = GMTimes.getGMKeyArray(); - try { - statement = prepareStatement("INSERT INTO " + tableName + " (" - + columnUserID + ", " - + columnSurvivalTime + ", " - + columnCreativeTime + ", " - + columnAdventureTime + ", " - + columnSpectatorTime - + ") VALUES (?, ?, ?, ?, ?)"); - - statement.setInt(1, userId); - - for (int i = 0; i < gms.length; i++) { - Long time = gamemodeTimes.get(gms[i]); - statement.setLong(i + 2, time != null ? time : 0); - } - - statement.execute(); - } finally { - close(statement); - } - } -}