45 import org.openjdk.jmc.agent.jfr.JFRTransformDescriptor;
46 import org.openjdk.jmc.agent.jfr.VersionResolver;
47 import org.openjdk.jmc.agent.jfr.VersionResolver.JFRVersion;
48 import org.openjdk.jmc.agent.jfr.impl.JFRClassVisitor;
49 import org.openjdk.jmc.agent.jfrnext.impl.JFRNextClassVisitor;
50 import org.openjdk.jmc.agent.text.impl.LoggerClassVisitor;
51 import org.openjdk.jmc.agent.text.impl.TextTransformDescriptor;
52
53 public class Transformer implements ClassFileTransformer {
54 private TransformRegistry registry;
55
56 public Transformer(TransformRegistry registry) {
57 this.registry = registry;
58 }
59
60 @Override
61 public byte[] transform(
62 ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
63 byte[] classfileBuffer) throws IllegalClassFormatException {
64 if (!registry.hasPendingTransforms(className)) {
65 return classfileBuffer;
66 }
67 return doTransforms(registry.getTransformData(className), classfileBuffer, loader, protectionDomain);
68 }
69
70 private byte[] doTransforms(
71 List<TransformDescriptor> transformDataList, byte[] classfileBuffer, ClassLoader definingClassLoader,
72 ProtectionDomain protectionDomain) {
73 for (TransformDescriptor td : transformDataList) {
74 if (td.isPendingTransforms()) {
75 // FIXME: Optimization, should do all transforms to one class in one go, instead of creating one class writer per transform.
76 classfileBuffer = doTransform(td, classfileBuffer, definingClassLoader, protectionDomain);
77 td.setPendingTransforms(false);
78 }
79 }
80 return classfileBuffer;
81 }
82
83 private byte[] doTransform(
84 TransformDescriptor td, byte[] classfileBuffer, ClassLoader definingClassLoader,
85 ProtectionDomain protectionDomain) {
|
45 import org.openjdk.jmc.agent.jfr.JFRTransformDescriptor;
46 import org.openjdk.jmc.agent.jfr.VersionResolver;
47 import org.openjdk.jmc.agent.jfr.VersionResolver.JFRVersion;
48 import org.openjdk.jmc.agent.jfr.impl.JFRClassVisitor;
49 import org.openjdk.jmc.agent.jfrnext.impl.JFRNextClassVisitor;
50 import org.openjdk.jmc.agent.text.impl.LoggerClassVisitor;
51 import org.openjdk.jmc.agent.text.impl.TextTransformDescriptor;
52
53 public class Transformer implements ClassFileTransformer {
54 private TransformRegistry registry;
55
56 public Transformer(TransformRegistry registry) {
57 this.registry = registry;
58 }
59
60 @Override
61 public byte[] transform(
62 ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
63 byte[] classfileBuffer) throws IllegalClassFormatException {
64 if (!registry.hasPendingTransforms(className)) {
65 return null;
66 }
67 return doTransforms(registry.getTransformData(className), classfileBuffer, loader, protectionDomain);
68 }
69
70 private byte[] doTransforms(
71 List<TransformDescriptor> transformDataList, byte[] classfileBuffer, ClassLoader definingClassLoader,
72 ProtectionDomain protectionDomain) {
73 for (TransformDescriptor td : transformDataList) {
74 if (td.isPendingTransforms()) {
75 // FIXME: Optimization, should do all transforms to one class in one go, instead of creating one class writer per transform.
76 classfileBuffer = doTransform(td, classfileBuffer, definingClassLoader, protectionDomain);
77 td.setPendingTransforms(false);
78 }
79 }
80 return classfileBuffer;
81 }
82
83 private byte[] doTransform(
84 TransformDescriptor td, byte[] classfileBuffer, ClassLoader definingClassLoader,
85 ProtectionDomain protectionDomain) {
|