+ tcloud 初步测试成功

This commit is contained in:
坏黑
2018-10-01 22:52:48 +08:00
parent f4e2f2e14b
commit 16f8312a8f
11 changed files with 340 additions and 64 deletions

View File

@@ -71,15 +71,21 @@ public class EagletTask {
// create thread pool for download
executorService = Executors.newFixedThreadPool(threadAmount);
// check if is already running
if (running) throw new AlreadyStartException();
if (running) {
throw new AlreadyStartException();
}
// start the monitor thread
monitor = new Thread(() -> {
lock.lock();
// fire a new start event
if (onStart != null) onStart.handle(new StartEvent(this));
if (onStart != null) {
onStart.handle(new StartEvent(this));
}
try {
// create the target file
if (!dest.exists()) dest.createNewFile();
if (!dest.exists()) {
dest.createNewFile();
}
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// set the connection properties
httpHeader.forEach(connection::addRequestProperty);
@@ -90,27 +96,26 @@ public class EagletTask {
contentLength = connection.getContentLengthLong();
// fire a new connected event
// contains connection properties
if (onConnected != null) onConnected.handle(new ConnectedEvent(contentLength, this));
if (onConnected != null) {
onConnected.handle(new ConnectedEvent(contentLength, this));
}
// if this is an unknown length task
if (contentLength == -1 || threadAmount == 1) {
// pass the connection instance to this new thread
SingleThreadDownload download = new SingleThreadDownload(connection, dest, this);
executorService.execute(download);
long last = 0;
while (true) {
do {
Thread.sleep(1000);
// check the progress
long progress = download.getCurrentProgress();
// fire a new progress event
if (onProgress != null)
onProgress.handle(new ProgressEvent(progress - last, this,
((double) progress) / Math.max((double) contentLength, 0D)));
if (onProgress != null) {
onProgress.handle(new ProgressEvent(progress - last, this, ((double) progress) / Math.max((double) contentLength, 0D)));
}
last = progress;
// check complete
if (last == contentLength || download.isComplete()) {
break;
}
}
} while (last != contentLength && !download.isComplete());
// close the thread pool, release resources
executorService.shutdown();
// change the running flag to false
@@ -131,48 +136,54 @@ public class EagletTask {
splitDownloads.add(download);
}
long last = 0;
while (true) {
do {
Thread.sleep(1000);
long progress = 0;
// Collect download progress
for (SplitDownload splitDownload : splitDownloads) {
progress += splitDownload.getCurrentIndex() - splitDownload.startIndex;
// blocked then restart from current index
if (!splitDownload.isComplete() &&
System.currentTimeMillis() - splitDownload.getLastUpdateTime() > maxBlockingTime) {
if (!splitDownload.isComplete() && System.currentTimeMillis() - splitDownload.getLastUpdateTime() > maxBlockingTime) {
splitDownload.setStartIndex(splitDownload.getCurrentIndex());
if (splitDownload.getRetry() <= maxRetry)
if (splitDownload.getRetry() <= maxRetry) {
executorService.execute(splitDownload);
else throw new RetryFailedException(this);
} else {
throw new RetryFailedException(this);
}
}
}
// Fire a progress event
if (onProgress != null)
if (onProgress != null) {
onProgress.handle(new ProgressEvent(progress - last, this,
((double) progress) / ((double) contentLength)));
}
last = progress;
// check complete
if (last >= contentLength) {
break;
}
}
} while (last < contentLength);
// close the thread pool, release resources
executorService.shutdown();
// change the running flag to false
running = false;
}
// check hash
if (md5 != null && !md5.equalsIgnoreCase(HashUtil.md5(dest)))
if (md5 != null && !md5.equalsIgnoreCase(HashUtil.md5(dest))) {
throw new HashNotMatchException();
if (sha1 != null && !sha1.equalsIgnoreCase(HashUtil.sha1(dest)))
}
if (sha1 != null && !sha1.equalsIgnoreCase(HashUtil.sha1(dest))) {
throw new HashNotMatchException();
if (sha256 != null && !sha256.equalsIgnoreCase(HashUtil.sha256(dest)))
}
if (sha256 != null && !sha256.equalsIgnoreCase(HashUtil.sha256(dest))) {
throw new HashNotMatchException();
if (onComplete != null) onComplete.handle(new CompleteEvent(this, true));
}
if (onComplete != null) {
onComplete.handle(new CompleteEvent(this, true));
}
} catch (Exception e) {
onError.handle(new ErrorEvent(e, this));
executorService.shutdown();
if (onComplete != null) onComplete.handle(new CompleteEvent(this, false));
if (onComplete != null) {
onComplete.handle(new CompleteEvent(this, false));
}
} finally {
lock.unlock();
}
@@ -182,14 +193,18 @@ public class EagletTask {
}
public EagletTask waitUntil() {
while (lock.tryLock()) lock.unlock();
while (lock.tryLock()) {
lock.unlock();
}
lock.lock();
lock.unlock();
return this;
}
public EagletTask waitFor(long timeout, TimeUnit unit) {
while (lock.tryLock()) lock.unlock();
while (lock.tryLock()) {
lock.unlock();
}
try {
lock.tryLock(timeout, unit);
} catch (InterruptedException e) {
@@ -404,7 +419,9 @@ public class EagletTask {
* @return task instance
*/
public EagletTask setThreads(int i) {
if (i < 1) throw new RuntimeException("Thread amount cannot be zero or negative!");
if (i < 1) {
throw new RuntimeException("Thread amount cannot be zero or negative!");
}
threadAmount = i;
return this;
}

View File

@@ -3,20 +3,22 @@ package me.skymc.taboolib.cloud;
import com.ilummc.tlib.resources.TLocale;
import me.skymc.taboolib.TabooLib;
import me.skymc.taboolib.cloud.expansion.Expansion;
import me.skymc.taboolib.cloud.expansion.ExpansionType;
import me.skymc.taboolib.commands.internal.BaseMainCommand;
import me.skymc.taboolib.commands.internal.BaseSubCommand;
import me.skymc.taboolib.commands.internal.TCommand;
import me.skymc.taboolib.commands.internal.plugin.TLibLocale;
import me.skymc.taboolib.commands.internal.type.CommandArgument;
import me.skymc.taboolib.commands.internal.type.CommandRegister;
import me.skymc.taboolib.common.util.SimpleIterator;
import me.skymc.taboolib.fileutils.FileUtils;
import me.skymc.taboolib.plugin.PluginUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.util.NumberConversions;
import java.io.File;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -109,6 +111,7 @@ public class TCloudCommand extends BaseMainCommand {
}
}
};
@CommandRegister(priority = 3)
BaseSubCommand download = new BaseSubCommand() {
@Override
@@ -135,15 +138,105 @@ public class TCloudCommand extends BaseMainCommand {
TLocale.sendTo(sender, "COMMANDS.TCLOUD.DOWNLOAD.EXPANSION-EXISTS", args[0]);
} else {
Bukkit.getScheduler().runTaskAsynchronously(TabooLib.instance(), () -> {
TLocale.sendTo(sender, "COMMANDS.TCLOUD.DOWNLOAD.DOWNLOAD-START", args[0], expansion.getFile().getPath(), expansion.getLink());
TLocale.sendTo(sender, "COMMANDS.TCLOUD.DOWNLOAD.DOWNLOAD-START", args[0], expansion.getLink());
FileUtils.download(expansion.getLink(), expansion.getFile());
TLocale.sendTo(sender, "COMMANDS.TCLOUD.DOWNLOAD.DOWNLOAD-SUCCESS", args[0]);
Bukkit.getScheduler().runTask(TabooLib.instance(), () -> PluginUtils.load(expansion.getName()));
});
}
}
};
@CommandRegister(priority = 4)
BaseSubCommand update = new BaseSubCommand() {
@Override
public String getLabel() {
return "update";
}
@Override
public String getDescription() {
return TLibLocale.description("TCLOUD", "UPDATE");
}
@Override
public CommandArgument[] getArguments() {
return TLibLocale.arguments("TCLOUD", "UPDATE", 1);
}
@Override
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
Expansion expansion = TCloudLoader.getExpansion(args[0]);
if (expansion == null) {
TLocale.sendTo(sender, "COMMANDS.TCLOUD.UPDATE.EXPANSION-NOT-FOUND", args[0]);
} else if (!TCloudLoader.isExpansionExists(expansion)) {
TLocale.sendTo(sender, "COMMANDS.TCLOUD.UPDATE.EXPANSION-NOT-EXISTS", args[0]);
} else if (!expansion.canUpdate()) {
TLocale.sendTo(sender, "COMMANDS.TCLOUD.UPDATE.EXPANSION-NO-UPDATE", args[0]);
} else {
Bukkit.getScheduler().runTaskAsynchronously(TabooLib.instance(), () -> {
TLocale.sendTo(sender, "COMMANDS.TCLOUD.UPDATE.UPDATE-START", args[0], expansion.getVersion(), expansion.getLink());
FileUtils.download(expansion.getLink(), expansion.getFile());
TLocale.sendTo(sender, "COMMANDS.TCLOUD.UPDATE.UPDATE-SUCCESS", args[0]);
});
}
}
};
@CommandRegister(priority = 5)
BaseSubCommand list = new BaseSubCommand() {
@Override
public String getLabel() {
return "list";
}
@Override
public String getDescription() {
return TLibLocale.description("TCLOUD", "LIST");
}
@Override
public CommandArgument[] getArguments() {
return new CommandArgument[] {
TLibLocale.argument("TCLOUD", "LIST", 0),
TLibLocale.argument("TCLOUD", "LIST", 1, false)
};
}
@Override
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
ExpansionType type;
switch (args[0].toLowerCase()) {
case "plugins":
type = ExpansionType.PLUGIN;
break;
case "internal":
type = ExpansionType.INTERNAL;
break;
default:
TLocale.sendTo(sender, "COMMANDS.TCLOUD.LIST.INVALID-TYPE.0");
return;
}
Map<String, Expansion> expansions = type == ExpansionType.PLUGIN ? TCloudLoader.getExpansionPlugins() : TCloudLoader.getExpansionInternal();
int page = args.length < 2 ? 1 : NumberConversions.toInt(args[1]);
if (page < 1 || page > (expansions.size() / 5) + 1) {
TLocale.sendTo(sender, "COMMANDS.TCLOUD.LIST.INVALID-TYPE.1");
return;
}
TLocale.sendTo(sender, "COMMANDS.TCLOUD.LIST.LIST-HEAD", type.name(), String.valueOf(page), String.valueOf((expansions.size() / 5) + 1));
int i = (page - 1) * 5;
for (Map.Entry<String, Expansion> entry : new SimpleIterator(expansions).mapIterator((page - 1) * 5, page * 5)) {
if (!TCloudLoader.isExpansionExists(entry.getValue())) {
TLocale.sendTo(sender, "COMMANDS.TCLOUD.LIST.LIST-EXPANSION.0", String.valueOf(++i), entry.getValue().getName(), entry.getValue().getDescription());
} else if (entry.getValue().canUpdate()) {
TLocale.sendTo(sender, "COMMANDS.TCLOUD.LIST.LIST-EXPANSION.1", String.valueOf(++i), entry.getValue().getName(), entry.getValue().getDescription());
} else {
TLocale.sendTo(sender, "COMMANDS.TCLOUD.LIST.LIST-EXPANSION.2", String.valueOf(++i), entry.getValue().getName(), entry.getValue().getDescription());
}
}
TLocale.sendTo(sender, "COMMANDS.TCLOUD.LIST.LIST-BOTTOM");
}
};
@Override
public String getCommandTitle() {
return TLocale.asString("COMMANDS.TCLOUD.COMMAND-TITLE");

View File

@@ -49,16 +49,12 @@ public class TCloudLoader {
TLocale.Logger.error("TCLOUD.LIST-CONNECT-FAILED");
return;
}
TLocale.Logger.info("TCLOUD.LIST-CONNECT-SUCCESS", String.valueOf(System.currentTimeMillis() - time));
time = System.currentTimeMillis();
try {
latestJsonObject = new JsonParser().parse(latestJsonOrigin).getAsJsonObject();
} catch (Exception e) {
TLocale.Logger.info("TCLOUD.LIST-PARSE-FAILED", e.getMessage());
return;
}
TLocale.Logger.info("TCLOUD.LIST-PARSE-SUCCESS", String.valueOf(System.currentTimeMillis() - time));
time = System.currentTimeMillis();
if (latestJsonObject.has("plugins")) {
for (Map.Entry<String, JsonElement> pluginEntry : latestJsonObject.getAsJsonObject("plugins").entrySet()) {
try {

View File

@@ -8,6 +8,8 @@ import com.ilummc.tlib.resources.TLocale;
import me.skymc.taboolib.cloud.TCloudLoader;
import me.skymc.taboolib.fileutils.FileUtils;
import me.skymc.taboolib.string.ArrayUtils;
import org.bukkit.Bukkit;
import org.bukkit.util.NumberConversions;
import java.io.File;
import java.util.stream.IntStream;
@@ -94,4 +96,11 @@ public class Expansion {
public File getFile() {
return type == ExpansionType.INTERNAL ? new File(TCloudLoader.getExpansionInternalFolder(), "[TCLOUD] " + name + ".jar") : new File("plugins/[TCLOUD] " + name + ".jar");
}
public boolean canUpdate() {
if (!TCloudLoader.isExpansionExists(this)) {
return false;
}
return type == ExpansionType.PLUGIN && NumberConversions.toDouble(Bukkit.getPluginManager().getPlugin(name).getDescription().getVersion()) < NumberConversions.toDouble(version);
}
}

View File

@@ -100,7 +100,6 @@ public abstract class BaseSubCommand {
* @return String
*/
public String getCommandString(String label) {
String stringBuilder = Arrays.stream(getArguments()).map(parameter -> parameter.toString() + " ").collect(Collectors.joining());
return TLocale.asString("COMMANDS.INTERNAL.COMMAND-HELP", label, getLabel(), stringBuilder.trim(), getDescription());
return TLocale.asString("COMMANDS.INTERNAL.COMMAND-HELP", label, getLabel(), Arrays.stream(getArguments()).map(parameter -> parameter.toString() + " ").collect(Collectors.joining()), getDescription());
}
}

View File

@@ -26,4 +26,8 @@ public class TLibLocale {
public static CommandArgument argument(String name, String label, int index) {
return new CommandArgument(TLocale.asString("COMMANDS." + name + "." + label + ".ARGUMENTS." + index));
}
public static CommandArgument argument(String name, String label, int index, boolean required) {
return new CommandArgument(TLocale.asString("COMMANDS." + name + "." + label + ".ARGUMENTS." + index), required);
}
}

View File

@@ -0,0 +1,51 @@
package me.skymc.taboolib.common.util;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Map;
/**
* @Author sky
* @Since 2018-10-01 16:19
*/
public class SimpleIterator {
private final Object container;
public SimpleIterator(Object container) {
this.container = container;
}
public List<Map.Entry> mapIterator(int start, int end) {
List<Map.Entry> iterator = Lists.newArrayList();
Map container = (Map) this.container;
int loop = 0;
for (Object entry : container.entrySet()) {
if (loop++ >= start) {
if (loop <= end) {
iterator.add((Map.Entry) entry);
} else {
break;
}
}
}
return iterator;
}
public List listIterator(int start, int end) {
List iterator = Lists.newArrayList();
List container = (List) this.container;
int loop = 0;
for (Object entry : container) {
if (loop++ >= start) {
if (loop <= end) {
iterator.add(entry);
} else {
break;
}
}
}
return iterator;
}
}