diff --git a/pom.xml b/pom.xml index 577bd82f..dfb4bfb3 100644 --- a/pom.xml +++ b/pom.xml @@ -155,6 +155,10 @@ org.apache.maven.plugins maven-javadoc-plugin 3.4.1 + + false + false + @@ -334,6 +338,10 @@ com.google.thirdparty fr.xephi.authme.libs.com.google.thirdparty + + com.cryptomorin.xseries + fr.xephi.authme.libs.xseries + com.google.j2objc fr.xephi.authme.libs.com.google.j2objc @@ -1115,6 +1123,14 @@ test + + + com.github.Anon8281 + UniversalScheduler + 0.1.6 + compile + + org.xerial diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java index 22f1fa09..dbe9aa4a 100644 --- a/src/main/java/fr/xephi/authme/AuthMe.java +++ b/src/main/java/fr/xephi/authme/AuthMe.java @@ -2,6 +2,8 @@ package fr.xephi.authme; import ch.jalu.injector.Injector; import ch.jalu.injector.InjectorBuilder; +import com.github.Anon8281.universalScheduler.UniversalScheduler; +import com.github.Anon8281.universalScheduler.scheduling.schedulers.TaskScheduler; import fr.xephi.authme.api.v3.AuthMeApi; import fr.xephi.authme.command.CommandHandler; import fr.xephi.authme.datasource.DataSource; @@ -45,7 +47,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitScheduler; import org.jetbrains.annotations.NotNull; import javax.inject.Inject; @@ -79,6 +80,7 @@ public class AuthMe extends JavaPlugin { // Private instances private EmailService emailService; private CommandHandler commandHandler; + private static TaskScheduler scheduler; @Inject public static Settings settings; private DataSource database; @@ -130,7 +132,12 @@ public class AuthMe extends JavaPlugin { return pluginBuildNumber; } - + /** + * Get the scheduler + */ + public static TaskScheduler getScheduler() { + return scheduler; + } /** * Method called when the server enables the plugin. @@ -139,6 +146,7 @@ public class AuthMe extends JavaPlugin { public void onEnable() { // Load the plugin version data from the plugin description file loadPluginInfo(getDescription().getVersion()); + scheduler = UniversalScheduler.getScheduler(this); // Set the Logger instance and log file path ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME)); @@ -246,7 +254,6 @@ public class AuthMe extends JavaPlugin { injector.register(AuthMe.class, this); injector.register(Server.class, getServer()); injector.register(PluginManager.class, getServer().getPluginManager()); - injector.register(BukkitScheduler.class, getServer().getScheduler()); injector.provide(DataFolder.class, getDataFolder()); injector.registerProvider(Settings.class, SettingsProvider.class); injector.registerProvider(DataSource.class, DataSourceProvider.class); diff --git a/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java b/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java index 34e73196..55f172b6 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java +++ b/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java @@ -1,8 +1,8 @@ package fr.xephi.authme.data.limbo; +import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask; import fr.xephi.authme.task.MessageTask; import org.bukkit.Location; -import org.bukkit.scheduler.BukkitTask; import java.util.ArrayList; import java.util.Collection; @@ -22,7 +22,7 @@ public class LimboPlayer { private final Location loc; private final float walkSpeed; private final float flySpeed; - private BukkitTask timeoutTask = null; + private MyScheduledTask timeoutTask = null; private MessageTask messageTask = null; private LimboPlayerState state = LimboPlayerState.PASSWORD_REQUIRED; @@ -81,7 +81,7 @@ public class LimboPlayer { * * @return The timeout task associated to the player */ - public BukkitTask getTimeoutTask() { + public MyScheduledTask getTimeoutTask() { return timeoutTask; } @@ -91,7 +91,7 @@ public class LimboPlayer { * * @param timeoutTask The task to set */ - public void setTimeoutTask(BukkitTask timeoutTask) { + public void setTimeoutTask(MyScheduledTask timeoutTask) { if (this.timeoutTask != null) { this.timeoutTask.cancel(); } diff --git a/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java b/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java index 3612e679..7331a653 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java +++ b/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java @@ -1,5 +1,6 @@ package fr.xephi.authme.data.limbo; +import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask; import fr.xephi.authme.data.auth.PlayerCache; import fr.xephi.authme.data.captcha.RegistrationCaptchaManager; import fr.xephi.authme.message.MessageKey; @@ -11,7 +12,6 @@ import fr.xephi.authme.settings.properties.RestrictionSettings; import fr.xephi.authme.task.MessageTask; import fr.xephi.authme.task.TimeoutTask; import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitTask; import javax.inject.Inject; @@ -68,7 +68,7 @@ class LimboPlayerTaskManager { final int timeout = settings.getProperty(RestrictionSettings.TIMEOUT) * TICKS_PER_SECOND; if (timeout > 0) { String message = messages.retrieveSingle(player, MessageKey.LOGIN_TIMEOUT_ERROR); - BukkitTask task = bukkitService.runTaskLater(new TimeoutTask(player, message, playerCache), timeout); + MyScheduledTask task = bukkitService.runTaskLater(new TimeoutTask(player, message, playerCache), timeout); limbo.setTimeoutTask(task); } } diff --git a/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java b/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java index 02f17e95..705f3bcc 100644 --- a/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java +++ b/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java @@ -1,5 +1,6 @@ package fr.xephi.authme.initialization; +import com.github.Anon8281.universalScheduler.UniversalRunnable; import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.datasource.DataSource; @@ -18,7 +19,6 @@ import org.bstats.bukkit.Metrics; import org.bstats.charts.SimplePie; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; import javax.inject.Inject; import java.util.List; @@ -96,7 +96,7 @@ public class OnStartupTasks { if (!settings.getProperty(RECALL_PLAYERS)) { return; } - bukkitService.runTaskTimerAsynchronously(new BukkitRunnable() { + bukkitService.runTaskTimerAsynchronously(new UniversalRunnable() { @Override public void run() { List loggedPlayersWithEmptyMail = dataSource.getLoggedPlayersWithEmptyMail(); diff --git a/src/main/java/fr/xephi/authme/initialization/TaskCloser.java b/src/main/java/fr/xephi/authme/initialization/TaskCloser.java index 7cf1b0a7..8356b28b 100644 --- a/src/main/java/fr/xephi/authme/initialization/TaskCloser.java +++ b/src/main/java/fr/xephi/authme/initialization/TaskCloser.java @@ -1,15 +1,9 @@ package fr.xephi.authme.initialization; -import com.google.common.annotations.VisibleForTesting; +import com.github.Anon8281.universalScheduler.scheduling.schedulers.TaskScheduler; import fr.xephi.authme.AuthMe; import fr.xephi.authme.datasource.DataSource; -import org.bukkit.scheduler.BukkitScheduler; -import org.bukkit.scheduler.BukkitWorker; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.logging.Level; import java.util.logging.Logger; /** @@ -18,7 +12,7 @@ import java.util.logging.Logger; */ public class TaskCloser implements Runnable { - private final BukkitScheduler scheduler; + private final TaskScheduler scheduler; private final Logger logger; private final AuthMe plugin; private final DataSource dataSource; @@ -30,7 +24,7 @@ public class TaskCloser implements Runnable { * @param dataSource the data source (nullable) */ public TaskCloser(AuthMe plugin, DataSource dataSource) { - this.scheduler = plugin.getServer().getScheduler(); + this.scheduler = AuthMe.getScheduler(); this.logger = plugin.getLogger(); this.plugin = plugin; this.dataSource = dataSource; @@ -38,58 +32,9 @@ public class TaskCloser implements Runnable { @Override public void run() { - List pendingTasks = getPendingTasks(); - logger.log(Level.INFO, "Waiting for {0} tasks to finish", pendingTasks.size()); - int progress = 0; - - //one minute + some time checking the running state - int tries = 60; - while (!pendingTasks.isEmpty()) { - if (tries <= 0) { - logger.log(Level.INFO, "Async tasks times out after to many tries {0}", pendingTasks); - break; - } - - try { - sleep(); - } catch (InterruptedException ignored) { - Thread.currentThread().interrupt(); - break; - } - - for (Iterator iterator = pendingTasks.iterator(); iterator.hasNext(); ) { - int taskId = iterator.next(); - if (!scheduler.isCurrentlyRunning(taskId)) { - iterator.remove(); - progress++; - logger.log(Level.INFO, "Progress: {0} / {1}", new Object[]{progress, pendingTasks.size()}); - } - } - - tries--; - } - + scheduler.cancelTasks(); if (dataSource != null) { dataSource.closeConnection(); } } - - /** Makes the current thread sleep for one second. */ - @VisibleForTesting - void sleep() throws InterruptedException { - Thread.sleep(1000); - } - - private List getPendingTasks() { - List pendingTasks = new ArrayList<>(); - //returns only the async tasks - for (BukkitWorker pendingTask : scheduler.getActiveWorkers()) { - if (pendingTask.getOwner().equals(plugin) - //it's not a periodic task - && !scheduler.isQueued(pendingTask.getTaskId())) { - pendingTasks.add(pendingTask.getTaskId()); - } - } - return pendingTasks; - } } diff --git a/src/main/java/fr/xephi/authme/service/AntiBotService.java b/src/main/java/fr/xephi/authme/service/AntiBotService.java index 96ff499f..f902a28f 100644 --- a/src/main/java/fr/xephi/authme/service/AntiBotService.java +++ b/src/main/java/fr/xephi/authme/service/AntiBotService.java @@ -1,5 +1,6 @@ package fr.xephi.authme.service; +import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask; import fr.xephi.authme.initialization.SettingsDependent; import fr.xephi.authme.message.MessageKey; import fr.xephi.authme.message.Messages; @@ -8,7 +9,6 @@ import fr.xephi.authme.permission.PermissionsManager; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.ProtectionSettings; import fr.xephi.authme.util.AtomicIntervalCounter; -import org.bukkit.scheduler.BukkitTask; import javax.inject.Inject; import java.util.Locale; @@ -32,7 +32,7 @@ public class AntiBotService implements SettingsDependent { // Service status private AntiBotStatus antiBotStatus; private boolean startup; - private BukkitTask disableTask; + private MyScheduledTask disableTask; private AtomicIntervalCounter flaggedCounter; @Inject diff --git a/src/main/java/fr/xephi/authme/service/BukkitService.java b/src/main/java/fr/xephi/authme/service/BukkitService.java index 797fddf3..c73257d6 100644 --- a/src/main/java/fr/xephi/authme/service/BukkitService.java +++ b/src/main/java/fr/xephi/authme/service/BukkitService.java @@ -1,5 +1,7 @@ package fr.xephi.authme.service; +import com.github.Anon8281.universalScheduler.UniversalRunnable; +import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask; import fr.xephi.authme.AuthMe; import fr.xephi.authme.initialization.SettingsDependent; import fr.xephi.authme.settings.Settings; @@ -13,8 +15,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.Event; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; import javax.inject.Inject; import java.util.Collection; @@ -23,6 +23,8 @@ import java.util.Optional; import java.util.Set; import java.util.function.Function; +import static fr.xephi.authme.AuthMe.getScheduler; + /** * Service for operations requiring the Bukkit API, such as for scheduling. */ @@ -50,8 +52,8 @@ public class BukkitService implements SettingsDependent { * @param task Task to be executed * @return Task id number (-1 if scheduling failed) */ - public int scheduleSyncDelayedTask(Runnable task) { - return Bukkit.getScheduler().scheduleSyncDelayedTask(authMe, task); + public void scheduleSyncDelayedTask(Runnable task) { + getScheduler().runTask(task); } /** @@ -63,8 +65,8 @@ public class BukkitService implements SettingsDependent { * @param delay Delay in server ticks before executing task * @return Task id number (-1 if scheduling failed) */ - public int scheduleSyncDelayedTask(Runnable task, long delay) { - return Bukkit.getScheduler().scheduleSyncDelayedTask(authMe, task, delay); + public void scheduleSyncDelayedTask(Runnable task, long delay) { + getScheduler().runTaskLater(task, delay); } /** @@ -76,7 +78,7 @@ public class BukkitService implements SettingsDependent { */ public void scheduleSyncTaskFromOptionallyAsyncTask(Runnable task) { if (Bukkit.isPrimaryThread()) { - task.run(); + runTask(task); } else { scheduleSyncDelayedTask(task); } @@ -90,8 +92,8 @@ public class BukkitService implements SettingsDependent { * @throws IllegalArgumentException if plugin is null * @throws IllegalArgumentException if task is null */ - public BukkitTask runTask(Runnable task) { - return Bukkit.getScheduler().runTask(authMe, task); + public void runTask(Runnable task) { + getScheduler().runTask(task); } /** @@ -104,8 +106,8 @@ public class BukkitService implements SettingsDependent { * @throws IllegalArgumentException if plugin is null * @throws IllegalArgumentException if task is null */ - public BukkitTask runTaskLater(Runnable task, long delay) { - return Bukkit.getScheduler().runTaskLater(authMe, task, delay); + public MyScheduledTask runTaskLater(Runnable task, long delay) { + return getScheduler().runTaskLater(task, delay); } /** @@ -118,7 +120,7 @@ public class BukkitService implements SettingsDependent { if (useAsyncTasks) { runTaskAsynchronously(task); } else { - task.run(); + runTask(task); } } @@ -133,8 +135,8 @@ public class BukkitService implements SettingsDependent { * @throws IllegalArgumentException if plugin is null * @throws IllegalArgumentException if task is null */ - public BukkitTask runTaskAsynchronously(Runnable task) { - return Bukkit.getScheduler().runTaskAsynchronously(authMe, task); + public void runTaskAsynchronously(Runnable task) { + getScheduler().runTaskAsynchronously(task); } /** @@ -152,7 +154,7 @@ public class BukkitService implements SettingsDependent { * @throws IllegalArgumentException if task is null * @throws IllegalStateException if this was already scheduled */ - public BukkitTask runTaskTimerAsynchronously(BukkitRunnable task, long delay, long period) { + public MyScheduledTask runTaskTimerAsynchronously(UniversalRunnable task, long delay, long period) { return task.runTaskTimerAsynchronously(authMe, delay, period); } @@ -167,7 +169,7 @@ public class BukkitService implements SettingsDependent { * @throws IllegalArgumentException if plugin is null * @throws IllegalStateException if this was already scheduled */ - public BukkitTask runTaskTimer(BukkitRunnable task, long delay, long period) { + public MyScheduledTask runTaskTimer(UniversalRunnable task, long delay, long period) { return task.runTaskTimer(authMe, delay, period); } diff --git a/src/main/java/fr/xephi/authme/task/CleanupTask.java b/src/main/java/fr/xephi/authme/task/CleanupTask.java index 48d989f1..4f40ddb2 100644 --- a/src/main/java/fr/xephi/authme/task/CleanupTask.java +++ b/src/main/java/fr/xephi/authme/task/CleanupTask.java @@ -1,15 +1,15 @@ package fr.xephi.authme.task; import ch.jalu.injector.factory.SingletonStore; +import com.github.Anon8281.universalScheduler.UniversalRunnable; import fr.xephi.authme.initialization.HasCleanup; -import org.bukkit.scheduler.BukkitRunnable; import javax.inject.Inject; /** * Task run periodically to invoke the cleanup task on services. */ -public class CleanupTask extends BukkitRunnable { +public class CleanupTask extends UniversalRunnable { @Inject private SingletonStore hasCleanupStore; diff --git a/src/main/java/fr/xephi/authme/task/MessageTask.java b/src/main/java/fr/xephi/authme/task/MessageTask.java index cf4366d9..dd11e8ef 100644 --- a/src/main/java/fr/xephi/authme/task/MessageTask.java +++ b/src/main/java/fr/xephi/authme/task/MessageTask.java @@ -1,12 +1,12 @@ package fr.xephi.authme.task; +import com.github.Anon8281.universalScheduler.UniversalRunnable; import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; /** * Message shown to a player in a regular interval as long as he is not logged in. */ -public class MessageTask extends BukkitRunnable { +public class MessageTask extends UniversalRunnable { private final Player player; private final String[] message; diff --git a/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java b/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java index 5c4a8707..15ab6552 100644 --- a/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java +++ b/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java @@ -1,5 +1,6 @@ package fr.xephi.authme.task.purge; +import com.github.Anon8281.universalScheduler.UniversalRunnable; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.permission.PermissionsManager; @@ -9,14 +10,13 @@ import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; import java.util.HashSet; import java.util.Locale; import java.util.Set; import java.util.UUID; -class PurgeTask extends BukkitRunnable { +class PurgeTask extends UniversalRunnable { //how many players we should check for each tick private static final int INTERVAL_CHECK = 5;