|
1 | 1 | package org.mangorage.mangobotlaunch.launch; |
2 | 2 |
|
3 | 3 | import org.mangorage.bootstrap.api.transformer.IClassTransformer; |
| 4 | +import org.mangorage.bootstrap.api.transformer.IClassTransformerHistory; |
| 5 | +import org.mangorage.bootstrap.api.transformer.ITransformerResultHistory; |
4 | 6 | import org.mangorage.bootstrap.api.transformer.TransformResult; |
5 | 7 | import org.mangorage.bootstrap.api.transformer.TransformerFlag; |
6 | 8 |
|
| 9 | +import java.util.HashMap; |
7 | 10 | import java.util.List; |
| 11 | +import java.util.Map; |
8 | 12 | import java.util.concurrent.CopyOnWriteArrayList; |
| 13 | +import java.util.logging.Level; |
| 14 | +import java.util.logging.Logger; |
9 | 15 |
|
10 | | -public final class ClassTransformers { |
| 16 | +public final class ClassTransformers implements IClassTransformerHistory { |
11 | 17 |
|
| 18 | + private static final Logger LOGGER = Logger.getLogger(ClassTransformers.class.getName()); |
12 | 19 | private static final boolean DEBUG_CLASS_TRANSFORMING = Boolean.getBoolean("DEBUG_CLASS_TRANSFORMING"); |
13 | 20 |
|
| 21 | + record TransformerHistoryEntry(Class<?> transformer, String transformerName, TransformerFlag transformerFlag, byte[] classData) |
| 22 | + implements ITransformerResultHistory {} |
14 | 23 |
|
15 | 24 | private final List<IClassTransformer> transformers = new CopyOnWriteArrayList<>(); |
16 | | - |
| 25 | + private final Map<String, List<ITransformerResultHistory>> transformerHistoryCache = DEBUG_CLASS_TRANSFORMING ? new HashMap<>() : null; |
17 | 26 |
|
18 | 27 | ClassTransformers() {} |
19 | 28 |
|
20 | 29 | void add(IClassTransformer transformer) { |
21 | 30 | transformers.add(transformer); |
| 31 | + LOGGER.log(Level.INFO, "Added transformer: {0}", transformer.getName()); |
22 | 32 | } |
23 | 33 |
|
24 | 34 | 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 | + } |
25 | 39 |
|
26 | 40 | for (IClassTransformer transformer : transformers) { |
27 | 41 |
|
28 | 42 | TransformResult result = transformer.transform(name, classData); |
29 | 43 |
|
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()}); |
32 | 48 | } |
33 | 49 |
|
34 | 50 | 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()}); |
40 | 52 | return result.classData(); |
41 | 53 | } |
42 | 54 | } |
43 | 55 |
|
| 56 | + LOGGER.log(Level.FINE, "No transformation applied to class: {0}", name); |
| 57 | + |
44 | 58 | return null; |
45 | 59 | } |
46 | 60 |
|
| 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 | + } |
47 | 68 | } |
0 commit comments