From 75cc88f10a275e7d6bcfa7fa6627729929db307f Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 18 Apr 2025 15:32:20 +0800 Subject: [PATCH] =?UTF-8?q?refactor(pack):=20=E9=87=8D=E6=9E=84=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=8C=85=E4=B8=BB=E6=9C=BA=E7=B1=BB=E7=9A=84=20JSON?= =?UTF-8?q?=20=E8=A7=A3=E6=9E=90=E5=92=8C=20SHA1=20=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/pack/host/impl/AlistHost.java | 34 ++--------------- .../core/pack/host/impl/CustomApiHost.java | 16 +------- .../core/pack/host/impl/DropboxHost.java | 36 ++---------------- .../core/pack/host/impl/LobFileHost.java | 15 +------- .../core/pack/host/impl/OneDriveHost.java | 38 +++---------------- .../core/pack/host/impl/S3Host.java | 28 +++----------- .../craftengine/core/util/GsonHelper.java | 23 +++++++++++ .../craftengine/core/util/HashUtils.java | 26 +++++++++++++ 8 files changed, 70 insertions(+), 146 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/HashUtils.java diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java index 03ff451c2..4bebf88ae 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java @@ -2,12 +2,12 @@ package net.momirealms.craftengine.core.pack.host.impl; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.GsonHelper; +import net.momirealms.craftengine.core.util.HashUtils; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.Pair; @@ -137,7 +137,7 @@ public class AlistHost implements ResourcePackHost { .thenAccept(response -> { long uploadTime = System.currentTimeMillis() - requestStart; if (response.statusCode() == 200) { - cacheSha1 = calculateLocalFileSha1(finalResourcePackPath); + cacheSha1 = HashUtils.calculateLocalFileSha1(finalResourcePackPath); saveCacheToDisk(); CraftEngine.instance().logger().info("[Alist] Upload resource pack success after " + uploadTime + "ms"); future.complete(null); @@ -174,7 +174,7 @@ public class AlistHost implements ResourcePackHost { CraftEngine.instance().logger().warn("[Alist] Failed to get JWT token: " + response.body()); return null; } - JsonObject jsonData = parseJson(response.body()); + JsonObject jsonData = GsonHelper.parseJsonToJsonObject(response.body()); JsonElement code = jsonData.get("code"); if (code.isJsonPrimitive() && code.getAsJsonPrimitive().isNumber() && code.getAsJsonPrimitive().getAsInt() == 200) { JsonElement data = jsonData.get("data"); @@ -216,7 +216,7 @@ public class AlistHost implements ResourcePackHost { private void handleResourcePackDownloadLinkResponse( HttpResponse response, CompletableFuture> future) { if (response.statusCode() == 200) { - JsonObject json = parseJson(response.body()); + JsonObject json = GsonHelper.parseJsonToJsonObject(response.body()); JsonElement code = json.get("code"); if (code.isJsonPrimitive() && code.getAsJsonPrimitive().isNumber() && code.getAsJsonPrimitive().getAsInt() == 200) { JsonElement data = json.get("data"); @@ -262,32 +262,6 @@ public class AlistHost implements ResourcePackHost { new RuntimeException("Failed to request resource pack download link: " + response.body())); } - private JsonObject parseJson(String json) { - try { - return GsonHelper.get().fromJson( - json, - JsonObject.class - ); - } catch (JsonSyntaxException e) { - throw new RuntimeException("Invalid JSON response: " + json, e); - } - } - - private String calculateLocalFileSha1(Path filePath) { - try (InputStream is = Files.newInputStream(filePath)) { - MessageDigest md = MessageDigest.getInstance("SHA-1"); - byte[] buffer = new byte[8192]; - int len; - while ((len = is.read(buffer)) != -1) { - md.update(buffer, 0, len); - } - byte[] digest = md.digest(); - return HexFormat.of().formatHex(digest); - } catch (IOException | NoSuchAlgorithmException e) { - throw new RuntimeException("Failed to calculate SHA1", e); - } - } - public static class Factory implements ResourcePackHostFactory { @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/CustomApiHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/CustomApiHost.java index cc8b7b588..e5b45e71f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/CustomApiHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/CustomApiHost.java @@ -1,7 +1,5 @@ package net.momirealms.craftengine.core.pack.host.impl; -import com.google.gson.JsonSyntaxException; -import com.google.gson.reflect.TypeToken; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; @@ -10,7 +8,6 @@ import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.MiscUtils; import java.io.FileNotFoundException; -import java.net.Authenticator; import java.net.ProxySelector; import java.net.URI; import java.net.http.HttpClient; @@ -49,7 +46,7 @@ public class CustomApiHost implements ResourcePackHost { client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenAccept(response -> { if (response.statusCode() == 200) { - Map jsonData = parseJson(response.body()); + Map jsonData = GsonHelper.parseJsonToMap(response.body()); String url = (String) jsonData.get("url"); String sha1 = (String) jsonData.get("sha1"); UUID uuid = UUID.fromString(sha1); @@ -105,17 +102,6 @@ public class CustomApiHost implements ResourcePackHost { return future; } - private Map parseJson(String json) { - try { - return GsonHelper.get().fromJson( - json, - new TypeToken>() {}.getType() - ); - } catch (JsonSyntaxException e) { - throw new RuntimeException("Invalid JSON response: " + json, e); - } - } - public static class Factory implements ResourcePackHostFactory { @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java index 8263a4aac..43784ad8f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java @@ -2,13 +2,13 @@ package net.momirealms.craftengine.core.pack.host.impl; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.GsonHelper; +import net.momirealms.craftengine.core.util.HashUtils; import net.momirealms.craftengine.core.util.MiscUtils; import java.io.FileNotFoundException; @@ -24,8 +24,6 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -107,7 +105,7 @@ public class DropboxHost implements ResourcePackHost { Path finalResourcePackPath = resourcePackPath; CraftEngine.instance().scheduler().executeAsync(() -> { - String sha1 = calculateLocalFileSha1(finalResourcePackPath); + String sha1 = HashUtils.calculateLocalFileSha1(finalResourcePackPath); try (HttpClient client = HttpClient.newBuilder().proxy(proxy).build()) { JsonObject apiArg = new JsonObject(); apiArg.addProperty("path", uploadPath); @@ -179,7 +177,7 @@ public class DropboxHost implements ResourcePackHost { .build(); HttpResponse listResponse = client.send(listLinksRequest, HttpResponse.BodyHandlers.ofString()); if (listResponse.statusCode() == 200) { - JsonObject responseJson = parseJson(listResponse.body()); + JsonObject responseJson = GsonHelper.parseJsonToJsonObject(listResponse.body()); JsonArray links = responseJson.getAsJsonArray("links"); if (!links.isEmpty()) { return links.get(0).getAsJsonObject().get("url").getAsString().replace("dl=0", "dl=1"); @@ -189,7 +187,7 @@ public class DropboxHost implements ResourcePackHost { CraftEngine.instance().logger().warn("[DropBox] Failed to get download url: " + response.body()); return null; } - JsonObject jsonData = parseJson(response.body()); + JsonObject jsonData = GsonHelper.parseJsonToJsonObject(response.body()); return jsonData.getAsJsonPrimitive("url").getAsString().replace("dl=0", "dl=1"); } catch (IOException | InterruptedException e) { CraftEngine.instance().logger().warn("[DropBox] Failed to get download url: " + e.getMessage()); @@ -198,32 +196,6 @@ public class DropboxHost implements ResourcePackHost { } } - private JsonObject parseJson(String json) { - try { - return GsonHelper.get().fromJson( - json, - JsonObject.class - ); - } catch (JsonSyntaxException e) { - throw new RuntimeException("Invalid JSON response: " + json, e); - } - } - - private String calculateLocalFileSha1(Path filePath) { - try (InputStream is = Files.newInputStream(filePath)) { - MessageDigest md = MessageDigest.getInstance("SHA-1"); - byte[] buffer = new byte[8192]; - int len; - while ((len = is.read(buffer)) != -1) { - md.update(buffer, 0, len); - } - byte[] digest = md.digest(); - return HexFormat.of().formatHex(digest); - } catch (IOException | NoSuchAlgorithmException e) { - throw new RuntimeException("Failed to calculate SHA1", e); - } - } - public static class Factory implements ResourcePackHostFactory { @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java index 637f73575..3b9c6d950 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.core.pack.host.impl; -import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; @@ -12,7 +11,6 @@ import net.momirealms.craftengine.core.util.MiscUtils; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.net.Authenticator; import java.net.ProxySelector; import java.net.URI; import java.net.http.HttpClient; @@ -225,7 +223,7 @@ public class LobFileHost implements ResourcePackHost { ) { try { if (response.statusCode() == 200) { - Map json = parseJson(response.body()); + Map json = GsonHelper.parseJsonToMap(response.body()); if (Boolean.TRUE.equals(json.get("success"))) { this.url = (String) json.get("url"); this.sha1 = localSha1; @@ -261,17 +259,6 @@ public class LobFileHost implements ResourcePackHost { return sb.toString(); } - private Map parseJson(String json) { - try { - return GsonHelper.get().fromJson( - json, - new TypeToken>() {}.getType() - ); - } catch (JsonSyntaxException e) { - throw new RuntimeException("Invalid JSON response: " + json, e); - } - } - public static class Factory implements ResourcePackHostFactory { @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java index a2686e209..5228bdde6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java @@ -1,13 +1,13 @@ package net.momirealms.craftengine.core.pack.host.impl; import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.GsonHelper; +import net.momirealms.craftengine.core.util.HashUtils; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.Tuple; @@ -25,8 +25,6 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -122,7 +120,7 @@ public class OneDriveHost implements ResourcePackHost { future.completeExceptionally(new IOException("Failed to request resource pack download link: " + response.body())); return; } - String downloadUrl = parseJson(response.body()).get("@microsoft.graph.downloadUrl").getAsString(); + String downloadUrl = GsonHelper.parseJsonToJsonObject(response.body()).get("@microsoft.graph.downloadUrl").getAsString(); future.complete(List.of(new ResourcePackDownloadData( downloadUrl, UUID.nameUUIDFromBytes(sha1.getBytes(StandardCharsets.UTF_8)), @@ -145,7 +143,7 @@ public class OneDriveHost implements ResourcePackHost { if (this.localFilePath != null) resourcePackPath = this.localFilePath; Path finalResourcePackPath = resourcePackPath; CraftEngine.instance().scheduler().executeAsync(() -> { - sha1 = calculateLocalFileSha1(finalResourcePackPath); + sha1 = HashUtils.calculateLocalFileSha1(finalResourcePackPath); String accessToken = getOrRefreshJwtToken(); try (HttpClient client = HttpClient.newBuilder().proxy(proxy).build()) { HttpRequest request = HttpRequest.newBuilder() @@ -160,7 +158,7 @@ public class OneDriveHost implements ResourcePackHost { .thenAccept(response -> { if (response.statusCode() == 200 || response.statusCode() == 201) { CraftEngine.instance().logger().info("[OneDrive] Uploaded resource pack in " + (System.currentTimeMillis() - uploadStart) + "ms"); - fileId = parseJson(response.body()).get("id").getAsString(); + fileId = GsonHelper.parseJsonToJsonObject(response.body()).get("id").getAsString(); saveCacheToDisk(); future.complete(null); } else { @@ -204,7 +202,7 @@ public class OneDriveHost implements ResourcePackHost { return refreshToken != null ? refreshToken.mid() : ""; } - JsonObject jsonData = parseJson(response.body()); + JsonObject jsonData = GsonHelper.parseJsonToJsonObject(response.body()); if (jsonData.has("error")) { CraftEngine.instance().logger().warn("[OneDrive] Token refresh error: " + jsonData); throw new RuntimeException("Token refresh failed: " + jsonData); @@ -224,32 +222,6 @@ public class OneDriveHost implements ResourcePackHost { return refreshToken.mid(); } - private JsonObject parseJson(String json) { - try { - return GsonHelper.get().fromJson( - json, - JsonObject.class - ); - } catch (JsonSyntaxException e) { - throw new RuntimeException("Invalid JSON response: " + json, e); - } - } - - private String calculateLocalFileSha1(Path filePath) { - try (InputStream is = Files.newInputStream(filePath)) { - MessageDigest md = MessageDigest.getInstance("SHA-1"); - byte[] buffer = new byte[8192]; - int len; - while ((len = is.read(buffer)) != -1) { - md.update(buffer, 0, len); - } - byte[] digest = md.digest(); - return HexFormat.of().formatHex(digest); - } catch (IOException | NoSuchAlgorithmException e) { - throw new RuntimeException("Failed to calculate SHA1", e); - } - } - public static class Factory implements ResourcePackHostFactory { @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java index ec725211f..fc55dfb17 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java @@ -4,6 +4,7 @@ import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.HashUtils; import net.momirealms.craftengine.core.util.MiscUtils; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; @@ -22,17 +23,15 @@ import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.presigner.S3Presigner; import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; -import java.io.IOException; -import java.io.InputStream; import java.net.URI; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.time.Duration; -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; @@ -112,7 +111,7 @@ public class S3Host implements ResourcePackHost { public CompletableFuture upload(Path resourcePackPath) { if (this.localFilePath != null) resourcePackPath = this.localFilePath; String objectKey = uploadPath; - String sha1 = calculateLocalFileSha1(resourcePackPath); + String sha1 = HashUtils.calculateLocalFileSha1(resourcePackPath); PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket(bucket) .key(objectKey) @@ -147,21 +146,6 @@ public class S3Host implements ResourcePackHost { + (originalUrl.getQuery() != null ? "?" + originalUrl.getQuery() : ""); } - private String calculateLocalFileSha1(Path filePath) { - try (InputStream is = Files.newInputStream(filePath)) { - MessageDigest md = MessageDigest.getInstance("SHA-1"); - byte[] buffer = new byte[8192]; - int len; - while ((len = is.read(buffer)) != -1) { - md.update(buffer, 0, len); - } - byte[] digest = md.digest(); - return HexFormat.of().formatHex(digest); - } catch (IOException | NoSuchAlgorithmException e) { - throw new RuntimeException("Failed to calculate SHA1", e); - } - } - public static class Factory implements ResourcePackHostFactory { @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/GsonHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/GsonHelper.java index f677c0ab8..7dcb40ce1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/GsonHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/GsonHelper.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.util; import com.google.gson.*; +import com.google.gson.reflect.TypeToken; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -78,4 +79,26 @@ public class GsonHelper { } return merged; } + + public static JsonObject parseJsonToJsonObject(String json) { + try { + return get().fromJson( + json, + JsonObject.class + ); + } catch (JsonSyntaxException e) { + throw new RuntimeException("Invalid JSON response: " + json, e); + } + } + + public static Map parseJsonToMap(String json) { + try { + return GsonHelper.get().fromJson( + json, + new TypeToken>() {}.getType() + ); + } catch (JsonSyntaxException e) { + throw new RuntimeException("Invalid JSON response: " + json, e); + } + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/HashUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/HashUtils.java new file mode 100644 index 000000000..250adcfc7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/HashUtils.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.util; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.HexFormat; + +public class HashUtils { + public static String calculateLocalFileSha1(Path filePath) { + try (InputStream is = Files.newInputStream(filePath)) { + MessageDigest md = MessageDigest.getInstance("SHA-1"); + byte[] buffer = new byte[8192]; + int len; + while ((len = is.read(buffer)) != -1) { + md.update(buffer, 0, len); + } + byte[] digest = md.digest(); + return HexFormat.of().formatHex(digest); + } catch (IOException | NoSuchAlgorithmException e) { + throw new RuntimeException("Failed to calculate SHA1", e); + } + } +}