From b081ca9f868fb3612c7d1650e9b80d6c0d5aeef4 Mon Sep 17 00:00:00 2001 From: Timo Ley Date: Tue, 18 Aug 2020 22:32:52 +0200 Subject: [PATCH] Implemented new installer argument system. DirInstaller: can now have a custom file name as second argument. --- .../installer/DefaultInstaller.java | 27 ++++++++++ .../addonscript/installer/DirInstaller.java | 49 +++++++++++++++++++ .../addonscript/installer/IInstaller.java | 9 ---- .../installer/InternalDirInstaller.java | 26 ---------- .../anvil/addonscript/v1/AddonscriptJSON.java | 1 - .../anvil/addonscript/wrapper/ASWrapper.java | 7 +-- .../anvil/addonscript/wrapper/FileOrLink.java | 8 ++- .../anvil/addonscript/wrapper/IInstaller.java | 39 +++++++++++++++ 8 files changed, 122 insertions(+), 44 deletions(-) create mode 100644 src/main/java/ley/anvil/addonscript/installer/DefaultInstaller.java create mode 100644 src/main/java/ley/anvil/addonscript/installer/DirInstaller.java delete mode 100644 src/main/java/ley/anvil/addonscript/installer/IInstaller.java delete mode 100644 src/main/java/ley/anvil/addonscript/installer/InternalDirInstaller.java create mode 100644 src/main/java/ley/anvil/addonscript/wrapper/IInstaller.java diff --git a/src/main/java/ley/anvil/addonscript/installer/DefaultInstaller.java b/src/main/java/ley/anvil/addonscript/installer/DefaultInstaller.java new file mode 100644 index 0000000..52bed0e --- /dev/null +++ b/src/main/java/ley/anvil/addonscript/installer/DefaultInstaller.java @@ -0,0 +1,27 @@ +package ley.anvil.addonscript.installer; + +import ley.anvil.addonscript.wrapper.IInstaller; + +import java.util.List; + +public class DefaultInstaller implements IInstaller { + + String id; + List arguments; + + public DefaultInstaller(String id, List arguments) { + this.id = id; + this.arguments = arguments; + } + + @Override + public String installerID() { + return id; + } + + @Override + public String[] getArguments() { + return arguments.toArray(new String[0]); + } + +} diff --git a/src/main/java/ley/anvil/addonscript/installer/DirInstaller.java b/src/main/java/ley/anvil/addonscript/installer/DirInstaller.java new file mode 100644 index 0000000..d9d42c5 --- /dev/null +++ b/src/main/java/ley/anvil/addonscript/installer/DirInstaller.java @@ -0,0 +1,49 @@ +package ley.anvil.addonscript.installer; + +import ley.anvil.addonscript.util.Utils; +import ley.anvil.addonscript.wrapper.IInstaller; + +import javax.annotation.Nullable; +import java.io.File; +import java.util.List; + +public class DirInstaller implements IInstaller { + + List arguments; + + public DirInstaller(List arguments) { + this.arguments = arguments; + } + + @Override + public String installerID() { + return "internal.dir"; + } + + @Override + public String[] getArguments() { + return arguments.toArray(new String[0]); + } + + public String getDestination() { + return arguments.get(0); + } + + public File getDestination(File mcdir) { + return new File(Utils.slashEnd(mcdir.getPath()) + getDestination()); + } + + public boolean shouldRename() { + return arguments.size() == 2; + } + + @Nullable + public String filename() { + if (shouldRename()) { + return arguments.get(1); + } else { + return null; + } + } + +} diff --git a/src/main/java/ley/anvil/addonscript/installer/IInstaller.java b/src/main/java/ley/anvil/addonscript/installer/IInstaller.java deleted file mode 100644 index d5d6aed..0000000 --- a/src/main/java/ley/anvil/addonscript/installer/IInstaller.java +++ /dev/null @@ -1,9 +0,0 @@ -package ley.anvil.addonscript.installer; - -import java.io.File; - -public interface IInstaller { - - void install(String[] params, File input); - -} diff --git a/src/main/java/ley/anvil/addonscript/installer/InternalDirInstaller.java b/src/main/java/ley/anvil/addonscript/installer/InternalDirInstaller.java deleted file mode 100644 index 6f34df1..0000000 --- a/src/main/java/ley/anvil/addonscript/installer/InternalDirInstaller.java +++ /dev/null @@ -1,26 +0,0 @@ -package ley.anvil.addonscript.installer; - -import ley.anvil.addonscript.installer.IInstaller; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; - -public class InternalDirInstaller implements IInstaller { - - @Override - public void install(String[] params, File input) { - if (params.length >= 1) { - try { - InputStream in = new FileInputStream(input); - Files.copy(in, Paths.get(params[0]), StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - e.printStackTrace(); - } - } else { - throw new RuntimeException("No directory specified for file " + input.toString()); - } - } - -} diff --git a/src/main/java/ley/anvil/addonscript/v1/AddonscriptJSON.java b/src/main/java/ley/anvil/addonscript/v1/AddonscriptJSON.java index 5281696..91ab650 100644 --- a/src/main/java/ley/anvil/addonscript/v1/AddonscriptJSON.java +++ b/src/main/java/ley/anvil/addonscript/v1/AddonscriptJSON.java @@ -200,7 +200,6 @@ public class AddonscriptJSON extends ASBase { public String installer = "internal.dir"; /** * This are the arguments for the installer - * Each installer needs other arguments and others need none. */ @Upcoming @Expose diff --git a/src/main/java/ley/anvil/addonscript/wrapper/ASWrapper.java b/src/main/java/ley/anvil/addonscript/wrapper/ASWrapper.java index b5ec7b3..efed569 100644 --- a/src/main/java/ley/anvil/addonscript/wrapper/ASWrapper.java +++ b/src/main/java/ley/anvil/addonscript/wrapper/ASWrapper.java @@ -7,8 +7,6 @@ import com.google.gson.JsonElement; import jdk.nashorn.api.scripting.URLReader; import ley.anvil.addonscript.curse.CurseMeta; import ley.anvil.addonscript.forge.ForgeMeta; -import ley.anvil.addonscript.installer.IInstaller; -import ley.anvil.addonscript.installer.InternalDirInstaller; import ley.anvil.addonscript.util.Utils; import ley.anvil.addonscript.v1.AddonscriptJSON; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; @@ -25,7 +23,6 @@ public class ASWrapper { AddonscriptJSON json; Map REPOSITORIES; - public Map INSTALLERS; public Map ADDONS; public Map VERSIONS; @Nullable @@ -34,10 +31,8 @@ public class ASWrapper { public ASWrapper(AddonscriptJSON json) { this.json = json; REPOSITORIES = new HashMap<>(); - INSTALLERS = new HashMap<>(); ADDONS = new HashMap<>(); VERSIONS = new HashMap<>(); - INSTALLERS.put("internal.dir", new InternalDirInstaller()); if (json.repositories != null) { for (AddonscriptJSON.Repository r : json.repositories) { REPOSITORIES.put(r.id, r.url); @@ -217,7 +212,7 @@ public class ASWrapper { } public FileOrLink get() { - return new FileOrLink(getLink(), file.installer).setASDir(asdir); + return new FileOrLink(getLink(), IInstaller.create(file.installer, file.arguments)).setASDir(asdir); } public String getLink() { diff --git a/src/main/java/ley/anvil/addonscript/wrapper/FileOrLink.java b/src/main/java/ley/anvil/addonscript/wrapper/FileOrLink.java index 6fb18bb..330764a 100644 --- a/src/main/java/ley/anvil/addonscript/wrapper/FileOrLink.java +++ b/src/main/java/ley/anvil/addonscript/wrapper/FileOrLink.java @@ -11,14 +11,14 @@ public class FileOrLink { String link; File asdir; - public String installer; + public IInstaller installer; public FileOrLink(String link) { this.link = link; } - public FileOrLink(String link, String installer) { + public FileOrLink(String link, IInstaller installer) { this.link = link; this.installer = installer; } @@ -84,4 +84,8 @@ public class FileOrLink { return asdir != null; } + public IInstaller getInstaller() { + return installer; + } + } diff --git a/src/main/java/ley/anvil/addonscript/wrapper/IInstaller.java b/src/main/java/ley/anvil/addonscript/wrapper/IInstaller.java new file mode 100644 index 0000000..f8efde6 --- /dev/null +++ b/src/main/java/ley/anvil/addonscript/wrapper/IInstaller.java @@ -0,0 +1,39 @@ +package ley.anvil.addonscript.wrapper; + +import ley.anvil.addonscript.installer.DefaultInstaller; +import ley.anvil.addonscript.installer.DirInstaller; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public interface IInstaller { + + /** + * This is the ID of this installer type. + * @return the ID + */ + String installerID(); + + /** + * This are the raw arguments of the installer. + * @return An array of arguments. The positions are important. + */ + String[] getArguments(); + + @Nullable + static IInstaller create(String id, List arguments) { + if (arguments == null || id.contains(":")) { + String[] parts = id.split(":"); + id = parts[0]; + arguments = new ArrayList<>(); + arguments.addAll(Arrays.asList(parts).subList(1, parts.length)); + } + switch (id) { + case "internal.dir": return new DirInstaller(arguments); + default: return new DefaultInstaller(id, arguments); + } + } + +}