diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultCacheRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultCacheRepository.java index 2bbab5257..f11942ed5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultCacheRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultCacheRepository.java @@ -63,7 +63,7 @@ public class DefaultCacheRepository extends CacheRepository { lock.writeLock().lock(); try { if (Files.isRegularFile(indexFile)) - index = JsonUtils.GSON.fromJson(FileUtils.readText(indexFile.toFile()), Index.class); + index = JsonUtils.fromNonNullJson(FileUtils.readText(indexFile.toFile()), Index.class); else index = new Index(); } catch (IOException | JsonParseException e) { @@ -240,13 +240,13 @@ public class DefaultCacheRepository extends CacheRepository { } } - private class LibraryIndex { + private class LibraryIndex implements Validation { private final String name; private final String hash; private final String type; public LibraryIndex() { - this(null, null, null); + this("", "", ""); } public LibraryIndex(String name, String hash, String type) { @@ -255,18 +255,27 @@ public class DefaultCacheRepository extends CacheRepository { this.type = type; } + @NotNull public String getName() { return name; } + @NotNull public String getHash() { return hash; } + @NotNull public String getType() { return type; } + @Override + public void validate() throws JsonParseException, TolerableValidationException { + if (name == null || hash == null || type == null) + throw new JsonParseException("Index.LibraryIndex.* cannot be null"); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Arguments.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Arguments.java index 0273d0c81..093a1ff26 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Arguments.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Arguments.java @@ -23,11 +23,7 @@ import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.platform.OperatingSystem; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -99,7 +95,7 @@ public final class Arguments { } public static List parseStringArguments(List arguments, Map keys) { - return arguments.stream().flatMap(str -> new StringArgument(str).toString(keys, Collections.emptyMap()).stream()).collect(Collectors.toList()); + return arguments.stream().filter(Objects::nonNull).flatMap(str -> new StringArgument(str).toString(keys, Collections.emptyMap()).stream()).collect(Collectors.toList()); } public static List parseArguments(List arguments, Map keys) { @@ -107,7 +103,7 @@ public final class Arguments { } public static List parseArguments(List arguments, Map keys, Map features) { - return arguments.stream().flatMap(arg -> arg.toString(keys, features).stream()).collect(Collectors.toList()); + return arguments.stream().filter(Objects::nonNull).flatMap(arg -> arg.toString(keys, features).stream()).collect(Collectors.toList()); } public static final List DEFAULT_JVM_ARGUMENTS; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/RuledArgument.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/RuledArgument.java index 0abcc1ca3..81f0e6ca2 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/RuledArgument.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/RuledArgument.java @@ -23,10 +23,7 @@ import com.google.gson.reflect.TypeToken; import org.jackhuang.hmcl.util.Immutable; import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -69,6 +66,7 @@ public class RuledArgument implements Argument { public List toString(Map keys, Map features) { if (CompatibilityRule.appliesToCurrentEnvironment(rules, features) && value != null) return value.stream() + .filter(Objects::nonNull) .map(StringArgument::new) .map(str -> str.toString(keys, features).get(0)) .collect(Collectors.toList());