diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java index 2c8642866..725a635ec 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java @@ -202,8 +202,10 @@ public final class MainPage extends StackPane implements DecoratorPage { children.add(buildNode(repository, version, GameVersion.minecraftVersion(repository.getVersionJar(version.getId())).orElse("Unknown"))); } JFXUtilities.runInFX(() -> { - contentPane.getChildren().setAll(masonryPane); - FXUtils.resetChildren(masonryPane, children); + if (profile == repository.getProfile()) { + contentPane.getChildren().setAll(masonryPane); + FXUtils.resetChildren(masonryPane, children); + } }); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java index be65124e9..160342b31 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java @@ -82,7 +82,7 @@ public final class GameAssetDownloadTask extends Task { AssetObject assetObject = entry.getValue(); String url = dependencyManager.getDownloadProvider().getAssetBaseURL() + assetObject.getLocation(); if (!FileUtils.makeDirectory(file.getAbsoluteFile().getParentFile())) { - Logging.LOG.log(Level.SEVERE, "Unable to create new file {0}, because parent directory cannot be created", file); + Logging.LOG.log(Level.SEVERE, "Unable to create new file " + file + ", because parent directory cannot be created"); continue; } if (file.isDirectory()) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/Event.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/Event.java index 248334cc8..68adc2bc9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/Event.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/Event.java @@ -17,6 +17,8 @@ */ package org.jackhuang.hmcl.event; +import org.jackhuang.hmcl.util.ToStringBuilder; + import java.util.Objects; /** @@ -28,13 +30,13 @@ public class Event { /** * The object on which the Event initially occurred. */ - protected transient Object source; + protected transient Object source; /** * Constructs a prototypical Event. * * @param source The object on which the Event initially occurred. - * @throws NullPointerException if source is null. + * @throws NullPointerException if source is null. */ public Event(Object source) { Objects.requireNonNull(source); @@ -54,10 +56,10 @@ public class Event { /** * Returns a String representation of this Event. * - * @return A a String representation of this Event. + * @return A a String representation of this Event. */ public String toString() { - return getClass().getName() + "[source=" + source + "]"; + return new ToStringBuilder(this).append("source", source).toString(); } private boolean canceled; @@ -72,7 +74,6 @@ public class Event { } /** - * * @param canceled new value * @throws UnsupportedOperationException if trying to cancel a non-cancelable event. */ diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java index ea3ede46e..944bbe52a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java @@ -17,6 +17,8 @@ */ package org.jackhuang.hmcl.event; +import org.jackhuang.hmcl.util.Logging; + import java.util.HashMap; /** @@ -36,6 +38,8 @@ public final class EventBus { @SuppressWarnings("unchecked") public Event.Result fireEvent(Event obj) { + Logging.LOG.info(obj + " gets fired"); + return channel((Class) obj.getClass()).fireEvent(obj); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/GameJsonParseFailedEvent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/GameJsonParseFailedEvent.java index 011bda099..d070df240 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/GameJsonParseFailedEvent.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/GameJsonParseFailedEvent.java @@ -17,6 +17,8 @@ */ package org.jackhuang.hmcl.event; +import org.jackhuang.hmcl.util.ToStringBuilder; + import java.io.File; /** @@ -49,4 +51,13 @@ public final class GameJsonParseFailedEvent extends Event { public String getVersion() { return version; } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("source", source) + .append("jsonFile", jsonFile) + .append("version", version) + .toString(); + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/JVMLaunchFailedEvent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/JVMLaunchFailedEvent.java index 70e75d259..4bf6ff40d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/JVMLaunchFailedEvent.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/JVMLaunchFailedEvent.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.event; import org.jackhuang.hmcl.util.ManagedProcess; +import org.jackhuang.hmcl.util.ToStringBuilder; /** * This event gets fired when we launch the JVM and it got crashed. @@ -44,4 +45,12 @@ public class JVMLaunchFailedEvent extends Event { public ManagedProcess getProcess() { return process; } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("source", source) + .append("process", process) + .toString(); + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/LoadedOneVersionEvent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/LoadedOneVersionEvent.java index e71bac3a6..47e44da64 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/LoadedOneVersionEvent.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/LoadedOneVersionEvent.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.event; import org.jackhuang.hmcl.game.Version; +import org.jackhuang.hmcl.util.ToStringBuilder; /** * This event gets fired when a minecraft version has been loaded. @@ -48,4 +49,12 @@ public final class LoadedOneVersionEvent extends Event { public boolean hasResult() { return true; } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("source", source) + .append("version", version) + .toString(); + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/ProcessExitedAbnormallyEvent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/ProcessExitedAbnormallyEvent.java index 410ee1759..e8e5b0d82 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/ProcessExitedAbnormallyEvent.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/ProcessExitedAbnormallyEvent.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.event; import org.jackhuang.hmcl.util.ManagedProcess; +import org.jackhuang.hmcl.util.ToStringBuilder; /** * This event gets fired when a JavaProcess exited abnormally and the exit code is not zero. @@ -44,4 +45,12 @@ public final class ProcessExitedAbnormallyEvent extends Event { public ManagedProcess getProcess() { return process; } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("source", source) + .append("process", process) + .toString(); + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/ProcessStoppedEvent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/ProcessStoppedEvent.java index 7786c13d5..2fbe901b8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/ProcessStoppedEvent.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/ProcessStoppedEvent.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.event; import org.jackhuang.hmcl.util.ManagedProcess; +import org.jackhuang.hmcl.util.ToStringBuilder; /** * This event gets fired when minecraft process exited successfully and the exit code is 0. @@ -44,4 +45,12 @@ public class ProcessStoppedEvent extends Event { public ManagedProcess getProcess() { return process; } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("source", source) + .append("process", process) + .toString(); + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/RefreshingVersionsEvent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/RefreshingVersionsEvent.java index f85c09d29..2f7291b6f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/RefreshingVersionsEvent.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/RefreshingVersionsEvent.java @@ -35,4 +35,8 @@ public final class RefreshingVersionsEvent extends Event { super(source); } + @Override + public boolean hasResult() { + return true; + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/RemoveVersionEvent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/RemoveVersionEvent.java new file mode 100644 index 000000000..3deab872c --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/RemoveVersionEvent.java @@ -0,0 +1,59 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2018 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.hmcl.event; + +import org.jackhuang.hmcl.util.ToStringBuilder; + +/** + * This event gets fired when a minecraft version is being removed. + *
+ * This event is fired on the {@link org.jackhuang.hmcl.event.EventBus#EVENT_BUS} + * + * @author huangyuhui + */ +public class RemoveVersionEvent extends Event { + + private final String version; + + /** + * + * @param source {@link org.jackhuang.hmcl.game.GameRepository} + * @param version the version id. + */ + public RemoveVersionEvent(Object source, String version) { + super(source); + this.version = version; + } + + public String getVersion() { + return version; + } + + @Override + public boolean hasResult() { + return true; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("source", source) + .append("version", version) + .toString(); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/RenameVersionEvent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/RenameVersionEvent.java new file mode 100644 index 000000000..fb2597c39 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/RenameVersionEvent.java @@ -0,0 +1,65 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2018 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.hmcl.event; + +import org.jackhuang.hmcl.util.ToStringBuilder; + +/** + * This event gets fired when a minecraft version is being removed. + *
+ * This event is fired on the {@link org.jackhuang.hmcl.event.EventBus#EVENT_BUS} + * + * @author huangyuhui + */ +public class RenameVersionEvent extends Event { + + private final String from, to; + + /** + * + * @param source {@link org.jackhuang.hmcl.game.GameRepository} + * @param from the version id. + */ + public RenameVersionEvent(Object source, String from, String to) { + super(source); + this.from = from; + this.to = to; + } + + public String getFromVersion() { + return from; + } + + public String getToVersion() { + return to; + } + + @Override + public boolean hasResult() { + return true; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("source", source) + .append("from", from) + .append("to", to) + .toString(); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java index 4c510f006..63e669fb8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java @@ -24,6 +24,7 @@ import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.FileUtils; import org.jackhuang.hmcl.util.Logging; +import org.jackhuang.hmcl.util.ToStringBuilder; import java.io.File; import java.io.IOException; @@ -116,6 +117,9 @@ public class DefaultGameRepository implements GameRepository { @Override public boolean renameVersion(String from, String to) { + if (EventBus.EVENT_BUS.fireEvent(new RenameVersionEvent(this, from, to)) == Event.Result.DENY) + return false; + try { Version fromVersion = getVersion(from); File fromDir = getVersionRoot(from); @@ -145,6 +149,8 @@ public class DefaultGameRepository implements GameRepository { public boolean removeVersionFromDisk(String id) { if (!versions.containsKey(id)) return true; + if (EventBus.EVENT_BUS.fireEvent(new RemoveVersionEvent(this, id)) == Event.Result.DENY) + return false; File file = getVersionRoot(id); if (!file.exists()) return true; @@ -201,7 +207,7 @@ public class DefaultGameRepository implements GameRepository { try { FileUtils.writeText(json, Constants.GSON.toJson(version)); } catch (Exception e) { - Logging.LOG.log(Level.WARNING, "Ignoring version {0} because wrong id {1} is set and cannot correct it.", new Object[]{id, version.getId()}); + Logging.LOG.log(Level.WARNING, "Ignoring version " + id + " because wrong id " + version.getId() + " is set and cannot correct it."); continue; } } @@ -217,7 +223,7 @@ public class DefaultGameRepository implements GameRepository { EventBus.EVENT_BUS.fireEvent(new LoadedOneVersionEvent(this, resolved)) != Event.Result.DENY) versions.put(version.getId(), version); } catch (VersionNotFoundException e) { - Logging.LOG.log(Level.WARNING, "Ignoring version {0} because it inherits from a nonexistent version.", version.getId()); + Logging.LOG.log(Level.WARNING, "Ignoring version " + version.getId() + " because it inherits from a nonexistent version."); } } @@ -227,7 +233,9 @@ public class DefaultGameRepository implements GameRepository { @Override public void refreshVersions() { - EventBus.EVENT_BUS.fireEvent(new RefreshingVersionsEvent(this)); + if (EventBus.EVENT_BUS.fireEvent(new RefreshingVersionsEvent(this)) == Event.Result.DENY) + return; + Schedulers.newThread().schedule(() -> { refreshVersionsImpl(); EventBus.EVENT_BUS.fireEvent(new RefreshedVersionsEvent(this)); @@ -337,4 +345,11 @@ public class DefaultGameRepository implements GameRepository { return getModpackConfiguration(version).exists(); } + @Override + public String toString() { + return new ToStringBuilder(this) + .append("versions", versions == null ? null : versions.keySet()) + .append("baseDirectory", baseDirectory) + .toString(); + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java index 06202d055..e4ccd4928 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java @@ -156,7 +156,7 @@ public class Version implements Comparable, Validation { // To maximize the compatibility. if (!resolvedSoFar.add(id)) { - Logging.LOG.log(Level.WARNING, "Found circular dependency versions: {0}", resolvedSoFar); + Logging.LOG.log(Level.WARNING, "Found circular dependency versions: " + resolvedSoFar); return this; } @@ -233,6 +233,11 @@ public class Version implements Comparable, Validation { return id.compareTo(o.id); } + @Override + public String toString() { + return new ToStringBuilder(this).append("id", id).toString(); + } + @Override public void validate() throws JsonParseException { if (StringUtils.isBlank(id)) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java index 6887466c8..066401682 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java @@ -119,7 +119,7 @@ public class FileDownloadTask extends Task { @Override public void execute() throws Exception { URL currentURL = url; - Logging.LOG.log(Level.FINER, "Downloading {0} to {1}", new Object[] { currentURL, file }); + Logging.LOG.log(Level.FINER, "Downloading " + currentURL + " to " + file); Exception exception = null; for (int repeat = 0; repeat < retry; repeat++) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java index a04f4135c..0495a2c9c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java @@ -84,7 +84,7 @@ public final class GetTask extends TaskResult { Exception exception = null; for (int time = 0; time < retry; ++time) { if (time > 0) - Logging.LOG.log(Level.WARNING, "Failed to download, repeat times: {0}", time); + Logging.LOG.log(Level.WARNING, "Failed to download, repeat times: " + time); try { updateProgress(0); HttpURLConnection conn = NetworkUtils.createConnection(url, proxy); 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 c85ea57b6..f3a0ace83 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java @@ -134,7 +134,7 @@ public final class TaskExecutor { task.setState(Task.TaskState.READY); if (task.getSignificance().shouldLog()) - Logging.LOG.log(Level.FINE, "Executing task: {0}", task.getName()); + Logging.LOG.log(Level.FINE, "Executing task: " + task.getName()); taskListeners.forEach(it -> it.onReady(task)); @@ -176,7 +176,7 @@ public final class TaskExecutor { flag = true; if (task.getSignificance().shouldLog()) { - Logging.LOG.log(Level.FINER, "Task finished: {0}", task.getName()); + Logging.LOG.log(Level.FINER, "Task finished: " + task.getName()); } task.onDone().fireEvent(new TaskEvent(this, task, false)); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java index 6e1005bb8..3776040e9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java @@ -63,7 +63,7 @@ public final class Logging { String date = format.format(new Date(record.getMillis())); String log = String.format("[%s] [%s.%s/%s] %s%n", date, record.getSourceClassName(), record.getSourceMethodName(), - record.getLevel().getName(), MessageFormat.format(record.getMessage(), record.getParameters()) + record.getLevel().getName(), record.getMessage() ); ByteArrayOutputStream builder = new ByteArrayOutputStream(); if (record.getThrown() != null)