From 4552b76465fd175d6f9a96a5124dc1d75503bfb5 Mon Sep 17 00:00:00 2001 From: Henry Le Grys Date: Wed, 10 Mar 2021 01:13:27 +0000 Subject: [PATCH] Fix Updater to only download additional loader files once Previously the launcher was downloading these files once for every processor due to code architecture limitations. By moving the download queueing step into BaseUpdater we ensure they are only downloaded once. --- .../launcher/install/InstallExtras.java | 17 ++++++++++++ .../launcher/model/loader/LocalLoader.java | 12 +++++++++ .../launcher/model/loader/ProcessorEntry.java | 26 +++---------------- .../launcher/model/modpack/FileInstall.java | 9 +++---- .../launcher/model/modpack/ManifestEntry.java | 5 ++-- .../skcraft/launcher/update/BaseUpdater.java | 26 +++++++++++++++---- 6 files changed, 59 insertions(+), 36 deletions(-) create mode 100644 launcher/src/main/java/com/skcraft/launcher/install/InstallExtras.java create mode 100644 launcher/src/main/java/com/skcraft/launcher/model/loader/LocalLoader.java diff --git a/launcher/src/main/java/com/skcraft/launcher/install/InstallExtras.java b/launcher/src/main/java/com/skcraft/launcher/install/InstallExtras.java new file mode 100644 index 0000000..a6e3b69 --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/install/InstallExtras.java @@ -0,0 +1,17 @@ +package com.skcraft.launcher.install; + +import com.skcraft.launcher.model.loader.LocalLoader; +import lombok.Data; + +import java.io.File; +import java.util.HashMap; + +@Data +public class InstallExtras { + private final File contentDir; + private final HashMap loaders; + + public LocalLoader getLoader(String key) { + return loaders.get(key); + } +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/loader/LocalLoader.java b/launcher/src/main/java/com/skcraft/launcher/model/loader/LocalLoader.java new file mode 100644 index 0000000..d6ff587 --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/loader/LocalLoader.java @@ -0,0 +1,12 @@ +package com.skcraft.launcher.model.loader; + +import com.skcraft.launcher.model.modpack.DownloadableFile; +import lombok.Data; + +import java.util.HashMap; + +@Data +public class LocalLoader { + private final LoaderManifest manifest; + private final HashMap localFiles; +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/loader/ProcessorEntry.java b/launcher/src/main/java/com/skcraft/launcher/model/loader/ProcessorEntry.java index 706d415..dbceece 100644 --- a/launcher/src/main/java/com/skcraft/launcher/model/loader/ProcessorEntry.java +++ b/launcher/src/main/java/com/skcraft/launcher/model/loader/ProcessorEntry.java @@ -1,21 +1,12 @@ package com.skcraft.launcher.model.loader; -import com.google.common.collect.Maps; -import com.skcraft.launcher.install.InstallLog; -import com.skcraft.launcher.install.Installer; -import com.skcraft.launcher.install.ProcessorTask; -import com.skcraft.launcher.install.UpdateCache; -import com.skcraft.launcher.model.minecraft.Side; -import com.skcraft.launcher.model.modpack.DownloadableFile; +import com.skcraft.launcher.install.*; import com.skcraft.launcher.model.modpack.ManifestEntry; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.io.File; -import java.util.HashMap; - @Data @AllArgsConstructor @NoArgsConstructor @@ -25,18 +16,9 @@ public class ProcessorEntry extends ManifestEntry { private InstallProcessor processor; @Override - public void install(Installer installer, InstallLog log, UpdateCache cache, File contentDir) throws Exception { - LoaderManifest loaderManifest = getManifest().getLoaders().get(loaderName); + public void install(Installer installer, InstallLog log, UpdateCache cache, InstallExtras extras) throws Exception { + LocalLoader loader = extras.getLoader(loaderName); - HashMap localFilesMap = Maps.newHashMap(); - for (DownloadableFile downloadableFile : loaderManifest.getDownloadableFiles()) { - if (downloadableFile.getSide() != Side.CLIENT) continue; - - DownloadableFile.LocalFile localFile = downloadableFile.download(installer, getManifest()); - - localFilesMap.put(localFile.getName(), localFile); - } - - installer.queueLate(new ProcessorTask(processor, loaderManifest, getManifest(), localFilesMap)); + installer.queueLate(new ProcessorTask(processor, loader.getManifest(), getManifest(), loader.getLocalFiles())); } } diff --git a/launcher/src/main/java/com/skcraft/launcher/model/modpack/FileInstall.java b/launcher/src/main/java/com/skcraft/launcher/model/modpack/FileInstall.java index 3964787..b7c4cd6 100644 --- a/launcher/src/main/java/com/skcraft/launcher/model/modpack/FileInstall.java +++ b/launcher/src/main/java/com/skcraft/launcher/model/modpack/FileInstall.java @@ -10,10 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; import com.google.common.io.Files; -import com.skcraft.launcher.install.InstallLog; -import com.skcraft.launcher.install.InstallLogFileMover; -import com.skcraft.launcher.install.Installer; -import com.skcraft.launcher.install.UpdateCache; +import com.skcraft.launcher.install.*; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NonNull; @@ -50,13 +47,13 @@ public class FileInstall extends ManifestEntry { @Override public void install(@NonNull Installer installer, @NonNull InstallLog log, - @NonNull UpdateCache cache, @NonNull File contentDir) throws IOException { + @NonNull UpdateCache cache, InstallExtras extras) throws IOException { if (getWhen() != null && !getWhen().matches()) { return; } String targetPath = getTargetPath(); - File targetFile = new File(contentDir, targetPath); + File targetFile = new File(extras.getContentDir(), targetPath); String fileVersion = getImpliedVersion(); URL url = concat(getManifest().getObjectsUrl(), getLocation()); diff --git a/launcher/src/main/java/com/skcraft/launcher/model/modpack/ManifestEntry.java b/launcher/src/main/java/com/skcraft/launcher/model/modpack/ManifestEntry.java index e4f503a..776e450 100644 --- a/launcher/src/main/java/com/skcraft/launcher/model/modpack/ManifestEntry.java +++ b/launcher/src/main/java/com/skcraft/launcher/model/modpack/ManifestEntry.java @@ -9,6 +9,7 @@ package com.skcraft.launcher.model.modpack; import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.skcraft.launcher.install.InstallExtras; import com.skcraft.launcher.install.InstallLog; import com.skcraft.launcher.install.Installer; import com.skcraft.launcher.install.UpdateCache; @@ -16,8 +17,6 @@ import com.skcraft.launcher.model.loader.ProcessorEntry; import lombok.Data; import lombok.ToString; -import java.io.File; - @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, @@ -35,6 +34,6 @@ public abstract class ManifestEntry { private Manifest manifest; private Condition when; - public abstract void install(Installer installer, InstallLog log, UpdateCache cache, File contentDir) throws Exception; + public abstract void install(Installer installer, InstallLog log, UpdateCache cache, InstallExtras extras) throws Exception; } diff --git a/launcher/src/main/java/com/skcraft/launcher/update/BaseUpdater.java b/launcher/src/main/java/com/skcraft/launcher/update/BaseUpdater.java index 9aaa6db..cfb3d4f 100644 --- a/launcher/src/main/java/com/skcraft/launcher/update/BaseUpdater.java +++ b/launcher/src/main/java/com/skcraft/launcher/update/BaseUpdater.java @@ -8,6 +8,7 @@ package com.skcraft.launcher.update; import com.google.common.base.Strings; import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; import com.skcraft.launcher.AssetsRoot; import com.skcraft.launcher.Instance; import com.skcraft.launcher.Launcher; @@ -16,10 +17,9 @@ import com.skcraft.launcher.dialog.FeatureSelectionDialog; import com.skcraft.launcher.dialog.ProgressDialog; import com.skcraft.launcher.install.*; import com.skcraft.launcher.model.loader.LoaderManifest; -import com.skcraft.launcher.model.minecraft.Asset; -import com.skcraft.launcher.model.minecraft.AssetsIndex; -import com.skcraft.launcher.model.minecraft.Library; -import com.skcraft.launcher.model.minecraft.VersionManifest; +import com.skcraft.launcher.model.loader.LocalLoader; +import com.skcraft.launcher.model.minecraft.*; +import com.skcraft.launcher.model.modpack.DownloadableFile; import com.skcraft.launcher.model.modpack.Feature; import com.skcraft.launcher.model.modpack.Manifest; import com.skcraft.launcher.model.modpack.ManifestEntry; @@ -127,8 +127,24 @@ public abstract class BaseUpdater { } } + // Download any extra processing files for each loader + HashMap loaders = Maps.newHashMap(); + for (Map.Entry entry : manifest.getLoaders().entrySet()) { + HashMap localFilesMap = Maps.newHashMap(); + + for (DownloadableFile file : entry.getValue().getDownloadableFiles()) { + if (file.getSide() != Side.CLIENT) continue; + + DownloadableFile.LocalFile localFile = file.download(installer, manifest); + localFilesMap.put(localFile.getName(), localFile); + } + + loaders.put(entry.getKey(), new LocalLoader(entry.getValue(), localFilesMap)); + } + + InstallExtras extras = new InstallExtras(contentDir, loaders); for (ManifestEntry entry : manifest.getTasks()) { - entry.install(installer, currentLog, updateCache, contentDir); + entry.install(installer, currentLog, updateCache, extras); } executeOnCompletion.add(new Runnable() {