Search in sources :

Example 51 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project intellij-community by JetBrains.

the class ResetAgent method premain.

public static void premain(String options, Instrumentation inst) {
    // Handle duplicate agents
    if (initialized) {
        return;
    }
    initialized = true;
    inst.addTransformer(new ClassFileTransformer() {

        public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
            if (classBeingRedefined != null) {
                try {
                    Field callSiteArrayField = classBeingRedefined.getDeclaredField("$callSiteArray");
                    callSiteArrayField.setAccessible(true);
                    callSiteArrayField.set(null, null);
                } catch (Throwable ignored) {
                }
            }
            return removeTimestampField(classfileBuffer);
        }
    });
}
Also used : ProtectionDomain(java.security.ProtectionDomain) Field(java.lang.reflect.Field) ClassFileTransformer(java.lang.instrument.ClassFileTransformer) IllegalClassFormatException(java.lang.instrument.IllegalClassFormatException) String(java.lang.String)

Example 52 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project jdk8u_jdk by JetBrains.

the class TransformerManager method transform.

public byte[] transform(ClassLoader loader, String classname, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
    boolean someoneTouchedTheBytecode = false;
    TransformerInfo[] transformerList = getSnapshotTransformerList();
    byte[] bufferToUse = classfileBuffer;
    // order matters, gotta run 'em in the order they were added
    for (int x = 0; x < transformerList.length; x++) {
        TransformerInfo transformerInfo = transformerList[x];
        ClassFileTransformer transformer = transformerInfo.transformer();
        byte[] transformedBytes = null;
        try {
            transformedBytes = transformer.transform(loader, classname, classBeingRedefined, protectionDomain, bufferToUse);
        } catch (Throwable t) {
        // don't let any one transformer mess it up for the others.
        // This is where we need to put some logging. What should go here? FIXME
        }
        if (transformedBytes != null) {
            someoneTouchedTheBytecode = true;
            bufferToUse = transformedBytes;
        }
    }
    // if someone modified it, return the modified buffer.
    // otherwise return null to mean "no transforms occurred"
    byte[] result;
    if (someoneTouchedTheBytecode) {
        result = bufferToUse;
    } else {
        result = null;
    }
    return result;
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer)

Example 53 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project tomee by apache.

the class JpaTest method createEntityManagerFactory.

private EntityManagerFactory createEntityManagerFactory() throws Exception {
    final PersistenceClassLoaderHandler persistenceClassLoaderHandler = new PersistenceClassLoaderHandler() {

        public void addTransformer(final String unitId, final ClassLoader classLoader, final ClassFileTransformer classFileTransformer) {
        /*
                Instrumentation instrumentation = Agent.getInstrumentation();
                instrumentation.addTransformer(classFileTransformer);
                */
        }

        public void destroy(final String unitId) {
        }

        public ClassLoader getNewTempClassLoader(final ClassLoader classLoader) {
            return new TempClassLoader(classLoader);
        }
    };
    /*
        Agent.getInstrumentation().addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
                if (!className.equals("org/apache/openejb/core/cmp/jpa/Employee")) {
                    return null;
                }
                byte[] newBytes = addNewField(classfileBuffer);
                return newBytes;
            }
        });
        */
    final PersistenceUnitInfoImpl unitInfo = new PersistenceUnitInfoImpl(persistenceClassLoaderHandler);
    unitInfo.setPersistenceUnitName("CMP");
    unitInfo.setPersistenceProviderClassName(PERSISTENCE_PROVIDER);
    unitInfo.setClassLoader(getClass().getClassLoader());
    unitInfo.setExcludeUnlistedClasses(false);
    unitInfo.setJtaDataSource(jtaDs);
    unitInfo.setNonJtaDataSource(nonJtaDs);
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.Employee");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.Bill");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.EmbeddedBill");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.Person");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.EmbeddedBillPk");
    unitInfo.getMappingFileNames().add("META-INF/jpa-test-mappings.xml");
    // Handle Properties
    final Properties properties = new Properties();
    properties.setProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
    properties.setProperty("openjpa.Log", "DefaultLevel=WARN");
    properties.setProperty("openjpa.RuntimeUnenhancedClasses", "supported");
    unitInfo.setProperties(properties);
    unitInfo.setTransactionType(transactionType);
    unitInfo.getManagedClassNames().add("org.apache.openejb.core.cmp.jpa.Employee");
    final PersistenceProvider persistenceProvider = (PersistenceProvider) getClass().getClassLoader().loadClass(PERSISTENCE_PROVIDER).newInstance();
    final EntityManagerFactory emf = persistenceProvider.createContainerEntityManagerFactory(unitInfo, new HashMap());
    return emf;
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer) PersistenceClassLoaderHandler(org.apache.openejb.persistence.PersistenceClassLoaderHandler) TempClassLoader(org.apache.openejb.core.TempClassLoader) PersistenceUnitInfoImpl(org.apache.openejb.persistence.PersistenceUnitInfoImpl) HashMap(java.util.HashMap) PersistenceProvider(javax.persistence.spi.PersistenceProvider) EntityManagerFactory(javax.persistence.EntityManagerFactory) TempClassLoader(org.apache.openejb.core.TempClassLoader) Properties(java.util.Properties)

Example 54 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project tomee by apache.

the class UnenhancedTest method runTest.

private void runTest(final String methodName, final PersistenceUnitTransactionType transactionType, final boolean enhance) throws Exception {
    this.enhance = enhance;
    final ClassLoader loader = new FilteredChildFirstClassLoader(getClass().getClassLoader(), "org.apache.openejb.core.cmp.jpa");
    final PersistenceClassLoaderHandler persistenceClassLoaderHandler = new PersistenceClassLoaderHandler() {

        public void addTransformer(final String unitId, final ClassLoader classLoader, final ClassFileTransformer classFileTransformer) {
            final Instrumentation instrumentation = Agent.getInstrumentation();
            if (instrumentation != null) {
                instrumentation.addTransformer(new ControllableTransformer(classFileTransformer));
            }
        }

        public void destroy(final String unitId) {
        }

        public ClassLoader getNewTempClassLoader(final ClassLoader classLoader) {
            return new TempClassLoader(classLoader);
        }
    };
    final PersistenceUnitInfoImpl unitInfo = new PersistenceUnitInfoImpl(persistenceClassLoaderHandler);
    unitInfo.setPersistenceUnitName("CMP");
    unitInfo.setPersistenceProviderClassName(PERSISTENCE_PROVIDER);
    unitInfo.setClassLoader(loader);
    unitInfo.setExcludeUnlistedClasses(false);
    unitInfo.setJtaDataSource(jtaDs);
    unitInfo.setNonJtaDataSource(nonJtaDs);
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.ComplexSuperclass");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.ComplexSubclass");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.ComplexStandalone");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.GeneratedStandalone");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.GeneratedSuperclass");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.GeneratedSubclass");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.OneStandalone");
    unitInfo.addManagedClassName("org.apache.openejb.core.cmp.jpa.ManyStandalone");
    // Handle Properties
    final Properties properties = new Properties();
    properties.setProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema(SchemaAction='add,deleteTableContents',ForeignKeys=true)");
    properties.setProperty("openjpa.RuntimeUnenhancedClasses", "supported");
    properties.setProperty("openjpa.Log", "DefaultLevel=INFO");
    unitInfo.setProperties(properties);
    unitInfo.setTransactionType(transactionType);
    unitInfo.getManagedClassNames().add("org.apache.openejb.core.cmp.jpa.Employee");
    final PersistenceProvider persistenceProvider = (PersistenceProvider) getClass().getClassLoader().loadClass(PERSISTENCE_PROVIDER).newInstance();
    entityManagerFactory = persistenceProvider.createContainerEntityManagerFactory(unitInfo, new HashMap());
    // create the test object (via reflection)
    final Object testObject = loader.loadClass("org.apache.openejb.core.cmp.jpa.UnenhancedUnits").newInstance();
    set(testObject, "TransactionManager", TransactionManager.class, transactionManager);
    set(testObject, "EntityManagerFactory", EntityManagerFactory.class, entityManagerFactory);
    // invoke the test (via reflection)
    Thread.currentThread().setContextClassLoader(loader);
    invoke(testObject, "setUp");
    try {
        invoke(testObject, methodName);
    } finally {
        invoke(testObject, "tearDown");
    }
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer) TempClassLoader(org.apache.openejb.core.TempClassLoader) PersistenceUnitInfoImpl(org.apache.openejb.persistence.PersistenceUnitInfoImpl) HashMap(java.util.HashMap) PersistenceProvider(javax.persistence.spi.PersistenceProvider) Instrumentation(java.lang.instrument.Instrumentation) Properties(java.util.Properties) PersistenceClassLoaderHandler(org.apache.openejb.persistence.PersistenceClassLoaderHandler) URLClassLoader(java.net.URLClassLoader) TempClassLoader(org.apache.openejb.core.TempClassLoader)

Aggregations

ClassFileTransformer (java.lang.instrument.ClassFileTransformer)54 Test (org.junit.Test)38 Instrumentation (java.lang.instrument.Instrumentation)35 ByteArrayClassLoader (net.bytebuddy.dynamic.loading.ByteArrayClassLoader)9 IllegalClassFormatException (java.lang.instrument.IllegalClassFormatException)7 Callable (java.util.concurrent.Callable)7 SimpleType (net.bytebuddy.test.packaging.SimpleType)6 ProtectionDomain (java.security.ProtectionDomain)5 ByteBuddy (net.bytebuddy.ByteBuddy)5 URLClassLoader (java.net.URLClassLoader)3 MatchableClassFileTransformer (com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformer)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 Properties (java.util.Properties)2 PersistenceProvider (javax.persistence.spi.PersistenceProvider)2 TypeDescription (net.bytebuddy.description.type.TypeDescription)2 SimpleOptionalType (net.bytebuddy.test.packaging.SimpleOptionalType)2 TempClassLoader (org.apache.openejb.core.TempClassLoader)2 PersistenceClassLoaderHandler (org.apache.openejb.persistence.PersistenceClassLoaderHandler)2 PersistenceUnitInfoImpl (org.apache.openejb.persistence.PersistenceUnitInfoImpl)2