From 8dd39ff060656b448cc2d5d5c9d05871e5fee225 Mon Sep 17 00:00:00 2001 From: ACGaming <4818419+ACGaming@users.noreply.github.com> Date: Wed, 12 Jul 2023 13:41:01 +0200 Subject: [PATCH] Implement deletion of archives after extraction #5 --- .../configuration/InstallationPolicy.java | 7 +++++ .../configuration/ModDirectorRemoteMod.java | 1 + .../core/configuration/type/UrlRemoteMod.java | 3 ++ .../core/manage/InstallController.java | 29 ++++++++++--------- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/InstallationPolicy.java b/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/InstallationPolicy.java index 6d449b2..d2f5dd0 100644 --- a/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/InstallationPolicy.java +++ b/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/InstallationPolicy.java @@ -10,6 +10,7 @@ public class InstallationPolicy { private final String name; private final String description; private final boolean extract; + private final boolean deleteAfterExtract; private final boolean downloadAlways; private final String supersede; private final String modpackVersion; @@ -22,6 +23,7 @@ public InstallationPolicy( @JsonProperty(value = "name") String name, @JsonProperty(value = "description") String description, @JsonProperty(value = "extract") boolean extract, + @JsonProperty(value = "deleteAfterExtract") boolean deleteAfterExtract, @JsonProperty(value = "downloadAlways") boolean downloadAlways, @JsonProperty(value = "supersede") String supersede, @JsonProperty(value = "modpackVersion") String modpackVersion @@ -32,6 +34,7 @@ public InstallationPolicy( this.name = name; this.description = description; this.extract = extract; + this.deleteAfterExtract = deleteAfterExtract; this.downloadAlways = downloadAlways; this.supersede = supersede; this.modpackVersion = modpackVersion; @@ -61,6 +64,10 @@ public boolean shouldExtract() { return extract; } + public boolean shouldDeleteAfterExtract() { + return deleteAfterExtract; + } + public boolean shouldDownloadAlways() { return downloadAlways; } diff --git a/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/ModDirectorRemoteMod.java b/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/ModDirectorRemoteMod.java index bf9bbca..fc8b2e4 100644 --- a/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/ModDirectorRemoteMod.java +++ b/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/ModDirectorRemoteMod.java @@ -31,6 +31,7 @@ public ModDirectorRemoteMod( null, false, false, + false, null, null ) : installationPolicy; diff --git a/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/type/UrlRemoteMod.java b/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/type/UrlRemoteMod.java index 0f55e0e..e081baf 100644 --- a/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/type/UrlRemoteMod.java +++ b/mod-director-core/src/main/java/net/jan/moddirector/core/configuration/type/UrlRemoteMod.java @@ -141,6 +141,9 @@ public void performInstall(Path targetFile, ProgressCallback progressCallback, M zipEntry = zipInputStream.getNextEntry(); } } + if (this.getInstallationPolicy().shouldDeleteAfterExtract()) { + Files.delete(targetFile); + } } } catch(IOException e) { throw new ModDirectorException("Failed to write file to disk", e); diff --git a/mod-director-core/src/main/java/net/jan/moddirector/core/manage/InstallController.java b/mod-director-core/src/main/java/net/jan/moddirector/core/manage/InstallController.java index ee66a66..816e4dd 100644 --- a/mod-director-core/src/main/java/net/jan/moddirector/core/manage/InstallController.java +++ b/mod-director-core/src/main/java/net/jan/moddirector/core/manage/InstallController.java @@ -20,6 +20,7 @@ import java.util.function.BiFunction; public class InstallController { + private static final String LOG_DOMAIN = "ModDirector/InstallController"; private final ModDirector director; public InstallController(ModDirector director) { @@ -69,7 +70,7 @@ public List> createPreInstallTasks( try { information = mod.queryInformation(); } catch(ModDirectorException e) { - director.getLogger().logThrowable(ModDirectorSeverityLevel.ERROR, "ModDirector/InstallController", + director.getLogger().logThrowable(ModDirectorSeverityLevel.ERROR, LOG_DOMAIN, "CORE", e, "Failed to query information for %s from %s", mod.offlineName(), mod.remoteType()); director.addError(new ModDirectorError(downloadSeverityLevelFor(mod), @@ -105,7 +106,7 @@ public List> createPreInstallTasks( switch(hashResult) { case UNKNOWN: - director.getLogger().log(ModDirectorSeverityLevel.DEBUG, "ModDirector/InstallController", + director.getLogger().log(ModDirectorSeverityLevel.DEBUG, LOG_DOMAIN, "CORE", "Skipping download of %s as hashes can't be determined but file exists", targetFile.toString()); callback.done(); @@ -114,7 +115,7 @@ public List> createPreInstallTasks( return null; case MATCHED: - director.getLogger().log(ModDirectorSeverityLevel.INFO, "ModDirector/InstallController", + director.getLogger().log(ModDirectorSeverityLevel.INFO, LOG_DOMAIN, "CORE", "Skipping download of %s as the hashes match", targetFile.toString()); callback.done(); @@ -122,7 +123,7 @@ public List> createPreInstallTasks( return null; case UNMATCHED: - director.getLogger().log(ModDirectorSeverityLevel.WARN, "ModDirector/InstallController", + director.getLogger().log(ModDirectorSeverityLevel.WARN, LOG_DOMAIN, "CORE", "File %s exists, but hashes do not match, downloading again!", targetFile.toString()); } @@ -131,13 +132,13 @@ public List> createPreInstallTasks( reinstallMods.add(installableMod); } else if(mod.getInstallationPolicy().shouldDownloadAlways() && Files.isRegularFile(targetFile)) { - director.getLogger().log(ModDirectorSeverityLevel.INFO, "ModDirector/InstallController", + director.getLogger().log(ModDirectorSeverityLevel.INFO, LOG_DOMAIN, "CORE", "Force downloading file %s as download always option is set.", targetFile.toString()); reinstallMods.add(installableMod); } else if(Files.isRegularFile(targetFile)) { - director.getLogger().log(ModDirectorSeverityLevel.DEBUG, "ModDirector/InstallController", + director.getLogger().log(ModDirectorSeverityLevel.DEBUG, LOG_DOMAIN, "CORE", "File %s exists and no metadata given, skipping download.", targetFile.toString()); excludedMods.add(mod); @@ -174,7 +175,7 @@ private Path computeInstallationTargetPath(ModDirectorRemoteMod mod, RemoteModIn .toAbsolutePath().normalize(); if(!targetFile.startsWith(installationRoot)) { - director.getLogger().log(ModDirectorSeverityLevel.ERROR, "ModDirector/InstallController", + director.getLogger().log(ModDirectorSeverityLevel.ERROR, LOG_DOMAIN, "CORE", "Tried to install a file to %s, which is outside the installation root of %s!", targetFile.toString(), director.getPlatform().installationRoot()); director.addError(new ModDirectorError(ModDirectorSeverityLevel.ERROR, @@ -228,7 +229,7 @@ public void markDisabledMods(List mods) { } catch (IOException e) { director.getLogger().logThrowable( ModDirectorSeverityLevel.WARN, - "ModDirector/InstallController", + LOG_DOMAIN, "CORE", e, "Failed to create disabled file, the user might be asked again if he wants to install the mod" @@ -262,7 +263,7 @@ public List> createInstallTasks( private void handle(InstallableMod mod, ProgressCallback callback) { ModDirectorRemoteMod remoteMod = mod.getRemoteMod(); - director.getLogger().log(ModDirectorSeverityLevel.DEBUG, "ModDirector/InstallController", "CORE", + director.getLogger().log(ModDirectorSeverityLevel.DEBUG, LOG_DOMAIN, "CORE", "Now handling %s from backend %s", remoteMod.offlineName(), remoteMod.remoteType()); Path targetFile = mod.getTargetFile(); @@ -270,7 +271,7 @@ private void handle(InstallableMod mod, ProgressCallback callback) { try { Files.createDirectories(targetFile.getParent()); } catch(IOException e) { - director.getLogger().logThrowable(ModDirectorSeverityLevel.ERROR, "ModDirector/InstallController", + director.getLogger().logThrowable(ModDirectorSeverityLevel.ERROR, LOG_DOMAIN, "CORE", e, "Failed to create directory %s", targetFile.getParent().toString()); director.addError(new ModDirectorError(ModDirectorSeverityLevel.ERROR, "Failed to create directory" + targetFile.getParent().toString(), e)); @@ -281,7 +282,7 @@ private void handle(InstallableMod mod, ProgressCallback callback) { try { mod.performInstall(director, callback); } catch(ModDirectorException e) { - director.getLogger().logThrowable(ModDirectorSeverityLevel.ERROR, "ModDirector/InstallController", + director.getLogger().logThrowable(ModDirectorSeverityLevel.ERROR, LOG_DOMAIN, "CORE", e, "Failed to install mod %s", remoteMod.offlineName()); director.addError(new ModDirectorError(downloadSeverityLevelFor(remoteMod), "Failed to install mod " + remoteMod.offlineName(), e)); @@ -290,16 +291,16 @@ private void handle(InstallableMod mod, ProgressCallback callback) { } if(remoteMod.getMetadata() != null && remoteMod.getMetadata().checkHashes(targetFile, director) == HashResult.UNMATCHED) { - director.getLogger().log(ModDirectorSeverityLevel.ERROR, "ModDirector/InstallController", + director.getLogger().log(ModDirectorSeverityLevel.ERROR, LOG_DOMAIN, "CORE", "Mod did not match hash after download, aborting!"); director.addError(new ModDirectorError(ModDirectorSeverityLevel.ERROR, "Mod did not match hash after download")); } else { if(remoteMod.getInstallationPolicy().shouldExtract()) { - director.getLogger().log(ModDirectorSeverityLevel.INFO, "ModDirector/InstallController", + director.getLogger().log(ModDirectorSeverityLevel.INFO, LOG_DOMAIN, "CORE", "Extracted mod file %s", targetFile.toString()); } else { - director.getLogger().log(ModDirectorSeverityLevel.INFO, "ModDirector/InstallController", + director.getLogger().log(ModDirectorSeverityLevel.INFO, LOG_DOMAIN, "CORE", "Installed mod file %s", targetFile.toString()); } director.installSuccess(new InstalledMod(targetFile, remoteMod.getOptions(), remoteMod.forceInject()));