From b22e724a3f07266709d11235a726e187ea3a5dbb Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sun, 24 Feb 2019 11:35:52 +0800 Subject: [PATCH] Remove SilentException --- .../jackhuang/hmcl/ui/DialogController.java | 7 +++-- .../hmcl/ui/account/AccountListItem.java | 3 ++ .../jackhuang/hmcl/mod/ModpackUpdateTask.java | 8 ------ .../jackhuang/hmcl/task/SilentException.java | 28 ------------------- .../java/org/jackhuang/hmcl/task/Task.java | 17 +++++++++-- .../org/jackhuang/hmcl/task/TaskExecutor.java | 18 ++++++------ 6 files changed, 32 insertions(+), 49 deletions(-) delete mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/task/SilentException.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/DialogController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/DialogController.java index ff6ecf94b..e2bcd98d2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/DialogController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/DialogController.java @@ -20,17 +20,18 @@ package org.jackhuang.hmcl.ui; import com.jfoenix.utils.JFXUtilities; import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.AuthInfo; +import org.jackhuang.hmcl.auth.AuthenticationException; import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount; -import org.jackhuang.hmcl.task.SilentException; import org.jackhuang.hmcl.ui.account.AccountLoginPane; import java.util.Optional; +import java.util.concurrent.CancellationException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; public final class DialogController { - public static AuthInfo logIn(Account account) throws Exception { + public static AuthInfo logIn(Account account) throws CancellationException, AuthenticationException, InterruptedException { if (account instanceof YggdrasilAccount) { CountDownLatch latch = new CountDownLatch(1); AtomicReference res = new AtomicReference<>(null); @@ -42,7 +43,7 @@ public final class DialogController { Controllers.dialog(pane); }); latch.await(); - return Optional.ofNullable(res.get()).orElseThrow(SilentException::new); + return Optional.ofNullable(res.get()).orElseThrow(CancellationException::new); } return account.logIn(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java index 1d1e92fef..656bf87d5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java @@ -37,6 +37,7 @@ import static org.jackhuang.hmcl.util.Lang.thread; import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; +import java.util.concurrent.CancellationException; import java.util.logging.Level; public class AccountListItem extends RadioButton { @@ -84,6 +85,8 @@ public class AccountListItem extends RadioButton { } catch (CredentialExpiredException e) { try { DialogController.logIn(account); + } catch (CancellationException e1) { + // ignore cancellation } catch (Exception e1) { LOG.log(Level.WARNING, "Failed to refresh " + account + " with password", e1); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/ModpackUpdateTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/ModpackUpdateTask.java index 54368f6cc..7adc8754d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/ModpackUpdateTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/ModpackUpdateTask.java @@ -18,7 +18,6 @@ package org.jackhuang.hmcl.mod; import org.jackhuang.hmcl.game.DefaultGameRepository; -import org.jackhuang.hmcl.task.SilentException; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.io.FileUtils; @@ -49,11 +48,6 @@ public class ModpackUpdateTask extends Task { } } - @Override - public boolean isRelyingOnDependencies() { - return false; - } - @Override public Collection getDependencies() { return Collections.singleton(updateTask); @@ -78,8 +72,6 @@ public class ModpackUpdateTask extends Task { repository.removeVersionFromDisk(id); FileUtils.copyDirectory(backupFolder, repository.getVersionRoot(id).toPath()); - - throw new SilentException(); } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/SilentException.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/SilentException.java deleted file mode 100644 index be6a5266a..000000000 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/SilentException.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2019 huangyuhui and contributors - * - * 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 . - */ -package org.jackhuang.hmcl.task; - -/** - * If a task throws {@link SilentException}, - * the task will be marked as failure but do not log the stacktrace. - * - * @author huangyuhui - */ -public final class SilentException extends Exception { - -} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java index 3f7d3204b..31bb6a5c2 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java @@ -33,6 +33,7 @@ import org.jackhuang.hmcl.util.function.ExceptionalSupplier; import java.util.Collection; import java.util.Collections; import java.util.concurrent.Callable; +import java.util.concurrent.CancellationException; import java.util.logging.Level; /** @@ -154,8 +155,15 @@ public abstract class Task { } /** + * This method will be called after dependency tasks terminated all together. + * + * You can check whether dependencies succeed in this method by calling + * {@link Task#isDependenciesSucceeded()} no matter when + * {@link Task#isRelyingOnDependencies()} returns true or false. + * * @throws InterruptedException if current thread is interrupted * @see Thread#isInterrupted + * @see Task#isDependenciesSucceeded() */ public void postExecute() throws Exception {} @@ -370,8 +378,13 @@ public abstract class Task { public void execute() throws Exception { action.execute(isDependentsSucceeded(), Task.this.getLastException()); - if (!isDependentsSucceeded()) - throw new SilentException(); + if (!isDependentsSucceeded()) { + setSignificance(TaskSignificance.MINOR); + if (Task.this.getLastException() == null) + throw new CancellationException(); + else + throw Task.this.getLastException(); + } } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java index 82d48f36b..3cbf487af 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java @@ -163,7 +163,7 @@ public final class TaskExecutor { Exception dependentsException = dependents.stream().map(Task::getLastException).filter(Objects::nonNull).findAny().orElse(null); if (!doDependentsSucceeded && task.isRelyingOnDependents() || canceled) { task.setLastException(dependentsException); - throw new SilentException(); + throw new CancellationException(); } if (doDependentsSucceeded) @@ -187,11 +187,6 @@ public final class TaskExecutor { Collection dependencies = task.getDependencies(); boolean doDependenciesSucceeded = executeTasks(dependencies); Exception dependenciesException = dependencies.stream().map(Task::getLastException).filter(Objects::nonNull).findAny().orElse(null); - if (!doDependenciesSucceeded && task.isRelyingOnDependencies()) { - Logging.LOG.severe("Subtasks failed for " + task.getName()); - task.setLastException(dependenciesException); - throw new SilentException(); - } if (doDependenciesSucceeded) task.setDependenciesSucceeded(); @@ -207,6 +202,12 @@ public final class TaskExecutor { } } + if (!doDependenciesSucceeded && task.isRelyingOnDependencies()) { + Logging.LOG.severe("Subtasks failed for " + task.getName()); + task.setLastException(dependenciesException); + throw new CancellationException(); + } + flag = true; if (task.getSignificance().shouldLog()) { Logging.LOG.log(Level.FINER, "Task finished: " + task.getName()); @@ -221,8 +222,9 @@ public final class TaskExecutor { } task.onDone().fireEvent(new TaskEvent(this, task, true)); taskListeners.forEach(it -> it.onFailed(task, e)); - } catch (SilentException | RejectedExecutionException e) { - task.setLastException(e); + } catch (CancellationException | RejectedExecutionException e) { + if (task.getLastException() == null) + task.setLastException(e); } catch (Exception e) { task.setLastException(e); lastException = e;