From 9062c2e447d0e160b99ed80ad89d0b8c647e4724 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sun, 17 Feb 2019 13:45:10 +0800 Subject: [PATCH] Display more friendly error message when fail to install library --- .../ui/download/InstallerWizardProvider.java | 16 +++++++++++++++- .../download/ModpackInstallWizardProvider.java | 9 +-------- .../download/VanillaInstallWizardProvider.java | 18 +----------------- .../main/resources/assets/lang/I18N.properties | 1 + .../resources/assets/lang/I18N_zh.properties | 1 + .../assets/lang/I18N_zh_CN.properties | 1 + .../download/game/LibraryDownloadTask.java | 5 +++-- .../jackhuang/hmcl/task/DownloadException.java | 4 +++- 8 files changed, 26 insertions(+), 29 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java index d517816fe..87f1360f5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java @@ -21,12 +21,17 @@ import javafx.scene.Node; import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.LibraryAnalyzer; import org.jackhuang.hmcl.download.RemoteVersion; +import org.jackhuang.hmcl.download.game.LibraryDownloadException; import org.jackhuang.hmcl.game.Library; import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.setting.Profile; +import org.jackhuang.hmcl.task.DownloadException; import org.jackhuang.hmcl.task.Task; +import org.jackhuang.hmcl.ui.Controllers; +import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardProvider; +import org.jackhuang.hmcl.util.StringUtils; import java.util.Map; @@ -82,7 +87,7 @@ public final class InstallerWizardProvider implements WizardProvider { @Override public Object finish(Map settings) { settings.put("success_message", i18n("install.success")); - settings.put("failure_message", i18n("install.failed")); + settings.put("failure_callback", (FailureCallback) (settings1, exception, next) -> alertFailureMessage(exception, next)); Task ret = Task.ofResult("version", () -> version); @@ -114,4 +119,13 @@ public final class InstallerWizardProvider implements WizardProvider { return true; } + public static void alertFailureMessage(Exception exception, Runnable next) { + if (exception instanceof LibraryDownloadException) { + Controllers.dialog(i18n("launch.failed.download_library", ((LibraryDownloadException) exception).getLibrary().getName()) + "\n" + StringUtils.getStackTrace(exception.getCause()), i18n("install.failed.downloading"), MessageBox.ERROR_MESSAGE, next); + } else if (exception instanceof DownloadException) { + Controllers.dialog(i18n("install.failed.downloading.detail", ((DownloadException) exception).getUrl()) + "\n" + StringUtils.getStackTrace(exception.getCause()), i18n("install.failed.downloading"), MessageBox.ERROR_MESSAGE, next); + } else { + Controllers.dialog(StringUtils.getStackTrace(exception), i18n("install.failed"), MessageBox.ERROR_MESSAGE, next); + } + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackInstallWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackInstallWizardProvider.java index a06c75813..5536940ab 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackInstallWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackInstallWizardProvider.java @@ -18,21 +18,18 @@ package org.jackhuang.hmcl.ui.download; import javafx.scene.Node; -import org.jackhuang.hmcl.download.game.LibraryDownloadException; import org.jackhuang.hmcl.game.ModpackHelper; import org.jackhuang.hmcl.mod.CurseCompletionException; import org.jackhuang.hmcl.mod.MismatchedModpackTypeException; import org.jackhuang.hmcl.mod.Modpack; import org.jackhuang.hmcl.mod.UnsupportedModpackException; import org.jackhuang.hmcl.setting.Profile; -import org.jackhuang.hmcl.task.DownloadException; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardProvider; -import org.jackhuang.hmcl.util.StringUtils; import java.io.File; import java.io.FileNotFoundException; @@ -112,12 +109,8 @@ public class ModpackInstallWizardProvider implements WizardProvider { } else { Controllers.dialog(i18n("modpack.type.curse.tolerable_error"), i18n("install.success"), MessageBox.INFORMATION_MESSAGE, next); } - } else if (exception instanceof LibraryDownloadException) { - Controllers.dialog(i18n("launch.failed.download_library", ((LibraryDownloadException) exception).getLibrary().getName()) + "\n" + StringUtils.getStackTrace(exception.getCause()), i18n("install.failed.downloading"), MessageBox.ERROR_MESSAGE, next); - } else if (exception instanceof DownloadException) { - Controllers.dialog(StringUtils.getStackTrace(exception), i18n("install.failed.downloading"), MessageBox.ERROR_MESSAGE, next); } else { - Controllers.dialog(StringUtils.getStackTrace(exception), i18n("install.failed"), MessageBox.ERROR_MESSAGE, next); + InstallerWizardProvider.alertFailureMessage(exception, next); } } }); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VanillaInstallWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VanillaInstallWizardProvider.java index b0105819d..9a3e6bcbf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VanillaInstallWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VanillaInstallWizardProvider.java @@ -21,16 +21,11 @@ import javafx.scene.Node; import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.GameBuilder; import org.jackhuang.hmcl.download.RemoteVersion; -import org.jackhuang.hmcl.download.game.LibraryDownloadException; import org.jackhuang.hmcl.setting.Profile; -import org.jackhuang.hmcl.task.DownloadException; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.ui.Controllers; -import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardProvider; -import org.jackhuang.hmcl.util.StringUtils; import java.util.Map; @@ -71,18 +66,7 @@ public final class VanillaInstallWizardProvider implements WizardProvider { @Override public Object finish(Map settings) { settings.put("success_message", i18n("install.success")); - settings.put("failure_callback", new FailureCallback() { - @Override - public void onFail(Map settings, Exception exception, Runnable next) { - if (exception instanceof LibraryDownloadException) { - Controllers.dialog(i18n("launch.failed.download_library", ((LibraryDownloadException) exception).getLibrary().getName()) + "\n" + StringUtils.getStackTrace(exception.getCause()), i18n("install.failed.downloading"), MessageBox.ERROR_MESSAGE, next); - } else if (exception instanceof DownloadException) { - Controllers.dialog(StringUtils.getStackTrace(exception), i18n("install.failed.downloading"), MessageBox.ERROR_MESSAGE, next); - } else { - Controllers.dialog(StringUtils.getStackTrace(exception), i18n("install.failed"), MessageBox.ERROR_MESSAGE, next); - } - } - }); + settings.put("failure_callback", (FailureCallback) (settings1, exception, next) -> InstallerWizardProvider.alertFailureMessage(exception, next)); return finishVersionDownloadingAsync(settings); } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index dea8f5bc7..3cf4d2195 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -126,6 +126,7 @@ input.url=Must be a valid URL. install=Install New Game install.failed=Failed to install install.failed.downloading=Failed to install due to some files not downloaded successfully +install.failed.downloading.detail=Failed to download file: %s install.installer.choose=Choose a %s version install.installer.forge=Forge install.installer.game=Game diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 92ee6a411..e6ccafb5e 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -125,6 +125,7 @@ input.url=必須為有效連結 install=新增遊戲 install.failed=安裝失敗 install.failed.downloading=安裝失敗,部分文件未能完成下載 +install.failed.downloading.detail=未能下載檔案:%s install.installer.choose=選擇 %s 版本 install.installer.forge=Forge install.installer.game=遊戲 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 967ce6417..1bf87a513 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -125,6 +125,7 @@ input.url=必须是合法的链接 install=添加游戏 install.failed=安装失败 install.failed.downloading=安装失败,部分文件未能完成下载 +install.failed.downloading.detail=未能下载文件:%s install.installer.choose=选择 %s 版本 install.installer.forge=Forge install.installer.game=游戏 diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java index ce1025413..fecb40e3f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java @@ -20,6 +20,7 @@ package org.jackhuang.hmcl.download.game; import org.jackhuang.hmcl.download.AbstractDependencyManager; import org.jackhuang.hmcl.download.DefaultCacheRepository; import org.jackhuang.hmcl.game.Library; +import org.jackhuang.hmcl.task.DownloadException; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck; import org.jackhuang.hmcl.task.Task; @@ -88,10 +89,10 @@ public class LibraryDownloadTask extends Task { if (cached) return; if (!isDependentsSucceeded()) { - // Since FileDownloadTask wraps the actual exception with another IOException. + // Since FileDownloadTask wraps the actual exception with DownloadException. // We should extract it letting the error message clearer. Throwable t = task.getLastException(); - if (t.getCause() != null) + if (t instanceof DownloadException) throw new LibraryDownloadException(library, t.getCause()); else throw new LibraryDownloadException(library, t); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/DownloadException.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/DownloadException.java index ca652025b..d056d9efb 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/DownloadException.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/DownloadException.java @@ -20,12 +20,14 @@ package org.jackhuang.hmcl.task; import java.io.IOException; import java.net.URL; +import static java.util.Objects.requireNonNull; + public class DownloadException extends IOException { private final URL url; public DownloadException(URL url, Throwable cause) { - super("Unable to download " + url + ", " + cause.getMessage(), cause); + super("Unable to download " + url + ", " + cause.getMessage(), requireNonNull(cause)); this.url = url; }