From 80222524522291d474c54d33d0a24a8b43593b39 Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Sun, 27 Mar 2016 14:13:59 +0800 Subject: [PATCH] Fixed task system --- .../core/asset/MinecraftAssetService.java | 20 +-- .../core/download/CurseDownloadProvider.java | 2 +- .../core/install/InstallerVersionList.java | 15 +-- .../install/MinecraftInstallerService.java | 51 +++----- .../forge/MinecraftForgeVersionList.java | 106 ++++++++------- .../liteloader/LiteLoaderVersionList.java | 75 ++++++----- .../bmcl/OptiFineBMCLVersionList.java | 66 ++++++---- .../optifine/vanilla/OptiFineVersionList.java | 121 ++++++++++-------- .../core/version/LibraryDownloadInfo.java | 2 +- .../launcher/ui/InstallerPanel.java | 9 +- .../hellominecraft/util/system/ZipEngine.java | 2 + .../hellominecraft/util/tasks/DoubleTask.java | 23 +++- .../hellominecraft/util/tasks/TaskList.java | 2 + .../util/tasks/TaskRunnableArg1.java | 54 -------- .../hellominecraft/util/tasks/TaskWindow.java | 6 +- .../util/tasks/download/FileDownloadTask.java | 2 + .../util/tasks/download/HTTPGetTask.java | 11 +- 17 files changed, 278 insertions(+), 289 deletions(-) delete mode 100755 HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskRunnableArg1.java diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java index a81f4ac21..55983d959 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java @@ -22,7 +22,6 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collection; -import java.util.HashSet; import java.util.Map; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftAssetService; @@ -30,7 +29,6 @@ import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.version.AssetIndexDownloadInfo; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.util.MessageBox; -import org.jackhuang.hellominecraft.util.Utils; import org.jackhuang.hellominecraft.util.func.Function; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.tasks.Task; @@ -58,23 +56,7 @@ public class MinecraftAssetService extends IMinecraftAssetService { public Task downloadAssets(final MinecraftVersion mv) { if (mv == null) return null; - return new TaskInfo("Download Assets") { - Collection afters = new HashSet<>(); - - @Override - public Collection getDependTasks() { - return Arrays.asList(IAssetsHandler.ASSETS_HANDLER.getList(mv, service.asset())); - } - - @Override - public void executeTask() { - } - - @Override - public Collection getAfterTasks() { - return Arrays.asList(IAssetsHandler.ASSETS_HANDLER.getDownloadTask(service.getDownloadType().getProvider())); - } - }; + return IAssetsHandler.ASSETS_HANDLER.getList(mv, service.asset()).after(IAssetsHandler.ASSETS_HANDLER.getDownloadTask(service.getDownloadType().getProvider())); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/CurseDownloadProvider.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/CurseDownloadProvider.java index 1d8f773a1..2cf81138d 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/CurseDownloadProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/CurseDownloadProvider.java @@ -25,7 +25,7 @@ public class CurseDownloadProvider extends MojangDownloadProvider { @Override public String getParsedDownloadURL(String str) { - return str == null ? null : str.replace("http://files.minecraftforge.net/maven", "http://ftb.cursecdn.com/FTB2/maven/"); + return str == null ? null : str.replace("http://files.minecraftforge.net/maven", "http://ftb.cursecdn.com/FTB2/maven"); } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java index 14bb8b095..2aefcea2c 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/InstallerVersionList.java @@ -22,13 +22,13 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; -import org.jackhuang.hellominecraft.util.func.Consumer; +import org.jackhuang.hellominecraft.util.tasks.Task; /** * * @author huangyuhui */ -public abstract class InstallerVersionList implements Consumer { +public abstract class InstallerVersionList { /** * Refresh installer versions list from the downloaded content. @@ -37,7 +37,7 @@ public abstract class InstallerVersionList implements Consumer { * * @throws java.lang.Exception including network exceptions, IO exceptions. */ - public abstract void refreshList(String[] versions) throws Exception; + public abstract Task refresh(String[] versions); /** * Installer name. @@ -117,13 +117,4 @@ public abstract class InstallerVersionList implements Consumer { return o2.compareTo(o1); } } - - @Override - public void accept(String[] v) { - try { - refreshList(v); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java index 93e5f1031..4cdcccada 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java @@ -27,8 +27,6 @@ import org.jackhuang.hellominecraft.launcher.core.install.liteloader.LiteLoaderV import org.jackhuang.hellominecraft.launcher.core.install.optifine.OptiFineInstaller; import org.jackhuang.hellominecraft.launcher.core.install.optifine.vanilla.OptiFineDownloadFormatter; import org.jackhuang.hellominecraft.util.tasks.Task; -import org.jackhuang.hellominecraft.util.tasks.TaskInfo; -import org.jackhuang.hellominecraft.util.tasks.TaskWindow; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; import org.jackhuang.hellominecraft.util.system.IOUtils; @@ -58,47 +56,28 @@ public final class MinecraftInstallerService extends IMinecraftInstallerService @Override public Task downloadForge(String installId, InstallerVersion v) { - return new TaskInfo("Forge Downloader") { - @Override - public void executeTask() { - File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "forge-installer.jar"); - if (v.installer != null) - TaskWindow.factory() - .append(new FileDownloadTask(service.getDownloadType().getProvider().getParsedDownloadURL(v.installer), filepath).setTag("forge")) - .append(new ForgeInstaller(service, filepath)) - .create(); - } - }; + File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "forge-installer.jar"); + if (v.installer == null) + return null; + else + return new FileDownloadTask(service.getDownloadType().getProvider().getParsedDownloadURL(v.installer), filepath).setTag("forge") + .after(new ForgeInstaller(service, filepath)); } @Override public Task downloadOptiFine(String installId, InstallerVersion v) { - return new TaskInfo("OptiFine Downloader") { - @Override - public void executeTask() { - File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "optifine-installer.jar"); - if (v.installer != null) { - OptiFineDownloadFormatter task = new OptiFineDownloadFormatter(v.installer); - TaskWindow.factory().append(task) - .append(new FileDownloadTask(filepath).registerPreviousResult(task).setTag("optifine")) - .append(new OptiFineInstaller(service, installId, v, filepath)) - .create(); - } - } - }; + File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "optifine-installer.jar"); + if (v.installer == null) + return null; + OptiFineDownloadFormatter task = new OptiFineDownloadFormatter(v.installer); + return task.after(new FileDownloadTask(filepath).registerPreviousResult(task).setTag("optifine")) + .after(new OptiFineInstaller(service, installId, v, filepath)); } @Override public Task downloadLiteLoader(String installId, InstallerVersion v) { - return new TaskInfo("LiteLoader Downloader") { - @Override - public void executeTask() { - File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "liteloader-universal.jar"); - FileDownloadTask task = (FileDownloadTask) new FileDownloadTask(v.universal, filepath).setTag("LiteLoader"); - TaskWindow.factory() - .append(task).append(new LiteLoaderInstaller(service, installId, (LiteLoaderVersionList.LiteLoaderInstallerVersion) v).registerPreviousResult(task)) - .create(); - } - }; + File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "liteloader-universal.jar"); + FileDownloadTask task = (FileDownloadTask) new FileDownloadTask(v.universal, filepath).setTag("LiteLoader"); + return task.after(new LiteLoaderInstaller(service, installId, (LiteLoaderVersionList.LiteLoaderInstallerVersion) v).registerPreviousResult(task)); } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java index 800874e7a..984425ca1 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java @@ -18,6 +18,8 @@ package org.jackhuang.hellominecraft.launcher.core.install.forge; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -27,7 +29,9 @@ import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.launcher.core.install.InstallerVersionList; import org.jackhuang.hellominecraft.launcher.core.install.InstallerVersionNewerComparator; -import org.jackhuang.hellominecraft.util.NetUtils; +import org.jackhuang.hellominecraft.util.tasks.Task; +import org.jackhuang.hellominecraft.util.tasks.TaskInfo; +import org.jackhuang.hellominecraft.util.tasks.download.HTTPGetTask; /** * @@ -48,54 +52,68 @@ public class MinecraftForgeVersionList extends InstallerVersionList { public List versions; @Override - public void refreshList(String[] needed) throws Exception { + public Task refresh(String[] needed) { if (root != null) - return; - String s = NetUtils.get(DownloadType.getSuggestedDownloadType().getProvider().getParsedDownloadURL(C.URL_FORGE_LIST)); + return null; + return new TaskInfo(C.i18n("install.forge.get_list")) { + HTTPGetTask task = new HTTPGetTask(DownloadType.getSuggestedDownloadType().getProvider().getParsedDownloadURL(C.URL_FORGE_LIST)); - root = C.GSON.fromJson(s, MinecraftForgeVersionRoot.class); - - versionMap = new HashMap<>(); - versions = new ArrayList<>(); - - for (Map.Entry arr : root.mcversion.entrySet()) { - String mcver = StrUtils.formatVersion(arr.getKey()); - ArrayList al = new ArrayList<>(); - for (int num : arr.getValue()) { - MinecraftForgeVersion v = root.number.get(num); - InstallerVersion iv = new InstallerVersion(v.version, StrUtils.formatVersion(v.mcversion)); - for (String[] f : v.files) { - - String ver = v.mcversion + "-" + v.version; - if (!StrUtils.isBlank(v.branch)) - ver = ver + "-" + v.branch; - String filename = root.artifact + "-" + ver + "-" + f[1] + "." + f[0]; - String url = DownloadType.getSuggestedDownloadType().getProvider().getParsedDownloadURL(root.webpath + ver + "/" + filename); - switch (f[1]) { - case "installer": - iv.installer = url; - break; - case "universal": - iv.universal = url; - break; - case "changelog": - iv.changelog = url; - break; - default: - break; - } - } - if (StrUtils.isBlank(iv.installer) || StrUtils.isBlank(iv.universal)) - continue; - Collections.sort(al, new InstallerVersionNewerComparator()); - al.add(iv); - versions.add(iv); + @Override + public Collection getDependTasks() { + return Arrays.asList(task); } - versionMap.put(StrUtils.formatVersion(mcver), al); - } + @Override + public void executeTask() throws Throwable { + if (!areDependTasksSucceeded) + return; + String s = task.getResult(); - Collections.sort(versions, new InstallerVersionComparator()); + root = C.GSON.fromJson(s, MinecraftForgeVersionRoot.class); + + versionMap = new HashMap<>(); + versions = new ArrayList<>(); + + for (Map.Entry arr : root.mcversion.entrySet()) { + String mcver = StrUtils.formatVersion(arr.getKey()); + ArrayList al = new ArrayList<>(); + for (int num : arr.getValue()) { + MinecraftForgeVersion v = root.number.get(num); + InstallerVersion iv = new InstallerVersion(v.version, StrUtils.formatVersion(v.mcversion)); + for (String[] f : v.files) { + + String ver = v.mcversion + "-" + v.version; + if (!StrUtils.isBlank(v.branch)) + ver = ver + "-" + v.branch; + String filename = root.artifact + "-" + ver + "-" + f[1] + "." + f[0]; + String url = DownloadType.getSuggestedDownloadType().getProvider().getParsedDownloadURL(root.webpath + ver + "/" + filename); + switch (f[1]) { + case "installer": + iv.installer = url; + break; + case "universal": + iv.universal = url; + break; + case "changelog": + iv.changelog = url; + break; + default: + break; + } + } + if (StrUtils.isBlank(iv.installer) || StrUtils.isBlank(iv.universal)) + continue; + Collections.sort(al, new InstallerVersionNewerComparator()); + al.add(iv); + versions.add(iv); + } + + versionMap.put(StrUtils.formatVersion(mcver), al); + } + + Collections.sort(versions, new InstallerVersionComparator()); + } + }; } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderVersionList.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderVersionList.java index e21231ebe..b8ab21c0b 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderVersionList.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderVersionList.java @@ -19,6 +19,7 @@ package org.jackhuang.hellominecraft.launcher.core.install.liteloader; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -28,8 +29,10 @@ import org.jackhuang.hellominecraft.launcher.core.version.MinecraftLibrary; import org.jackhuang.hellominecraft.launcher.core.install.InstallerVersionList; import org.jackhuang.hellominecraft.launcher.core.install.InstallerVersionList.InstallerVersion; import org.jackhuang.hellominecraft.launcher.core.install.InstallerVersionNewerComparator; -import org.jackhuang.hellominecraft.util.NetUtils; import org.jackhuang.hellominecraft.util.StrUtils; +import org.jackhuang.hellominecraft.util.tasks.Task; +import org.jackhuang.hellominecraft.util.tasks.TaskInfo; +import org.jackhuang.hellominecraft.util.tasks.download.HTTPGetTask; /** * @@ -50,38 +53,52 @@ public class LiteLoaderVersionList extends InstallerVersionList { public List versions; @Override - public void refreshList(String[] needed) throws Exception { - String s = NetUtils.get(C.URL_LITELOADER_LIST); + public Task refresh(String[] needed) { if (root != null) - return; + return null; + return new TaskInfo(C.i18n("install.liteloader.get_list")) { + HTTPGetTask task = new HTTPGetTask(C.URL_LITELOADER_LIST); - root = C.GSON.fromJson(s, LiteLoaderVersionsRoot.class); - - versionMap = new HashMap<>(); - versions = new ArrayList<>(); - - for (Map.Entry arr : root.versions.entrySet()) { - ArrayList al = new ArrayList<>(); - LiteLoaderMCVersions mcv = arr.getValue(); - if (mcv == null || mcv.artefacts == null || mcv.artefacts.get("com.mumfrey:liteloader") == null) - continue; - for (Map.Entry entry : mcv.artefacts.get("com.mumfrey:liteloader").entrySet()) { - if ("latest".equals(entry.getKey())) - continue; - LiteLoaderVersion v = entry.getValue(); - LiteLoaderInstallerVersion iv = new LiteLoaderInstallerVersion(v.version, StrUtils.formatVersion(arr.getKey())); - iv.universal = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + arr.getKey() + "/" + v.file; - iv.tweakClass = v.tweakClass; - iv.libraries = Arrays.copyOf(v.libraries, v.libraries.length); - iv.installer = "http://dl.liteloader.com/redist/" + iv.mcVersion + "/liteloader-installer-" + iv.selfVersion.replace("_", "-") + ".jar"; - al.add(iv); - versions.add(iv); + @Override + public Collection getDependTasks() { + return Arrays.asList(task); } - Collections.sort(al, new InstallerVersionNewerComparator()); - versionMap.put(StrUtils.formatVersion(arr.getKey()), al); - } - Collections.sort(versions, InstallerVersionComparator.INSTANCE); + @Override + public void executeTask() throws Throwable { + if (!areDependTasksSucceeded) + return; + String s = task.getResult(); + + root = C.GSON.fromJson(s, LiteLoaderVersionsRoot.class); + + versionMap = new HashMap<>(); + versions = new ArrayList<>(); + + for (Map.Entry arr : root.versions.entrySet()) { + ArrayList al = new ArrayList<>(); + LiteLoaderMCVersions mcv = arr.getValue(); + if (mcv == null || mcv.artefacts == null || mcv.artefacts.get("com.mumfrey:liteloader") == null) + continue; + for (Map.Entry entry : mcv.artefacts.get("com.mumfrey:liteloader").entrySet()) { + if ("latest".equals(entry.getKey())) + continue; + LiteLoaderVersion v = entry.getValue(); + LiteLoaderInstallerVersion iv = new LiteLoaderInstallerVersion(v.version, StrUtils.formatVersion(arr.getKey())); + iv.universal = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + arr.getKey() + "/" + v.file; + iv.tweakClass = v.tweakClass; + iv.libraries = Arrays.copyOf(v.libraries, v.libraries.length); + iv.installer = "http://dl.liteloader.com/redist/" + iv.mcVersion + "/liteloader-installer-" + iv.selfVersion.replace("_", "-") + ".jar"; + al.add(iv); + versions.add(iv); + } + Collections.sort(al, new InstallerVersionNewerComparator()); + versionMap.put(StrUtils.formatVersion(arr.getKey()), al); + } + + Collections.sort(versions, InstallerVersionComparator.INSTANCE); + } + }; } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/bmcl/OptiFineBMCLVersionList.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/bmcl/OptiFineBMCLVersionList.java index 3718d21c8..f0003b91f 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/bmcl/OptiFineBMCLVersionList.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/bmcl/OptiFineBMCLVersionList.java @@ -20,6 +20,8 @@ package org.jackhuang.hellominecraft.launcher.core.install.optifine.bmcl; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -30,8 +32,10 @@ import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.ArrayUtils; import org.jackhuang.hellominecraft.launcher.core.install.InstallerVersionList; import org.jackhuang.hellominecraft.launcher.core.install.optifine.OptiFineVersion; -import org.jackhuang.hellominecraft.util.NetUtils; import org.jackhuang.hellominecraft.util.StrUtils; +import org.jackhuang.hellominecraft.util.tasks.Task; +import org.jackhuang.hellominecraft.util.tasks.TaskInfo; +import org.jackhuang.hellominecraft.util.tasks.download.HTTPGetTask; /** * @@ -55,34 +59,46 @@ public class OptiFineBMCLVersionList extends InstallerVersionList { }.getType(); @Override - public void refreshList(String[] needed) throws Exception { - String s = NetUtils.get("http://bmclapi.bangbang93.com/optifine/versionlist"); + public Task refresh(String[] needed) { + return new TaskInfo(C.i18n("install.optifine.get_list")) { + HTTPGetTask task = new HTTPGetTask("http://bmclapi.bangbang93.com/optifine/versionlist"); - versionMap = new HashMap<>(); - versions = new ArrayList<>(); - - if (s == null) - return; - root = C.GSON.fromJson(s, TYPE); - for (OptiFineVersion v : root) { - v.setMirror(v.getMirror().replace("http://optifine.net/http://optifine.net/", "http://optifine.net/")); - - if (StrUtils.isBlank(v.getMCVersion())) { - Pattern p = Pattern.compile("OptiFine (.*) HD"); - Matcher m = p.matcher(v.getVersion()); - while (m.find()) - v.setMCVersion(m.group(1)); + @Override + public Collection getDependTasks() { + return Arrays.asList(task); } - InstallerVersion iv = new InstallerVersion(v.getVersion(), StrUtils.formatVersion(v.getMCVersion())); - List al = ArrayUtils.tryGetMapWithList(versionMap, StrUtils.formatVersion(v.getMCVersion())); - //String url = "http://bmclapi.bangbang93.com/optifine/" + iv.selfVersion.replace(" ", "%20"); - iv.installer = iv.universal = v.getMirror(); - al.add(iv); - versions.add(iv); - } + @Override + public void executeTask() throws Throwable { + String s = task.getResult(); - Collections.sort(versions, InstallerVersionComparator.INSTANCE); + versionMap = new HashMap<>(); + versions = new ArrayList<>(); + + if (s == null) + return; + root = C.GSON.fromJson(s, TYPE); + for (OptiFineVersion v : root) { + v.setMirror(v.getMirror().replace("http://optifine.net/http://optifine.net/", "http://optifine.net/")); + + if (StrUtils.isBlank(v.getMCVersion())) { + Pattern p = Pattern.compile("OptiFine (.*) HD"); + Matcher m = p.matcher(v.getVersion()); + while (m.find()) + v.setMCVersion(m.group(1)); + } + InstallerVersion iv = new InstallerVersion(v.getVersion(), StrUtils.formatVersion(v.getMCVersion())); + + List al = ArrayUtils.tryGetMapWithList(versionMap, StrUtils.formatVersion(v.getMCVersion())); + //String url = "http://bmclapi.bangbang93.com/optifine/" + iv.selfVersion.replace(" ", "%20"); + iv.installer = iv.universal = v.getMirror(); + al.add(iv); + versions.add(iv); + } + + Collections.sort(versions, InstallerVersionComparator.INSTANCE); + } + }; } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/vanilla/OptiFineVersionList.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/vanilla/OptiFineVersionList.java index 6db757162..02c015bd2 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/vanilla/OptiFineVersionList.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/vanilla/OptiFineVersionList.java @@ -20,6 +20,8 @@ package org.jackhuang.hellominecraft.launcher.core.install.optifine.vanilla; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -32,8 +34,11 @@ import javax.xml.parsers.ParserConfigurationException; import org.jackhuang.hellominecraft.launcher.core.install.InstallerVersionList; import org.jackhuang.hellominecraft.launcher.core.install.optifine.OptiFineVersion; import org.jackhuang.hellominecraft.util.ArrayUtils; -import org.jackhuang.hellominecraft.util.NetUtils; +import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.StrUtils; +import org.jackhuang.hellominecraft.util.tasks.Task; +import org.jackhuang.hellominecraft.util.tasks.TaskInfo; +import org.jackhuang.hellominecraft.util.tasks.download.HTTPGetTask; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -59,60 +64,74 @@ public class OptiFineVersionList extends InstallerVersionList { public List versions; @Override - public void refreshList(String[] sss) throws Exception { - String content = NetUtils.get("http://optifine.net/downloads"); + public Task refresh(String[] sss) { if (versions != null) - return; - versionMap = new HashMap<>(); - versions = new ArrayList<>(); + return null; + return new TaskInfo(C.i18n("install.optifine.get_list")) { + HTTPGetTask task = new HTTPGetTask("http://optifine.net/downloads"); - content = content.replace(" ", " ").replace(">", ">").replace("<", "<").replace("
", "
"); - - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder db = factory.newDocumentBuilder(); - Document doc = db.parse(new ByteArrayInputStream(content.getBytes("UTF-8"))); - Element r = doc.getDocumentElement(); - NodeList tables = r.getElementsByTagName("table"); - for (int i = 0; i < tables.getLength(); i++) { - Element e = (Element) tables.item(i); - if ("downloadTable".equals(e.getAttribute("class"))) { - NodeList tr = e.getElementsByTagName("tr"); - for (int k = 0; k < tr.getLength(); k++) { - NodeList downloadLine = ((Element) tr.item(k)).getElementsByTagName("td"); - OptiFineVersion v = new OptiFineVersion(); - for (int j = 0; j < downloadLine.getLength(); j++) { - Element td = (Element) downloadLine.item(j); - if (StrUtils.startsWith(td.getAttribute("class"), "downloadLineMirror")) - v.setMirror(((Element) td.getElementsByTagName("a").item(0)).getAttribute("href")); - if (StrUtils.startsWith(td.getAttribute("class"), "downloadLineDownload")) - v.setDownloadLink(((Element) td.getElementsByTagName("a").item(0)).getAttribute("href")); - if (StrUtils.startsWith(td.getAttribute("class"), "downloadLineDate")) - v.setDate(td.getTextContent()); - if (StrUtils.startsWith(td.getAttribute("class"), "downloadLineFile")) - v.setVersion(td.getTextContent()); - } - if (StrUtils.isBlank(v.getMCVersion())) { - Pattern p = Pattern.compile("OptiFine (.*?) "); - Matcher m = p.matcher(v.getVersion()); - while (m.find()) - v.setMCVersion(StrUtils.formatVersion(m.group(1))); - } - InstallerVersion iv = new InstallerVersion(v.getVersion(), StrUtils.formatVersion(v.getMCVersion())); - iv.installer = iv.universal = v.getMirror(); - root.add(v); - versions.add(iv); - - List ivl = ArrayUtils.tryGetMapWithList(versionMap, StrUtils.formatVersion(v.getMCVersion())); - ivl.add(iv); - } - } + @Override + public Collection getDependTasks() { + return Arrays.asList(task); } - } catch (ParserConfigurationException | SAXException | IOException | DOMException ex) { - throw new RuntimeException(ex); - } - Collections.sort(versions, InstallerVersionComparator.INSTANCE); + @Override + public void executeTask() throws Throwable { + if (!areDependTasksSucceeded) + return; + String content = task.getResult(); + versionMap = new HashMap<>(); + versions = new ArrayList<>(); + + content = content.replace(" ", " ").replace(">", ">").replace("<", "<").replace("
", "
"); + + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = factory.newDocumentBuilder(); + Document doc = db.parse(new ByteArrayInputStream(content.getBytes("UTF-8"))); + Element r = doc.getDocumentElement(); + NodeList tables = r.getElementsByTagName("table"); + for (int i = 0; i < tables.getLength(); i++) { + Element e = (Element) tables.item(i); + if ("downloadTable".equals(e.getAttribute("class"))) { + NodeList tr = e.getElementsByTagName("tr"); + for (int k = 0; k < tr.getLength(); k++) { + NodeList downloadLine = ((Element) tr.item(k)).getElementsByTagName("td"); + OptiFineVersion v = new OptiFineVersion(); + for (int j = 0; j < downloadLine.getLength(); j++) { + Element td = (Element) downloadLine.item(j); + if (StrUtils.startsWith(td.getAttribute("class"), "downloadLineMirror")) + v.setMirror(((Element) td.getElementsByTagName("a").item(0)).getAttribute("href")); + if (StrUtils.startsWith(td.getAttribute("class"), "downloadLineDownload")) + v.setDownloadLink(((Element) td.getElementsByTagName("a").item(0)).getAttribute("href")); + if (StrUtils.startsWith(td.getAttribute("class"), "downloadLineDate")) + v.setDate(td.getTextContent()); + if (StrUtils.startsWith(td.getAttribute("class"), "downloadLineFile")) + v.setVersion(td.getTextContent()); + } + if (StrUtils.isBlank(v.getMCVersion())) { + Pattern p = Pattern.compile("OptiFine (.*?) "); + Matcher m = p.matcher(v.getVersion()); + while (m.find()) + v.setMCVersion(StrUtils.formatVersion(m.group(1))); + } + InstallerVersion iv = new InstallerVersion(v.getVersion(), StrUtils.formatVersion(v.getMCVersion())); + iv.installer = iv.universal = v.getMirror(); + root.add(v); + versions.add(iv); + + List ivl = ArrayUtils.tryGetMapWithList(versionMap, StrUtils.formatVersion(v.getMCVersion())); + ivl.add(iv); + } + } + } + } catch (ParserConfigurationException | SAXException | IOException | DOMException ex) { + throw new RuntimeException(ex); + } + + Collections.sort(versions, InstallerVersionComparator.INSTANCE); + } + }; } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java index 4123989bf..6aafe41e7 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/LibraryDownloadInfo.java @@ -31,7 +31,7 @@ public class LibraryDownloadInfo extends GameDownloadInfo { @Override public String getUrl(DownloadType dt, boolean allowSelf) { - String myURL = (forgeURL == null ? dt.getProvider().getLibraryDownloadURL() : forgeURL) + "/"; + String myURL = (forgeURL == null ? dt.getProvider().getLibraryDownloadURL() : forgeURL); if (StrUtils.isNotBlank(url) && allowSelf) myURL = url; if (!myURL.endsWith(".jar")) diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java index 64ac2d8d5..26ebaad1b 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java @@ -25,9 +25,7 @@ import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.core.install.InstallerType; import org.jackhuang.hellominecraft.launcher.core.install.InstallerVersionList; import org.jackhuang.hellominecraft.util.tasks.TaskRunnable; -import org.jackhuang.hellominecraft.util.tasks.TaskRunnableArg1; import org.jackhuang.hellominecraft.util.tasks.TaskWindow; -import org.jackhuang.hellominecraft.util.tasks.communication.DefaultPreviousResult; import org.jackhuang.hellominecraft.util.MessageBox; import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.ui.SwingUtils; @@ -123,9 +121,7 @@ public class InstallerPanel extends AnimatedPanel { InstallerType id; void refreshVersions() { - if (TaskWindow.factory().append(new TaskRunnableArg1<>(C.i18n("install." + id.id + ".get_list"), list) - .registerPreviousResult(new DefaultPreviousResult<>(new String[] { gsp.getMinecraftVersionFormatted() }))) - .create()) + if (TaskWindow.execute(list.refresh(new String[] { gsp.getMinecraftVersionFormatted() }))) loadVersions(); } @@ -139,7 +135,8 @@ public class InstallerPanel extends AnimatedPanel { MessageBox.Show(C.i18n("install.not_refreshed")); return; } - Settings.getLastProfile().service().install().download(Settings.getLastProfile().getSelectedVersion(), getVersion(idx), id).after(new TaskRunnable(this::refreshVersions)).run(); + TaskWindow.execute(Settings.getLastProfile().service().install().download(Settings.getLastProfile().getSelectedVersion(), getVersion(idx), id), + new TaskRunnable(this::refreshVersions)); } public void loadVersions() { diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/system/ZipEngine.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/system/ZipEngine.java index 7dea0d56e..8c28853de 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/system/ZipEngine.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/system/ZipEngine.java @@ -88,6 +88,8 @@ public class ZipEngine { files = new File[1]; files[0] = source; } + if (files == null) + return; String pathName;//存相对路径(相对于待压缩的根目录) for (File file : files) if (file.isDirectory()) { diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoubleTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoubleTask.java index 1e8ca511c..eb858c9bc 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoubleTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoubleTask.java @@ -17,28 +17,39 @@ */ package org.jackhuang.hellominecraft.util.tasks; +import java.util.Arrays; +import java.util.Collection; + /** * * @author huangyuhui */ -public class DoubleTask extends Task { +public class DoubleTask extends TaskInfo { Task a, b; public DoubleTask(Task a, Task b) { + this(a, b, "Double Task"); + } + + public DoubleTask(Task a, Task b, String info) { + super(info); this.a = a; this.b = b; } @Override - public void executeTask() throws Throwable { - a.executeTask(); - b.executeTask(); + public Collection getDependTasks() { + return Arrays.asList(a); } @Override - public String getInfo() { - return "Double Task"; + public Collection getAfterTasks() { + return Arrays.asList(b); + } + + @Override + public void executeTask() throws Throwable { } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java index 88eaa6e6d..df318b254 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java @@ -101,6 +101,8 @@ public class TaskList extends Thread { AtomicBoolean bool = new AtomicBoolean(true); CountDownLatch counter = new CountDownLatch(c.size()); for (Task t2 : c) { + if (t2 == null) + continue; t2.setParallelExecuting(true); Invoker thread = new Invoker(t2, counter, bool); invokers.add(thread); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskRunnableArg1.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskRunnableArg1.java deleted file mode 100755 index 137461cc3..000000000 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskRunnableArg1.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Hello Minecraft!. - * Copyright (C) 2013 huangyuhui - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see {http://www.gnu.org/licenses/}. - */ -package org.jackhuang.hellominecraft.util.tasks; - -import java.util.ArrayList; -import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResult; -import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResultRegistrar; -import org.jackhuang.hellominecraft.util.func.Consumer; - -/** - * - * @author huangyuhui - * @param Runnable<T> - */ -public class TaskRunnableArg1 extends TaskInfo implements PreviousResultRegistrar { - - private final Consumer r; - - public TaskRunnableArg1(String info, Consumer r) { - super(info); - this.r = r; - } - - @Override - public void executeTask() throws Exception { - if (al.size() != 1) - throw new IllegalStateException("the count of args is not one."); - r.accept(al.get(0).getResult()); - } - - ArrayList> al = new ArrayList(); - - @Override - public Task registerPreviousResult(PreviousResult pr) { - al.add(pr); - return this; - } - -} diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java index f783e5257..83f3c4276 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java @@ -216,8 +216,8 @@ public class TaskWindow extends javax.swing.JDialog if (idx == -1) return; int pgs = progress * 100 / max; - if (progresses.contains(idx) && progresses.get(idx) != pgs && lstDownload.getRowCount() > idx) { - SwingUtils.setValueAt(lstDownload, pgs + "%", idx, 1); + if (progresses.size() > idx && progresses.get(idx) != pgs && lstDownload.getRowCount() > idx) { + SwingUtils.setValueAt(lstDownload, pgs < 0 ? "???" : pgs + "%", idx, 1); progresses.set(idx, pgs); } }); @@ -242,7 +242,7 @@ public class TaskWindow extends javax.swing.JDialog if (taskList == null) return; tasks.add(task); - progresses.add(0); + progresses.add(-1); SwingUtils.appendLast(lstDownload, task.getInfo(), "0%"); SwingUtils.moveEnd(srlDownload); }); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java index 8664d6ec4..d4e97809f 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java @@ -130,6 +130,8 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev if (!shouldContinue) break; try { + if (ppl != null) + ppl.setProgress(this, -1, 1); // Open connection to URL. HttpURLConnection connection diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/HTTPGetTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/HTTPGetTask.java index 7344419fe..7aa7c0ec5 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/HTTPGetTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/HTTPGetTask.java @@ -57,15 +57,22 @@ public class HTTPGetTask extends TaskInfo implements PreviousResult { if (repeat > 0) HMCLog.warn("Failed to download, repeat: " + repeat); try { + if (ppl != null) + ppl.setProgress(this, -1, 1); URLConnection conn = new URL(url).openConnection(); InputStream is = conn.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int i; int size = conn.getContentLength(), read = 0; + long lastTime = System.currentTimeMillis(); while ((i = is.read()) != -1) { baos.write(i); - if (ppl != null) - ppl.setProgress(this, ++read, size); + ++read; + long now = System.currentTimeMillis(); + if (ppl != null && (now - lastTime) >= 1000) { + ppl.setProgress(this, read, size); + lastTime = now; + } if (!shouldContinue) return; }