geolocationCache = CacheBuilder.newBuilder()
.build();
@@ -59,39 +69,48 @@ public class GeolocationCache {
/**
* Retrieves the country in full length (e.g. United States) from the IP Address.
*
- * This method uses the free service of freegeoip.net. The maximum amount of requests is 15.000 per hour.
- *
+ * This product includes GeoLite2 data created by MaxMind, available from
+ * http://www.maxmind.com.
* @param ipAddress The IP Address from which the country is retrieved
* @return The name of the country in full length.
*
* An exception from that rule is when the country is unknown or the retrieval of the country failed in any way,
* if that happens, "Not Known" will be returned.
- * @see http://freegeoip.net
+ * @see http://maxmind.com
* @see #getCountry(String)
*/
private static String getUncachedCountry(String ipAddress) {
- URL url;
-
- String urlString = "http://freegeoip.net/csv/" + ipAddress;
- String unknownString = "Not Known";
-
try {
- url = new URL(urlString);
- } catch (MalformedURLException e) {
- Log.error("The URL \"" + urlString + "\" couldn't be converted to URL: " + e.getCause()); //Shouldn't ever happen
- return unknownString;
+ checkDB();
+
+ try (DatabaseReader reader = new DatabaseReader.Builder(geolocationDB).build()) {
+ InetAddress inetAddress = InetAddress.getByName(ipAddress);
+
+ CountryResponse response = reader.country(inetAddress);
+ Country country = response.getCountry();
+
+ return country.getName();
+ }
+
+ } catch (IOException | GeoIp2Exception e) {
+ return "Not Known";
+ }
+ }
+
+ /**
+ * Checks if the DB exists, if not, it downloads it
+ *
+ * @throws IOException when an error at download or saving the DB happens
+ */
+ public static void checkDB() throws IOException {
+ if (geolocationDB.exists()) {
+ return;
}
- try (BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
- String resultLine = in.readLine();
- Log.debug("Result for country request for " + ipAddress + ": " + resultLine);
-
- String[] results = resultLine.split(",");
- String result = results[2];
-
- return result.isEmpty() ? unknownString : result;
- } catch (Exception exc) {
- return unknownString;
+ URL downloadSite = new URL("http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz");
+ try (ReadableByteChannel rbc = Channels.newChannel(new GZIPInputStream(downloadSite.openStream()));
+ FileOutputStream fos = new FileOutputStream(geolocationDB.getAbsoluteFile())) {
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
}
}
@@ -115,6 +134,9 @@ public class GeolocationCache {
return geolocationCache.asMap().containsKey(ipAddress);
}
+ /**
+ * Clears the cache
+ */
public static void clearCache() {
geolocationCache.invalidateAll();
}
diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java
index 8abf228b4..cea543a9f 100644
--- a/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java
+++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java
@@ -110,16 +110,8 @@ public class InspectPageParser extends PageParser {
long playtimeDay = AnalysisUtils.getTotalPlaytime(sessionsDay);
long playtimeWeek = AnalysisUtils.getTotalPlaytime(sessionsWeek);
- if (!sessionsDay.isEmpty()) {
- addValue("sessionLengthLongestDay", FormatUtils.formatTimeAmount(sessionsDay.get(0).getLength()));
- } else {
- addValue("sessionLengthLongestDay", "-");
- }
- if (!sessionsWeek.isEmpty()) {
- addValue("sessionLengthLongestWeek", FormatUtils.formatTimeAmount(sessionsWeek.get(0).getLength()));
- } else {
- addValue("sessionLengthLongestWeek", "-");
- }
+ addValue("sessionLengthLongestDay", !sessionsDay.isEmpty() ? FormatUtils.formatTimeAmount(sessionsDay.get(0).getLength()) : "-");
+ addValue("sessionLengthLongestWeek", !sessionsWeek.isEmpty() ? FormatUtils.formatTimeAmount(sessionsWeek.get(0).getLength()) : "-");
addValue("sessionCountDay", sessionCountDay);
addValue("sessionCountWeek", sessionCountWeek);
diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/UserImportData.java b/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/UserImportData.java
index e8ddfd9d5..2ec16a467 100644
--- a/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/UserImportData.java
+++ b/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/UserImportData.java
@@ -16,7 +16,7 @@ import java.util.*;
public class UserImportData {
private String name;
- private String uuid;
+ private UUID uuid;
private List nicknames;
private long registered;
@@ -32,7 +32,7 @@ public class UserImportData {
private int mobKills;
private int deaths;
- private UserImportData(String name, String uuid, List nicknames, long registered, boolean op, boolean banned, int timesKicked, List ips, Map worldTimes, List kills, int mobKills, int deaths) {
+ private UserImportData(String name, UUID uuid, List nicknames, long registered, boolean op, boolean banned, int timesKicked, List ips, Map worldTimes, List kills, int mobKills, int deaths) {
this.name = name;
this.uuid = uuid;
this.nicknames = nicknames;
@@ -59,11 +59,11 @@ public class UserImportData {
this.name = name;
}
- public String getUuid() {
+ public UUID getUuid() {
return uuid;
}
- public void setUuid(String uuid) {
+ public void setUuid(UUID uuid) {
this.uuid = uuid;
}
@@ -153,7 +153,7 @@ public class UserImportData {
private final Map worldTimes = new HashMap<>();
private final List kills = new ArrayList<>();
private String name;
- private String uuid;
+ private UUID uuid;
private long registered;
private boolean op;
private boolean banned;
@@ -171,12 +171,12 @@ public class UserImportData {
}
public UserImportDataBuilder uuid(UUID uuid) {
- return uuid(uuid.toString());
+ this.uuid = uuid;
+ return this;
}
public UserImportDataBuilder uuid(String uuid) {
- this.uuid = uuid;
- return this;
+ return uuid(UUID.fromString(uuid));
}
public UserImportDataBuilder registered(long registered) {
diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/UserImportRefiner.java b/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/UserImportRefiner.java
index 8afa969c5..56ef30e38 100644
--- a/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/UserImportRefiner.java
+++ b/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/UserImportRefiner.java
@@ -96,17 +96,15 @@ public class UserImportRefiner {
importers.parallelStream().forEach(importer -> {
String name = importer.getName();
- String uuid = importer.getUuid();
+ UUID uuid = importer.getUuid();
boolean nameNull = name == null;
boolean uuidNull = uuid == null;
if (nameNull && uuidNull) {
invalidData.add(importer);
- }
-
- if (nameNull) {
- namesMissing.put(importer, uuid);
+ } else if (nameNull) {
+ namesMissing.put(importer, uuid.toString());
} else if (uuidNull) {
uuidsMissing.put(importer, name);
}
@@ -133,7 +131,13 @@ public class UserImportRefiner {
addMissingUUIDsOverFetcher();
}
- foundUUIDs.entrySet().parallelStream().forEach(entry -> entry.getKey().setUuid(entry.getValue()));
+ foundUUIDs.entrySet().parallelStream()
+ .forEach(entry -> {
+ UserImportData userImportData = entry.getKey();
+ UUID uuid = UUID.fromString(entry.getValue());
+
+ userImportData.setUuid(uuid);
+ });
importers.removeAll(uuidsMissing.keySet());
diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/importers/Importer.java b/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/importers/Importer.java
index 933610a8e..cc3af4acc 100644
--- a/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/importers/Importer.java
+++ b/Plan/src/main/java/com/djrapitops/plan/systems/processing/importing/importers/Importer.java
@@ -5,14 +5,25 @@
package main.java.com.djrapitops.plan.systems.processing.importing.importers;
import com.djrapitops.plugin.utilities.Verify;
+import com.google.common.collect.ImmutableMap;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
+import main.java.com.djrapitops.plan.data.Session;
+import main.java.com.djrapitops.plan.data.UserInfo;
+import main.java.com.djrapitops.plan.data.time.WorldTimes;
+import main.java.com.djrapitops.plan.database.Database;
+import main.java.com.djrapitops.plan.systems.cache.GeolocationCache;
import main.java.com.djrapitops.plan.systems.processing.importing.ServerImportData;
import main.java.com.djrapitops.plan.systems.processing.importing.UserImportData;
import main.java.com.djrapitops.plan.systems.processing.importing.UserImportRefiner;
import main.java.com.djrapitops.plan.utilities.Benchmark;
-import java.util.List;
+import java.sql.SQLException;
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
/**
* @author Fuzzlemann
@@ -26,7 +37,7 @@ public abstract class Importer {
public abstract List getUserImportData();
- public final void processImport() {
+ public final void processImport() throws SQLException {
String benchmarkName = "Import processing";
String serverBenchmarkName = "Server Data processing";
String userDataBenchmarkName = "User Data processing";
@@ -44,7 +55,7 @@ public abstract class Importer {
Benchmark.stop(benchmarkName);
}
- private void processServerData() {
+ private void processServerData() throws SQLException {
String benchmarkName = "Processing Server Data";
String getDataBenchmarkName = "Getting Server Data";
@@ -60,12 +71,17 @@ public abstract class Importer {
return;
}
- //TODO
+ Plan plan = Plan.getInstance();
+ UUID uuid = plan.getServerInfoManager().getServerUUID();
+ Database db = plan.getDB();
+
+ db.getTpsTable().insertAllTPS(ImmutableMap.of(uuid, serverImportData.getTpsData()));
+ db.getCommandUseTable().insertCommandUsage(ImmutableMap.of(uuid, serverImportData.getCommandUsages()));
Benchmark.start(benchmarkName);
}
- private void processUserData() {
+ private void processUserData() throws SQLException {
String benchmarkName = "Processing User Data";
String getDataBenchmarkName = "Getting User Data";
@@ -81,11 +97,133 @@ public abstract class Importer {
return;
}
- UserImportRefiner userImportRefiner = new UserImportRefiner(Plan.getInstance(), userImportData);
+ Plan plan = Plan.getInstance();
+
+ UserImportRefiner userImportRefiner = new UserImportRefiner(plan, userImportData);
userImportData = userImportRefiner.refineData();
- //TODO
+ UUID serverUUID = plan.getServerInfoManager().getServerUUID();
+ Database db = plan.getDB();
+
+ Set existingUUIDs = db.getSavedUUIDs();
+ Map users = new Hashtable<>();
+ List userInfo = new Vector<>();
+ Map> nickNames = new Hashtable<>();
+ Map sessions = new Hashtable<>();
+ Map> ips = new Hashtable<>();
+ Map timesKicked = new Hashtable<>();
+
+ userImportData.parallelStream().forEach(data -> {
+ UUID uuid = data.getUuid();
+ UserInfo info = toUserInfo(data);
+
+ if (!existingUUIDs.contains(uuid)) {
+ userInfo.add(info);
+ }
+
+ users.put(uuid, info);
+ nickNames.put(uuid, data.getNicknames());
+ ips.put(uuid, convertIPs(data));
+ timesKicked.put(uuid, data.getTimesKicked());
+ sessions.put(uuid, toSession(data));
+ });
+
+ ExecutorService service = Executors.newCachedThreadPool();
+
+ db.getUsersTable().insertUsers(users);
+
+ new ImportExecutorHelper() {
+ @Override
+ void execute() throws SQLException {
+ // TODO db.getSessionsTable().insertSessions(ImmutableMap.of(serverUUID, sessions));
+ }
+ }.submit(service);
+
+ new ImportExecutorHelper() {
+ @Override
+ void execute() throws SQLException {
+ db.getUsersTable().updateKicked(timesKicked);
+ }
+ }.submit(service);
+
+ new ImportExecutorHelper() {
+ @Override
+ void execute() throws SQLException {
+ db.getUserInfoTable().insertUserInfo(ImmutableMap.of(serverUUID, userInfo));
+ }
+ }.submit(service);
+
+ new ImportExecutorHelper() {
+ @Override
+ void execute() throws SQLException {
+ db.getNicknamesTable().insertNicknames(ImmutableMap.of(serverUUID, nickNames));
+ }
+ }.submit(service);
+
+ new ImportExecutorHelper() {
+ @Override
+ void execute() throws SQLException {
+ db.getIpsTable().insertIPsAndGeolocations(ips);
+ }
+ }.submit(service);
+
+ service.shutdown();
+
+ try {
+ service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
+ } catch (InterruptedException e) {
+ Log.toLog(this.getClass().getName(), e);
+ }
Benchmark.stop(benchmarkName);
}
+
+ private UserInfo toUserInfo(UserImportData userImportData) {
+ UUID uuid = userImportData.getUuid();
+ String name = userImportData.getName();
+ long registered = userImportData.getRegistered();
+ boolean op = userImportData.isOp();
+ boolean banned = userImportData.isBanned();
+
+ return new UserInfo(uuid, name, registered, op, banned);
+ }
+
+ private Session toSession(UserImportData userImportData) {
+ int mobKills = userImportData.getMobKills();
+ int deaths = userImportData.getDeaths();
+
+ Session session = new Session(0, 0L, 0L, mobKills, deaths);
+
+ session.setPlayerKills(userImportData.getKills());
+ session.setWorldTimes(new WorldTimes(userImportData.getWorldTimes()));
+
+ return session;
+ }
+
+ private Map convertIPs(UserImportData userImportData) {
+ Map convertedIPs;
+ List ips = userImportData.getIps();
+
+ convertedIPs = ips.parallelStream()
+ .collect(Collectors.toMap(ip -> ip, GeolocationCache::getCountry, (a, b) -> b, HashMap::new));
+
+ return convertedIPs;
+ }
+
+ private abstract class ImportExecutorHelper {
+ abstract void execute() throws SQLException;
+
+ void submit(ExecutorService service) {
+ service.submit(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ execute();
+ } catch (SQLException e) {
+ Log.toLog(this.getClass().getName(), e);
+ }
+ }
+ });
+ }
+ }
}
diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webapi/universal/PingWebAPI.java b/Plan/src/main/java/com/djrapitops/plan/systems/webapi/universal/PingWebAPI.java
new file mode 100644
index 000000000..fcacf043d
--- /dev/null
+++ b/Plan/src/main/java/com/djrapitops/plan/systems/webapi/universal/PingWebAPI.java
@@ -0,0 +1,23 @@
+/*
+ * Licence is provided in the jar as license.yml also here:
+ * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
+ */
+package main.java.com.djrapitops.plan.systems.webapi.universal;
+
+import main.java.com.djrapitops.plan.Plan;
+import main.java.com.djrapitops.plan.systems.webapi.WebAPI;
+import main.java.com.djrapitops.plan.systems.webserver.PageCache;
+import main.java.com.djrapitops.plan.systems.webserver.response.Response;
+import main.java.com.djrapitops.plan.systems.webserver.response.api.SuccessResponse;
+
+import java.util.Map;
+
+/**
+ * @author Fuzzlemann
+ */
+public class PingWebAPI implements WebAPI {
+ @Override
+ public Response onResponse(Plan plan, Map variables) {
+ return PageCache.loadPage("success", SuccessResponse::new);
+ }
+}
\ No newline at end of file
diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java
index 208c9c50d..72c0b9c2a 100644
--- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java
+++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java
@@ -14,6 +14,7 @@ import main.java.com.djrapitops.plan.systems.info.InformationManager;
import main.java.com.djrapitops.plan.systems.webapi.WebAPI;
import main.java.com.djrapitops.plan.systems.webapi.WebAPIManager;
import main.java.com.djrapitops.plan.systems.webapi.bukkit.*;
+import main.java.com.djrapitops.plan.systems.webapi.universal.PingWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.response.*;
import main.java.com.djrapitops.plan.systems.webserver.response.api.BadRequestResponse;
import main.java.com.djrapitops.plan.systems.webserver.response.api.JsonResponse;
@@ -72,6 +73,7 @@ public class WebServer {
WebAPIManager.registerNewAPI("configure", new ConfigureWebAPI());
WebAPIManager.registerNewAPI("inspect", new InspectWebAPI());
WebAPIManager.registerNewAPI("onlineplayers", new OnlinePlayersWebAPI());
+ WebAPIManager.registerNewAPI("ping", new PingWebAPI());
}
/**
diff --git a/Plan/test/main/java/com/djrapitops/plan/data/additional/importer/ImportBuilderTest.java b/Plan/test/main/java/com/djrapitops/plan/data/additional/importer/ImportBuilderTest.java
index e9d1184e2..b0863a95b 100644
--- a/Plan/test/main/java/com/djrapitops/plan/data/additional/importer/ImportBuilderTest.java
+++ b/Plan/test/main/java/com/djrapitops/plan/data/additional/importer/ImportBuilderTest.java
@@ -133,7 +133,7 @@ public class ImportBuilderTest {
assertEquals(3, data.getNicknames().size());
assertEquals(randomInt, data.getTimesKicked());
- assertEquals(uuid.toString(), data.getUuid());
+ assertEquals(uuid, data.getUuid());
assertEquals(randomString, data.getName());
}
}
diff --git a/Plan/test/main/java/com/djrapitops/plan/utilities/MiscUtilsTest.java b/Plan/test/main/java/com/djrapitops/plan/utilities/MiscUtilsTest.java
index 1207f6230..5b77939ad 100644
--- a/Plan/test/main/java/com/djrapitops/plan/utilities/MiscUtilsTest.java
+++ b/Plan/test/main/java/com/djrapitops/plan/utilities/MiscUtilsTest.java
@@ -36,7 +36,6 @@ import static org.powermock.api.mockito.PowerMockito.when;
@PrepareForTest({JavaPlugin.class, Bukkit.class})
public class MiscUtilsTest {
- private Plan plan;
private SQLDB db;
@Test
@@ -152,7 +151,7 @@ public class MiscUtilsTest {
TestInit.init();
TestInit t = TestInit.init();
- plan = t.getPlanMock();
+ Plan plan = t.getPlanMock();
db = new SQLiteDB(plan, "debug" + MiscUtils.getTime());
db.init();