Search in sources :

Example 66 with ClassFileTransformer

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

the class WebappClassLoaderBase method toString.

/**
 * Render a String representation of this object.
 */
@Override
public String toString() {
    StringBuilder sb = new StringBuilder(this.getClass().getSimpleName());
    sb.append("\r\n  context: ");
    sb.append(contextName);
    sb.append("\r\n  delegate: ");
    sb.append(delegate);
    sb.append("\r\n  repositories:\r\n");
    if (repositories != null) {
        for (int i = 0; i < repositories.length; i++) {
            sb.append("    ");
            sb.append(repositories[i]);
            sb.append("\r\n");
        }
    }
    if (this.parent != null) {
        sb.append("----------> Parent Classloader:\r\n");
        sb.append(this.parent.toString());
        sb.append("\r\n");
    }
    if (this.transformers.size() > 0) {
        sb.append("----------> Class file transformers:\r\n");
        for (ClassFileTransformer transformer : this.transformers) {
            sb.append(transformer).append("\r\n");
        }
    }
    return (sb.toString());
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer)

Example 67 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 68 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)

Example 69 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project Payara by payara.

the class ASURLClassLoader method findClass.

/**
 * THREAD SAFETY: what happens when more than one thread requests the same class
 *        and thus works on the same classData?  Or defines the same package?  Maybe
 *        the same work just gets done twice, and that's all.
 *        CAUTION: this method might be overriden, and subclasses must be cautious (also)
 *        about thread safety.
 */
@Override
protected Class findClass(String name) throws ClassNotFoundException {
    ClassData classData = findClassData(name);
    // Instruments the classes if the profiler's enabled
    if (PreprocessorUtil.isPreprocessorEnabled()) {
        // search thru the JARs for a file of the form java/lang/Object.class
        final String entryName = name.replace('.', '/') + ".class";
        classData.setClassBytes(PreprocessorUtil.processClass(entryName, classData.getClassBytes()));
    }
    // Define package information if necessary
    int lastPackageSep = name.lastIndexOf('.');
    if (lastPackageSep != -1) {
        String packageName = name.substring(0, lastPackageSep);
        if (getPackage(packageName) == null) {
            try {
                // There's a small chance that one of our parents
                // could define the same package after getPackage
                // returns null but before we call definePackage,
                // since the parent classloader instances
                // are not locked.  So, just catch the exception
                // that is thrown in that case and ignore it.
                // 
                // It's unclear where we would get the info to
                // set all spec and impl data for the package,
                // so just use null.  This is consistent will the
                // JDK code that does the same.
                definePackage(packageName, null, null, null, null, null, null, null);
            } catch (IllegalArgumentException iae) {
                // duplicate attempt to define same package.
                // safe to ignore.
                _logger.log(Level.FINE, "duplicate package " + "definition attempt for " + packageName, iae);
            }
        }
    }
    // Loop though the transformers here!!
    try {
        final ArrayList<ClassFileTransformer> xformers = (ArrayList<ClassFileTransformer>) transformers.clone();
        for (final ClassFileTransformer transformer : xformers) {
            // see javadocs of transform().
            // It expects class name as java/lang/Object
            // as opposed to java.lang.Object
            final String internalClassName = name.replace('.', '/');
            final byte[] transformedBytes = transformer.transform(this, internalClassName, null, classData.pd, classData.getClassBytes());
            if (transformedBytes != null) {
                // null indicates no transformation
                _logger.log(Level.INFO, CULoggerInfo.actuallyTransformed, name);
                classData.setClassBytes(transformedBytes);
            }
        }
    } catch (IllegalClassFormatException icfEx) {
        throw new ClassNotFoundException(icfEx.toString(), icfEx);
    }
    try {
        byte[] bytes = classData.getClassBytes();
        return defineClass(name, bytes, 0, bytes.length, classData.pd);
    } catch (UnsupportedClassVersionError ucve) {
        throw new UnsupportedClassVersionError(sm.getString("ejbClassLoader.unsupportedVersion", name, System.getProperty("java.version")));
    }
}
Also used : ClassFileTransformer(java.lang.instrument.ClassFileTransformer) IllegalClassFormatException(java.lang.instrument.IllegalClassFormatException) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList)

Example 70 with ClassFileTransformer

use of java.lang.instrument.ClassFileTransformer in project Payara by payara.

the class ACCClassLoader method copyClass.

private Class<?> copyClass(final Class<?> c) throws ClassNotFoundException {
    final String name = c.getName();
    final ProtectionDomain pd = c.getProtectionDomain();
    byte[] bytecode = readByteCode(name);
    for (ClassFileTransformer xf : transformers) {
        try {
            bytecode = xf.transform(this, name, null, pd, bytecode);
        } catch (IllegalClassFormatException ex) {
            throw new ClassNotFoundException(name, ex);
        }
    }
    return defineClass(name, bytecode, 0, bytecode.length, pd);
}
Also used : ProtectionDomain(java.security.ProtectionDomain) ClassFileTransformer(java.lang.instrument.ClassFileTransformer) IllegalClassFormatException(java.lang.instrument.IllegalClassFormatException)

Aggregations

ClassFileTransformer (java.lang.instrument.ClassFileTransformer)81 Test (org.junit.Test)40 Instrumentation (java.lang.instrument.Instrumentation)37 IllegalClassFormatException (java.lang.instrument.IllegalClassFormatException)17 ProtectionDomain (java.security.ProtectionDomain)12 ByteArrayClassLoader (net.bytebuddy.dynamic.loading.ByteArrayClassLoader)9 Callable (java.util.concurrent.Callable)7 MatchableClassFileTransformer (com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformer)6 SimpleType (net.bytebuddy.test.packaging.SimpleType)6 ArrayList (java.util.ArrayList)5 ByteBuddy (net.bytebuddy.ByteBuddy)5 IOException (java.io.IOException)4 URLClassLoader (java.net.URLClassLoader)4 ByteArrayInputStream (java.io.ByteArrayInputStream)3 ByteArrayOutputStream (java.io.ByteArrayOutputStream)3 InputStream (java.io.InputStream)3 URL (java.net.URL)3 CodeSource (java.security.CodeSource)3 UnmodifiableClassException (java.lang.instrument.UnmodifiableClassException)2 Certificate (java.security.cert.Certificate)2