From b104e8ca031a69cedb20e2f127532294ed2e3b43 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Sun, 16 Sep 2018 17:23:21 +0300 Subject: [PATCH] Made Graph Factories that use Dagger to initialize new Graphs. Inject Graphs to access these factories. Moved WorldTimes Alias playtime calculations to WorldAliasSettings Renamed some Graphs to be shorter and unambiguous: AbstractLineGraph -> LineGraph AbstractPieChart -> Pie AbstractPieChartWithDrilldown -> PieWithDrilldown AbstractStackGraph -> StackGraph Abstracted away some details and made some graph classes package private Fixed tests for Line graphs, removed Stack graph test for now --- .../plan/data/container/Session.java | 4 +- .../store/containers/AnalysisContainer.java | 63 +++++---- .../store/containers/NetworkContainer.java | 28 ++-- .../djrapitops/plan/data/time/WorldTimes.java | 29 ----- .../system/settings/WorldAliasSettings.java | 57 +++++++++ .../plan/utilities/html/HtmlStructure.java | 6 +- .../plan/utilities/html/graphs/Graphs.java | 68 ++++++++++ .../html/graphs/bar/BarGraphFactory.java | 23 ++++ .../html/graphs/bar/GeolocationBarGraph.java | 4 +- .../html/graphs/calendar/CalendarFactory.java | 46 +++++++ .../html/graphs/calendar/PlayerCalendar.java | 6 +- .../html/graphs/calendar/ServerCalendar.java | 33 +++-- .../html/graphs/line/AbstractLineGraph.java | 93 -------------- .../utilities/html/graphs/line/CPUGraph.java | 13 +- .../html/graphs/line/ChunkGraph.java | 13 +- .../html/graphs/line/EntityGraph.java | 13 +- .../utilities/html/graphs/line/LineGraph.java | 62 +++++++++ .../html/graphs/line/LineGraphFactory.java | 60 +++++++++ .../html/graphs/line/OnlineActivityGraph.java | 24 ---- .../utilities/html/graphs/line/PingGraph.java | 19 +-- .../html/graphs/line/PlayersOnlineGraph.java | 17 +++ .../utilities/html/graphs/line/RamGraph.java | 13 +- .../utilities/html/graphs/line/TPSGraph.java | 13 +- .../html/graphs/pie/ActivityPie.java | 11 +- .../pie/{AbstractPieChart.java => Pie.java} | 19 +-- .../html/graphs/pie/PieGraphFactory.java | 54 ++++++++ ...thDrilldown.java => PieWithDrilldown.java} | 7 +- .../html/graphs/pie/ServerPreferencePie.java | 4 +- .../utilities/html/graphs/pie/WorldPie.java | 62 +++------ .../PunchCard.java} | 22 ++-- .../graphs/special/SpecialGraphFactory.java | 31 +++++ .../html/graphs/{ => special}/WorldMap.java | 11 +- .../{ => stack}/ActivityStackGraph.java | 26 ++-- ...bstractStackGraph.java => StackGraph.java} | 4 +- .../html/graphs/stack/StackGraphFactory.java | 39 ++++++ .../utilities/html/pages/InspectPage.java | 20 +-- .../utilities/html/pages/PageFactory.java | 7 +- .../html/structure/ServerAccordion.java | 9 +- .../html/structure/SessionAccordion.java | 13 +- .../plan/utilities/html/graphs/GraphTest.java | 121 ------------------ .../html/graphs/line/LineGraphTest.java | 80 ++++++++++++ 41 files changed, 722 insertions(+), 525 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/Graphs.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/bar/BarGraphFactory.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/CalendarFactory.java delete mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/AbstractLineGraph.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraph.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraphFactory.java delete mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/OnlineActivityGraph.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PlayersOnlineGraph.java rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/{AbstractPieChart.java => Pie.java} (62%) create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieGraphFactory.java rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/{AbstractPieChartWithDrilldown.java => PieWithDrilldown.java} (67%) rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{PunchCardGraph.java => special/PunchCard.java} (87%) create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/special/SpecialGraphFactory.java rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => special}/WorldMap.java (96%) rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => stack}/ActivityStackGraph.java (55%) rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/{AbstractStackGraph.java => StackGraph.java} (93%) create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/StackGraphFactory.java delete mode 100644 Plan/src/test/java/com/djrapitops/plan/utilities/html/graphs/GraphTest.java create mode 100644 Plan/src/test/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraphTest.java diff --git a/Plan/src/main/java/com/djrapitops/plan/data/container/Session.java b/Plan/src/main/java/com/djrapitops/plan/data/container/Session.java index eb06dfd9e..2f0e62658 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/container/Session.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/container/Session.java @@ -2,11 +2,11 @@ package com.djrapitops.plan.data.container; import com.djrapitops.plan.data.store.containers.DataContainer; import com.djrapitops.plan.data.store.keys.SessionKeys; -import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.data.store.objects.DateHolder; import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.settings.WorldAliasSettings; +import com.djrapitops.plan.utilities.formatting.Formatters; import java.util.*; @@ -230,7 +230,7 @@ public class Session extends DataContainer implements DateHolder { return "Current: " + aliases.get(worldTimes.getCurrentWorld()); } - Map playtimePerAlias = worldTimes.getPlaytimePerAlias(); + Map playtimePerAlias = new HashMap<>(); //TODO Call WorldAliasSettings#getPlaytimePerAlias(WorldTimes) long total = worldTimes.getTotal(); long longest = 0; diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/AnalysisContainer.java b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/AnalysisContainer.java index 7e9ed2033..a87c8adce 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/AnalysisContainer.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/AnalysisContainer.java @@ -18,14 +18,11 @@ import com.djrapitops.plan.system.settings.theme.ThemeVal; import com.djrapitops.plan.utilities.MiscUtils; import com.djrapitops.plan.utilities.analysis.ServerBanDataReader; import com.djrapitops.plan.utilities.formatting.Formatters; -import com.djrapitops.plan.utilities.html.graphs.ActivityStackGraph; -import com.djrapitops.plan.utilities.html.graphs.PunchCardGraph; -import com.djrapitops.plan.utilities.html.graphs.WorldMap; -import com.djrapitops.plan.utilities.html.graphs.bar.GeolocationBarGraph; -import com.djrapitops.plan.utilities.html.graphs.calendar.ServerCalendar; -import com.djrapitops.plan.utilities.html.graphs.line.*; -import com.djrapitops.plan.utilities.html.graphs.pie.ActivityPie; +import com.djrapitops.plan.utilities.html.graphs.Graphs; +import com.djrapitops.plan.utilities.html.graphs.bar.BarGraph; +import com.djrapitops.plan.utilities.html.graphs.line.PingGraph; import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie; +import com.djrapitops.plan.utilities.html.graphs.stack.StackGraph; import com.djrapitops.plan.utilities.html.structure.AnalysisPluginsTabContentCreator; import com.djrapitops.plan.utilities.html.structure.RecentLoginList; import com.djrapitops.plan.utilities.html.structure.SessionAccordion; @@ -50,11 +47,13 @@ public class AnalysisContainer extends DataContainer { private final ServerContainer serverContainer; + // TODO private String version; private PlanConfig config; private Theme theme; private Database database; private ServerProperties serverProperties; + private Graphs graphs; private static final Key> serverNames = new Key<>(new Type>() {}, "SERVER_NAMES"); @@ -206,13 +205,11 @@ public class AnalysisContainer extends DataContainer { putSupplier(AnalysisKeys.UNIQUE_PLAYERS_PER_DAY, () -> getUnsafe(AnalysisKeys.SESSIONS_MUTATOR).uniqueJoinsPerDay()); putSupplier(AnalysisKeys.NEW_PLAYERS_PER_DAY, () -> getUnsafe(AnalysisKeys.PLAYERS_MUTATOR).newPerDay()); - putSupplier(AnalysisKeys.UNIQUE_PLAYERS_SERIES, () -> new AbstractLineGraph( - MutatorFunctions.toPoints(getUnsafe(AnalysisKeys.UNIQUE_PLAYERS_PER_DAY)) - ).toHighChartsSeries() + putSupplier(AnalysisKeys.UNIQUE_PLAYERS_SERIES, () -> graphs.line().lineGraph( + MutatorFunctions.toPoints(getUnsafe(AnalysisKeys.UNIQUE_PLAYERS_PER_DAY))).toHighChartsSeries() ); - putSupplier(AnalysisKeys.NEW_PLAYERS_SERIES, () -> new AbstractLineGraph( - MutatorFunctions.toPoints(getUnsafe(AnalysisKeys.NEW_PLAYERS_PER_DAY)) - ).toHighChartsSeries() + putSupplier(AnalysisKeys.NEW_PLAYERS_SERIES, () -> graphs.line().lineGraph( + MutatorFunctions.toPoints(getUnsafe(AnalysisKeys.NEW_PLAYERS_PER_DAY))).toHighChartsSeries() ); Key retentionDay = new Key<>(Integer.class, "RETENTION_DAY"); @@ -316,7 +313,7 @@ public class AnalysisContainer extends DataContainer { .filterSessionsBetween(getUnsafe(AnalysisKeys.ANALYSIS_TIME_MONTH_AGO), getUnsafe(AnalysisKeys.ANALYSIS_TIME)) ); - putSupplier(AnalysisKeys.PUNCHCARD_SERIES, () -> new PunchCardGraph(getUnsafe(sessionsMonth).all()).toHighChartsSeries()); + putSupplier(AnalysisKeys.PUNCHCARD_SERIES, () -> graphs.special().punchCard(getUnsafe(sessionsMonth).all()).toHighChartsSeries()); putSupplier(AnalysisKeys.AVG_PLAYERS, () -> getUnsafe(AnalysisKeys.SESSIONS_MUTATOR).toAverageUniqueJoinsPerDay()); putSupplier(AnalysisKeys.AVG_PLAYERS_DAY, () -> getUnsafe(sessionsDay).toAverageUniqueJoinsPerDay()); putSupplier(AnalysisKeys.AVG_PLAYERS_WEEK, () -> getUnsafe(sessionsWeek).toAverageUniqueJoinsPerDay()); @@ -325,46 +322,48 @@ public class AnalysisContainer extends DataContainer { private void addGraphSuppliers() { Key worldPie = new Key<>(WorldPie.class, "WORLD_PIE"); - putSupplier(worldPie, () -> new WorldPie(serverContainer.getValue(ServerKeys.WORLD_TIMES).orElse(new WorldTimes(new HashMap<>())))); + putSupplier(worldPie, () -> graphs.pie().worldPie( + serverContainer.getValue(ServerKeys.WORLD_TIMES).orElse(new WorldTimes(new HashMap<>())) + )); putSupplier(AnalysisKeys.WORLD_PIE_SERIES, () -> getUnsafe(worldPie).toHighChartsSeries()); putSupplier(AnalysisKeys.GM_PIE_SERIES, () -> getUnsafe(worldPie).toHighChartsDrilldown()); putSupplier(AnalysisKeys.PLAYERS_ONLINE_SERIES, () -> - new OnlineActivityGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries() + graphs.line().playersOnlineGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries() ); - putSupplier(AnalysisKeys.TPS_SERIES, () -> new TPSGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries()); - putSupplier(AnalysisKeys.CPU_SERIES, () -> new CPUGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries()); - putSupplier(AnalysisKeys.RAM_SERIES, () -> new RamGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries()); - putSupplier(AnalysisKeys.ENTITY_SERIES, () -> new EntityGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries()); - putSupplier(AnalysisKeys.CHUNK_SERIES, () -> new ChunkGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries()); + putSupplier(AnalysisKeys.TPS_SERIES, () -> graphs.line().tpsGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries()); + putSupplier(AnalysisKeys.CPU_SERIES, () -> graphs.line().cpuGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries()); + putSupplier(AnalysisKeys.RAM_SERIES, () -> graphs.line().ramGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries()); + putSupplier(AnalysisKeys.ENTITY_SERIES, () -> graphs.line().entityGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries()); + putSupplier(AnalysisKeys.CHUNK_SERIES, () -> graphs.line().cpuGraph(getUnsafe(AnalysisKeys.TPS_MUTATOR)).toHighChartsSeries()); putSupplier(AnalysisKeys.WORLD_MAP_SERIES, () -> - new WorldMap(getUnsafe(AnalysisKeys.PLAYERS_MUTATOR).getGeolocations()).toHighChartsSeries() + graphs.special().worldMap(getUnsafe(AnalysisKeys.PLAYERS_MUTATOR)).toHighChartsSeries() ); - Key geolocationBarChart = new Key<>(GeolocationBarGraph.class, "GEOLOCATION_BAR_CHART"); - putSupplier(geolocationBarChart, () -> new GeolocationBarGraph(getUnsafe(AnalysisKeys.PLAYERS_MUTATOR))); + Key geolocationBarChart = new Key<>(BarGraph.class, "GEOLOCATION_BAR_GRAPH"); + putSupplier(geolocationBarChart, () -> graphs.bar().geolocationBarGraph(getUnsafe(AnalysisKeys.PLAYERS_MUTATOR))); putSupplier(AnalysisKeys.COUNTRY_CATEGORIES, () -> getUnsafe(geolocationBarChart).toHighChartsCategories()); putSupplier(AnalysisKeys.COUNTRY_SERIES, () -> getUnsafe(geolocationBarChart).toHighChartsSeries()); Key pingGraph = new Key<>(PingGraph.class, "PING_GRAPH"); - putSupplier(pingGraph, () -> new PingGraph( - PingMutator.forContainer(serverContainer).mutateToByMinutePings().all() - )); + putSupplier(pingGraph, () -> + graphs.line().pingGraph(PingMutator.forContainer(serverContainer).mutateToByMinutePings().all()) + ); putSupplier(AnalysisKeys.AVG_PING_SERIES, () -> getUnsafe(pingGraph).toAvgSeries()); putSupplier(AnalysisKeys.MAX_PING_SERIES, () -> getUnsafe(pingGraph).toMaxSeries()); putSupplier(AnalysisKeys.MIN_PING_SERIES, () -> getUnsafe(pingGraph).toMinSeries()); - putSupplier(AnalysisKeys.CALENDAR_SERIES, () -> new ServerCalendar( + putSupplier(AnalysisKeys.CALENDAR_SERIES, () -> graphs.calendar().serverCalendar( getUnsafe(AnalysisKeys.PLAYERS_MUTATOR), getUnsafe(AnalysisKeys.UNIQUE_PLAYERS_PER_DAY), getUnsafe(AnalysisKeys.NEW_PLAYERS_PER_DAY) ).toCalendarSeries()); putSupplier(AnalysisKeys.ACTIVITY_DATA, () -> getUnsafe(AnalysisKeys.PLAYERS_MUTATOR).toActivityDataMap(getUnsafe(AnalysisKeys.ANALYSIS_TIME))); - Key activityStackGraph = new Key<>(ActivityStackGraph.class, "ACTIVITY_STACK_GRAPH"); - putSupplier(activityStackGraph, () -> new ActivityStackGraph(getUnsafe(AnalysisKeys.ACTIVITY_DATA))); + Key activityStackGraph = new Key<>(StackGraph.class, "ACTIVITY_STACK_GRAPH"); + putSupplier(activityStackGraph, () -> graphs.stack().activityStackGraph(getUnsafe(AnalysisKeys.ACTIVITY_DATA))); putSupplier(AnalysisKeys.ACTIVITY_STACK_CATEGORIES, () -> getUnsafe(activityStackGraph).toHighChartsLabels()); putSupplier(AnalysisKeys.ACTIVITY_STACK_SERIES, () -> getUnsafe(activityStackGraph).toHighChartsSeries()); - putSupplier(AnalysisKeys.ACTIVITY_PIE_SERIES, () -> - new ActivityPie(getUnsafe(AnalysisKeys.ACTIVITY_DATA).get(getUnsafe(AnalysisKeys.ANALYSIS_TIME))).toHighChartsSeries() + putSupplier(AnalysisKeys.ACTIVITY_PIE_SERIES, () -> graphs.pie().activityPie( + getUnsafe(AnalysisKeys.ACTIVITY_DATA).get(getUnsafe(AnalysisKeys.ANALYSIS_TIME))).toHighChartsSeries() ); putSupplier(AnalysisKeys.PLAYERS_REGULAR, () -> { Map> activityNow = getUnsafe(AnalysisKeys.ACTIVITY_DATA) diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java index e0240da37..5aea289d2 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java @@ -6,7 +6,6 @@ import com.djrapitops.plan.data.store.keys.NetworkKeys; import com.djrapitops.plan.data.store.keys.ServerKeys; import com.djrapitops.plan.data.store.mutators.PlayersMutator; import com.djrapitops.plan.data.store.mutators.TPSMutator; -import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.data.store.mutators.health.NetworkHealthInformation; import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.info.server.ServerInfo; @@ -14,11 +13,10 @@ import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.theme.Theme; import com.djrapitops.plan.system.settings.theme.ThemeVal; import com.djrapitops.plan.utilities.MiscUtils; -import com.djrapitops.plan.utilities.html.graphs.ActivityStackGraph; -import com.djrapitops.plan.utilities.html.graphs.WorldMap; -import com.djrapitops.plan.utilities.html.graphs.bar.GeolocationBarGraph; -import com.djrapitops.plan.utilities.html.graphs.line.OnlineActivityGraph; -import com.djrapitops.plan.utilities.html.graphs.pie.ActivityPie; +import com.djrapitops.plan.utilities.formatting.Formatters; +import com.djrapitops.plan.utilities.html.graphs.Graphs; +import com.djrapitops.plan.utilities.html.graphs.bar.BarGraph; +import com.djrapitops.plan.utilities.html.graphs.stack.StackGraph; import com.djrapitops.plugin.api.Check; import com.djrapitops.plugin.api.TimeAmount; @@ -38,7 +36,9 @@ public class NetworkContainer extends DataContainer { private final ServerContainer bungeeContainer; + // TODO private Database database; + private Graphs graphs; private final Map serverContainers; @@ -99,23 +99,23 @@ public class NetworkContainer extends DataContainer { private void addPlayerInformation() { putSupplier(NetworkKeys.PLAYERS_TOTAL, () -> getUnsafe(NetworkKeys.PLAYERS_MUTATOR).count()); putSupplier(NetworkKeys.WORLD_MAP_SERIES, () -> - new WorldMap(PlayersMutator.forContainer(bungeeContainer)).toHighChartsSeries() + graphs.special().worldMap(PlayersMutator.forContainer(bungeeContainer)).toHighChartsSeries() ); - Key geolocationBarChart = new Key<>(GeolocationBarGraph.class, "GEOLOCATION_BAR_CHART"); - putSupplier(geolocationBarChart, () -> new GeolocationBarGraph(getUnsafe(NetworkKeys.PLAYERS_MUTATOR))); + Key geolocationBarChart = new Key<>(BarGraph.class, "GEOLOCATION_BAR_GRAPH"); + putSupplier(geolocationBarChart, () -> graphs.bar().geolocationBarGraph(getUnsafe(NetworkKeys.PLAYERS_MUTATOR))); putSupplier(NetworkKeys.COUNTRY_CATEGORIES, () -> getUnsafe(geolocationBarChart).toHighChartsCategories()); putSupplier(NetworkKeys.COUNTRY_SERIES, () -> getUnsafe(geolocationBarChart).toHighChartsSeries()); putSupplier(NetworkKeys.PLAYERS_ONLINE_SERIES, () -> - new OnlineActivityGraph(TPSMutator.forContainer(bungeeContainer)).toHighChartsSeries() + graphs.line().playersOnlineGraph(TPSMutator.forContainer(bungeeContainer)).toHighChartsSeries() ); - Key activityStackGraph = new Key<>(ActivityStackGraph.class, "ACTIVITY_STACK_GRAPH"); + Key activityStackGraph = new Key<>(StackGraph.class, "ACTIVITY_STACK_GRAPH"); putSupplier(NetworkKeys.ACTIVITY_DATA, () -> getUnsafe(NetworkKeys.PLAYERS_MUTATOR).toActivityDataMap(getUnsafe(NetworkKeys.REFRESH_TIME))); - putSupplier(activityStackGraph, () -> new ActivityStackGraph(getUnsafe(NetworkKeys.ACTIVITY_DATA))); + putSupplier(activityStackGraph, () -> graphs.stack().activityStackGraph(getUnsafe(NetworkKeys.ACTIVITY_DATA))); putSupplier(NetworkKeys.ACTIVITY_STACK_CATEGORIES, () -> getUnsafe(activityStackGraph).toHighChartsLabels()); putSupplier(NetworkKeys.ACTIVITY_STACK_SERIES, () -> getUnsafe(activityStackGraph).toHighChartsSeries()); - putSupplier(NetworkKeys.ACTIVITY_PIE_SERIES, () -> - new ActivityPie(getUnsafe(NetworkKeys.ACTIVITY_DATA).get(getUnsafe(NetworkKeys.REFRESH_TIME))).toHighChartsSeries() + putSupplier(NetworkKeys.ACTIVITY_PIE_SERIES, () -> graphs.pie().activityPie( + getUnsafe(NetworkKeys.ACTIVITY_DATA).get(getUnsafe(NetworkKeys.REFRESH_TIME))).toHighChartsSeries() ); putSupplier(NetworkKeys.ALL_TIME_PEAK_TIME_F, () -> 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 d78ea39b9..01c43746e 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,11 +1,8 @@ package com.djrapitops.plan.data.time; -import com.djrapitops.plan.system.settings.WorldAliasSettings; - import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; /** * Class that tracks the time spent in each World based on GMTimes. @@ -169,30 +166,4 @@ public class WorldTimes { } } - public Map getPlaytimePerAlias() { - Map playtimePerWorld = getWorldTimes() // WorldTimes Map - .entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().getTotal() // GMTimes.getTotal - )); - - Map aliases = WorldAliasSettings.getAliases_Old(); - - Map playtimePerAlias = new HashMap<>(); - for (Map.Entry entry : playtimePerWorld.entrySet()) { - String worldName = entry.getKey(); - long playtime = entry.getValue(); - - if (!aliases.containsKey(worldName)) { - aliases.put(worldName, worldName); - WorldAliasSettings.addWorld_Old(worldName); - } - - String alias = aliases.get(worldName); - - playtimePerAlias.put(alias, playtimePerAlias.getOrDefault(alias, 0L) + playtime); - } - return playtimePerAlias; - } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/settings/WorldAliasSettings.java b/Plan/src/main/java/com/djrapitops/plan/system/settings/WorldAliasSettings.java index 5b2ac454d..981fd7874 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/settings/WorldAliasSettings.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/settings/WorldAliasSettings.java @@ -4,6 +4,8 @@ */ package com.djrapitops.plan.system.settings; +import com.djrapitops.plan.data.time.GMTimes; +import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plugin.config.ConfigNode; @@ -17,6 +19,7 @@ import javax.inject.Singleton; import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; /** * Class responsible for managing config settings for World Aliases. @@ -92,4 +95,58 @@ public class WorldAliasSettings { }); } } + + public Map getPlaytimePerAlias(WorldTimes worldTimes) { + Map playtimePerWorld = worldTimes.getWorldTimes() // WorldTimes Map + .entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().getTotal() // GMTimes.getTotal + )); + + Map aliases = getAliases(); + + Map playtimePerAlias = new HashMap<>(); + for (Map.Entry entry : playtimePerWorld.entrySet()) { + String worldName = entry.getKey(); + long playtime = entry.getValue(); + + if (!aliases.containsKey(worldName)) { + aliases.put(worldName, worldName); + addWorld(worldName); + } + + String alias = aliases.get(worldName); + + playtimePerAlias.put(alias, playtimePerAlias.getOrDefault(alias, 0L) + playtime); + } + return playtimePerAlias; + } + + public Map getGMTimesPerAlias(WorldTimes worldTimes) { + Map aliases = getAliases(); + + Map gmTimesPerAlias = new HashMap<>(); + + String[] gms = GMTimes.getGMKeyArray(); + + for (Map.Entry entry : worldTimes.getWorldTimes().entrySet()) { + String worldName = entry.getKey(); + GMTimes gmTimes = entry.getValue(); + + if (!aliases.containsKey(worldName)) { + aliases.put(worldName, worldName); + addWorld(worldName); + } + + String alias = aliases.get(worldName); + + GMTimes aliasGMTimes = gmTimesPerAlias.getOrDefault(alias, new GMTimes()); + for (String gm : gms) { + aliasGMTimes.addTime(gm, gmTimes.getTime(gm)); + } + gmTimesPerAlias.put(alias, aliasGMTimes); + } + return gmTimesPerAlias; + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java index 9a5a8eb61..a3f7b8d57 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java @@ -4,12 +4,13 @@ */ package com.djrapitops.plan.utilities.html; +import com.djrapitops.plan.data.store.mutators.TPSMutator; import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.info.server.Server; import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.info.server.properties.ServerProperties; import com.djrapitops.plan.utilities.FormatUtils; -import com.djrapitops.plan.utilities.html.graphs.line.OnlineActivityGraph; +import com.djrapitops.plan.utilities.html.graphs.Graphs; import com.djrapitops.plan.utilities.html.icon.Color; import com.djrapitops.plan.utilities.html.icon.Icon; import com.djrapitops.plan.utilities.html.icon.Icons; @@ -81,7 +82,8 @@ public class HtmlStructure { int playerCount = 0; String playerData = "[]"; playerCount = db.count().getServerPlayerCount(serverUUID); - playerData = new OnlineActivityGraph(db.fetch().getTPSData(serverUUID)).toHighChartsSeries(); + Graphs graphs = null; // TODO + playerData = graphs.line().playersOnlineGraph(new TPSMutator(db.fetch().getTPSData(serverUUID))).toHighChartsSeries(); return "
" + "
" + diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/Graphs.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/Graphs.java new file mode 100644 index 000000000..a6de21f14 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/Graphs.java @@ -0,0 +1,68 @@ +package com.djrapitops.plan.utilities.html.graphs; + +import com.djrapitops.plan.utilities.html.graphs.bar.BarGraphFactory; +import com.djrapitops.plan.utilities.html.graphs.calendar.CalendarFactory; +import com.djrapitops.plan.utilities.html.graphs.line.LineGraphFactory; +import com.djrapitops.plan.utilities.html.graphs.pie.PieGraphFactory; +import com.djrapitops.plan.utilities.html.graphs.special.SpecialGraphFactory; +import com.djrapitops.plan.utilities.html.graphs.stack.StackGraphFactory; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Factory class for different objects representing HTML graphs. + * + * @author Rsl1122 + */ +@Singleton +public class Graphs { + + private final BarGraphFactory barGraphFactory; + private final CalendarFactory calendarFactory; + private final LineGraphFactory lineGraphFactory; + private final PieGraphFactory pieGraphFactory; + private final StackGraphFactory stackGraphFactory; + private final SpecialGraphFactory specialGraphFactory; + + @Inject + public Graphs( + BarGraphFactory barGraphFactory, + CalendarFactory calendarFactory, + LineGraphFactory lineGraphFactory, + PieGraphFactory pieGraphFactory, + StackGraphFactory stackGraphFactory, + SpecialGraphFactory specialGraphFactory + ) { + this.barGraphFactory = barGraphFactory; + this.calendarFactory = calendarFactory; + this.lineGraphFactory = lineGraphFactory; + this.pieGraphFactory = pieGraphFactory; + this.stackGraphFactory = stackGraphFactory; + this.specialGraphFactory = specialGraphFactory; + } + + public BarGraphFactory bar() { + return barGraphFactory; + } + + public CalendarFactory calendar() { + return calendarFactory; + } + + public LineGraphFactory line() { + return lineGraphFactory; + } + + public PieGraphFactory pie() { + return pieGraphFactory; + } + + public StackGraphFactory stack() { + return stackGraphFactory; + } + + public SpecialGraphFactory special() { + return specialGraphFactory; + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/bar/BarGraphFactory.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/bar/BarGraphFactory.java new file mode 100644 index 000000000..5527e4089 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/bar/BarGraphFactory.java @@ -0,0 +1,23 @@ +package com.djrapitops.plan.utilities.html.graphs.bar; + +import com.djrapitops.plan.data.store.mutators.PlayersMutator; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Factory class for Bar Graphs. + * + * @author Rsl1122 + */ +@Singleton +public class BarGraphFactory { + @Inject + public BarGraphFactory() { + // Inject Constructor. + } + + public BarGraph geolocationBarGraph(PlayersMutator playersMutator) { + return new GeolocationBarGraph(playersMutator); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/bar/GeolocationBarGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/bar/GeolocationBarGraph.java index ba3900acf..b92d5c342 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/bar/GeolocationBarGraph.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/bar/GeolocationBarGraph.java @@ -9,11 +9,11 @@ import java.util.stream.Collectors; public class GeolocationBarGraph extends BarGraph { - public GeolocationBarGraph(PlayersMutator mutator) { + GeolocationBarGraph(PlayersMutator mutator) { this(mutator.getGeolocations()); } - public GeolocationBarGraph(List geolocations) { + private GeolocationBarGraph(List geolocations) { super(turnToBars(geolocations)); } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/CalendarFactory.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/CalendarFactory.java new file mode 100644 index 000000000..95fb9e4e6 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/CalendarFactory.java @@ -0,0 +1,46 @@ +package com.djrapitops.plan.utilities.html.graphs.calendar; + +import com.djrapitops.plan.data.store.containers.PlayerContainer; +import com.djrapitops.plan.data.store.mutators.PlayersMutator; +import com.djrapitops.plan.system.settings.theme.Theme; +import com.djrapitops.plan.utilities.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatters; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.TreeMap; + +/** + * Factory class for different objects representing HTML calendars. + * + * @author Rsl1122 + */ +@Singleton +public class CalendarFactory { + + private final Formatter iso8601Formatter; + private final Formatter timeAmountFormatter; + private final Theme theme; + + @Inject + public CalendarFactory( + Formatters formatters, + Theme theme + ) { + this.iso8601Formatter = formatters.iso8601NoClockLong(); + this.timeAmountFormatter = formatters.timeAmount(); + this.theme = theme; + } + + public PlayerCalendar playerCalendar(PlayerContainer player) { + return new PlayerCalendar(player); + } + + public ServerCalendar serverCalendar( + PlayersMutator mutator, + TreeMap uniquePerDay, + TreeMap newPerDay + ) { + return new ServerCalendar(mutator, uniquePerDay, newPerDay, iso8601Formatter, timeAmountFormatter, theme); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/PlayerCalendar.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/PlayerCalendar.java index 067153b2c..a257ea640 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/PlayerCalendar.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/PlayerCalendar.java @@ -9,11 +9,11 @@ import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.store.containers.PlayerContainer; import com.djrapitops.plan.data.store.keys.PlayerKeys; import com.djrapitops.plan.data.store.keys.SessionKeys; -import com.djrapitops.plan.utilities.formatting.Formatter; -import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.system.settings.theme.Theme; import com.djrapitops.plan.system.settings.theme.ThemeVal; import com.djrapitops.plan.utilities.FormatUtils; +import com.djrapitops.plan.utilities.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plugin.api.TimeAmount; import java.util.ArrayList; @@ -31,7 +31,7 @@ public class PlayerCalendar { private final List allSessions; private final long registered; - public PlayerCalendar(PlayerContainer container) { + PlayerCalendar(PlayerContainer container) { this( container.getValue(PlayerKeys.SESSIONS).orElse(new ArrayList<>()), container.getValue(PlayerKeys.REGISTERED).orElse(0L) diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/ServerCalendar.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/ServerCalendar.java index 38830369c..cfe19b799 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/ServerCalendar.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/ServerCalendar.java @@ -7,10 +7,9 @@ package com.djrapitops.plan.utilities.html.graphs.calendar; import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.store.mutators.PlayersMutator; import com.djrapitops.plan.data.store.mutators.SessionsMutator; -import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.system.settings.theme.Theme; import com.djrapitops.plan.system.settings.theme.ThemeVal; -import com.djrapitops.plan.utilities.FormatUtils; +import com.djrapitops.plan.utilities.formatting.Formatter; import java.util.*; @@ -25,12 +24,22 @@ public class ServerCalendar { private final TreeMap uniquePerDay; private final TreeMap newPerDay; - public ServerCalendar(PlayersMutator mutator, - TreeMap uniquePerDay, - TreeMap newPerDay) { + private final Formatter iso8601Formatter; + private final Formatter timeAmountFormatter; + private final Theme theme; + + ServerCalendar( + PlayersMutator mutator, TreeMap uniquePerDay, TreeMap newPerDay, + Formatter iso8601Formatter, + Formatter timeAmountFormatter, + Theme theme + ) { this.mutator = mutator; this.uniquePerDay = uniquePerDay; this.newPerDay = newPerDay; + this.iso8601Formatter = iso8601Formatter; + this.timeAmountFormatter = timeAmountFormatter; + this.theme = theme; } public String toCalendarSeries() { @@ -51,12 +60,12 @@ public class ServerCalendar { if (newPlayers <= 0) { continue; } - + String day = entry.getKey(); series.append(",{title: 'New: ").append(newPlayers) .append("',start:'").append(day) - .append("',color: '").append(Theme.getValue_Old(ThemeVal.LIGHT_GREEN)).append("'") + .append("',color: '").append(theme.getThemeValue(ThemeVal.LIGHT_GREEN)).append("'") .append("}"); } @@ -72,7 +81,7 @@ public class ServerCalendar { } Long key = entry.getKey(); - String day = FormatUtils.formatTimeStampISO8601NoClock(key); + String day = iso8601Formatter.apply(key); List sessions = byStartOfDay.getOrDefault(key, new ArrayList<>()); SessionsMutator dayMutator = new SessionsMutator(sessions); @@ -80,14 +89,14 @@ public class ServerCalendar { long playtime = dayMutator.toPlaytime(); long uniquePlayers = entry.getValue(); - series.append(",{title: 'Playtime: ").append(Formatters.timeAmount_Old().apply(playtime)) + series.append(",{title: 'Playtime: ").append(timeAmountFormatter.apply(playtime)) .append("',start:'").append(day) - .append("',color: '").append(Theme.getValue_Old(ThemeVal.GREEN)).append("'") + .append("',color: '").append(theme.getThemeValue(ThemeVal.GREEN)).append("'") .append("}"); series.append(",{title: 'Sessions: ").append(sessionCount) .append("',start:'").append(day) - .append("',color: '").append(Theme.getValue_Old(ThemeVal.TEAL)).append("'") + .append("',color: '").append(theme.getThemeValue(ThemeVal.TEAL)).append("'") .append("}"); series.append(",{title: 'Unique: ").append(uniquePlayers) @@ -99,7 +108,7 @@ public class ServerCalendar { private Map getRegisteredByDay() { Map registeredByDay = new HashMap<>(); for (Map.Entry entry : newPerDay.entrySet()) { - String day = FormatUtils.formatTimeStampISO8601NoClock(entry.getKey()); + String day = iso8601Formatter.apply(entry.getKey()); registeredByDay.put(day, entry.getValue()); } return registeredByDay; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/AbstractLineGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/AbstractLineGraph.java deleted file mode 100644 index 94cbbf593..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/AbstractLineGraph.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package com.djrapitops.plan.utilities.html.graphs.line; - -import com.djrapitops.plan.system.settings.Settings; -import com.djrapitops.plan.utilities.html.graphs.HighChart; -import com.djrapitops.plan.utilities.html.graphs.line.alg.DouglasPeuckerAlgorithm; -import com.djrapitops.plan.utilities.html.graphs.line.alg.ReduceGapTriangles; -import com.djrapitops.plugin.api.TimeAmount; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -/** - * This is a LineGraph for any set of Points, thus it is Abstract. - * - * @author Rsl1122 - * @since 4.2.0 - */ -public class AbstractLineGraph implements HighChart { - - protected List points; - protected boolean reduceGapTriangles = false; - protected boolean reducePoints = false; - - public AbstractLineGraph() { - points = new ArrayList<>(); - } - - public AbstractLineGraph(List points) { - this.points = points; - } - - @Override - public String toHighChartsSeries() { - StringBuilder arrayBuilder = new StringBuilder("["); - - if (reducePoints) { - points = DouglasPeuckerAlgorithm.reducePoints(points, 0); - } - if (reduceGapTriangles) { - points = ReduceGapTriangles.reduce(points); - } - - int size = points.size(); - Long lastX = null; - boolean addMissingPoints = Settings.DISPLAY_GAPS_IN_GRAPH_DATA.isTrue(); - for (int i = 0; i < size; i++) { - Point point = points.get(i); - Double y = point.getY(); - long date = (long) point.getX(); - if (addMissingPoints && lastX != null && date - lastX > TimeAmount.MINUTE.ms() * 3L) { - addMissingPoints(arrayBuilder, lastX, date); - } - lastX = date; - arrayBuilder.append("[").append(date).append(",").append(y).append("]"); - if (i < size - 1) { - arrayBuilder.append(","); - } - } - - arrayBuilder.append("]"); - return arrayBuilder.toString(); - } - - private void addMissingPoints(StringBuilder arrayBuilder, Long lastX, long date) { - long iterate = lastX + TimeAmount.MINUTE.ms(); - while (iterate < date) { - arrayBuilder.append("[").append(iterate).append(",null],"); - iterate += TimeAmount.MINUTE.ms() * 30L; - } - } - - public void reduceGapTriangles() { - this.reduceGapTriangles = true; - } - - public void reducePoints() { - this.reducePoints = true; - } - - public void setPoints(List points) { - this.points = points; - } - - public void addPoints(Collection points) { - this.points.addAll(points); - } -} diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/CPUGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/CPUGraph.java index e26a24305..86875934e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/CPUGraph.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/CPUGraph.java @@ -1,10 +1,7 @@ package com.djrapitops.plan.utilities.html.graphs.line; -import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.store.mutators.TPSMutator; -import java.util.List; - /** * Graph about CPU Usage gathered by TPSCountTimer. * @@ -12,13 +9,9 @@ import java.util.List; * @see com.djrapitops.plan.system.tasks.TPSCountTimer * @since 4.2.0 */ -public class CPUGraph extends AbstractLineGraph { +class CPUGraph extends LineGraph { - public CPUGraph(List tpsData) { - this(new TPSMutator(tpsData)); - } - - public CPUGraph(TPSMutator mutator) { - super(mutator.cpuPoints()); + CPUGraph(TPSMutator mutator, boolean displayGaps) { + super(mutator.cpuPoints(), displayGaps); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/ChunkGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/ChunkGraph.java index 3ce1d5f0e..4305db54e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/ChunkGraph.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/ChunkGraph.java @@ -1,10 +1,7 @@ package com.djrapitops.plan.utilities.html.graphs.line; -import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.store.mutators.TPSMutator; -import java.util.List; - /** * Graph about Chunk Counts gathered by TPSCountTimer. * @@ -12,13 +9,9 @@ import java.util.List; * @see com.djrapitops.plan.system.tasks.TPSCountTimer * @since 4.2.0 */ -public class ChunkGraph extends AbstractLineGraph { +class ChunkGraph extends LineGraph { - public ChunkGraph(List tpsData) { - this(new TPSMutator(tpsData)); - } - - public ChunkGraph(TPSMutator mutator) { - super(mutator.chunkPoints()); + ChunkGraph(TPSMutator mutator, boolean displayGaps) { + super(mutator.chunkPoints(), displayGaps); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/EntityGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/EntityGraph.java index 617612b96..ba00921fd 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/EntityGraph.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/EntityGraph.java @@ -1,10 +1,7 @@ package com.djrapitops.plan.utilities.html.graphs.line; -import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.store.mutators.TPSMutator; -import java.util.List; - /** * Graph about Entity Counts gathered by TPSCountTimer. * @@ -12,13 +9,9 @@ import java.util.List; * @see com.djrapitops.plan.system.tasks.TPSCountTimer * @since 4.2.0 */ -public class EntityGraph extends AbstractLineGraph { +class EntityGraph extends LineGraph { - public EntityGraph(List tpsData) { - this(new TPSMutator(tpsData)); - } - - public EntityGraph(TPSMutator mutator) { - super(mutator.entityPoints()); + EntityGraph(TPSMutator mutator, boolean displayGaps) { + super(mutator.entityPoints(), displayGaps); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraph.java new file mode 100644 index 000000000..b84ad26f3 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraph.java @@ -0,0 +1,62 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.djrapitops.plan.utilities.html.graphs.line; + +import com.djrapitops.plan.utilities.html.graphs.HighChart; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * This is a LineGraph for any set of Points, thus it is Abstract. + * + * @author Rsl1122 + * @since 4.2.0 + */ +public class LineGraph implements HighChart { + + private final boolean displayGaps; + private List points; + + public LineGraph(List points, boolean displayGaps) { + this.points = points; + this.displayGaps = displayGaps; + } + + @Override + public String toHighChartsSeries() { + StringBuilder arrayBuilder = new StringBuilder("["); + + int size = points.size(); + Long lastX = null; + for (int i = 0; i < size; i++) { + Point point = points.get(i); + Double y = point.getY(); + long date = (long) point.getX(); + + if (displayGaps && lastX != null && date - lastX > TimeUnit.MINUTES.toMillis(3L)) { + addMissingPoints(arrayBuilder, lastX, date); + } + lastX = date; + + arrayBuilder.append("[").append(date).append(",").append(y).append("]"); + if (i < size - 1) { + arrayBuilder.append(","); + } + } + + arrayBuilder.append("]"); + return arrayBuilder.toString(); + } + + private void addMissingPoints(StringBuilder arrayBuilder, Long lastX, long date) { + long iterate = lastX + TimeUnit.MINUTES.toMillis(1L); + while (iterate < date) { + arrayBuilder.append("[").append(iterate).append(",null],"); + iterate += TimeUnit.MINUTES.toMillis(30L); + } + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraphFactory.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraphFactory.java new file mode 100644 index 000000000..29bcda7f0 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraphFactory.java @@ -0,0 +1,60 @@ +package com.djrapitops.plan.utilities.html.graphs.line; + +import com.djrapitops.plan.data.container.Ping; +import com.djrapitops.plan.data.store.mutators.TPSMutator; +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.config.PlanConfig; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.List; + +/** + * Factory class for different objects representing HTML line graphs. + * + * @author Rsl1122 + */ +@Singleton +public class LineGraphFactory { + + private final PlanConfig config; + + @Inject + public LineGraphFactory( + PlanConfig config + ) { + this.config = config; + } + + public LineGraph lineGraph(List points) { + return new LineGraph(points, config.isTrue(Settings.DISPLAY_GAPS_IN_GRAPH_DATA)); + } + + public LineGraph chunkGraph(TPSMutator mutator) { + return new ChunkGraph(mutator, config.isTrue(Settings.DISPLAY_GAPS_IN_GRAPH_DATA)); + } + + public LineGraph cpuGraph(TPSMutator mutator) { + return new CPUGraph(mutator, config.isTrue(Settings.DISPLAY_GAPS_IN_GRAPH_DATA)); + } + + public LineGraph entityGraph(TPSMutator mutator) { + return new EntityGraph(mutator, config.isTrue(Settings.DISPLAY_GAPS_IN_GRAPH_DATA)); + } + + public LineGraph playersOnlineGraph(TPSMutator mutator) { + return new PlayersOnlineGraph(mutator, config.isTrue(Settings.DISPLAY_GAPS_IN_GRAPH_DATA)); + } + + public PingGraph pingGraph(List pingList) { + return new PingGraph(pingList, config.isTrue(Settings.DISPLAY_GAPS_IN_GRAPH_DATA)); + } + + public LineGraph ramGraph(TPSMutator mutator) { + return new RamGraph(mutator, config.isTrue(Settings.DISPLAY_GAPS_IN_GRAPH_DATA)); + } + + public LineGraph tpsGraph(TPSMutator mutator) { + return new TPSGraph(mutator, config.isTrue(Settings.DISPLAY_GAPS_IN_GRAPH_DATA)); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/OnlineActivityGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/OnlineActivityGraph.java deleted file mode 100644 index 89fccf3d5..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/OnlineActivityGraph.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.djrapitops.plan.utilities.html.graphs.line; - -import com.djrapitops.plan.data.container.TPS; -import com.djrapitops.plan.data.store.mutators.TPSMutator; - -import java.util.List; - -/** - * Graph about Player Counts gathered by TPSCountTimer. - * - * @author Rsl1122 - * @see com.djrapitops.plan.system.tasks.TPSCountTimer - * @since 4.2.0 - */ -public class OnlineActivityGraph extends AbstractLineGraph { - - public OnlineActivityGraph(List tpsData) { - this(new TPSMutator(tpsData)); - } - - public OnlineActivityGraph(TPSMutator mutator) { - super(mutator.playersOnlinePoints()); - } -} diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PingGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PingGraph.java index 28ad850b2..0960aadfa 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PingGraph.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PingGraph.java @@ -7,17 +7,18 @@ import java.util.List; public class PingGraph { - private final AbstractLineGraph maxGraph; - private final AbstractLineGraph minGraph; - private final AbstractLineGraph avgGraph; + private final LineGraph maxGraph; + private final LineGraph minGraph; + private final LineGraph avgGraph; /** * Constructor. * - * @param pings List of Ping values: - * List should be filtered so that only a single entry for each date exists. + * @param pings List of Ping values: + * List should be filtered so that only a single entry for each date exists. + * @param displayGaps Should data gaps be displayed. */ - public PingGraph(List pings) { + PingGraph(List pings, boolean displayGaps) { List max = new ArrayList<>(); List min = new ArrayList<>(); List avg = new ArrayList<>(); @@ -30,9 +31,9 @@ public class PingGraph { avg.add(new Point(date, ping.getAverage())); } - maxGraph = new AbstractLineGraph(max); - minGraph = new AbstractLineGraph(min); - avgGraph = new AbstractLineGraph(avg); + maxGraph = new LineGraph(max, displayGaps); + minGraph = new LineGraph(min, displayGaps); + avgGraph = new LineGraph(avg, displayGaps); } public String toMaxSeries() { diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PlayersOnlineGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PlayersOnlineGraph.java new file mode 100644 index 000000000..7e9f5993c --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PlayersOnlineGraph.java @@ -0,0 +1,17 @@ +package com.djrapitops.plan.utilities.html.graphs.line; + +import com.djrapitops.plan.data.store.mutators.TPSMutator; + +/** + * Graph about Player Counts gathered by TPSCountTimer. + * + * @author Rsl1122 + * @see com.djrapitops.plan.system.tasks.TPSCountTimer + * @since 4.2.0 + */ +class PlayersOnlineGraph extends LineGraph { + + PlayersOnlineGraph(TPSMutator mutator, boolean displayGaps) { + super(mutator.playersOnlinePoints(), displayGaps); + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/RamGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/RamGraph.java index 40b1460d9..833523878 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/RamGraph.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/RamGraph.java @@ -1,10 +1,7 @@ package com.djrapitops.plan.utilities.html.graphs.line; -import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.store.mutators.TPSMutator; -import java.util.List; - /** * Graph about RAM Usage gathered by TPSCountTimer. * @@ -12,13 +9,9 @@ import java.util.List; * @see com.djrapitops.plan.system.tasks.TPSCountTimer * @since 4.2.0 */ -public class RamGraph extends AbstractLineGraph { +class RamGraph extends LineGraph { - public RamGraph(List tpsData) { - this(new TPSMutator(tpsData)); - } - - public RamGraph(TPSMutator mutator) { - super(mutator.ramUsagePoints()); + RamGraph(TPSMutator mutator, boolean displayGaps) { + super(mutator.ramUsagePoints(), displayGaps); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/TPSGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/TPSGraph.java index 63d8270dc..5cab30e58 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/TPSGraph.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/TPSGraph.java @@ -1,10 +1,7 @@ package com.djrapitops.plan.utilities.html.graphs.line; -import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.store.mutators.TPSMutator; -import java.util.List; - /** * Graph about TPS gathered by TPSCountTimer. * @@ -12,13 +9,9 @@ import java.util.List; * @see com.djrapitops.plan.system.tasks.TPSCountTimer * @since 4.2.0 */ -public class TPSGraph extends AbstractLineGraph { +class TPSGraph extends LineGraph { - public TPSGraph(List tpsData) { - this(new TPSMutator(tpsData)); - } - - public TPSGraph(TPSMutator mutator) { - super(mutator.tpsPoints()); + TPSGraph(TPSMutator mutator, boolean displayGaps) { + super(mutator.tpsPoints(), displayGaps); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ActivityPie.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ActivityPie.java index df57ed078..91619d4aa 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ActivityPie.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ActivityPie.java @@ -5,8 +5,6 @@ package com.djrapitops.plan.utilities.html.graphs.pie; import com.djrapitops.plan.data.store.mutators.ActivityIndex; -import com.djrapitops.plan.system.settings.theme.Theme; -import com.djrapitops.plan.system.settings.theme.ThemeVal; import java.util.*; @@ -17,14 +15,13 @@ import java.util.*; * @see ActivityIndex * @since 4.2.0 */ -public class ActivityPie extends AbstractPieChart { +public class ActivityPie extends Pie { - public ActivityPie(Map> activityData) { - super(turnToSlices(activityData)); + ActivityPie(Map> activityData, String[] colors) { + super(turnToSlices(activityData, colors)); } - private static List turnToSlices(Map> activityData) { - String[] colors = Theme.getValue_Old(ThemeVal.GRAPH_ACTIVITY_PIE).split(", "); + private static List turnToSlices(Map> activityData, String[] colors) { int maxCol = colors.length; List slices = new ArrayList<>(); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/AbstractPieChart.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/Pie.java similarity index 62% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/AbstractPieChart.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/Pie.java index 101c8234d..e60c35a20 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/AbstractPieChart.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/Pie.java @@ -7,7 +7,6 @@ package com.djrapitops.plan.utilities.html.graphs.pie; import com.djrapitops.plan.utilities.html.graphs.HighChart; import org.apache.commons.text.TextStringBuilder; -import java.util.ArrayList; import java.util.List; /** @@ -16,15 +15,11 @@ import java.util.List; * @author Rsl1122 * @since 4.2.0 */ -public class AbstractPieChart implements HighChart { +public class Pie implements HighChart { - protected List slices; + protected final List slices; - public AbstractPieChart() { - slices = new ArrayList<>(); - } - - public AbstractPieChart(List slices) { + public Pie(List slices) { this.slices = slices; } @@ -34,12 +29,4 @@ public class AbstractPieChart implements HighChart { series.appendWithSeparators(slices, ","); return series.append("]").toString(); } - - public void setSlices(List slices) { - this.slices = slices; - } - - public void addSlices(List slices) { - this.slices.addAll(slices); - } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieGraphFactory.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieGraphFactory.java new file mode 100644 index 000000000..1da6405cf --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieGraphFactory.java @@ -0,0 +1,54 @@ +package com.djrapitops.plan.utilities.html.graphs.pie; + +import com.djrapitops.plan.data.time.GMTimes; +import com.djrapitops.plan.data.time.WorldTimes; +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.WorldAliasSettings; +import com.djrapitops.plan.system.settings.config.PlanConfig; +import com.djrapitops.plan.system.settings.theme.Theme; +import com.djrapitops.plan.system.settings.theme.ThemeVal; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +/** + * Factory class for different objects representing HTML pie graphs. + * + * @author Rsl1122 + */ +@Singleton +public class PieGraphFactory { + + private final PlanConfig config; + private final Theme theme; + + @Inject + public PieGraphFactory( + PlanConfig config, + Theme theme + ) { + this.config = config; + this.theme = theme; + } + + public Pie activityPie(Map> activityData) { + String[] colors = theme.getThemeValue(ThemeVal.GRAPH_ACTIVITY_PIE).split(", "); + return new ActivityPie(activityData, colors); + } + + public Pie serverPreferencePie(Map serverNames, Map serverWorldTimes) { + return new ServerPreferencePie(serverNames, serverWorldTimes); + } + + public WorldPie worldPie(WorldTimes worldTimes) { + WorldAliasSettings worldAliasSettings = config.getWorldAliasSettings(); + Map playtimePerAlias = worldAliasSettings.getPlaytimePerAlias(worldTimes); + Map gmTimesPerAlias = worldAliasSettings.getGMTimesPerAlias(worldTimes); + String[] colors = theme.getThemeValue(ThemeVal.GRAPH_WORLD_PIE).split(", "); + boolean orderByPercentage = config.isTrue(Settings.ORDER_WORLD_PIE_BY_PERC); + return new WorldPie(playtimePerAlias, gmTimesPerAlias, colors, orderByPercentage); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/AbstractPieChartWithDrilldown.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieWithDrilldown.java similarity index 67% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/AbstractPieChartWithDrilldown.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieWithDrilldown.java index 8c5721d74..a6087f802 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/AbstractPieChartWithDrilldown.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieWithDrilldown.java @@ -11,12 +11,9 @@ import java.util.List; * * @author Rsl1122 */ -public abstract class AbstractPieChartWithDrilldown extends AbstractPieChart { +public abstract class PieWithDrilldown extends Pie { - public AbstractPieChartWithDrilldown() { - } - - public AbstractPieChartWithDrilldown(List slices) { + public PieWithDrilldown(List slices) { super(slices); } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ServerPreferencePie.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ServerPreferencePie.java index 81791d328..bc9c897ae 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ServerPreferencePie.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ServerPreferencePie.java @@ -7,9 +7,9 @@ import java.util.List; import java.util.Map; import java.util.UUID; -public class ServerPreferencePie extends AbstractPieChart { +public class ServerPreferencePie extends Pie { - public ServerPreferencePie(Map serverNames, Map serverWorldTimes) { + ServerPreferencePie(Map serverNames, Map serverWorldTimes) { super(turnToSlices(serverNames, serverWorldTimes)); } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/WorldPie.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/WorldPie.java index e7fcedf7e..87e5b51c5 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/WorldPie.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/WorldPie.java @@ -1,35 +1,35 @@ package com.djrapitops.plan.utilities.html.graphs.pie; import com.djrapitops.plan.data.time.GMTimes; -import com.djrapitops.plan.data.time.WorldTimes; -import com.djrapitops.plan.system.settings.Settings; -import com.djrapitops.plan.system.settings.WorldAliasSettings; -import com.djrapitops.plan.system.settings.theme.Theme; -import com.djrapitops.plan.system.settings.theme.ThemeVal; import com.djrapitops.plan.utilities.comparators.PieSliceComparator; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; -public class WorldPie extends AbstractPieChartWithDrilldown { +public class WorldPie extends PieWithDrilldown { - private WorldTimes worldTimes; + private final Map gmTimesAliasMap; - public WorldPie(WorldTimes worldTimes) { - super(turnIntoSlices(worldTimes)); + WorldPie( + Map playtimePerAlias, + Map gmTimesAliasMap, + String[] colors, + boolean orderByPercentage + ) { + super(turnIntoSlices(playtimePerAlias, colors)); - this.worldTimes = worldTimes; + this.gmTimesAliasMap = gmTimesAliasMap; - if (Settings.ORDER_WORLD_PIE_BY_PERC.isTrue()) { + if (orderByPercentage) { slices.sort(new PieSliceComparator()); } } - private static List turnIntoSlices(WorldTimes worldTimes) { - String[] colors = Theme.getValue_Old(ThemeVal.GRAPH_WORLD_PIE).split(", "); + private static List turnIntoSlices(Map playtimePerAlias, String[] colors) { int colLength = colors.length; - Map playtimePerAlias = worldTimes.getPlaytimePerAlias(); - List worlds = new ArrayList<>(playtimePerAlias.keySet()); Collections.sort(worlds); @@ -46,44 +46,16 @@ public class WorldPie extends AbstractPieChartWithDrilldown { return slices; } - private Map getGMTimesPerAlias() { - Map aliases = WorldAliasSettings.getAliases_Old(); - - Map gmTimesPerAlias = new HashMap<>(); - - String[] gms = GMTimes.getGMKeyArray(); - - for (Map.Entry entry : worldTimes.getWorldTimes().entrySet()) { - String worldName = entry.getKey(); - GMTimes gmTimes = entry.getValue(); - - if (!aliases.containsKey(worldName)) { - aliases.put(worldName, worldName); - WorldAliasSettings.addWorld_Old(worldName); - } - - String alias = aliases.get(worldName); - - GMTimes aliasGMTimes = gmTimesPerAlias.getOrDefault(alias, new GMTimes()); - for (String gm : gms) { - aliasGMTimes.addTime(gm, gmTimes.getTime(gm)); - } - gmTimesPerAlias.put(alias, aliasGMTimes); - } - return gmTimesPerAlias; - } - @Override public String toHighChartsDrilldown() { StringBuilder drilldownBuilder = new StringBuilder(); int i = 0; - Map gmTimesAliasMap = getGMTimesPerAlias(); if (gmTimesAliasMap.isEmpty()) { return "[]"; } int size = gmTimesAliasMap.size(); - + drilldownBuilder.append("["); for (Map.Entry worldAlias : gmTimesAliasMap.entrySet()) { drilldownBuilder.append("{name:'").append(worldAlias.getKey()) diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/PunchCardGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/special/PunchCard.java similarity index 87% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/PunchCardGraph.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/special/PunchCard.java index 53b561719..76cf4e599 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/PunchCardGraph.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/special/PunchCard.java @@ -3,10 +3,11 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package com.djrapitops.plan.utilities.html.graphs; +package com.djrapitops.plan.utilities.html.graphs.special; import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.store.keys.SessionKeys; +import com.djrapitops.plan.utilities.html.graphs.HighChart; import java.util.Calendar; import java.util.Collection; @@ -20,16 +21,16 @@ import java.util.stream.Collectors; * @author Rsl1122 * @since 4.2.0 */ -public class PunchCardGraph implements HighChart { +public class PunchCard implements HighChart { private final Collection sessions; /** - * Constuctor for the graph. + * Constructor for the graph. * * @param sessions All sessions of All users this PunchCard represents. */ - public PunchCardGraph(Collection sessions) { + PunchCard(Collection sessions) { this.sessions = sessions; } @@ -37,7 +38,7 @@ public class PunchCardGraph implements HighChart { * First number signifies the Day of Week. (0 = Monday, 6 = Sunday) * Second number signifies the Hour of Day. (0 = 0 AM, 23 = 11 PM) */ - private static List getDaysAndHours(Collection sessionStarts) { + private List getDaysAndHours(Collection sessionStarts) { return sessionStarts.stream().map((Long start) -> { Calendar day = Calendar.getInstance(); day.setTimeInMillis(start); @@ -57,7 +58,7 @@ public class PunchCardGraph implements HighChart { }).collect(Collectors.toList()); } - private static int[][] turnIntoArray(Collection sessionStarts) { + private int[][] turnIntoArray(Collection sessionStarts) { List daysAndHours = getDaysAndHours(sessionStarts); int[][] dataArray = createEmptyArray(); for (int[] dAndH : daysAndHours) { @@ -96,7 +97,7 @@ public class PunchCardGraph implements HighChart { return arrayBuilder.toString(); } - private static List getSessionStarts(Collection data) { + private List getSessionStarts(Collection data) { return data.stream() .filter(Objects::nonNull) .map(s -> s.getUnsafe(SessionKeys.START)) @@ -104,7 +105,7 @@ public class PunchCardGraph implements HighChart { .collect(Collectors.toList()); } - private static int[][] createEmptyArray() { + private int[][] createEmptyArray() { int[][] dataArray = new int[7][24]; for (int i = 0; i < 7; i++) { for (int j = 0; j < 24; j++) { @@ -114,7 +115,7 @@ public class PunchCardGraph implements HighChart { return dataArray; } - private static int findBiggestValue(int[][] dataArray) { + private int findBiggestValue(int[][] dataArray) { int highest = 1; for (int i = 0; i < 7; i++) { for (int j = 0; j < 24; j++) { @@ -127,8 +128,7 @@ public class PunchCardGraph implements HighChart { return highest; } - private static int[][] scale(int[][] dataArray, int big) { - + private int[][] scale(int[][] dataArray, int big) { int[][] scaled = new int[7][24]; for (int i = 0; i < 7; i++) { for (int j = 0; j < 24; j++) { diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/special/SpecialGraphFactory.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/special/SpecialGraphFactory.java new file mode 100644 index 000000000..921651c92 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/special/SpecialGraphFactory.java @@ -0,0 +1,31 @@ +package com.djrapitops.plan.utilities.html.graphs.special; + +import com.djrapitops.plan.data.container.Session; +import com.djrapitops.plan.data.store.mutators.PlayersMutator; +import com.djrapitops.plan.utilities.html.graphs.HighChart; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.Collection; + +/** + * Factory class for different objects representing special HTML graphs. + * + * @author Rsl1122 + */ +@Singleton +public class SpecialGraphFactory { + + @Inject + public SpecialGraphFactory() { + // Inject Constructor. + } + + public HighChart punchCard(Collection sessions) { + return new PunchCard(sessions); + } + + public HighChart worldMap(PlayersMutator mutator) { + return new WorldMap(mutator); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldMap.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/special/WorldMap.java similarity index 96% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldMap.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/special/WorldMap.java index 0fb9d6c4e..c58dedede 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldMap.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/special/WorldMap.java @@ -1,6 +1,7 @@ -package com.djrapitops.plan.utilities.html.graphs; +package com.djrapitops.plan.utilities.html.graphs.special; import com.djrapitops.plan.data.store.mutators.PlayersMutator; +import com.djrapitops.plan.utilities.html.graphs.HighChart; import org.apache.commons.text.TextStringBuilder; import java.util.HashMap; @@ -17,12 +18,8 @@ public class WorldMap implements HighChart { private final List geoLocations; - public WorldMap(List geoLocations) { - this.geoLocations = geoLocations; - } - - public WorldMap(PlayersMutator mutator) { - this(mutator.getGeolocations()); + WorldMap(PlayersMutator mutator) { + this.geoLocations = mutator.getGeolocations(); } private static Map getGeoCodes(Map geoCodeCounts) { diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/ActivityStackGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/ActivityStackGraph.java similarity index 55% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/ActivityStackGraph.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/ActivityStackGraph.java index 70a3168a8..c03a5a54a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/ActivityStackGraph.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/ActivityStackGraph.java @@ -2,15 +2,10 @@ * License is provided in the jar as LICENSE also here: * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/LICENSE */ -package com.djrapitops.plan.utilities.html.graphs; +package com.djrapitops.plan.utilities.html.graphs.stack; import com.djrapitops.plan.data.store.mutators.ActivityIndex; -import com.djrapitops.plan.data.store.mutators.PlayersMutator; -import com.djrapitops.plan.system.settings.theme.Theme; -import com.djrapitops.plan.system.settings.theme.ThemeVal; -import com.djrapitops.plan.utilities.FormatUtils; -import com.djrapitops.plan.utilities.html.graphs.stack.AbstractStackGraph; -import com.djrapitops.plan.utilities.html.graphs.stack.StackDataSet; +import com.djrapitops.plan.utilities.formatting.Formatter; import java.util.*; @@ -21,25 +16,20 @@ import java.util.*; * @see ActivityIndex * @since 4.2.0 */ -public class ActivityStackGraph extends AbstractStackGraph { +class ActivityStackGraph extends StackGraph { - public ActivityStackGraph(TreeMap>> activityData) { - super(getLabels(activityData.navigableKeySet()), getDataSets(activityData)); + ActivityStackGraph(TreeMap>> activityData, String[] colors, Formatter dayFormatter) { + super(getLabels(activityData.navigableKeySet(), dayFormatter), getDataSets(activityData, colors)); } - public ActivityStackGraph(long date, PlayersMutator mutator) { - this(mutator.toActivityDataMap(date)); - } - - private static String[] getLabels(NavigableSet dates) { + private static String[] getLabels(Collection dates, Formatter dayFormatter) { return dates.stream() - .map(FormatUtils::formatTimeStampDay) + .map(dayFormatter) .toArray(String[]::new); } - private static StackDataSet[] getDataSets(TreeMap>> activityData) { + private static StackDataSet[] getDataSets(TreeMap>> activityData, String[] colors) { String[] groups = ActivityIndex.getGroups(); - String[] colors = Theme.getValue_Old(ThemeVal.GRAPH_ACTIVITY_PIE).split(", "); int maxCol = colors.length; StackDataSet[] dataSets = new StackDataSet[groups.length]; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/AbstractStackGraph.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/StackGraph.java similarity index 93% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/AbstractStackGraph.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/StackGraph.java index ef42b0c8c..bd5f319a6 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/AbstractStackGraph.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/StackGraph.java @@ -11,12 +11,12 @@ import com.djrapitops.plan.utilities.html.graphs.HighChart; * * @author Rsl1122 */ -public class AbstractStackGraph implements HighChart { +public class StackGraph implements HighChart { private final StackDataSet[] dataSets; private final String[] labels; - public AbstractStackGraph(String[] labels, StackDataSet... dataSets) { + public StackGraph(String[] labels, StackDataSet... dataSets) { this.dataSets = dataSets; this.labels = labels; } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/StackGraphFactory.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/StackGraphFactory.java new file mode 100644 index 000000000..2bc31c920 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/stack/StackGraphFactory.java @@ -0,0 +1,39 @@ +package com.djrapitops.plan.utilities.html.graphs.stack; + +import com.djrapitops.plan.system.settings.theme.Theme; +import com.djrapitops.plan.system.settings.theme.ThemeVal; +import com.djrapitops.plan.utilities.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatters; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.UUID; + +/** + * Factory class for different objects representing HTML stack graphs. + * + * @author Rsl1122 + */ +@Singleton +public class StackGraphFactory { + + private final Theme theme; + private final Formatter dayFormatter; + + @Inject + public StackGraphFactory( + Formatters formatters, + Theme theme + ) { + this.theme = theme; + this.dayFormatter = formatters.dayLong(); + } + + public StackGraph activityStackGraph(TreeMap>> activityData) { + String[] colors = theme.getThemeValue(ThemeVal.GRAPH_ACTIVITY_PIE).split(", "); + return new ActivityStackGraph(activityData, colors, dayFormatter); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/InspectPage.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/InspectPage.java index d44ff87b9..28af021a1 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/InspectPage.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/InspectPage.java @@ -10,9 +10,6 @@ import com.djrapitops.plan.data.store.containers.PerServerContainer; import com.djrapitops.plan.data.store.containers.PlayerContainer; import com.djrapitops.plan.data.store.keys.PlayerKeys; import com.djrapitops.plan.data.store.mutators.*; -import com.djrapitops.plan.utilities.formatting.Formatter; -import com.djrapitops.plan.utilities.formatting.Formatters; -import com.djrapitops.plan.utilities.formatting.PlaceholderReplacer; import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.info.server.ServerInfo; @@ -24,10 +21,12 @@ import com.djrapitops.plan.utilities.FormatUtils; import com.djrapitops.plan.utilities.MiscUtils; import com.djrapitops.plan.utilities.comparators.SessionStartComparator; import com.djrapitops.plan.utilities.file.FileUtil; +import com.djrapitops.plan.utilities.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatters; +import com.djrapitops.plan.utilities.formatting.PlaceholderReplacer; import com.djrapitops.plan.utilities.html.HtmlStructure; -import com.djrapitops.plan.utilities.html.graphs.PunchCardGraph; +import com.djrapitops.plan.utilities.html.graphs.Graphs; import com.djrapitops.plan.utilities.html.graphs.calendar.PlayerCalendar; -import com.djrapitops.plan.utilities.html.graphs.pie.ServerPreferencePie; import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie; import com.djrapitops.plan.utilities.html.structure.ServerAccordion; import com.djrapitops.plan.utilities.html.structure.SessionAccordion; @@ -49,18 +48,21 @@ public class InspectPage implements Page { private final Map serverNames; private final PlanConfig config; + private final Graphs graphs; private final ServerInfo serverInfo; private final Timings timings; InspectPage( PlayerContainer player, Map serverNames, PlanConfig config, + Graphs graphs, ServerInfo serverInfo, Timings timings ) { this.player = player; this.serverNames = serverNames; this.config = config; + this.graphs = graphs; this.serverInfo = serverInfo; this.timings = timings; } @@ -115,7 +117,7 @@ public class InspectPage implements Page { PerServerMutator perServerMutator = new PerServerMutator(perServerContainer); Map worldTimesPerServer = perServerMutator.worldTimesPerServer(); - replacer.put("serverPieSeries", new ServerPreferencePie(serverNames, worldTimesPerServer).toHighChartsSeries()); + replacer.put("serverPieSeries", graphs.pie().serverPreferencePie(serverNames, worldTimesPerServer).toHighChartsSeries()); replacer.put("worldPieColors", Theme.getValue_Old(ThemeVal.GRAPH_WORLD_PIE)); replacer.put("gmPieColors", Theme.getValue_Old(ThemeVal.GRAPH_GM_PIE)); replacer.put("serverPieColors", Theme.getValue_Old(ThemeVal.GRAPH_SERVER_PREF_PIE)); @@ -156,7 +158,7 @@ public class InspectPage implements Page { ServerAccordion serverAccordion = new ServerAccordion(player, serverNames); - PlayerCalendar playerCalendar = new PlayerCalendar(player); + PlayerCalendar playerCalendar = graphs.calendar().playerCalendar(player); replacer.put("calendarSeries", playerCalendar.toCalendarSeries()); replacer.put("firstDay", 1); @@ -174,10 +176,10 @@ public class InspectPage implements Page { sessionsAndPlaytime(replacer, sessionsMutator, daySessionsMutator, weekSessionsMutator, monthSessionsMutator); - String punchCardData = new PunchCardGraph(allSessions).toHighChartsSeries(); + String punchCardData = graphs.special().punchCard(allSessions).toHighChartsSeries(); WorldTimes worldTimes = player.getValue(PlayerKeys.WORLD_TIMES).orElse(new WorldTimes(new HashMap<>())); - WorldPie worldPie = new WorldPie(worldTimes); + WorldPie worldPie = graphs.pie().worldPie(worldTimes); replacer.put("worldPieSeries", worldPie.toHighChartsSeries()); replacer.put("gmSeries", worldPie.toHighChartsDrilldown()); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/PageFactory.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/PageFactory.java index b17dc4517..922510ad6 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/PageFactory.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/PageFactory.java @@ -7,6 +7,7 @@ import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.info.connection.ConnectionSystem; import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.settings.config.PlanConfig; +import com.djrapitops.plan.utilities.html.graphs.Graphs; import com.djrapitops.plugin.benchmarking.Timings; import com.djrapitops.plugin.logging.debug.DebugLogger; import com.djrapitops.plugin.logging.error.ErrorHandler; @@ -31,6 +32,7 @@ public class PageFactory { private final Lazy database; private final Lazy serverInfo; private final Lazy connectionSystem; + private final Lazy graphs; private final Lazy debugLogger; private final Lazy timings; private final Lazy errorHandler; @@ -42,7 +44,7 @@ public class PageFactory { Lazy database, Lazy serverInfo, Lazy connectionSystem, - Lazy debugLogger, + Lazy graphs, Lazy debugLogger, Lazy timings, Lazy errorHandler ) { @@ -51,6 +53,7 @@ public class PageFactory { this.database = database; this.serverInfo = serverInfo; this.connectionSystem = connectionSystem; + this.graphs = graphs; this.debugLogger = debugLogger; this.timings = timings; this.errorHandler = errorHandler; @@ -73,7 +76,7 @@ public class PageFactory { public InspectPage inspectPage(UUID uuid) { PlayerContainer player = database.get().fetch().getPlayerContainer(uuid); Map serverNames = database.get().fetch().getServerNames(); - return new InspectPage(player, serverNames, config.get(), serverInfo.get(), timings.get()); + return new InspectPage(player, serverNames, config.get(), graphs.get(), serverInfo.get(), timings.get()); } public NetworkPage networkPage() { diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordion.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordion.java index 513beff13..98377faa4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordion.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordion.java @@ -10,11 +10,12 @@ import com.djrapitops.plan.data.store.containers.PlayerContainer; import com.djrapitops.plan.data.store.keys.PerServerKeys; import com.djrapitops.plan.data.store.keys.PlayerKeys; import com.djrapitops.plan.data.store.mutators.SessionsMutator; -import com.djrapitops.plan.utilities.formatting.Formatter; -import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.system.settings.theme.Theme; import com.djrapitops.plan.system.settings.theme.ThemeVal; +import com.djrapitops.plan.utilities.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatters; +import com.djrapitops.plan.utilities.html.graphs.Graphs; import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie; import com.djrapitops.plan.utilities.html.icon.Color; import com.djrapitops.plan.utilities.html.icon.Icon; @@ -38,6 +39,8 @@ public class ServerAccordion extends AbstractAccordion { private final Map serverNames; private PerServerContainer perServer; + private Graphs graphs; + public ServerAccordion(PlayerContainer container, Map serverNames) { super("server_accordion"); @@ -96,7 +99,7 @@ public class ServerAccordion extends AbstractAccordion { String worldId = "worldPieServer" + sanitizedServerName; - WorldPie worldPie = new WorldPie(worldTimes); + WorldPie worldPie = graphs.pie().worldPie(worldTimes); String title = serverName + "" + play + ""; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/SessionAccordion.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/SessionAccordion.java index 2fa5aea8f..19e929385 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/SessionAccordion.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/SessionAccordion.java @@ -3,15 +3,16 @@ package com.djrapitops.plan.utilities.html.structure; import com.djrapitops.plan.api.PlanAPI; import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.store.keys.SessionKeys; -import com.djrapitops.plan.utilities.formatting.Formatter; -import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.data.store.objects.DateHolder; import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.theme.Theme; import com.djrapitops.plan.system.settings.theme.ThemeVal; import com.djrapitops.plan.utilities.comparators.DateHolderRecentComparator; +import com.djrapitops.plan.utilities.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.utilities.html.HtmlStructure; +import com.djrapitops.plan.utilities.html.graphs.Graphs; import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie; import com.djrapitops.plan.utilities.html.icon.Icons; import com.djrapitops.plan.utilities.html.tables.KillsTable; @@ -36,6 +37,8 @@ public class SessionAccordion extends AbstractAccordion { private final boolean appendWorldPercentage; private int maxSessions; + private Graphs graphs; + private SessionAccordion(boolean forPlayer, List sessions, Supplier> serverNamesSupplier, Supplier> playerNamesSupplier) { @@ -84,7 +87,7 @@ public class SessionAccordion extends AbstractAccordion { Formatter timeFormatter = Formatters.timeAmount_Old(); Formatter timeStampFormatter = Formatters.year_Old(); sessions.sort(new DateHolderRecentComparator()); - + int i = 0; for (Session session : sessions) { if (i >= maxSessions) { @@ -96,7 +99,7 @@ public class SessionAccordion extends AbstractAccordion { String sessionStart = timeStampFormatter.apply(session); WorldTimes worldTimes = session.getValue(SessionKeys.WORLD_TIMES).orElse(new WorldTimes(new HashMap<>())); - WorldPie worldPie = new WorldPie(worldTimes); + WorldPie worldPie = graphs.pie().worldPie(worldTimes); String longestWorldPlayed = session.getValue(SessionKeys.LONGEST_WORLD_PLAYED).orElse("Unknown"); boolean hasEnded = session.supports(SessionKeys.END); @@ -169,7 +172,7 @@ public class SessionAccordion extends AbstractAccordion { String sessionStart = timeStampFormatter.apply(session); WorldTimes worldTimes = session.getValue(SessionKeys.WORLD_TIMES).orElse(new WorldTimes(new HashMap<>())); - WorldPie worldPie = new WorldPie(worldTimes); + WorldPie worldPie = graphs.pie().worldPie(worldTimes); String longestWorldPlayed = session.getValue(SessionKeys.LONGEST_WORLD_PLAYED).orElse("Unknown"); boolean hasEnded = session.supports(SessionKeys.END); diff --git a/Plan/src/test/java/com/djrapitops/plan/utilities/html/graphs/GraphTest.java b/Plan/src/test/java/com/djrapitops/plan/utilities/html/graphs/GraphTest.java deleted file mode 100644 index 2523d7482..000000000 --- a/Plan/src/test/java/com/djrapitops/plan/utilities/html/graphs/GraphTest.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * License is provided in the jar as LICENSE also here: - * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/LICENSE - */ -package com.djrapitops.plan.utilities.html.graphs; - -import com.djrapitops.plan.data.container.TPS; -import com.djrapitops.plan.data.store.mutators.ActivityIndex; -import com.djrapitops.plan.system.settings.Settings; -import com.djrapitops.plan.utilities.html.graphs.line.*; -import com.djrapitops.plan.utilities.html.graphs.stack.AbstractStackGraph; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import utilities.RandomData; - -import java.util.*; - -import static org.junit.Assert.assertTrue; - -/** - * Tests various Graphs. - * - * @author Rsl1122 - */ -public class GraphTest { - - private final List tpsList = new ArrayList<>(); - private final TreeMap>> activityData = new TreeMap<>(); - - @Before - public void setUp() { - String[] groups = ActivityIndex.getGroups(); - for (int i = 0; i < 10; i++) { - tpsList.add(new TPS(i, i, i, i, i, i, i)); - Map> gData = new HashMap<>(); - for (String group : groups) { - Set uuids = new HashSet<>(); - for (int j = 0; j < RandomData.randomInt(1, 20); j++) { - uuids.add(UUID.randomUUID()); - } - gData.put(group, uuids); - } - activityData.put((long) i, gData); - } - } - - @Test - @Ignore // TODO Settings stuff - public void testLineGraphsForBracketErrors() { - AbstractLineGraph[] graphs = new AbstractLineGraph[]{ - new CPUGraph(tpsList), - new OnlineActivityGraph(tpsList), - new RamGraph(tpsList), - new TPSGraph(tpsList), - new EntityGraph(tpsList), - new ChunkGraph(tpsList) - }; - - for (AbstractLineGraph graph : graphs) { - System.out.print("Bracket Test: " + graph.getClass().getSimpleName() + " | "); - String series = graph.toHighChartsSeries(); - - System.out.println(series); - - char[] chars = series.toCharArray(); - assertBracketMatch(chars); - } - } - - @Test - @Ignore // TODO Settings stuff - public void testStackGraphsForBracketErrors() { - Settings.FORMAT_DECIMALS.setTemporaryValue("#.##"); - - AbstractStackGraph[] graphs = new AbstractStackGraph[]{ - new ActivityStackGraph(activityData) - }; - - for (AbstractStackGraph graph : graphs) { - System.out.print("Bracket Test: " + graph.getClass().getSimpleName() + " | "); - String series = graph.toHighChartsSeries(); - System.out.println(series); - char[] chars = series.toCharArray(); - assertBracketMatch(chars); - - String labels = graph.toHighChartsLabels(); - System.out.println(labels); - chars = labels.toCharArray(); - assertBracketMatch(chars); - } - } - - private void assertBracketMatch(char[] chars) { - Stack bracketStack = new Stack<>(); - for (int i = 0; i < chars.length; i++) { - char c = chars[i]; - switch (c) { - case '{': - case '[': - case '(': - bracketStack.push(c); - break; - case ')': - Character pop = bracketStack.pop(); - assertTrue("Bracket mismatch at char: " + i + " Expected (, got " + pop, '(' == pop); - break; - case ']': - Character pop1 = bracketStack.pop(); - assertTrue("Bracket mismatch at char: " + i + " Expected [, got " + pop1, '[' == pop1); - break; - case '}': - Character pop2 = bracketStack.pop(); - assertTrue("Bracket mismatch at char: " + i + " Expected {, got " + pop2, '{' == pop2); - break; - default: - break; - } - } - } -} diff --git a/Plan/src/test/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraphTest.java b/Plan/src/test/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraphTest.java new file mode 100644 index 000000000..3ba24d9d8 --- /dev/null +++ b/Plan/src/test/java/com/djrapitops/plan/utilities/html/graphs/line/LineGraphTest.java @@ -0,0 +1,80 @@ +package com.djrapitops.plan.utilities.html.graphs.line; + +import com.djrapitops.plan.data.container.TPS; +import com.djrapitops.plan.data.store.mutators.TPSMutator; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import static org.junit.Assert.assertTrue; + +/** + * Test class for {@link LineGraph}. + * + * @author Rsl1122 + */ +public class LineGraphTest { + + private final List tpsList = new ArrayList<>(); + + @Before + public void setUp() { + for (int i = 0; i < 10; i++) { + tpsList.add(new TPS(i, i, i, i, i, i, i)); + } + } + + @Test + public void testLineGraphsForBracketErrors() { + TPSMutator mutator = new TPSMutator(tpsList); + LineGraph[] graphs = new LineGraph[]{ + new CPUGraph(mutator, true), + new PlayersOnlineGraph(mutator, false), + new RamGraph(mutator, true), + new TPSGraph(mutator, false), + new EntityGraph(mutator, true), + new ChunkGraph(mutator, false) + }; + + for (LineGraph graph : graphs) { + System.out.print("Bracket Test: " + graph.getClass().getSimpleName() + " | "); + String series = graph.toHighChartsSeries(); + + System.out.println(series); + + char[] chars = series.toCharArray(); + assertBracketMatch(chars); + } + } + + private void assertBracketMatch(char[] chars) { + Stack bracketStack = new Stack<>(); + for (int i = 0; i < chars.length; i++) { + char c = chars[i]; + switch (c) { + case '{': + case '[': + case '(': + bracketStack.push(c); + break; + case ')': + Character pop = bracketStack.pop(); + assertTrue("Bracket mismatch at char: " + i + " Expected (, got " + pop, '(' == pop); + break; + case ']': + Character pop1 = bracketStack.pop(); + assertTrue("Bracket mismatch at char: " + i + " Expected [, got " + pop1, '[' == pop1); + break; + case '}': + Character pop2 = bracketStack.pop(); + assertTrue("Bracket mismatch at char: " + i + " Expected {, got " + pop2, '{' == pop2); + break; + default: + break; + } + } + } +} \ No newline at end of file