[Debt] Removed Settings getNumber method

Some threshold values are needed in mutators and tasks, but they are not
yet available in the classes they are used. TODO was added.

ActivityIndexTest was removed as it does not test proper stuff.

Affected issues: none
This commit is contained in:
Rsl1122 2018-09-18 16:01:06 +03:00
parent b6cc713c01
commit 2b1cf4b3cb
10 changed files with 39 additions and 180 deletions

View File

@ -398,19 +398,21 @@ public class AnalysisContainer extends DataContainer {
putSupplier(AnalysisKeys.PLAYERS_ONLINE_RESOLVER, () -> new PlayersOnlineResolver(getUnsafe(AnalysisKeys.TPS_MUTATOR)));
putSupplier(AnalysisKeys.TPS_SPIKE_MONTH, () -> getUnsafe(tpsMonth).lowTpsSpikeCount());
int threshold = 5; //TODO LOW TPS Threshold from Settings;
putSupplier(AnalysisKeys.TPS_SPIKE_MONTH, () -> getUnsafe(tpsMonth).lowTpsSpikeCount(threshold));
putSupplier(AnalysisKeys.AVG_TPS_MONTH, () -> getUnsafe(tpsMonth).averageTPS());
putSupplier(AnalysisKeys.AVG_CPU_MONTH, () -> getUnsafe(tpsMonth).averageCPU());
putSupplier(AnalysisKeys.AVG_RAM_MONTH, () -> getUnsafe(tpsMonth).averageRAM());
putSupplier(AnalysisKeys.AVG_ENTITY_MONTH, () -> getUnsafe(tpsMonth).averageEntities());
putSupplier(AnalysisKeys.AVG_CHUNK_MONTH, () -> getUnsafe(tpsMonth).averageChunks());
putSupplier(AnalysisKeys.TPS_SPIKE_WEEK, () -> getUnsafe(tpsWeek).lowTpsSpikeCount());
putSupplier(AnalysisKeys.TPS_SPIKE_WEEK, () -> getUnsafe(tpsWeek).lowTpsSpikeCount(threshold));
putSupplier(AnalysisKeys.AVG_TPS_WEEK, () -> getUnsafe(tpsWeek).averageTPS());
putSupplier(AnalysisKeys.AVG_CPU_WEEK, () -> getUnsafe(tpsWeek).averageCPU());
putSupplier(AnalysisKeys.AVG_RAM_WEEK, () -> getUnsafe(tpsWeek).averageRAM());
putSupplier(AnalysisKeys.AVG_ENTITY_WEEK, () -> getUnsafe(tpsWeek).averageEntities());
putSupplier(AnalysisKeys.AVG_CHUNK_WEEK, () -> getUnsafe(tpsWeek).averageChunks());
putSupplier(AnalysisKeys.TPS_SPIKE_DAY, () -> getUnsafe(tpsDay).lowTpsSpikeCount());
putSupplier(AnalysisKeys.TPS_SPIKE_DAY, () -> getUnsafe(tpsDay).lowTpsSpikeCount(threshold));
putSupplier(AnalysisKeys.AVG_TPS_DAY, () -> getUnsafe(tpsDay).averageTPS());
putSupplier(AnalysisKeys.AVG_CPU_DAY, () -> getUnsafe(tpsDay).averageCPU());
putSupplier(AnalysisKeys.AVG_RAM_DAY, () -> getUnsafe(tpsDay).averageRAM());

View File

@ -23,7 +23,8 @@ public class PlayerContainer extends DataContainer {
}
public ActivityIndex getActivityIndex(long date) {
return activityIndexCache.computeIfAbsent(date, time -> new ActivityIndex(this, time));
// TODO Thresholds from settings
return activityIndexCache.computeIfAbsent(date, time -> new ActivityIndex(this, time, 1, 1));
}
public boolean playedBetween(long after, long before) {

View File

@ -3,18 +3,27 @@ package com.djrapitops.plan.data.store.mutators;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.data.store.containers.DataContainer;
import com.djrapitops.plan.data.store.keys.PlayerKeys;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.utilities.formatting.Formatter;
import com.djrapitops.plugin.api.TimeAmount;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
public class ActivityIndex {
private final double value;
public ActivityIndex(DataContainer container, long date) {
private final int playThreshold;
private final int loginThreshold;
public ActivityIndex(
DataContainer container, long date,
int playThreshold, int loginThreshold
) {
this.playThreshold = playThreshold;
this.loginThreshold = loginThreshold;
value = calculate(container, date);
}
@ -22,22 +31,14 @@ public class ActivityIndex {
return new String[]{"Very Active", "Active", "Regular", "Irregular", "Inactive"};
}
private long loadSetting(long value) {
return value <= 0 ? 1 : value;
}
private int loadSetting(int value) {
return value <= 0 ? 1 : value;
}
private double calculate(DataContainer container, long date) {
long week = TimeAmount.WEEK.ms();
long weekAgo = date - week;
long twoWeeksAgo = date - 2L * week;
long threeWeeksAgo = date - 3L * week;
long activePlayThreshold = loadSetting(Settings.ACTIVE_PLAY_THRESHOLD.getNumber() * TimeAmount.MINUTE.ms());
int activeLoginThreshold = loadSetting(Settings.ACTIVE_LOGIN_THRESHOLD.getNumber());
long activePlayThreshold = TimeUnit.MINUTES.toMillis(playThreshold);
int activeLoginThreshold = loginThreshold;
Optional<List<Session>> sessionsValue = container.getValue(PlayerKeys.SESSIONS);
if (!sessionsValue.isPresent()) {

View File

@ -48,7 +48,8 @@ public class RetentionData {
public RetentionData(PlayerContainer player, PlayersOnlineResolver onlineOnJoin) {
Optional<Long> registeredValue = player.getValue(PlayerKeys.REGISTERED);
activityIndex = registeredValue
.map(registered -> new ActivityIndex(player, registered + TimeAmount.DAY.ms()).getValue())
// TODO Thresholds from settings
.map(registered -> new ActivityIndex(player, registered + TimeAmount.DAY.ms(), 1, 1).getValue())
.orElse(0.0);
this.onlineOnJoin = registeredValue
.map(registered -> onlineOnJoin.getOnlineOn(registered).orElse(-1))

View File

@ -3,7 +3,6 @@ package com.djrapitops.plan.data.store.mutators;
import com.djrapitops.plan.data.container.TPS;
import com.djrapitops.plan.data.store.containers.DataContainer;
import com.djrapitops.plan.data.store.keys.ServerKeys;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.utilities.comparators.TPSComparator;
import com.djrapitops.plan.utilities.html.graphs.line.Point;
import com.djrapitops.plugin.api.TimeAmount;
@ -134,13 +133,11 @@ public class TPSMutator {
return idleTime;
}
public double percentageTPSAboveLowThreshold() {
public double percentageTPSAboveThreshold(int threshold) {
if (tpsData.isEmpty()) {
return 1;
}
int threshold = Settings.THEME_GRAPH_TPS_THRESHOLD_MED.getNumber();
long count = 0;
for (TPS tps : tpsData) {
if (tps.getTicksPerSecond() >= threshold) {
@ -151,15 +148,13 @@ public class TPSMutator {
return count * 1.0 / tpsData.size();
}
public int lowTpsSpikeCount() {
int mediumThreshold = Settings.THEME_GRAPH_TPS_THRESHOLD_MED.getNumber();
public int lowTpsSpikeCount(int threshold) {
boolean wasLow = false;
int spikeCount = 0;
for (TPS tpsObj : tpsData) {
double tps = tpsObj.getTicksPerSecond();
if (tps < mediumThreshold) {
if (tps < threshold) {
if (!wasLow) {
spikeCount++;
wasLow = true;

View File

@ -10,7 +10,6 @@ import com.djrapitops.plan.data.store.keys.AnalysisKeys;
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
import com.djrapitops.plan.data.store.mutators.PlayersOnlineResolver;
import com.djrapitops.plan.data.store.mutators.TPSMutator;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.utilities.html.icon.Icons;
import com.djrapitops.plugin.api.TimeAmount;
@ -91,7 +90,10 @@ public class HealthInformation extends AbstractHealthInfo {
Key<TPSMutator> tpsMonth = new Key<>(TPSMutator.class, "TPS_MONTH");
TPSMutator tpsMutator = analysisContainer.getUnsafe(tpsMonth);
long serverDownTime = tpsMutator.serverDownTime();
double aboveThreshold = tpsMutator.percentageTPSAboveLowThreshold();
int threshold = 5; // TODO TPS THRESHOLD from settings
double aboveThreshold = tpsMutator.percentageTPSAboveThreshold(threshold);
long tpsSpikeMonth = analysisContainer.getValue(AnalysisKeys.TPS_SPIKE_MONTH).orElse(0);
String avgLowThresholdString = "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
@ -107,7 +109,6 @@ public class HealthInformation extends AbstractHealthInfo {
avgLowThresholdString += " Average TPS was above Low Threshold "
+ decimalFormatter.apply(aboveThreshold * 100.0) + "% of the time";
int threshold = Settings.THEME_GRAPH_TPS_THRESHOLD_MED.getNumber();
if (tpsSpikeMonth <= 5) {
addNote(Icons.GREEN_THUMB + " Average TPS dropped below Low Threshold (" + threshold + ")" +
" " + tpsSpikeMonth + " times" +

View File

@ -73,8 +73,10 @@ public class FileSystem implements SubSystem {
Verify.isTrue((configFile.exists() && configFile.isFile()) || configFile.createNewFile(),
() -> new EnableException("Could not create config file at " + configFile.getAbsolutePath()));
// TODO Log Keep Day threshold from Settings
// TODO Move This task creation outside of FileSystem class
plugin.getRunnableFactory().create("Logs folder Clean Task",
new LogsFolderCleanTask(getLogsFolder(), plugin.getPluginLogger())
new LogsFolderCleanTask(getLogsFolder(), 5, plugin.getPluginLogger())
).runTaskLaterAsynchronously(TimeAmount.toTicks(30L, TimeUnit.SECONDS));
} catch (IOException e) {
throw new EnableException("Failed to create config.yml", e);

View File

@ -1,9 +1,6 @@
package com.djrapitops.plan.system.settings;
import com.djrapitops.plan.system.settings.config.ConfigSystem;
import com.djrapitops.plan.system.settings.config.Setting;
import com.djrapitops.plugin.config.Config;
import com.djrapitops.plugin.utilities.Verify;
/**
* This enum contains all of the config settings used by the plugin for easier
@ -110,19 +107,6 @@ public enum Settings implements Setting {
this.configPath = path;
}
/**
* If the settings is a number, this method should be used.
*
* @return Integer value of the config setting
*/
@Deprecated
public int getNumber() {
if (tempValue != null) {
return (Integer) tempValue;
}
return getConfig().getInt(configPath);
}
/**
* Used to get the String path of a the config setting eg.
* Settings.WebServer.Enabled
@ -138,9 +122,4 @@ public enum Settings implements Setting {
this.tempValue = value;
}
private Config getConfig() {
Config config = ConfigSystem.getConfig_Old();
Verify.nullCheck(config, () -> new IllegalStateException("Settings are not supposed to be called before ConfigSystem is Enabled!"));
return config;
}
}

View File

@ -1,7 +1,5 @@
package com.djrapitops.plan.system.tasks;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.task.AbsRunnable;
@ -9,6 +7,7 @@ import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* Task in charge of removing old log files
@ -17,11 +16,14 @@ import java.util.Objects;
*/
public class LogsFolderCleanTask extends AbsRunnable {
private final int keepLogDayThreshold;
private final File folder;
private final PluginLogger logger;
public LogsFolderCleanTask(File folder, PluginLogger logger) {
public LogsFolderCleanTask(File folder, int keepLogDayThreshold, PluginLogger logger) {
this.folder = folder;
this.keepLogDayThreshold = keepLogDayThreshold;
this.logger = logger;
}
@ -42,8 +44,8 @@ public class LogsFolderCleanTask extends AbsRunnable {
private void cleanFolder() {
long now = System.currentTimeMillis();
for (File file : Objects.requireNonNull(folder.listFiles())) {
long forDaysMs = Settings.KEEP_LOGS_DAYS.getNumber() * TimeAmount.DAY.ms();
if (now - file.lastModified() > (forDaysMs > 0 ? forDaysMs : TimeAmount.DAY.ms())) {
long forDaysMs = TimeUnit.DAYS.toMillis(keepLogDayThreshold);
if (now - file.lastModified() > (forDaysMs > 0 ? forDaysMs : TimeUnit.DAYS.toMillis(1L))) {
try {
Files.delete(file.toPath());
} catch (IOException e) {

View File

@ -1,125 +0,0 @@
package com.djrapitops.plan.data.calculation;
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.mutators.ActivityIndex;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.TimeAmount;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import utilities.TestConstants;
import utilities.mocks.SystemMockUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static junit.framework.TestCase.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Test for ActivityIndex.
*
* @author Rsl1122
*/
public class ActivityIndexTest {
@ClassRule
public static TemporaryFolder temporaryFolder = new TemporaryFolder();
private static final UUID UUID = TestConstants.PLAYER_ONE_UUID;
private static final UUID SERVER_UUID = TestConstants.SERVER_UUID;
@BeforeClass
public static void setUpClass() throws Exception {
SystemMockUtil.setUp(temporaryFolder.getRoot()).enableConfigSystem();
}
@Test
public void testMaxActivityIndex() {
PlayerContainer container = new PlayerContainer();
List<Session> sessions = new ArrayList<>();
long date = System.currentTimeMillis();
long week = TimeAmount.WEEK.ms();
long weekAgo = date - week;
long twoWeeksAgo = date - 2L * week;
long threeWeeksAgo = date - 3L * week;
long requiredPlaytime = Settings.ACTIVE_PLAY_THRESHOLD.getNumber() * TimeAmount.MINUTE.ms();
int requiredLogins = Settings.ACTIVE_LOGIN_THRESHOLD.getNumber();
for (int i = 0; i < requiredLogins; i++) {
sessions.add(new Session(0, UUID, SERVER_UUID, weekAgo, weekAgo + requiredPlaytime * 4L, 0, 0, 0));
sessions.add(new Session(0, UUID, SERVER_UUID, twoWeeksAgo, twoWeeksAgo + requiredPlaytime * 4L, 0, 0, 0));
sessions.add(new Session(0, UUID, SERVER_UUID, threeWeeksAgo, threeWeeksAgo + requiredPlaytime * 4L, 0, 0, 0));
}
container.putRawData(PlayerKeys.SESSIONS, sessions);
assertEquals(5.0, new ActivityIndex(container, date).getValue());
}
@Test
public void testMaxActivityIndex2() {
PlayerContainer container = new PlayerContainer();
List<Session> sessions = new ArrayList<>();
long date = System.currentTimeMillis();
long week = TimeAmount.WEEK.ms();
long weekAgo = date - week;
long twoWeeksAgo = date - 2L * week;
long threeWeeksAgo = date - 3L * week;
long requiredPlaytime = Settings.ACTIVE_PLAY_THRESHOLD.getNumber() * TimeAmount.MINUTE.ms();
int requiredLogins = Settings.ACTIVE_LOGIN_THRESHOLD.getNumber();
for (int i = 0; i < requiredLogins * 2; i++) {
sessions.add(new Session(0, UUID, SERVER_UUID, weekAgo, weekAgo + requiredPlaytime * 3L, 0, 0, 0));
sessions.add(new Session(0, UUID, SERVER_UUID, twoWeeksAgo, twoWeeksAgo + requiredPlaytime * 3L, 0, 0, 0));
sessions.add(new Session(0, UUID, SERVER_UUID, threeWeeksAgo, threeWeeksAgo + requiredPlaytime * 3L, 0, 0, 0));
}
container.putRawData(PlayerKeys.SESSIONS, sessions);
assertTrue(container.supports(PlayerKeys.SESSIONS));
assertTrue(container.getValue(PlayerKeys.SESSIONS).isPresent());
assertEquals(5.0, new ActivityIndex(container, date).getValue());
}
@Test
public void testActivityIndexOne() {
PlayerContainer container = new PlayerContainer();
List<Session> sessions = new ArrayList<>();
long date = System.currentTimeMillis();
long week = TimeAmount.WEEK.ms();
long weekAgo = date - week;
long twoWeeksAgo = date - 2L * week;
long threeWeeksAgo = date - 3L * week;
int requiredLogins = Settings.ACTIVE_LOGIN_THRESHOLD.getNumber();
long requiredPlaytime = Settings.ACTIVE_PLAY_THRESHOLD.getNumber() * TimeAmount.MINUTE.ms() / requiredLogins;
for (int i = 0; i < requiredLogins; i++) {
sessions.add(new Session(i, UUID, SERVER_UUID, weekAgo, weekAgo + requiredPlaytime, 0, 0, 0));
sessions.add(new Session(i * 2, UUID, SERVER_UUID, twoWeeksAgo, twoWeeksAgo + requiredPlaytime, 0, 0, 0));
sessions.add(new Session(i * 3, UUID, SERVER_UUID, threeWeeksAgo, threeWeeksAgo + requiredPlaytime, 0, 0, 0));
}
container.putRawData(PlayerKeys.SESSIONS, sessions);
assertTrue(2.0 <= new ActivityIndex(container, date).getValue());
}
@Test(timeout = 500)
public void testTimeout() {
PlayerContainer container = new PlayerContainer();
List<Session> sessions = new ArrayList<>();
for (int i = 0; i < 5000; i++) {
sessions.add(new Session(0, UUID, SERVER_UUID, 0, 0, 0, 0, 0));
}
container.putRawData(PlayerKeys.SESSIONS, sessions);
new ActivityIndex(container, 0).getValue();
}
}