From bcff1695d3781429d5826f768b7347e2c4e8985f Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Tue, 22 Jan 2019 15:50:49 +0800 Subject: [PATCH] Refactor MaintainTask --- .../jackhuang/hmcl/download/MaintainTask.java | 76 ++------------- .../hmcl/game/VersionLibraryBuilder.java | 92 +++++++++++++++++++ 2 files changed, 101 insertions(+), 67 deletions(-) create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/game/VersionLibraryBuilder.java diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java index 13b6a5089..90f0debe3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java @@ -17,18 +17,8 @@ */ package org.jackhuang.hmcl.download; -import org.jackhuang.hmcl.game.Argument; -import org.jackhuang.hmcl.game.Arguments; -import org.jackhuang.hmcl.game.StringArgument; -import org.jackhuang.hmcl.game.Version; +import org.jackhuang.hmcl.game.*; import org.jackhuang.hmcl.task.TaskResult; -import org.jackhuang.hmcl.util.StringUtils; -import org.jackhuang.hmcl.util.platform.CommandBuilder; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; public class MaintainTask extends TaskResult { @@ -51,40 +41,30 @@ public class MaintainTask extends TaskResult { public static Version maintain(Version version) { LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); - List mcArgs = version.getMinecraftArguments().map(StringUtils::tokenize).map(ArrayList::new).orElse(null); - List game = version.getArguments().map(Arguments::getGame).map(ArrayList::new).orElseGet(ArrayList::new); - boolean useMcArgs = mcArgs != null; + VersionLibraryBuilder builder = new VersionLibraryBuilder(version); if (!libraryAnalyzer.hasForge()) { - removeTweakClass(useMcArgs, mcArgs, game, "forge"); + builder.removeTweakClass("forge"); } // Installing Forge will override the Minecraft arguments in json, so LiteLoader and OptiFine Tweaker are being re-added. - removeTweakClass(useMcArgs, mcArgs, game, "liteloader"); + builder.removeTweakClass("liteloader"); if (libraryAnalyzer.hasLiteLoader()) { - addArgument(useMcArgs, mcArgs, game, "--tweakClass", "com.mumfrey.liteloader.launch.LiteLoaderTweaker"); + builder.addArgument("--tweakClass", "com.mumfrey.liteloader.launch.LiteLoaderTweaker"); } - removeTweakClass(useMcArgs, mcArgs, game, "optifine"); + builder.removeTweakClass("optifine"); if (libraryAnalyzer.hasOptiFine()) { if (!libraryAnalyzer.hasLiteLoader() && !libraryAnalyzer.hasForge()) { - addArgument(useMcArgs, mcArgs, game, "--tweakClass", "optifine.OptiFineTweaker"); + builder.addArgument("--tweakClass", "optifine.OptiFineTweaker"); } else { // If forge or LiteLoader installed, OptiFine Forge Tweaker is needed. - addArgument(useMcArgs, mcArgs, game, "--tweakClass", "optifine.OptiFineForgeTweaker"); + builder.addArgument("--tweakClass", "optifine.OptiFineForgeTweaker"); } } - Version result; - if (useMcArgs) { - // Since $ will be escaped in linux, and our maintain of minecraftArgument will not cause escaping, - // so we regenerate the minecraftArgument without escaping. - result = version.setMinecraftArguments(new CommandBuilder().addAllWithoutParsing(mcArgs).toString()); - } else { - result = version.setArguments(version.getArguments().map(args -> args.withGame(game)).orElse(new Arguments(game, Collections.emptyList()))); - } - return result; + return builder.build(); } @Override @@ -92,43 +72,5 @@ public class MaintainTask extends TaskResult { return id; } - private static void removeTweakClass(boolean useMcArgs, List mcArgs, List game, String target) { - if (useMcArgs) { - for (int i = 0; i + 1 < mcArgs.size(); ++i) { - String arg0Str = mcArgs.get(i); - String arg1Str = mcArgs.get(i + 1); - if (arg0Str.equals("--tweakClass") && arg1Str.toLowerCase().contains(target)) { - mcArgs.remove(i); - mcArgs.remove(i); - --i; - } - } - } else { - for (int i = 0; i + 1 < game.size(); ++i) { - Argument arg0 = game.get(i); - Argument arg1 = game.get(i + 1); - if (arg0 instanceof StringArgument && arg1 instanceof StringArgument) { - // We need to preserve the tokens - String arg0Str = arg0.toString(); - String arg1Str = arg1.toString(); - if (arg0Str.equals("--tweakClass") && arg1Str.toLowerCase().contains(target)) { - game.remove(i); - game.remove(i); - --i; - } - } - } - } - } - - private static void addArgument(boolean useMcArgs, List mcArgs, List game, String... args) { - if (useMcArgs) { - mcArgs.addAll(Arrays.asList(args)); - } else { - for (String arg : args) - game.add(new StringArgument(arg)); - } - } - public static final String ID = "version"; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/VersionLibraryBuilder.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/VersionLibraryBuilder.java new file mode 100644 index 000000000..6fa20de1b --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/VersionLibraryBuilder.java @@ -0,0 +1,92 @@ +/* + * 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.game; + +import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.platform.CommandBuilder; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * + * @author huangyuhui + */ +public final class VersionLibraryBuilder { + private final Version version; + private final List mcArgs; + private final List game; + private final boolean useMcArgs; + + public VersionLibraryBuilder(Version version) { + this.version = version; + this.mcArgs = version.getMinecraftArguments().map(StringUtils::tokenize).map(ArrayList::new).orElse(null); + this.game = version.getArguments().map(Arguments::getGame).map(ArrayList::new).orElseGet(ArrayList::new); + this.useMcArgs = mcArgs != null; + } + + public Version build() { + if (useMcArgs) { + // Since $ will be escaped in linux, and our maintain of minecraftArgument will not cause escaping, + // so we regenerate the minecraftArgument without escaping. + return version.setMinecraftArguments(new CommandBuilder().addAllWithoutParsing(mcArgs).toString()); + } else { + return version.setArguments(version.getArguments().map(args -> args.withGame(game)).orElse(new Arguments(game, Collections.emptyList()))); + } + } + + public void removeTweakClass(String target) { + if (useMcArgs) { + for (int i = 0; i + 1 < mcArgs.size(); ++i) { + String arg0Str = mcArgs.get(i); + String arg1Str = mcArgs.get(i + 1); + if (arg0Str.equals("--tweakClass") && arg1Str.toLowerCase().contains(target)) { + mcArgs.remove(i); + mcArgs.remove(i); + --i; + } + } + } else { + for (int i = 0; i + 1 < game.size(); ++i) { + Argument arg0 = game.get(i); + Argument arg1 = game.get(i + 1); + if (arg0 instanceof StringArgument && arg1 instanceof StringArgument) { + // We need to preserve the tokens + String arg0Str = arg0.toString(); + String arg1Str = arg1.toString(); + if (arg0Str.equals("--tweakClass") && arg1Str.toLowerCase().contains(target)) { + game.remove(i); + game.remove(i); + --i; + } + } + } + } + } + + public void addArgument(String... args) { + if (useMcArgs) { + mcArgs.addAll(Arrays.asList(args)); + } else { + for (String arg : args) + game.add(new StringArgument(arg)); + } + } +}