From cfbdf19a463581ce3dce05b50ab786cf0065df3e Mon Sep 17 00:00:00 2001 From: ZZZank <47418975+ZZZank@users.noreply.github.com> Date: Sat, 13 Dec 2025 14:11:25 +0000 Subject: [PATCH 1/2] implement ClassPath<->diff conversion --- .../probejs/lang/java/clazz/ClassPath.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/main/java/moe/wolfgirl/probejs/lang/java/clazz/ClassPath.java b/src/main/java/moe/wolfgirl/probejs/lang/java/clazz/ClassPath.java index 524d561..e0f5222 100644 --- a/src/main/java/moe/wolfgirl/probejs/lang/java/clazz/ClassPath.java +++ b/src/main/java/moe/wolfgirl/probejs/lang/java/clazz/ClassPath.java @@ -8,9 +8,13 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Objects; public record ClassPath(List parts) { + public static final ClassPath EMPTY = new ClassPath(List.of()); + private static List transformJavaClass(Class clazz) { String name = clazz.getName(); String[] parts = name.split("\\."); @@ -89,4 +93,37 @@ public String getFileKey() { if (parts.size() == 1) return getClassPath(); return String.join(".", parts.subList(0, Math.min(4, parts.size() - 1))); } + + public String toDiff(ClassPath base) { + var common = countCommonPrefix(this.parts, base.parts); + var diff = new ArrayList<>(this.parts); + Collections.fill(diff.subList(0, common), ""); + return String.join(".", diff); + } + + public ClassPath fromDiff(String diff) { + var parts = diff.split("\\."); + for (int i = 0; i < parts.length; i++) { + if (parts[i].isEmpty()) { + parts[i] = this.parts.get(i); + } else { + break; + } + } + return new ClassPath(List.of(parts)); + } + + private static int countCommonPrefix(List a, List b) { + var sizeCompare = Integer.min(a.size(), b.size()); + + var common = 0; + for (int i = 0; i < sizeCompare; i++) { + if (Objects.equals(a.get(i), b.get(i))) { + common++; + } else { + break; + } + } + return common; + } } From fb13b7913f07462047541a94d853b045605ff1dc Mon Sep 17 00:00:00 2001 From: ZZZank <47418975+ZZZank@users.noreply.github.com> Date: Sat, 13 Dec 2025 14:12:04 +0000 Subject: [PATCH 2/2] use ClassPath<->diff conversion to reduce cache file size --- .../probejs/lang/java/ClassRegistry.java | 13 ++++++++++--- .../probejs/lang/java/clazz/ClassPath.java | 18 +++++++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main/java/moe/wolfgirl/probejs/lang/java/ClassRegistry.java b/src/main/java/moe/wolfgirl/probejs/lang/java/ClassRegistry.java index 45ad05f..40bc4de 100644 --- a/src/main/java/moe/wolfgirl/probejs/lang/java/ClassRegistry.java +++ b/src/main/java/moe/wolfgirl/probejs/lang/java/ClassRegistry.java @@ -166,24 +166,31 @@ public Collection getFoundClasses() { public void writeTo(Path path) throws IOException { try (var writer = Files.newBufferedWriter(path)) { - for (Map.Entry entry : foundClasses.entrySet()) { + var lastPath = ClassPath.EMPTY; + for (Map.Entry entry : new TreeMap<>(foundClasses).entrySet()) { + var classPath = entry.getKey(); writer.write("%s\t%s\n".formatted( - entry.getKey().getClassPathJava(), + classPath.toDiff(lastPath), entry.getValue().recursionDepth )); + lastPath = classPath; } } } public void loadFrom(Path path) { try (var reader = Files.newBufferedReader(path)) { + var lastPath = ClassPath.EMPTY; for (String parts : (Iterable) reader.lines()::iterator) { + ClassPath classPath = lastPath; try { String[] classRecursion = parts.split("\t"); - Class loaded = Class.forName(classRecursion[0]); + classPath = lastPath.fromDiff(classRecursion[0]); + Class loaded = classPath.forName(); fromClasses(Collections.singleton(loaded), Integer.parseInt(classRecursion[1])); } catch (Throwable ignored) { } + lastPath = classPath; } } catch (Exception ignored) { } diff --git a/src/main/java/moe/wolfgirl/probejs/lang/java/clazz/ClassPath.java b/src/main/java/moe/wolfgirl/probejs/lang/java/clazz/ClassPath.java index e0f5222..fdaedab 100644 --- a/src/main/java/moe/wolfgirl/probejs/lang/java/clazz/ClassPath.java +++ b/src/main/java/moe/wolfgirl/probejs/lang/java/clazz/ClassPath.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Objects; -public record ClassPath(List parts) { +public record ClassPath(List parts) implements Comparable { public static final ClassPath EMPTY = new ClassPath(List.of()); private static List transformJavaClass(Class clazz) { @@ -126,4 +126,20 @@ private static int countCommonPrefix(List a, List b) { } return common; } + + @Override + public int compareTo(ClassPath o) { + var a = this.parts; + var b = o.parts; + + int sizeCompare = Integer.min(a.size(), b.size()); + for (int i = 0; i < sizeCompare; i++) { + int compared = a.get(i).compareTo(b.get(i)); + if (compared != 0) { + return compared; + } + } + + return a.size() - b.size(); + } }