import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;

public class DynamicAgent {
    
    public static void agentmain(String agentArgs, Instrumentation inst) {
        inst.addTransformer(new ClassFileTransformer() {
            @Override
            public byte[] transform(ClassLoader loader, String className,
                                   Class<?> classBeingRedefined,
                                   ProtectionDomain protectionDomain,
                                   byte[] classfileBuffer) {
                if (className != null && className.endsWith("MyRecord")) {
                    System.out.println(">>> Transforming: " + className + " retransform=" + (classBeingRedefined != null));
                    
                    ClassReader reader = new ClassReader(classfileBuffer);
                    
                    // BUG: Not passing reader
                    ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
                    reader.accept(writer, 0);
                    return writer.toByteArray();
                }
                return null;
            }
        }, true);
        
        System.out.println(">>> Transformer installed, scanning for loaded classes...");
        
        // Find and retransform any already-loaded record classes
        for (Class<?> clazz : inst.getAllLoadedClasses()) {
            if (clazz.getName().contains("MyRecord") && inst.isModifiableClass(clazz)) {
                try {
                    System.out.println(">>> Retransforming already-loaded: " + clazz.getName());
                    inst.retransformClasses(clazz);
                } catch (Exception e) {
                    System.err.println(">>> Retransform failed: " + e);
                    e.printStackTrace();
                }
            }
        }
    }
}
