Merge pull request #182 from Fuzzlemann/master

Some more modifications & bugfixes
This commit is contained in:
Rsl1122 2017-07-25 07:54:12 +03:00 committed by GitHub
commit 4c570520b8
57 changed files with 469 additions and 464 deletions

View File

@ -5,7 +5,7 @@ import java.util.Collection;
/**
* This class manages the messages going to the Console Logger.
*
* Methods of Abtract Plugin Framework log utility are used.
* Methods of Abstract Plugin Framework log utility are used.
*
* @author Rsl1122
* @since 3.0.0
@ -22,7 +22,7 @@ public class Log {
}
/**
* Sends a message to the console with the chatcolors.
* Sends a message to the console with the ChatColors.
*
* @param message Message to send.
*/

View File

@ -25,26 +25,17 @@ import com.djrapitops.plugin.settings.ColorScheme;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.ITask;
import com.djrapitops.plugin.utilities.Verify;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.util.HashSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import main.java.com.djrapitops.plan.api.API;
import main.java.com.djrapitops.plan.command.PlanCommand;
import main.java.com.djrapitops.plan.command.commands.RegisterCommandFilter;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import main.java.com.djrapitops.plan.data.cache.*;
import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler;
import main.java.com.djrapitops.plan.data.listeners.*;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.databases.*;
import main.java.com.djrapitops.plan.database.databases.MySQLDB;
import main.java.com.djrapitops.plan.database.databases.SQLiteDB;
import main.java.com.djrapitops.plan.ui.html.Html;
import main.java.com.djrapitops.plan.ui.webserver.WebSocketServer;
import main.java.com.djrapitops.plan.utilities.Benchmark;
@ -52,6 +43,12 @@ import main.java.com.djrapitops.plan.utilities.Check;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.Bukkit;
import java.io.*;
import java.net.URL;
import java.util.HashSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
/**
* Main class for Bukkit that manages the plugin.
*
@ -335,7 +332,7 @@ public class Plan extends BukkitPlugin<Plan> {
URL localeURL = new URL("https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/Plan/localization/locale_" + locale + ".txt");
InputStream inputStream = localeURL.openStream();
OutputStream outputStream = new FileOutputStream(localeFile);
int read = 0;
int read;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);

View File

@ -23,6 +23,7 @@ public enum Settings {
GATHERKILLS("Settings.Data.GatherKillData"),
GATHERGMTIMES("Settings.Data.GamemodeChangeListener"),
GATHERCOMMANDS("Settings.Data.GatherCommandUsage"),
DO_NOT_LOG_UNKNOWN_COMMANDS("Customization.Data.DoNotLogUnknownCommands"),
SECURITY_IP_UUID("Settings.WebServer.Security.DisplayIPsAndUUIDs"),
GRAPH_PLAYERS_USEMAXPLAYERS_SCALE("Customization.Graphs.PlayersOnlineGraph.UseMaxPlayersAsScale"),
PLAYERLIST_SHOW_IMAGES("Customization.SmallHeadImagesOnAnalysisPlayerlist"),

View File

@ -4,13 +4,6 @@ import com.djrapitops.plugin.utilities.Verify;
import com.djrapitops.plugin.utilities.player.Fetch;
import com.djrapitops.plugin.utilities.player.IOfflinePlayer;
import com.djrapitops.plugin.utilities.player.UUIDFetcher;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.AnalysisData;
import main.java.com.djrapitops.plan.data.UserData;
@ -22,15 +15,23 @@ import main.java.com.djrapitops.plan.ui.html.DataRequestHandler;
import main.java.com.djrapitops.plan.ui.webserver.WebSocketServer;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* This class contains the API methods.
*
* Methods can be called from Asyncronous task and are thread safe unless
* Methods can be called from Asynchronous task and are thread safe unless
* otherwise stated.
*
* Use Plan.getPlanAPI() to get the API.
*
* More information about API methods can be found on Github.
* More information about API methods can be found on GitHub.
*
* @author Rsl1122
* @since 2.0.0
@ -44,7 +45,7 @@ public class API {
private final Plan plugin;
/**
* Class Construcor.
* Class Constructor.
*
* @param plugin Current instance of Plan
*/
@ -65,7 +66,7 @@ public class API {
* Add a source of plugin data to the Plugins tab on Analysis and/or Inspect
* page.
*
* Refer to documentation on github or Javadoc of PluginData to set-up a
* Refer to documentation on GitHub or Javadoc of PluginData to set-up a
* data source that extends PluginData correctly.
*
* @param dataSource an object that extends PluginData-object, thus allowing
@ -102,7 +103,7 @@ public class API {
*
* @param uuid UUID of the player.
* @param processor Object implementing DBCallableProcessor, which
* process(UserData data) method will be called.
* process (UserData data) method will be called.
*/
public void scheduleForGet(UUID uuid, DBCallableProcessor processor) {
plugin.getHandler().getUserDataForProcessing(processor, uuid, false);
@ -135,7 +136,7 @@ public class API {
/**
* Used to save the cached data to the database.
*
* Should be only called from an Asyncronous thread.
* Should be only called from an Asynchronous thread.
*/
public void saveCachedData() {
plugin.getHandler().saveCachedUserData();
@ -154,7 +155,7 @@ public class API {
/**
* Cache the UserData to InspectCache.
*
* Uses cache if data is cached or database if not. Call from an Asyncronous
* Uses cache if data is cached or database if not. Call from an Asynchronous
* thread.
*
* @param uuid UUID of the player.
@ -193,14 +194,14 @@ public class API {
* Run's the analysis with the current data in the cache and fetches rest
* from the database.
*
* Starts a new Asyncronous task to run the analysis.
* Starts a new Asynchronous task to run the analysis.
*/
public void updateAnalysisCache() {
plugin.getAnalysisCache().updateCache();
}
/**
* Used to get the full Html of the Analysis page as a string.
* Used to get the full HTML of the Analysis page as a string.
*
* Check if the data is cached to AnalysisCache before calling this.
*

View File

@ -89,17 +89,17 @@ public class AnalyzeCommand extends SubCommand {
private void runMessageSenderTask(ISender sender) {
plugin.getRunnableFactory().createNew("AnalysisMessageSenderTask", new AbsRunnable() {
private int timesrun = 0;
private int timesRun = 0;
@Override
public void run() {
timesrun++;
timesRun++;
if (analysisCache.isCached() && (!analysisCache.isAnalysisBeingRun() || !analysisCache.isAnalysisEnabled())) {
sendAnalysisMessage(sender);
this.cancel();
return;
}
if (timesrun > 10) {
if (timesRun > 10) {
Log.debug("Command Timeout Message, Analysis.");
sender.sendMessage(Phrase.COMMAND_TIMEOUT.parse("Analysis"));
this.cancel();

View File

@ -66,18 +66,18 @@ public class QuickAnalyzeCommand extends SubCommand {
private void runMessageSenderTask(ISender sender) {
plugin.getRunnableFactory().createNew(new AbsRunnable("QanalysisMessageSenderTask") {
private int timesrun = 0;
private int timesRun = 0;
@Override
public void run() {
timesrun++;
timesRun++;
if (analysisCache.isCached() && (!analysisCache.isAnalysisBeingRun() || !analysisCache.isAnalysisEnabled())) {
sender.sendMessage(Phrase.CMD_ANALYZE_HEADER + "");
sender.sendMessage(TextUI.getAnalysisMessages());
sender.sendMessage(Phrase.CMD_FOOTER + "");
this.cancel();
}
if (timesrun > 10) {
if (timesRun > 10) {
Log.debug("Command Timeout Message, QuickAnalyze.");
sender.sendMessage(Phrase.COMMAND_TIMEOUT.parse("Analysis"));
this.cancel();

View File

@ -43,7 +43,7 @@ public class RegisterCommand extends SubCommand {
String permLvlErrorMsg = ChatColor.RED + "Incorrect perm level, not a number: ";
try {
if (CommandUtils.isPlayer(sender)) {
Log.info(sender.getName()+" issued WebUser register command.");
Log.info(sender.getName() + " issued WebUser register command.");
playerRegister(args, sender);
} else {
consoleRegister(args, sender, notEnoughArgsMsg);
@ -74,11 +74,6 @@ public class RegisterCommand extends SubCommand {
if (registerSenderAsUser) {
String user = sender.getName();
String pass = PassEncryptUtil.createHash(args[0]);
if (!Check.isTrue(pass != null, ChatColor.RED + "Password hash error.", sender)) {
return;
}
int permLvl = getPermissionLevel(sender);
registerUser(new WebUser(user, pass, permLvl), sender);
} else if (sender.hasPermission(Permissions.MANAGE_WEB.getPermission())) {
@ -119,7 +114,7 @@ public class RegisterCommand extends SubCommand {
}
securityTable.addNewUser(webUser);
sender.sendMessage(successMsg);
Log.info("Registered new user: "+userName+" Perm level: "+webUser.getPermLevel());
Log.info("Registered new user: " + userName + " Perm level: " + webUser.getPermLevel());
} catch (Exception e) {
Log.toLog(this.getClass().getName(), e);
} finally {

View File

@ -90,7 +90,7 @@ public class ManageImportCommand extends SubCommand {
private void list(Map<String, Importer> importers, ISender sender) {
sender.sendMessage(Phrase.CMD_FOOTER.parse());
importers.entrySet().stream().forEach(e -> sender.sendMessage(Phrase.CMD_BALL + " " + e.getKey() + ": " + e.getValue().getInfo()));
importers.forEach((string, importer) -> sender.sendMessage(Phrase.CMD_BALL + " " + string + ": " + importer.getInfo()));
sender.sendMessage(Phrase.CMD_FOOTER.parse());
}
}

View File

@ -28,7 +28,7 @@ public class WebLevelCommand extends SubCommand {
ColorScheme cs = plugin.getColorScheme();
String sCol = cs.getSecondaryColor();
String cmdBall = Phrase.CMD_BALL.parse();
String[] msgs = new String[]{
String[] messages = new String[]{
Phrase.CMD_FOOTER.parse(),
cmdBall + sCol + "0: Access all pages",
cmdBall + sCol + "1: Access '/players' and all inspect pages",
@ -36,7 +36,7 @@ public class WebLevelCommand extends SubCommand {
cmdBall + sCol + "3+: No permissions",
Phrase.CMD_FOOTER.parse()
};
sender.sendMessage(msgs);
sender.sendMessage(messages);
return true;
}

View File

@ -1,24 +1,16 @@
package main.java.com.djrapitops.plan.data;
import com.djrapitops.plugin.utilities.Verify;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.analysis.ActivityPart;
import main.java.com.djrapitops.plan.data.analysis.CommandUsagePart;
import main.java.com.djrapitops.plan.data.analysis.GamemodePart;
import main.java.com.djrapitops.plan.data.analysis.GeolocationPart;
import main.java.com.djrapitops.plan.data.analysis.JoinInfoPart;
import main.java.com.djrapitops.plan.data.analysis.KillPart;
import main.java.com.djrapitops.plan.data.analysis.PlayerCountPart;
import main.java.com.djrapitops.plan.data.analysis.PlaytimePart;
import main.java.com.djrapitops.plan.data.analysis.RawData;
import main.java.com.djrapitops.plan.data.analysis.TPSPart;
import main.java.com.djrapitops.plan.data.analysis.*;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* Big container object for Data.
*
@ -151,7 +143,7 @@ public class AnalysisData extends RawData<AnalysisData> {
addValue("version", planVersion);
final List<RawData> parts = getAllParts();
parts.stream().forEach((part) -> {
parts.forEach((part) -> {
try {
Benchmark.start("Analysis Phase: " + part.getClass().getSimpleName());
part.analyseData();

View File

@ -22,7 +22,7 @@ public class KillData {
* @param victim UUID of the victim.
* @param victimID ID of the victim, get from the database.
* @param weapon Weapon used.
* @param date Epoch millisecond at which the kill occurrred.
* @param date Epoch millisecond at which the kill occurred.
*/
public KillData(UUID victim, int victimID, String weapon, long date) {
this.victim = victim;
@ -84,10 +84,9 @@ public class KillData {
return false;
}
final KillData other = (KillData) obj;
if (this.date != other.date) {
return false;
}
return Objects.equals(this.weapon, other.weapon) && Objects.equals(this.victim, other.victim);
return this.date == other.date
&& Objects.equals(this.weapon, other.weapon)
&& Objects.equals(this.victim, other.victim);
}
@Override

View File

@ -78,10 +78,9 @@ public class TPS {
return false;
}
final TPS other = (TPS) obj;
if (this.date != other.date) {
return false;
}
return Double.doubleToLongBits(this.tps) == Double.doubleToLongBits(other.tps) && this.players == other.players;
return this.date == other.date
&& Double.doubleToLongBits(this.tps) == Double.doubleToLongBits(other.tps)
&& this.players == other.players;
}
@Override

View File

@ -3,19 +3,12 @@ package main.java.com.djrapitops.plan.data;
import com.djrapitops.plugin.utilities.Verify;
import com.djrapitops.plugin.utilities.player.IOfflinePlayer;
import com.djrapitops.plugin.utilities.player.IPlayer;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import java.net.InetAddress;
import java.util.*;
import java.util.stream.Collectors;
/**
* This class is used for storing information about a player during runtime.
*
@ -64,7 +57,7 @@ public class UserData {
* All Collections are left empty: locations, nicknames, ips, sessions,
* playerKills. Because nicknames is empty, lastNick is an empty string.
*
* gmTimes Hashmap will contain 4 '0L' values: SURVIVAL, CREATIVE,
* gmTimes HashMap will contain 4 '0L' values: SURVIVAL, CREATIVE,
* ADVENTURE, SPECTATOR
*
* @param uuid UUID of the player
@ -106,7 +99,7 @@ public class UserData {
* All Collections are left empty: locations, nicknames, ips, sessions,
* playerKills. Because nicknames is empty, lastNick is an empty string.
*
* gmTimes Hashmap will contain 4 '0L' values: SURVIVAL, CREATIVE,
* gmTimes HashMap will contain 4 '0L' values: SURVIVAL, CREATIVE,
* ADVENTURE, SPECTATOR
*
* @param player IPlayer object.
@ -135,7 +128,7 @@ public class UserData {
* All Collections are left empty: locations, nicknames, ips, sessions,
* playerKills. Because nicknames is empty, lastNick is an empty string.
*
* gmTimes Hashmap will contain 4 '0L' values: SURVIVAL, CREATIVE,
* gmTimes HashMap will contain 4 '0L' values: SURVIVAL, CREATIVE,
* ADVENTURE, SPECTATOR
*
* lastGM will be set as SURVIVAL
@ -760,57 +753,32 @@ public class UserData {
if (getClass() != obj.getClass()) {
return false;
}
final UserData other = (UserData) obj;
if (this.registered != other.registered) {
return false;
}
// if (this.lastPlayed != other.lastPlayed) {
// return false;
// }
if (this.playTime != other.playTime) {
return false;
}
if (this.loginTimes != other.loginTimes) {
return false;
}
if (this.timesKicked != other.timesKicked) {
return false;
}
if (this.lastGmSwapTime != other.lastGmSwapTime) {
return false;
}
if (this.mobKills != other.mobKills) {
return false;
}
if (this.deaths != other.deaths) {
return false;
}
if (!Objects.equals(this.lastNick, other.lastNick)) {
return false;
}
if (!Objects.equals(this.name, other.name)) {
return false;
}
if (!Objects.equals(this.uuid, other.uuid)) {
return false;
}
if (!Objects.equals(this.ips, other.ips)) {
return false;
}
if (!Objects.equals(this.nicknames, other.nicknames)) {
return false;
}
if (!Objects.equals(this.lastGamemode, other.lastGamemode)) {
return false;
}
if (!Objects.equals(this.gmTimes, other.gmTimes)) {
return false;
}
return Objects.equals(this.playerKills, other.playerKills) && Objects.equals(this.sessions, other.sessions);
return this.registered == other.registered
&& this.playTime == other.playTime
&& this.loginTimes == other.loginTimes
&& this.timesKicked == other.timesKicked
&& this.lastGmSwapTime == other.lastGmSwapTime
&& this.mobKills == other.mobKills
&& this.deaths == other.deaths
&& Objects.equals(this.lastNick, other.lastNick)
&& Objects.equals(this.name, other.name)
&& Objects.equals(this.uuid, other.uuid)
&& Objects.equals(this.ips, other.ips)
&& Objects.equals(this.nicknames, other.nicknames)
&& Objects.equals(this.lastGamemode, other.lastGamemode)
&& Objects.equals(this.gmTimes, other.gmTimes)
&& Objects.equals(this.playerKills, other.playerKills)
&& Objects.equals(this.sessions, other.sessions);
}
/**
* Check wether or not the object should be cleared from cache after it has
* Check whether or not the object should be cleared from cache after it has
* been saved.
*
* @return true/false
@ -820,7 +788,7 @@ public class UserData {
}
/**
* Set wether or not the object should be cleared from cache after it has
* Set whether or not the object should be cleared from cache after it has
* been saved.
*
* @param clearAfterSave true/false

View File

@ -7,7 +7,7 @@ package main.java.com.djrapitops.plan.data.additional;
* The enum determines what should be done to the return value of
* PluginData.getValue() method when the analysis is run.
*
* Refer to the documentation on github for additional information.
* Refer to the documentation on GitHub for additional information.
*
* @author Rsl1122
* @since 3.1.0

View File

@ -1,17 +1,13 @@
package main.java.com.djrapitops.plan.data.additional;
import com.djrapitops.pluginbridge.plan.Bridge;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* Class responsible for hooking to other plugins and managing the %plugins%
* placeholder on Analysis and Inspect pages.
@ -46,7 +42,7 @@ public class HookHandler {
* The plugin data will appear on Analysis and/or Inspect pages depending on
* how the extending object is set up.
*
* Refer to documentation on github for more information.
* Refer to documentation on GitHub for more information.
*
* @param dataSource an object extending the PluginData class.
*/
@ -76,7 +72,7 @@ public class HookHandler {
/**
* Used to get the Layout with PluginData placeholders to replace %plugins%
* placeholder on analysis.hmtl.
* placeholder on analysis.html.
*
* @return html, getPluginsTabLayout-method
* @see HtmlUtils
@ -89,7 +85,7 @@ public class HookHandler {
/**
* Used to get the Layout with PluginData placeholders to replace %plugins%
* placeholder on player.hmtl.
* placeholder on player.html.
*
* @return html, getPluginsTabLayout-method
* @see HtmlUtils

View File

@ -31,7 +31,7 @@ public abstract class PluginData {
/**
* Name of the plugin the data is coming from.
*
* All datasources with the same sourcePlugin will be placed in the same
* All sources of data with the same sourcePlugin will be placed in the same
* "box" in the "Plugins" tab.
*
* A box has a max height of 600px, and higher than that will add a
@ -277,7 +277,7 @@ public abstract class PluginData {
/**
* If a PluginData object has same placeholder, sourcePlugin and
* analysisTypes, it is considired equal.
* analysisTypes, it is considered equal.
*
* @param obj Another Object.
* @return Is current object equal to given object.
@ -294,13 +294,10 @@ public abstract class PluginData {
return false;
}
final PluginData other = (PluginData) obj;
if (this.analysisOnly != other.analysisOnly) {
return false;
}
if (!Objects.equals(this.placeholder, other.placeholder)) {
return false;
}
return Objects.equals(this.sourcePlugin, other.sourcePlugin) && Objects.equals(this.analysisTypes, other.analysisTypes);
return this.analysisOnly == other.analysisOnly
&& Objects.equals(this.placeholder, other.placeholder)
&& Objects.equals(this.sourcePlugin, other.sourcePlugin)
&& Objects.equals(this.analysisTypes, other.analysisTypes);
}
@Override

View File

@ -73,10 +73,7 @@ public class GeolocationPart extends RawData<GeolocationPart> {
}
public void addGeoloc(String country) {
if (geolocations.get(country) == null) {
return;
}
geolocations.replace(country, geolocations.get(country) + 1);
geolocations.computeIfPresent(country, (computedCountry, amount) -> amount + 1);
}
}

View File

@ -1,20 +1,17 @@
package main.java.com.djrapitops.plan.data.cache;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.ITask;
import com.djrapitops.plugin.utilities.player.IPlayer;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.*;
import main.java.com.djrapitops.plan.data.cache.queue.*;
import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.queue.DataCacheClearQueue;
import main.java.com.djrapitops.plan.data.cache.queue.DataCacheGetQueue;
import main.java.com.djrapitops.plan.data.cache.queue.DataCacheProcessQueue;
import main.java.com.djrapitops.plan.data.cache.queue.DataCacheSaveQueue;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import main.java.com.djrapitops.plan.data.handling.info.LogoutInfo;
import main.java.com.djrapitops.plan.data.handling.info.ReloadInfo;
@ -25,16 +22,19 @@ import main.java.com.djrapitops.plan.utilities.NewPlayerCreator;
import main.java.com.djrapitops.plan.utilities.analysis.MathUtils;
import main.java.com.djrapitops.plan.utilities.comparators.HandlingInfoTimeComparator;
import java.sql.SQLException;
import java.util.*;
/**
* This Class contains the Cache.
*
* This class is the main processing class that initialises Save, Clear, Process
* and Get queue and Starts the asyncronous save task.
* and Get queue and Starts the asynchronous save task.
*
* It is used to store command use, locations, active sessions and UserData
* objects in memory.
*
* It's methods can be used to access all the data it stores and to clear them.
* Its methods can be used to access all the data it stores and to clear them.
*
* @author Rsl1122
* @since 2.0.0
@ -63,7 +63,7 @@ public class DataCacheHandler extends SessionCache {
* Class Constructor.
*
* Gets the Database from the plugin. Starts the queues. Registers
* Asyncronous Periodic Save Task
* Asynchronous Periodic Save Task
*
* @param plugin Current instance of Plan
*/
@ -112,7 +112,7 @@ public class DataCacheHandler extends SessionCache {
}
/**
* Used to start the Asyncronous Save Task.
* Used to start the Asynchronous Save Task.
*
* @throws IllegalArgumentException BukkitRunnable was given wrong
* parameters.
@ -131,7 +131,7 @@ public class DataCacheHandler extends SessionCache {
clearAfterXsaves = configValue;
}
DataCacheHandler handler = this;
ITask asyncPeriodicCacheSaveTask = plugin.getRunnableFactory().createNew(new AbsRunnable("PeriodicCacheSaveTask") {
plugin.getRunnableFactory().createNew(new AbsRunnable("PeriodicCacheSaveTask") {
private int timesSaved = 0;
@Override
@ -223,7 +223,7 @@ public class DataCacheHandler extends SessionCache {
* Should only be called from Async thread
*/
public void saveCachedUserData() {
List<UserData> data = new ArrayList<>();
Set<UserData> data = new HashSet<>();
data.addAll(dataCache.values());
try {
db.saveMultipleUserData(data);
@ -335,7 +335,7 @@ public class DataCacheHandler extends SessionCache {
/**
* Saves the cached CommandUse.
*
* Should be only called from an Asyncronous Thread.
* Should be only called from an Asynchronous Thread.
*/
public void saveCommandUse() {
try {
@ -364,10 +364,10 @@ public class DataCacheHandler extends SessionCache {
}
List<List<TPS>> copy = new ArrayList<>(unsavedTPSHistory);
for (List<TPS> history : copy) {
final long lastdate = history.get(history.size() - 1).getDate();
final long lastDate = history.get(history.size() - 1).getDate();
final double averageTPS = MathUtils.averageDouble(history.stream().map(TPS::getTps));
final int averagePlayersOnline = (int) MathUtils.averageInt(history.stream().map(TPS::getPlayers));
averages.add(new TPS(lastdate, averageTPS, averagePlayersOnline));
averages.add(new TPS(lastDate, averageTPS, averagePlayersOnline));
}
unsavedTPSHistory.removeAll(copy);
return averages;
@ -378,7 +378,7 @@ public class DataCacheHandler extends SessionCache {
*/
public void saveHandlerDataToCache() {
final List<IPlayer> onlinePlayers = plugin.fetch().getOnlinePlayers();
onlinePlayers.stream().forEach((p) -> saveHandlerDataToCache(p, false));
onlinePlayers.forEach((p) -> saveHandlerDataToCache(p, false));
}
private void saveHandlerDataToCache(IPlayer player, boolean pool) {
@ -426,7 +426,7 @@ public class DataCacheHandler extends SessionCache {
*
* @param uuid Player's UUID.
*/
public void scheludeForClear(UUID uuid) {
public void scheduldeForClear(UUID uuid) {
clearTask.scheduleForClear(uuid);
}
@ -492,7 +492,7 @@ public class DataCacheHandler extends SessionCache {
* Calls all the methods that are ran when PlayerJoinEvent is fired
*/
public void handleReload() {
ITask asyncReloadCacheUpdateTask = plugin.getRunnableFactory().createNew(new AbsRunnable("ReloadCacheUpdateTask") {
plugin.getRunnableFactory().createNew(new AbsRunnable("ReloadCacheUpdateTask") {
@Override
public void run() {
final List<IPlayer> onlinePlayers = plugin.fetch().getOnlinePlayers();

View File

@ -0,0 +1,93 @@
package main.java.com.djrapitops.plan.data.cache;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Map;
/**
* This class contains the geolocation cache.
* <p>
* It caches all IPs with their matching country.
* <p>
* This cache uses the Google Guava {@link Cache} and has a capacity of 10.000 entries.
*
* @author Fuzzlemann
*/
public class GeolocationCacheHandler {
private static final Cache<String, String> geolocationCache = CacheBuilder.newBuilder()
.maximumSize(10000)
.build();
/**
* Retrieves the country in full length (e.g. United States) from the IP Address.
* <p>
* This method uses the {@code geolocationCache}, every first access is getting cached and then retrieved later.
*
* @param ipAddress The IP Address from which the country is retrieved
* @return The name of the country in full length.
* <p>
* An exception from that rule is when the country is unknown or the retrieval of the country failed in any way,
* if that happens, the phrase for unknown country set in the config will be returned.
* @see #getUncachedCountry(String)
*/
public static String getCountry(String ipAddress) {
Log.debug("Started country retrieval from IP Address " + ipAddress);
Map<String, String> geolocationMap = geolocationCache.asMap();
String country = geolocationMap.get(ipAddress);
Log.debug("Got country from " + ipAddress + " out of cache: " + country + " (if null, country wasn't cached)");
if (country != null) {
return country;
} else {
country = getUncachedCountry(ipAddress);
geolocationCache.put(ipAddress, country);
Log.debug("Got uncached country from IP Address " + ipAddress + ": " + country);
return country;
}
}
/**
* Retrieves the country in full length (e.g. United States) from the IP Address.
* <p>
* This method uses the free service of freegeoip.net. The maximum amount of requests is 15.000 per hour.
*
* @param ipAddress The IP Address from which the country is retrieved
* @return The name of the country in full length.
* <p>
* An exception from that rule is when the country is unknown or the retrieval of the country failed in any way,
* if that happens, the phrase for unknown country set in the config will be returned.
* @see <a href="http://freegeoip.net">http://freegeoip.net</a>
* @see #getCountry(String)
*/
private static String getUncachedCountry(String ipAddress) {
try {
Benchmark.start("getUncachedCountry");
URL url = new URL("http://freegeoip.net/csv/" + ipAddress);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String resultLine = in.readLine();
in.close();
String[] results = resultLine.split(",");
String result = results[2];
String country = result.isEmpty() ? Phrase.DEM_UNKNOWN.toString() : result;
Benchmark.stop("getUncachedCountry");
return country;
} catch (Exception exc) {
return Phrase.DEM_UNKNOWN.toString();
}
}
}

View File

@ -1,18 +1,19 @@
package main.java.com.djrapitops.plan.data.cache.queue;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import java.util.Collection;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
/**
* This Class strats the Clear Queue Thread, that clears data from DataCache.
* This Class contains the Clear Queue Thread, which is clearing data from the DataCache.
*
* @author Rsl1122
* @since 3.0.0
@ -22,7 +23,7 @@ public class DataCacheClearQueue extends Queue<UUID> {
/**
* Class constructor, starts the new Thread for clearing.
*
* @param handler current instance of DataCachehandler.
* @param handler current instance of DataCacheHandler.
*/
public DataCacheClearQueue(DataCacheHandler handler) {
super(new ArrayBlockingQueue(Settings.PROCESS_CLEAR_LIMIT.getNumber()));

View File

@ -1,14 +1,5 @@
package main.java.com.djrapitops.plan.data.cache.queue;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
@ -16,6 +7,11 @@ import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.database.Database;
import java.sql.SQLException;
import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* This Class is starts the Get Queue Thread, that fetches data from DataCache.
*
@ -36,7 +32,7 @@ public class DataCacheGetQueue extends Queue<Map<UUID, List<DBCallableProcessor>
}
/**
* Schedules UserData objects to be get for the given proecssors.
* Schedules UserData objects to be get for the given processors.
*
* @param uuid UUID of the player whose UserData object is fetched.
* @param processors Processors which process-method will be called after

View File

@ -1,15 +1,16 @@
package main.java.com.djrapitops.plan.data.cache.queue;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
/**
* This Class is starts the Process Queue Thread, that processes HandlingInfo
@ -23,7 +24,7 @@ public class DataCacheProcessQueue extends Queue<HandlingInfo> {
/**
* Class constructor, starts the new Thread for processing.
*
* @param handler current instance of DataCachehandler.
* @param handler current instance of DataCacheHandler.
*/
public DataCacheProcessQueue(DataCacheHandler handler) {
super(new ArrayBlockingQueue(20000));

View File

@ -1,12 +1,5 @@
package main.java.com.djrapitops.plan.data.cache.queue;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
@ -15,8 +8,16 @@ import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.database.Database;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.stream.Collectors;
/**
* This Class is starts the Save Queue Thread, that saves data to the Databse.
* This Class is starts the Save Queue Thread, that saves data to the Database.
*
* @author Rsl1122
* @since 3.0.0

View File

@ -16,7 +16,7 @@ public abstract class Queue<T> {
Setup<T> setup;
/**
* Consturctor, defines queue.
* Constructor, defines queue.
*
* @param queue BlockingQueue to use for this queue.
*/

View File

@ -1,9 +1,10 @@
package main.java.com.djrapitops.plan.data.handling;
import com.djrapitops.plugin.utilities.player.Gamemode;
import java.util.Map;
import main.java.com.djrapitops.plan.data.UserData;
import java.util.Map;
/**
* Class containing static methods for processing information contained in a
* GamemodeChangeEvent.
@ -33,10 +34,7 @@ public class GamemodeHandling {
}
lastGamemode = data.getLastGamemode();
Map<String, Long> times = data.getGmTimes();
Long currentGMTime = times.get(lastGamemode);
if (currentGMTime == null) {
currentGMTime = 0L;
}
long currentGMTime = times.getOrDefault(lastGamemode, 0L);
data.setPlayTime(data.getPlayTime() + (time - data.getLastPlayed()));
data.setLastPlayed(time);
long lastSwap = data.getLastGmSwapTime();

View File

@ -1,12 +1,9 @@
package main.java.com.djrapitops.plan.data.handling;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.GeolocationCacheHandler;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.URL;
/**
* Class containing static methods for processing information contained in a
@ -40,29 +37,15 @@ public class LoginHandling {
/**
* Updates the geolocation of the player.
*
* Uses free service of freegeoip.net. 10000 requests can be sent per hour.
* Uses free service of freegeoip.net. 15000 requests can be sent per hour.
*
* @param ip InetAddress used for location.
* @param data UserData of the player.
* @see GeolocationCacheHandler
*/
public static void updateGeolocation(InetAddress ip, UserData data) {
try {
StringBuilder result = new StringBuilder();
URL url = new URL("http://freegeoip.net/csv/" + ip.getHostAddress());
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String geoLocation = GeolocationCacheHandler.getCountry(ip.getHostAddress());
String resultline;
while ((resultline = in.readLine()) != null) {
result.append(resultline).append(",");
}
in.close();
String[] results = result.toString().split(",");
if (!results[2].isEmpty()) {
data.setGeolocation(results[2]);
}
} catch (Exception e) {
data.setGeolocation(Phrase.DEM_UNKNOWN + "");
}
data.setGeolocation(geoLocation);
}
}

View File

@ -3,12 +3,14 @@ package main.java.com.djrapitops.plan.data.listeners;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.help.HelpMap;
/**
* Event Listener for PlayerCommandPreprocessEvents.
@ -40,12 +42,23 @@ public class PlanCommandPreprocessListener implements Listener {
if (event.isCancelled()) {
return;
}
String cmd = event.getMessage().split(" ")[0].toLowerCase();
if (Settings.DO_NOT_LOG_UNKNOWN_COMMANDS.isTrue()) {
HelpMap helpMap = plugin.getServer().getHelpMap();
if (helpMap.getHelpTopic(cmd) == null) {
Log.debug("Ignored command, command is unknown");
return;
}
}
Player player = event.getPlayer();
if (player.hasPermission(Permissions.IGNORE_COMMANDUSE.getPermission())) {
Log.debug("Ignored command, player had ignore permission.");
return;
}
handler.handleCommand(event.getMessage().split(" ")[0].toLowerCase());
handler.handleCommand(cmd);
}
}

View File

@ -1,10 +1,8 @@
package main.java.com.djrapitops.plan.data.listeners;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.ITask;
import com.djrapitops.plugin.utilities.player.Gamemode;
import com.djrapitops.plugin.utilities.player.bukkit.BukkitPlayer;
import java.util.UUID;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
@ -22,6 +20,8 @@ import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import java.util.UUID;
/**
* Event Listener for PlayerJoin, PlayerQuit and PlayerKickEvents.
*
@ -59,7 +59,7 @@ public class PlanPlayerListener implements Listener {
UUID uuid = player.getUniqueId();
handler.startSession(uuid);
Log.debug(uuid + ": PlayerJoinEvent");
ITask asyncNewPlayerCheckTask = plugin.getRunnableFactory().createNew(new AbsRunnable("NewPlayerCheckTask") {
plugin.getRunnableFactory().createNew(new AbsRunnable("NewPlayerCheckTask") {
@Override
public void run() {
LoginInfo loginInfo = new LoginInfo(uuid, MiscUtils.getTime(), player.getAddress().getAddress(), player.isBanned(), player.getDisplayName(), Gamemode.wrap(player.getGameMode()), 1);
@ -112,8 +112,10 @@ public class PlanPlayerListener implements Listener {
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
handler.endSession(uuid);
Log.debug(uuid + ": PlayerKickEvent");
handler.addToPool(new LogoutInfo(uuid, MiscUtils.getTime(), player.isBanned(), Gamemode.wrap(player.getGameMode()), handler.getSession(uuid)));
handler.addToPool(new KickInfo(uuid));
handler.saveCachedData(uuid);
Log.debug(uuid + ": PlayerKickEvent_END");
}
}

View File

@ -2,14 +2,15 @@ package main.java.com.djrapitops.plan.data.listeners;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.AbsRunnable;
import java.util.ArrayList;
import java.util.List;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Class responsible for calculating TPS every second.
*
@ -32,15 +33,15 @@ public class TPSCountTimer extends AbsRunnable {
@Override
public void run() {
long nanotime = System.nanoTime();
long nanoTime = System.nanoTime();
long now = MiscUtils.getTime();
long diff = nanotime - lastCheckNano;
lastCheckNano = nanotime;
if (diff > nanotime) { // First run's diff = nanotime + 1, no calc possible.
long diff = nanoTime - lastCheckNano;
lastCheckNano = nanoTime;
if (diff > nanoTime) { // First run's diff = nanoTime + 1, no calc possible.
Log.debug("First run of TPSCountTimer Task.");
return;
}
diff -= TimeAmount.MILLISECOND.ns() * 40L; // 40ms Removed because the run appears to take 40-50ms, scewing the tps.
diff -= TimeAmount.MILLISECOND.ns() * 40L; // 40ms removed because the run appears to take 40-50ms, screwing the tps.
TPS tps = calculateTPS(diff, now);
history.add(tps);
if (history.size() >= 60) {

View File

@ -1,26 +1,17 @@
package main.java.com.djrapitops.plan.database;
import java.sql.SQLException;
import java.util.*;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.database.tables.CommandUseTable;
import main.java.com.djrapitops.plan.database.tables.GMTimesTable;
import main.java.com.djrapitops.plan.database.tables.IPsTable;
import main.java.com.djrapitops.plan.database.tables.KillsTable;
import main.java.com.djrapitops.plan.database.tables.LocationsTable;
import main.java.com.djrapitops.plan.database.tables.NicknamesTable;
import main.java.com.djrapitops.plan.database.tables.SecurityTable;
import main.java.com.djrapitops.plan.database.tables.SessionsTable;
import main.java.com.djrapitops.plan.database.tables.TPSTable;
import main.java.com.djrapitops.plan.database.tables.UsersTable;
import main.java.com.djrapitops.plan.database.tables.VersionTable;
import main.java.com.djrapitops.plan.database.tables.*;
import java.sql.SQLException;
import java.util.*;
/**
* Abstract class representing a Database.
*
* All methods should be only called from an asyncronous thread, unless stated
* All methods should be only called from an asynchronous thread, unless stated
* otherwise.
*
* @author Rsl1122

View File

@ -1,20 +1,23 @@
package main.java.com.djrapitops.plan.database.databases;
import com.djrapitops.plugin.task.AbsRunnable;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.KillData;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.tables.*;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import java.net.InetAddress;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.*;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.tables.*;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
/**
*
@ -52,8 +55,6 @@ public abstract class SQLDB extends Database {
}
/**
*
* @param plugin
* @throws IllegalArgumentException
* @throws IllegalStateException
*/
@ -318,7 +319,7 @@ public abstract class SQLDB extends Database {
List<SessionData> sessions = sessionsTable.getSessionData(userId);
data.addSessions(sessions);
data.setPlayerKills(killsTable.getPlayerKills(userId));
processors.stream().forEach((processor) -> processor.process(data));
processors.forEach((processor) -> processor.process(data));
Benchmark.stop("Database: Give userdata to processors");
setAvailable();
}

View File

@ -1,16 +1,13 @@
package main.java.com.djrapitops.plan.database.tables;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import java.util.*;
/**
*
@ -151,7 +148,7 @@ public class GMTimesTable extends Table {
}
PreparedStatement statement = null;
String[] gms = getGMKeyArray();
int update = 0;
int update;
try {
statement = prepareStatement(
"UPDATE " + tableName + " SET "

View File

@ -246,9 +246,6 @@ public class UsersTable extends Table {
set = statement.executeQuery();
while (set.next()) {
UUID uuid = UUID.fromString(set.getString(columnUUID));
if (uuid == null) {
continue;
}
uuids.add(uuid);
}
return uuids;

View File

@ -1,8 +1,9 @@
package main.java.com.djrapitops.plan.ui.html;
import java.util.List;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import java.util.List;
/**
*
* @author Rsl1122
@ -12,8 +13,8 @@ public class RecentPlayersButtonsCreator {
/**
* Creates recent players buttons inside a p-tag.
*
* @param names Playernames sorted by last playtime.
* @param limit How many playes will be shown
* @param names The name of players sorted by last playtime.
* @param limit How many players will be shown
* @return html p-tag list of recent logins.
*/
public static String createRecentLoginsButtons(List<String> names, int limit) {

View File

@ -1,15 +1,5 @@
package main.java.com.djrapitops.plan.ui.html.graphs;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.SessionData;
@ -19,6 +9,11 @@ import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.analysis.MathUtils;
import main.java.com.djrapitops.plan.utilities.analysis.Point;
import java.io.Serializable;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
*
* @author Rsl1122
@ -84,11 +79,11 @@ public class PlayerActivityGraphCreator {
}
if (Settings.ANALYSIS_REMOVE_OUTLIERS.isTrue()) {
long average = MathUtils.averageLong(playersOnline.stream());
double standardDiviation = getStandardDiviation(playersOnline, average);
if (standardDiviation > 3.5) {
double standardDeviation = getStandardDeviation(playersOnline, average);
if (standardDeviation > 3.5) {
for (int i = 0; i < playersOnline.size(); i++) {
long value = playersOnline.get(i);
if (value - average > 3 * standardDiviation) {
if (value - average > 3 * standardDeviation) {
playersOnline.set(i, (long) Plan.getInstance().getVariable().getMaxPlayers() + 10);
}
}
@ -97,7 +92,7 @@ public class PlayerActivityGraphCreator {
return new String[]{playersOnline.toString(), labels.toString()};
}
private static double getStandardDiviation(List<Long> players, long avg) {
private static double getStandardDeviation(List<Long> players, long avg) {
List<Double> valueMinusAvg = players.stream()
.map(p -> Math.pow(Math.abs(p - avg), 2))
.collect(Collectors.toList());
@ -112,7 +107,7 @@ public class PlayerActivityGraphCreator {
Set<Long> keys = new HashSet<>(starts.keySet());
keys.addAll(ends.keySet());
Map<Long, Integer> change = new HashMap<>();
keys.stream().forEach((key) -> {
keys.forEach((key) -> {
int value = 0;
if (starts.containsKey(key)) {
value += starts.get(key);

View File

@ -67,13 +67,13 @@ public class PunchCardGraphCreator {
}
if (Settings.ANALYSIS_REMOVE_OUTLIERS.isTrue()) {
int avg = findAverage(dataArray);
double standardDiviation = getStandardDiviation(dataArray, avg);
Log.debug("Diviation: " + standardDiviation);
if (standardDiviation > 3.5) {
double standardDeviation = getStandardDeviation(dataArray, avg);
Log.debug("Deviation: " + standardDeviation);
if (standardDeviation > 3.5) {
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 24; j++) {
int value = dataArray[i][j];
if (value - avg > 3 * standardDiviation) {
if (value - avg > 3 * standardDeviation) {
dataArray[i][j] = avg;
}
}
@ -83,7 +83,7 @@ public class PunchCardGraphCreator {
return dataArray;
}
private static double getStandardDiviation(int[][] array, int avg) {
private static double getStandardDeviation(int[][] array, int avg) {
int[][] valueMinusAvg = new int[7][24];
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 24; j++) {

View File

@ -1,13 +1,14 @@
package main.java.com.djrapitops.plan.ui.html.tables;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.ui.html.Html;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.comparators.MapComparator;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
*
* @author Rsl1122
@ -38,6 +39,7 @@ public class CommandUseTableCreator {
Log.toLog("SortableCommandUseTableCreator", e);
Log.toLog("Cause: " + values[0] + " " + values[1], Log.getErrorsFilename());
}
i++;
}
}
Benchmark.stop("Create commanduse table");

View File

@ -127,7 +127,7 @@ public class Request implements Closeable {
/**
* Closes the Request.
*
* Closes the inputstream.
* Closes the InputStream.
*
* @throws IOException if the stream can not be closed.
*/

View File

@ -2,6 +2,20 @@ package main.java.com.djrapitops.plan.ui.webserver;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.WebUser;
import main.java.com.djrapitops.plan.database.tables.SecurityTable;
import main.java.com.djrapitops.plan.ui.html.DataRequestHandler;
import main.java.com.djrapitops.plan.ui.webserver.response.*;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
import main.java.com.djrapitops.plan.utilities.uuid.UUIDUtility;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@ -12,26 +26,6 @@ import java.sql.SQLException;
import java.util.Base64;
import java.util.UUID;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.WebUser;
import main.java.com.djrapitops.plan.database.tables.SecurityTable;
import main.java.com.djrapitops.plan.ui.html.DataRequestHandler;
import main.java.com.djrapitops.plan.ui.webserver.response.AnalysisPageResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.InspectPageResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.InternalErrorResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.NotFoundResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.PlayersPageResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.RedirectResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.Response;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
import main.java.com.djrapitops.plan.utilities.uuid.UUIDUtility;
/**
*
* @author Rsl1122
@ -63,7 +57,7 @@ public class WebSocketServer {
}
/**
* Starts up the Webserver in a Asyncronous thread.
* Starts up the Webserver in a Asynchronous thread.
*/
public void initServer() {
//Server is already enabled stop code

View File

@ -1,13 +1,14 @@
package main.java.com.djrapitops.plan.ui.webserver.response;
import java.io.OutputStream;
import java.util.List;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.ui.html.Html;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.comparators.UserDataNameComparator;
import java.io.OutputStream;
import java.util.List;
/**
*
* @author Rsl1122
@ -21,7 +22,7 @@ public class PlayersPageResponse extends Response {
super.setContent(buildContent(plugin.getInspectCache().getCachedUserData()));
}
public static final String buildContent(List<UserData> cached) {
public static String buildContent(List<UserData> cached) {
StringBuilder html = new StringBuilder();
int size = cached.size();
html.append("<h1>Cached Players</h1><p>")

View File

@ -18,14 +18,14 @@ public abstract class Response {
/**
* Class Constructor.
*
* @param output Website outputstream to write the response to.
* @param output Website OutputStream to write the response to.
*/
public Response(OutputStream output) {
this.output = output;
}
/**
* Wrties the HTML to the Outputstream according to the requested page.
* Writes the HTML to the OutputStream according to the requested page.
*
* @throws IOException
*/

View File

@ -36,6 +36,7 @@ public class HtmlUtils {
resourceStream = plugin.getResource(fileName);
scanner = new Scanner(resourceStream);
}
StringBuilder html = new StringBuilder();
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
@ -77,7 +78,7 @@ public class HtmlUtils {
String ip = Plan.getInstance().getVariable().getIp() + ":" + port;
boolean useAlternativeIP = Settings.SHOW_ALTERNATIVE_IP.isTrue();
if (useAlternativeIP) {
ip = Settings.ALTERNATIVE_IP.toString().replaceAll("%port%", "" + port);
ip = Settings.ALTERNATIVE_IP.toString().replace("%port%", "" + port);
}
return "//" + ip + "/server";
}
@ -101,7 +102,7 @@ public class HtmlUtils {
String ip = Plan.getInstance().getVariable().getIp() + ":" + port;
boolean useAlternativeIP = Settings.SHOW_ALTERNATIVE_IP.isTrue();
if (useAlternativeIP) {
ip = Settings.ALTERNATIVE_IP.toString().replaceAll("%port%", "" + port);
ip = Settings.ALTERNATIVE_IP.toString().replace("%port%", "" + port);
}
return "//" + ip + "/player/" + playerName;
}
@ -163,7 +164,7 @@ public class HtmlUtils {
StringBuilder html = new StringBuilder();
html.append(Html.HEADER.parse(name));
html.append(Html.PLUGIN_CONTAINER_START.parse());
placeholders.stream().forEach(html::append);
placeholders.forEach(html::append);
html.append("</div>");
return html.toString();
}
@ -179,13 +180,13 @@ public class HtmlUtils {
Html.COLOR_a, Html.COLOR_b, Html.COLOR_c, Html.COLOR_d, Html.COLOR_e, Html.COLOR_f};
for (Html html : replacer) {
string = string.replaceAll("§" + html.name().charAt(6), html.parse());
string = string.replace("§" + html.name().charAt(6), html.parse());
}
int spans = string.split("<span").length - 1;
for (int i = 0; i < spans; i++) {
string = Html.SPAN.parse(string);
}
return string.replaceAll("§r", "");
return string.replace("§r", "");
}
public static String separateWithQuotes(String... strings) {

View File

@ -29,7 +29,7 @@ public class ManageUtils {
*/
public static boolean backup(String dbName, Database copyFromDB) throws SQLException {
Plan plugin = Plan.getInstance();
String timeStamp = new Date().toString().substring(4, 10).replaceAll(" ", "-").replaceAll(":", "-");
String timeStamp = new Date().toString().substring(4, 10).replace(" ", "-");
String fileName = dbName + "-backup-" + timeStamp;
SQLiteDB backupDB = new SQLiteDB(plugin, fileName);
Collection<UUID> uuids = ManageUtils.getUUIDS(copyFromDB);
@ -95,7 +95,7 @@ public class ManageUtils {
.anyMatch(s -> sessions.stream()
.filter(ses -> !ses.equals(s))
.map(SessionData::getSessionStart)
.anyMatch((Long start) -> (Math.abs(s.getSessionEnd() - start) < threshold)));
.anyMatch(start -> Math.abs(s.getSessionEnd() - start) < threshold));
}
/**

View File

@ -1,11 +1,11 @@
package main.java.com.djrapitops.plan.utilities;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
/**
* Password Encryption utility.
@ -98,7 +98,7 @@ public class PassEncryptUtil {
);
}
int iterations = 0;
int iterations;
try {
iterations = Integer.parseInt(params[ITERATION_INDEX]);
} catch (NumberFormatException ex) {
@ -113,7 +113,7 @@ public class PassEncryptUtil {
);
}
byte[] salt = null;
byte[] salt;
try {
salt = fromBase64(params[SALT_INDEX]);
} catch (IllegalArgumentException ex) {
@ -122,7 +122,7 @@ public class PassEncryptUtil {
);
}
byte[] hash = null;
byte[] hash;
try {
hash = fromBase64(params[PBKDF2_INDEX]);
} catch (IllegalArgumentException ex) {
@ -131,7 +131,7 @@ public class PassEncryptUtil {
);
}
int storedHashSize = 0;
int storedHashSize;
try {
storedHashSize = Integer.parseInt(params[HASH_SIZE_INDEX]);
} catch (NumberFormatException ex) {

View File

@ -1,33 +1,16 @@
package main.java.com.djrapitops.plan.utilities.analysis;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.ITask;
import com.djrapitops.plugin.utilities.Verify;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.AnalysisData;
import main.java.com.djrapitops.plan.data.KillData;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.*;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.data.analysis.ActivityPart;
import main.java.com.djrapitops.plan.data.analysis.GamemodePart;
import main.java.com.djrapitops.plan.data.analysis.GeolocationPart;
import main.java.com.djrapitops.plan.data.analysis.JoinInfoPart;
import main.java.com.djrapitops.plan.data.analysis.KillPart;
import main.java.com.djrapitops.plan.data.analysis.PlayerCountPart;
import main.java.com.djrapitops.plan.data.analysis.PlaytimePart;
import main.java.com.djrapitops.plan.data.analysis.*;
import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler;
@ -38,6 +21,9 @@ import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.comparators.UserDataLastPlayedComparator;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* @author Rsl1122
@ -59,10 +45,10 @@ public class Analysis {
}
/**
* Analyzes the data of all offlineplayers on the server.
* Analyzes the data of all offline players on the server.
*
* First retrieves all Offlineplayers and checks those that are in the
* database. Then Runs a new Analysis Task Asyncronously. Saves AnalysisData
* First retrieves all offline players and checks those that are in the
* database. Then Runs a new Analysis Task Asynchronously. Saves AnalysisData
* to the provided Cache. Saves all UserData to InspectCache for 15 minutes.
*
* @param analysisCache Cache that the data is saved to.
@ -74,7 +60,7 @@ public class Analysis {
plugin.processStatus().startExecution("Analysis");
log(Phrase.ANALYSIS_START + "");
// Async task for Analysis
ITask asyncAnalysisTask = plugin.getRunnableFactory().createNew(new AbsRunnable("AnalysisTask") {
plugin.getRunnableFactory().createNew(new AbsRunnable("AnalysisTask") {
@Override
public void run() {
taskId = this.getTaskId();
@ -264,7 +250,7 @@ public class Analysis {
long now = MiscUtils.getTime();
Benchmark.start("Analysis: Fill Dataset");
rawData.stream().forEach((uData) -> {
rawData.forEach((uData) -> {
uData.access();
Map<String, Long> gmTimes = uData.getGmTimes();
String[] gms = new String[]{"SURVIVAL", "CREATIVE", "ADVENTURE", "SPECTATOR"};

View File

@ -1,9 +1,5 @@
package main.java.com.djrapitops.plan.utilities.analysis;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.SessionData;
@ -12,6 +8,11 @@ import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
*
* @author Rsl1122
@ -216,7 +217,7 @@ public class AnalysisUtils {
long now = MiscUtils.getTime();
long nowMinusScale = now - scale;
Set<UUID> uniqueJoins = new HashSet<>();
sessions.keySet().stream().forEach((uuid) -> {
sessions.keySet().forEach((uuid) -> {
List<SessionData> s = sessions.get(uuid);
for (SessionData session : s) {
if (session.getSessionStart() < nowMinusScale) {
@ -238,7 +239,7 @@ public class AnalysisUtils {
Map<Integer, Set<UUID>> uniqueJoins = new HashMap<>();
long now = MiscUtils.getTime();
long nowMinusScale = now - scale;
sessions.keySet().stream().forEach((uuid) -> {
sessions.keySet().forEach((uuid) -> {
List<SessionData> s = sessions.get(uuid);
for (SessionData session : s) {
if (scale != -1) {

View File

@ -25,7 +25,8 @@ public class ExportUtility {
/**
*
* @return @throws IOException
* @return
* @throws IOException
*/
public static File getFolder() throws IOException {
String path = Settings.ANALYSIS_EXPORT_PATH.toString();
@ -91,7 +92,7 @@ public class ExportUtility {
* @throws FileNotFoundException
* @throws IOException
*/
public static void writeInspectHtml(UserData userData, File playersFolder) throws FileNotFoundException, IOException {
public static void writeInspectHtml(UserData userData, File playersFolder) throws IOException {
if (!Settings.ANALYSIS_EXPORT.isTrue()) {
return;
}
@ -100,9 +101,7 @@ public class ExportUtility {
File playerFolder = new File(playersFolder, userData.getName());
playerFolder.mkdir();
File inspectHtmlFile = new File(playerFolder, "index.html");
if (inspectHtmlFile.exists()) {
inspectHtmlFile.delete();
}
inspectHtmlFile.delete();
Files.write(inspectHtmlFile.toPath(), Collections.singletonList(inspectHtml));
}
@ -113,7 +112,7 @@ public class ExportUtility {
* @throws FileNotFoundException
* @throws IOException
*/
public static void writeAnalysisHtml(AnalysisData analysisData, File serverFolder) throws FileNotFoundException, IOException {
public static void writeAnalysisHtml(AnalysisData analysisData, File serverFolder) throws IOException {
if (!Settings.ANALYSIS_EXPORT.isTrue()) {
return;
}
@ -121,16 +120,15 @@ public class ExportUtility {
PlaceholderUtils.getAnalysisReplaceRules(analysisData))
.replace(HtmlUtils.getInspectUrl(""), "../player/");
File analysisHtmlFile = new File(serverFolder, "index.html");
if (analysisHtmlFile.exists()) {
analysisHtmlFile.delete();
}
analysisHtmlFile.delete();
Files.write(analysisHtmlFile.toPath(), Collections.singletonList(analysisHtml));
}
private static void writePlayersPageHtml(List<UserData> rawData, File playersfolder) throws IOException {
private static void writePlayersPageHtml(List<UserData> rawData, File playersFolder) throws IOException {
String playersHtml = PlayersPageResponse.buildContent(rawData);
playersfolder.mkdirs();
File playersHtmlFile = new File(playersfolder, "index.html");
playersFolder.mkdirs();
File playersHtmlFile = new File(playersFolder, "index.html");
Files.write(playersHtmlFile.toPath(), Collections.singletonList(playersHtml));
}

View File

@ -3,6 +3,8 @@ package main.java.com.djrapitops.plan.utilities.analysis;
import java.io.Serializable;
import java.util.Collection;
import java.util.OptionalDouble;
import java.util.OptionalInt;
import java.util.OptionalLong;
import java.util.stream.Stream;
/**
@ -124,13 +126,13 @@ public class MathUtils {
* @return
*/
public static int getBiggest(Collection<Integer> values) {
int biggest = 1;
for (Integer value : values) {
if (value > biggest) {
biggest = value;
}
OptionalInt biggest = values.stream().mapToInt(i -> i).max();
if (biggest.isPresent()) {
return biggest.getAsInt();
} else {
return 1;
}
return biggest;
}
/**
@ -139,12 +141,12 @@ public class MathUtils {
* @return
*/
public static long getBiggestLong(Collection<Long> values) {
long biggest = 1;
for (Long value : values) {
if (value > biggest) {
biggest = value;
}
OptionalLong biggest = values.stream().mapToLong(i -> i).max();
if (biggest.isPresent()) {
return biggest.getAsLong();
} else {
return 1;
}
return biggest;
}
}

View File

@ -20,7 +20,7 @@ public class MapComparator {
*/
public static List<String[]> sortByValue(Map<String, Integer> hashMap) {
List<String[]> sortedList = new ArrayList<>();
hashMap.keySet().stream().forEach((key) -> sortedList.add(new String[]{"" + hashMap.get(key), key}));
hashMap.keySet().forEach((key) -> sortedList.add(new String[]{"" + hashMap.get(key), key}));
sortedList.sort(Comparator.comparingInt(strings -> Integer.parseInt(strings[0])));
return sortedList;
}
@ -32,7 +32,7 @@ public class MapComparator {
*/
public static List<String[]> sortByValueLong(Map<String, Long> hashMap) {
List<String[]> sortedList = new ArrayList<>();
hashMap.keySet().stream().forEach((key) -> sortedList.add(new String[]{"" + hashMap.get(key), key}));
hashMap.keySet().forEach((key) -> sortedList.add(new String[]{"" + hashMap.get(key), key}));
sortedList.sort(Comparator.comparing(strings -> Long.valueOf(strings[0])));
return sortedList;
}

View File

@ -41,6 +41,8 @@ Settings:
Customization:
ServerName: 'Plan'
SmallHeadImagesOnAnalysisPlayerlist: true
Data:
DoNotLogUnknownCommands: false
Graphs:
PlayersOnlineGraph:
UseMaxPlayersAsScale: true

View File

@ -1,14 +1,6 @@
package test.java.main.java.com.djrapitops.plan.data;
import com.djrapitops.plugin.utilities.player.IOfflinePlayer;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.UserData;
@ -19,9 +11,15 @@ import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.MockUtils;
import test.java.utils.TestInit;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import test.java.utils.TestInit;
/**
*
@ -348,7 +346,7 @@ public class UserDataTest {
* @throws IOException
*/
@Test
public void testPlayerConstructorBrokenBanned() throws IOException, Exception {
public void testPlayerConstructorBrokenBanned() throws Exception {
TestInit.init();
test = new UserData(MockUtils.mockBrokenPlayer());
UserData expected = new UserData(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"), 1234567L, true, "SURVIVAL", "TestName", true);
@ -372,7 +370,7 @@ public class UserDataTest {
* @throws IOException
*/
@Test
public void testOfflinePlayerConstructorBrokenBanned() throws IOException, Exception {
public void testOfflinePlayerConstructorBrokenBanned() throws Exception {
TestInit.init();
test = new UserData((IOfflinePlayer) MockUtils.mockBrokenPlayer());
UserData expected = new UserData(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"), 1234567L, true, "SURVIVAL", "TestName", true);

View File

@ -5,13 +5,6 @@
*/
package test.java.main.java.com.djrapitops.plan.data.cache.queue;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.sql.SQLException;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
@ -22,7 +15,6 @@ import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@ -32,6 +24,17 @@ import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.MockUtils;
import test.java.utils.TestInit;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.sql.SQLException;
import java.util.UUID;
import java.util.stream.Collectors;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
*
* @author Rsl1122
@ -56,7 +59,7 @@ public class DataCacheGetQueueTest {
* @throws Exception
*/
@Before
public void setUp() throws IOException, Exception {
public void setUp() throws Exception {
TestInit t = TestInit.init();
assertTrue("Not set up", t.setUp());
plan = t.getPlanMock();

View File

@ -5,22 +5,6 @@
*/
package test.java.main.java.com.djrapitops.plan.database;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.KillData;
import main.java.com.djrapitops.plan.data.SessionData;
@ -35,7 +19,8 @@ import main.java.com.djrapitops.plan.utilities.ManageUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.*;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitScheduler;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
@ -44,9 +29,20 @@ import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.MockUtils;
import test.java.utils.TestInit;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.sql.SQLException;
import java.util.*;
import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import test.java.utils.TestInit;
/**
*
@ -73,7 +69,7 @@ public class DatabaseTest {
* @throws Exception
*/
@Before
public void setUp() throws IOException, Exception {
public void setUp() throws Exception {
TestInit t = TestInit.init();
plan = t.getPlanMock();
db = new SQLiteDB(plan, "debug" + MiscUtils.getTime()) {

View File

@ -5,11 +5,8 @@
*/
package test.java.main.java.com.djrapitops.plan.utilities;
import java.io.FileNotFoundException;
import java.util.HashMap;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import org.bukkit.plugin.java.JavaPlugin;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@ -17,6 +14,12 @@ import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.TestInit;
import java.io.FileNotFoundException;
import java.util.HashMap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
*
* @author Rsl1122
@ -81,7 +84,7 @@ public class HtmlUtilsTest {
* @throws FileNotFoundException
*/
@Test
public void testGetServerAnalysisUrl() throws FileNotFoundException, Exception {
public void testGetServerAnalysisUrl() throws Exception {
TestInit.init();
String result = HtmlUtils.getServerAnalysisUrlWithProtocol();
String exp = "http://0.0.0.0:8804/server";

View File

@ -5,9 +5,6 @@
*/
package test.java.main.java.com.djrapitops.plan.utilities;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.utilities.ManageUtils;
import org.bukkit.plugin.java.JavaPlugin;
@ -16,9 +13,14 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.TestInit;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import test.java.utils.TestInit;
/**
*
@ -42,7 +44,7 @@ public class ManageUtilsTest {
* @throws Exception
*/
@Before
public void setUp() throws IOException, Exception {
public void setUp() throws Exception {
TestInit t = TestInit.init();
assertTrue("Not set up", t.setUp());
}
@ -173,5 +175,4 @@ public class ManageUtilsTest {
SessionData exp3 = new SessionData(threshold * 8, threshold * 10);
assertEquals(exp3, result.get(2));
}
}

View File

@ -2,8 +2,6 @@ package test.java.utils;
import com.djrapitops.plugin.utilities.player.Fetch;
import com.djrapitops.plugin.utilities.player.IPlayer;
import java.net.InetAddress;
import java.util.UUID;
import main.java.com.djrapitops.plan.data.KillData;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.UserData;
@ -15,6 +13,10 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import java.net.InetAddress;
import java.util.UUID;
import static org.powermock.api.mockito.PowerMockito.when;
/**
@ -37,7 +39,7 @@ public class MockUtils {
return NewPlayerCreator.createNewPlayer(mockIPlayer());
}
public static UserData mockUserWithmoreData() throws Exception {
public static UserData mockUserWithMoreData() throws Exception {
UserData mock = mockUser();
mock.addIpAddress(InetAddress.getByName("247.183.163.155"));
mock.addNickname("MoreNicks");

View File

@ -5,11 +5,6 @@ import com.djrapitops.plugin.utilities.BenchUtil;
import com.djrapitops.plugin.utilities.log.BukkitLog;
import com.djrapitops.plugin.utilities.player.Fetch;
import com.djrapitops.plugin.utilities.status.ProcessStatus;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.logging.Logger;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.ServerVariableHolder;
import main.java.com.djrapitops.plan.Settings;
@ -18,6 +13,13 @@ import org.bukkit.Server;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.powermock.api.mockito.PowerMockito;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.logging.Logger;
import static org.junit.Assert.assertTrue;
import static org.powermock.api.mockito.PowerMockito.when;
@ -50,7 +52,7 @@ public class TestInit {
YamlConfiguration config = mockConfig();
when(planMock.getConfig()).thenReturn(config);
File testFolder = getEmptyTestfolder();
File testFolder = getEmptyTestFolder();
when(planMock.getDataFolder()).thenReturn(testFolder);
// Html Files
@ -91,7 +93,7 @@ public class TestInit {
return mockServer;
}
private File getEmptyTestfolder() throws IOException {
private File getEmptyTestFolder() throws IOException {
File testFolder = new File("temporaryTestFolder");
if (testFolder.exists()) {
for (File f : testFolder.listFiles()) {