From 518969d2f25b3d98eb1906294090d29ef00992f8 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Wed, 26 Sep 2018 13:13:21 +0800 Subject: [PATCH] Fix JsonParseException --- .../org/jackhuang/hmcl/upgrade/UpdateHandler.java | 13 ++++++++----- .../hmcl/download/DefaultCacheRepository.java | 3 ++- .../hmcl/download/forge/ForgeInstallTask.java | 4 +--- .../jackhuang/hmcl/game/DefaultGameRepository.java | 5 ++--- .../main/java/org/jackhuang/hmcl/mod/Datapack.java | 6 +++--- .../org/jackhuang/hmcl/mod/MultiMCManifest.java | 4 ++-- .../hmcl/mod/MultiMCModpackInstallTask.java | 1 + 7 files changed, 19 insertions(+), 17 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java index 0508081aa..c59252427 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.upgrade; import com.google.gson.Gson; +import com.google.gson.JsonParseException; import javafx.application.Platform; import javafx.scene.layout.Region; import org.jackhuang.hmcl.Launcher; @@ -239,18 +240,20 @@ public final class UpdateHandler { } private static void breakForceUpdateFeature() { - try { - Path hmclVersionJson = Launcher.HMCL_DIRECTORY.toPath().resolve("hmclver.json"); - if (Files.isRegularFile(hmclVersionJson)) { + Path hmclVersionJson = Launcher.HMCL_DIRECTORY.toPath().resolve("hmclver.json"); + if (Files.isRegularFile(hmclVersionJson)) { + try { Map content = new Gson().fromJson(new String(Files.readAllBytes(hmclVersionJson), UTF_8), Map.class); Object ver = content.get("ver"); if (ver instanceof String && ((String) ver).startsWith("3.")) { Files.delete(hmclVersionJson); LOG.info("Successfully broke the force update feature"); } + } catch (IOException e) { + LOG.log(Level.WARNING, "Failed to break the force update feature", e); + } catch (JsonParseException e) { + hmclVersionJson.toFile().delete(); } - } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to break the force update feature", e); } } // ==== 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 aa1bf958c..dc2414a0a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultCacheRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultCacheRepository.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.download; +import com.google.gson.JsonParseException; import org.jackhuang.hmcl.download.game.LibraryDownloadTask; import org.jackhuang.hmcl.game.Library; import org.jackhuang.hmcl.game.LibraryDownloadInfo; @@ -62,7 +63,7 @@ public class DefaultCacheRepository extends CacheRepository { index = JsonUtils.GSON.fromJson(FileUtils.readText(indexFile.toFile()), Index.class); else index = new Index(); - } catch (IOException e) { + } catch (IOException | JsonParseException e) { Logging.LOG.log(Level.WARNING, "Unable to read index file", e); index = new Index(); } finally { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java index 2b0d6ebef..e1664b36e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java @@ -89,9 +89,7 @@ public final class ForgeInstallTask extends TaskResult { if (stream == null) throw new IOException("Malformed forge installer file, install_profile.json does not exist."); String json = IOUtils.readFullyAsString(stream); - ForgeInstallProfile installProfile = JsonUtils.GSON.fromJson(json, ForgeInstallProfile.class); - if (installProfile == null) - throw new IOException("Malformed forge installer file, install_profile.json does not exist."); + ForgeInstallProfile installProfile = JsonUtils.fromNonNullJson(json, ForgeInstallProfile.class); // unpack the universal jar in the installer file. Library forgeLibrary = Library.fromName(installProfile.getInstall().getPath()); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java index 96933ce4e..87af7f78f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java @@ -18,7 +18,6 @@ package org.jackhuang.hmcl.game; import com.google.gson.JsonParseException; -import com.google.gson.JsonSyntaxException; import org.jackhuang.hmcl.event.*; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.util.Logging; @@ -108,11 +107,11 @@ public class DefaultGameRepository implements GameRepository { return new File(getVersionRoot(id), id + ".json"); } - public Version readVersionJson(String id) throws IOException, JsonSyntaxException { + public Version readVersionJson(String id) throws IOException, JsonParseException { return readVersionJson(getVersionJson(id)); } - public Version readVersionJson(File file) throws IOException, JsonSyntaxException { + public Version readVersionJson(File file) throws IOException, JsonParseException { return JsonUtils.GSON.fromJson(FileUtils.readText(file), Version.class); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java index 9f7d4a33f..16488aaaa 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java @@ -112,7 +112,7 @@ public class Datapack { try { PackMcMeta pack = JsonUtils.fromNonNullJson(FileUtils.readText(mcmeta), PackMcMeta.class); info.add(new Pack(path, FileUtils.getNameWithoutExtension(path), pack.getPackInfo().getDescription(), this)); - } catch (IOException e) { + } catch (IOException | JsonParseException e) { Logging.LOG.log(Level.WARNING, "Failed to read datapack " + path, e); } } else { @@ -147,7 +147,7 @@ public class Datapack { PackMcMeta pack = enabled ? JsonUtils.fromNonNullJson(FileUtils.readText(mcmeta), PackMcMeta.class) : JsonUtils.fromNonNullJson(FileUtils.readText(mcmetaDisabled), PackMcMeta.class); info.add(new Pack(enabled ? mcmeta : mcmetaDisabled, FileUtils.getName(subDir), pack.getPackInfo().getDescription(), this)); - } catch (IOException e) { + } catch (IOException | JsonParseException e) { Logging.LOG.log(Level.WARNING, "Failed to read datapack " + subDir, e); } } else if (Files.isRegularFile(subDir)) { @@ -169,7 +169,7 @@ public class Datapack { PackMcMeta pack = JsonUtils.fromNonNullJson(FileUtils.readText(mcmeta), PackMcMeta.class); info.add(new Pack(subDir, name, pack.getPackInfo().getDescription(), this)); - } catch (IOException e) { + } catch (IOException | JsonParseException e) { Logging.LOG.log(Level.WARNING, "Failed to read datapack " + subDir, e); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCManifest.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCManifest.java index 156b8cd4b..bf3c75323 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCManifest.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCManifest.java @@ -63,8 +63,8 @@ public final class MultiMCManifest { String json = IOUtils.readFullyAsString(Files.newInputStream(mmcPack)); MultiMCManifest manifest = JsonUtils.fromNonNullJson(json, MultiMCManifest.class); - if (manifest != null && manifest.getComponents() == null) - throw new IOException("mmc-pack.json malformed."); + if (manifest.getComponents() == null) + throw new IOException("mmc-pack.json malformed."); return manifest; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCModpackInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCModpackInstallTask.java index be2e3447f..67e8441ec 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCModpackInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCModpackInstallTask.java @@ -125,6 +125,7 @@ public final class MultiMCModpackInstallTask extends Task { if (Files.exists(patches)) for (Path patchJson : Files.newDirectoryStream(patches)) { if (patchJson.toString().endsWith(".json")) { + // If json is malformed, we should stop installing this modpack instead of skipping it. MultiMCInstancePatch patch = JsonUtils.GSON.fromJson(IOUtils.readFullyAsString(Files.newInputStream(patchJson)), MultiMCInstancePatch.class); List newArguments = new LinkedList<>(); for (String arg : patch.getTweakers()) {