Skip to content

Commit 173b735

Browse files
committed
Added proper history details for transforming, so we can see the transformer history of a class, backed by a debug option...
1 parent b38c752 commit 173b735

4 files changed

Lines changed: 39 additions & 13 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ repositories {
6060
}
6161

6262
dependencies {
63-
compileOnly("org.mangorage:mangobotbootstrap:1.0.85")
63+
compileOnly("org.mangorage:mangobotbootstrap:1.0.86")
6464
}
6565

6666
test {

src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module org.mangorage.mangobotlaunchtarget {
22
requires org.mangorage.bootstrap;
3+
requires java.logging;
34

45
opens org.mangorage.mangobotlaunch.launch to org.mangorage.bootstrap;
56
opens org.mangorage.mangobotlaunch.util to org.mangorage.bootstrap;
Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,68 @@
11
package org.mangorage.mangobotlaunch.launch;
22

33
import org.mangorage.bootstrap.api.transformer.IClassTransformer;
4+
import org.mangorage.bootstrap.api.transformer.IClassTransformerHistory;
5+
import org.mangorage.bootstrap.api.transformer.ITransformerResultHistory;
46
import org.mangorage.bootstrap.api.transformer.TransformResult;
57
import org.mangorage.bootstrap.api.transformer.TransformerFlag;
68

9+
import java.util.HashMap;
710
import java.util.List;
11+
import java.util.Map;
812
import java.util.concurrent.CopyOnWriteArrayList;
13+
import java.util.logging.Level;
14+
import java.util.logging.Logger;
915

10-
public final class ClassTransformers {
16+
public final class ClassTransformers implements IClassTransformerHistory {
1117

18+
private static final Logger LOGGER = Logger.getLogger(ClassTransformers.class.getName());
1219
private static final boolean DEBUG_CLASS_TRANSFORMING = Boolean.getBoolean("DEBUG_CLASS_TRANSFORMING");
1320

21+
record TransformerHistoryEntry(Class<?> transformer, String transformerName, TransformerFlag transformerFlag, byte[] classData)
22+
implements ITransformerResultHistory {}
1423

1524
private final List<IClassTransformer> transformers = new CopyOnWriteArrayList<>();
16-
25+
private final Map<String, List<ITransformerResultHistory>> transformerHistoryCache = DEBUG_CLASS_TRANSFORMING ? new HashMap<>() : null;
1726

1827
ClassTransformers() {}
1928

2029
void add(IClassTransformer transformer) {
2130
transformers.add(transformer);
31+
LOGGER.log(Level.INFO, "Added transformer: {0}", transformer.getName());
2232
}
2333

2434
byte[] transform(String name, byte[] classData) {
35+
if (transformers.isEmpty()) {
36+
LOGGER.log(Level.FINE, "No transformers registered for class: {0}", name);
37+
return null;
38+
}
2539

2640
for (IClassTransformer transformer : transformers) {
2741

2842
TransformResult result = transformer.transform(name, classData);
2943

30-
if (DEBUG_CLASS_TRANSFORMING) {
31-
// TODO: Implement this
44+
if (DEBUG_CLASS_TRANSFORMING && transformerHistoryCache != null) {
45+
transformerHistoryCache.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>())
46+
.add(new TransformerHistoryEntry(transformer.getClass(), transformer.getName(), result.flag(), result.classData()));
47+
LOGGER.log(Level.FINE, "Transformer history recorded for {0} using {1}", new Object[]{name, transformer.getName()});
3248
}
3349

3450
if (result.flag() != TransformerFlag.NO_REWRITE) {
35-
System.out.println(
36-
"%s Transformed %s"
37-
.formatted(transformer.getName(), name)
38-
);
39-
51+
LOGGER.log(Level.INFO, "Class {0} transformed by {1}", new Object[]{name, transformer.getName()});
4052
return result.classData();
4153
}
4254
}
4355

56+
LOGGER.log(Level.FINE, "No transformation applied to class: {0}", name);
57+
4458
return null;
4559
}
4660

61+
@Override
62+
public List<ITransformerResultHistory> getHistory(String className) {
63+
if (!DEBUG_CLASS_TRANSFORMING || transformerHistoryCache == null) {
64+
return List.of();
65+
}
66+
return transformerHistoryCache.getOrDefault(className, List.of());
67+
}
4768
}

src/main/java/org/mangorage/mangobotlaunch/launch/MangoLoaderImpl.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.mangorage.bootstrap.api.loader.IMangoLoader;
44
import org.mangorage.bootstrap.api.module.IModuleConfigurator;
55
import org.mangorage.bootstrap.api.transformer.IClassTransformer;
6+
import org.mangorage.bootstrap.api.transformer.IClassTransformerHistory;
67

78
import java.io.IOException;
89
import java.io.InputStream;
@@ -152,6 +153,11 @@ protected Class<?> findClass(String moduleName, String name) {
152153
return null;
153154
}
154155

156+
@Override
157+
public IClassTransformerHistory getTransformerHistory() {
158+
return transformers;
159+
}
160+
155161
@Override
156162
public byte[] getClassBytes(String cn) {
157163
LoadedModule loadedModule = findLoadedModule(cn);
@@ -190,9 +196,7 @@ private Class<?> defineClass(String cn, LoadedModule loadedModule) {
190196
byte[] modifiedClassBytes = transformers.transform(cn, classBytes);
191197

192198
if (modifiedClassBytes != null) {
193-
Class<?> clz = defineClass(cn, modifiedClassBytes, 0, modifiedClassBytes.length);
194-
transformers.add(cn, clz);
195-
return clz;
199+
return defineClass(cn, modifiedClassBytes, 0, modifiedClassBytes.length);
196200
}
197201
return defineClass(cn, classBytes, 0, classBytes.length);
198202
} catch (IOException ioe) {

0 commit comments

Comments
 (0)