< prev index next >

core/org.openjdk.jmc.agent/src/main/java/org/openjdk/jmc/agent/Transformer.java

Print this page




  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) {


< prev index next >