All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.avaje.metric.agent.Transformer Maven / Gradle / Ivy

package org.avaje.metric.agent;

import java.io.PrintStream;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;

import org.avaje.metric.agent.asm.CLAwareClassWriter;
import org.avaje.metric.agent.asm.ClassReader;
import org.avaje.metric.agent.asm.ClassWriter;

/**
 * A Class file Transformer that enhances entity beans.
 * 

* This is used as both a javaagent or via an ANT task (or other off line * approach). *

*/ public class Transformer implements ClassFileTransformer { public static void premain(String agentArgs, Instrumentation inst) { Transformer t = new Transformer(agentArgs, null); inst.addTransformer(t); if (t.getLogLevel() > 0) { System.out.println("premain loading Transformer with args:" + agentArgs); } } public static void agentmain(String agentArgs, Instrumentation inst) throws Exception { Transformer t = new Transformer( agentArgs, null); inst.addTransformer(t); if (t.getLogLevel() > 0) { System.out.println("agentmain loading Transformer with args:" + agentArgs); } } private final EnhanceContext enhanceContext; public Transformer(String agentArgs, ClassLoader classLoader) { this.enhanceContext = new EnhanceContext(agentArgs, classLoader); } /** * Change the logout to something other than system out. */ public void setLogout(PrintStream logout) { this.enhanceContext.setLogout(logout); } public void log(int level, String msg, String extra) { enhanceContext.log(level, msg, extra); } public int getLogLevel() { return enhanceContext.getLogLevel(); } public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { try { // ignore JDK and JDBC classes etc if (enhanceContext.isIgnoreClass(className)) { enhanceContext.log(8, "ignore class ", className); return null; } enhanceContext.log(8, "look at ", className); return enhancement(loader, classfileBuffer); } catch (NoEnhancementRequiredException e) { // the class is an interface log(8, "No Enhancement required ", e.getMessage()); return null; } catch (Exception e) { // a safety net for unexpected errors // in the transformation enhanceContext.log(e); return null; } } /** * Perform enhancement. */ private byte[] enhancement(ClassLoader loader, byte[] classfileBuffer) { ClassReader cr = new ClassReader(classfileBuffer); ClassWriter cw = new CLAwareClassWriter(ClassWriter.COMPUTE_FRAMES + ClassWriter.COMPUTE_MAXS, loader); ClassAdapterMetric ca = new ClassAdapterMetric(cw, enhanceContext, loader); try { cr.accept(ca, ClassReader.EXPAND_FRAMES); if (ca.isLog(3)) { ca.log("enhanced"); } if (enhanceContext.isReadOnly()) { if (ca.isLog(3)) { ca.log("readonly mode - not enhanced"); } return null; } else { return cw.toByteArray(); } } catch (AlreadyEnhancedException e) { if (ca.isLog(1)) { ca.log("already enhanced"); } return null; } catch (NoEnhancementRequiredException e) { if (ca.isLog(4)) { ca.log("... skipping, no enhancement required"); } return null; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy