Skip to content

Commit 79680a4

Browse files
authored
Improve language loader (#153)
* Improve language loading logic * Catch exceptions more strictly * More lenient syntax restrictions --------- Signed-off-by: Hendrix-Shen <[email protected]>
1 parent f423d11 commit 79680a4

File tree

3 files changed

+32
-20
lines changed

3 files changed

+32
-20
lines changed

magiclib-core/common/src/main/java/top/hendrixshen/magiclib/impl/i18n/provider/FileLanguageProvider.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import com.google.common.collect.Lists;
44
import com.google.common.collect.Maps;
5-
import com.google.gson.JsonSyntaxException;
6-
import com.google.gson.stream.MalformedJsonException;
75
import lombok.AccessLevel;
86
import lombok.AllArgsConstructor;
97
import lombok.Getter;
@@ -75,14 +73,9 @@ public Map<String, String> getLanguage(String languageCode) {
7573

7674
this.files.getOrDefault(languageCode, Collections.emptyList()).forEach(file -> {
7775
try (InputStream inputStream = Files.newInputStream(file)) {
78-
JsonUtil.loadStringMapFromJson(inputStream, result::put);
76+
JsonUtil.loadLanguageMapFromJson(inputStream, result::put);
7977
MagicLib.getLogger().debug("Loaded language file {}.", file);
8078
} catch (Exception e) {
81-
if (e instanceof JsonSyntaxException && e.getCause() instanceof MalformedJsonException) {
82-
MagicLib.getLogger().error("Failed to load language file {}.", file);
83-
return;
84-
}
85-
8679
MagicLib.getLogger().error("Failed to load language file {}.", file, e);
8780
}
8881
});

magiclib-core/common/src/main/java/top/hendrixshen/magiclib/impl/i18n/provider/JarLanguageProvider.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,20 +80,15 @@ private void loadFromJar(@NotNull JarFile jar) {
8080

8181
@Internal
8282
public static boolean loadFromEntry(@NotNull ZipEntry entry, InputStream inputStream,
83-
Function<String, Map<String, String>> languageMapGetter) {
83+
Function<String, Map<String, String>> languageMapGetter) {
8484
Matcher matcher = LanguageProvider.LANGUAGE_PATH_PATTERN.matcher(entry.getName());
8585

8686
if (!matcher.find()) {
8787
return false;
8888
}
8989

9090
Map<String, String> language = languageMapGetter.apply(matcher.group(2));
91-
92-
try {
93-
JsonUtil.loadStringMapFromJson(inputStream, language::put);
94-
return true;
95-
} catch (Exception e) {
96-
return false;
97-
}
91+
JsonUtil.loadLanguageMapFromJson(inputStream, language::put);
92+
return true;
9893
}
9994
}

magiclib-core/common/src/main/java/top/hendrixshen/magiclib/util/JsonUtil.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package top.hendrixshen.magiclib.util;
22

33
import com.google.gson.JsonObject;
4+
import com.google.gson.stream.JsonReader;
5+
import com.google.gson.stream.JsonToken;
46
import org.jetbrains.annotations.NotNull;
57

68
import java.io.IOException;
@@ -12,10 +14,32 @@
1214

1315
public class JsonUtil {
1416
public static void loadStringMapFromJson(InputStream inputStream, BiConsumer<String, String> biConsumer) {
15-
JsonObject jsonObject = GsonUtil.GSON.fromJson(new InputStreamReader(inputStream,
16-
StandardCharsets.UTF_8), JsonObject.class);
17-
jsonObject.entrySet().forEach(entry -> biConsumer.accept(entry.getKey(),
18-
entry.getValue().getAsString()));
17+
JsonUtil.loadLanguageMapFromJson(inputStream, biConsumer);
18+
}
19+
20+
public static void loadLanguageMapFromJson(InputStream inputStream, BiConsumer<String, String> biConsumer) {
21+
try (
22+
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
23+
JsonReader reader = new JsonReader(inputStreamReader)
24+
) {
25+
if (reader.peek() == JsonToken.BEGIN_OBJECT) {
26+
reader.beginObject();
27+
28+
while (reader.hasNext()) {
29+
String key = reader.nextName();
30+
31+
if (reader.peek() == JsonToken.STRING) {
32+
biConsumer.accept(key, reader.nextString());
33+
} else {
34+
reader.skipValue();
35+
}
36+
}
37+
38+
reader.endObject();
39+
}
40+
} catch (IOException ignore) {
41+
// ignore.
42+
}
1943
}
2044

2145
public static JsonObject readJson(@NotNull URL url) throws IOException {

0 commit comments

Comments
 (0)