From 36158801efa9b494f6b6fbe443acaee837e9eb9b Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Mon, 24 Jun 2024 02:32:43 +0200 Subject: [PATCH] 8.1.6 - enhanced traversing of json for custom check url --- build.gradle | 2 +- .../tasks/updater/search/CustomCheckURL.java | 138 ++++++------------ 2 files changed, 49 insertions(+), 91 deletions(-) diff --git a/build.gradle b/build.gradle index f8778ee7..85e38f64 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ plugins { // Important for AutoPlugs Self-Updater! // Also take a look at the generateAutoplugProperties task where these properties get turned into the actual autoplug.properties file. group = 'com.osiris.autoplug.client' -version = '8.1.5' +version = '8.1.6' description = 'Responsible for all the main actions.' java { diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/search/CustomCheckURL.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/search/CustomCheckURL.java index 79ddb595..b50328c0 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/search/CustomCheckURL.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/search/CustomCheckURL.java @@ -8,25 +8,22 @@ package com.osiris.autoplug.client.tasks.updater.search; -import com.google.gson.*; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.osiris.autoplug.client.utils.UtilsURL; import com.osiris.jlib.json.Json; + import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; public class CustomCheckURL { public CustomCheckURL(){} - private boolean isInt(String s) { - try { - Integer.parseInt(s); - return true; - } catch (Exception e) { - return false; - } - } - public SearchResult doCustomCheck(String url, String currentVersion) { url = new UtilsURL().clean(url); Exception exception = null; @@ -36,25 +33,18 @@ public SearchResult doCustomCheck(String url, String currentVersion) { SearchResult.Type code = SearchResult.Type.UP_TO_DATE; try { JsonElement response = Json.get(url); - JsonObject release; - - if (response.isJsonArray()) { - try { - latest = traverseJsonArray(response.getAsJsonArray(), (byte) 0); - downloadUrl = traverseJsonArray(response.getAsJsonArray(), (byte) 1); - } catch (Exception e) { - throw e; - } - } else if (response.isJsonObject()) { - try { - latest = traverseJsonObject(response.getAsJsonObject(), (byte) 0); - downloadUrl = traverseJsonObject(response.getAsJsonObject(), (byte) 1); - } catch (Exception e) { - throw e; - } - } else { - throw new IllegalArgumentException("Invalid JSON response format"); - } + List latestVersions = new ArrayList<>(); + List downloadUrls = new ArrayList<>(); + traverseJson("", response, (key, value) -> { + String s1 = getLatestVersionIfValid(key, value); + if (!s1.isEmpty()) latestVersions.add(s1); + + String s2 = getDownloadUrlIfValid(key, value); + if (!s2.isEmpty()) downloadUrls.add(s2); + }); + + if (!latestVersions.isEmpty()) latest = latestVersions.get(0); + if (!downloadUrls.isEmpty()) downloadUrl = downloadUrls.get(0); String[] pluginVersionComponents = currentVersion.split("\\."); String[] latestVersionComponents = latest.split("\\."); @@ -85,72 +75,40 @@ public SearchResult doCustomCheck(String url, String currentVersion) { return result; } - private String getLatestVersionFromRe(JsonObject release){ - - String[] versionNaming = {"version_number", "version"}; - String latest = null; - - for (String naming : versionNaming) { - if (release.has(naming)) { - String version = release.get(naming).getAsString().replaceAll("[^0-9.]", ""); - if (!version.isEmpty()) { - latest = version; - break; - } - } - } - return latest; + /** + * Returns empty string if not valid. + */ + private String getLatestVersionIfValid(String key, String value) { + if (key.equals("version_number") || key.equals("version")) + return value.replaceAll("[^0-9.]", ""); + else return ""; } - private String getDownloadFromRe(JsonObject release){ - - String[] downloadNaming = {"download_url", "download", "file", "download_file"}; - String downloadUrl = null; - - for (String naming : downloadNaming) { - if (release.has(naming)) { - String durl = release.get(naming).getAsString(); - if (!durl.isEmpty()) { - downloadUrl = durl; - break; - } - } - } - return downloadUrl; + /** + * Returns empty string if not valid. + */ + private String getDownloadUrlIfValid(String key, String value) { + if (key.equals("download_url") || key.equals("download") || key.equals("file") || key.equals("download_file")) + return value; + else return ""; } - private String traverseJsonArray(JsonArray jsonArray, byte lookingFor) { - String r = null; - for (JsonElement element : jsonArray) { - if (element.isJsonObject()) { - r = traverseJsonObject(element.getAsJsonObject(),lookingFor); - } else if (element.isJsonArray()) { - r = traverseJsonArray(element.getAsJsonArray(),lookingFor); + public static void traverseJson(String key, JsonElement element, BiConsumer code) { + if (element.isJsonObject()) { + JsonObject obj = element.getAsJsonObject(); + for (Map.Entry entry : obj.entrySet()) { + traverseJson(entry.getKey(), entry.getValue(), code); } - if (r != null) - break; - } - return r; - } - - private String traverseJsonObject(JsonObject jsonObject, byte lookingFor) { - String r = null; - for (String key : jsonObject.keySet()) { - JsonElement element = jsonObject.get(key); - if (element.isJsonObject()) { - r = traverseJsonObject(element.getAsJsonObject(),lookingFor); - } else if (element.isJsonArray()) { - r = traverseJsonArray(element.getAsJsonArray(),lookingFor); + } else if (element.isJsonArray()) { + JsonArray array = element.getAsJsonArray(); + for (JsonElement item : array) { + traverseJson(key, item, code); } - if (r != null) - break; - } - - if (lookingFor == 0) { - r = getLatestVersionFromRe(jsonObject.getAsJsonObject()); - } else if (lookingFor == 1) { - r = getDownloadFromRe(jsonObject.getAsJsonObject()); - } - return r; + } else if (element.isJsonNull()) { + code.accept(key, ""); + } else if (element.isJsonPrimitive()) { + code.accept(key, element.getAsString()); + } else + throw new IllegalArgumentException("Invalid JSON response format"); } }