/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.jpa.test.enhancement.runtime; import org.hibernate.jpa.test.enhancement.cases.TestLazyPropertyOnPreUpdateExecutable; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseUnitTestCase; import org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils; import org.junit.Test; /** * @author Steve Ebersole */ public class JpaRuntimeEnhancementTest extends BaseUnitTestCase { // // @Rule // public ClassLoadingIsolater isolater = new ClassLoadingIsolater( // new ClassLoadingIsolater.IsolatedClassLoaderProvider() { // @Override // public ClassLoader buildIsolatedClassLoader() { // final EnhancementContext enhancementContext = new DefaultEnhancementContext() { // @Override // public boolean doExtendedEnhancement(CtClass classDescriptor) { // return classDescriptor.getPackageName().startsWith( "org.hibernate.jpa.test.enhancement.domain" ); // } // }; // // final Enhancer enhancer = new Enhancer( enhancementContext ); // // return new InstrumentedClassLoader( // Thread.currentThread().getContextClassLoader(), // new ClassTransformer() { // @Override // public byte[] transform( // ClassLoader loader, // String className, // Class<?> classBeingRedefined, // ProtectionDomain protectionDomain, // byte[] classfileBuffer) throws IllegalClassFormatException { // // try { // return enhancer.enhance( className, classfileBuffer ); // } // catch (final Exception e) { // throw new IllegalClassFormatException( "Error performing enhancement" ) { // @Override // public synchronized Throwable getCause() { // return e; // } // }; // } // } // } // ); // } // // @Override // public void releaseIsolatedClassLoader(ClassLoader isolatedClassLoader) { // // nothing to do // } // } // ); // the tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Test for HHH-7573. * Load some test data into an entity which has a lazy property and a @PreUpdate callback, then reload and update a * non lazy field which will trigger the PreUpdate lifecycle callback. * @throws Exception */ @Test @TestForIssue( jiraKey = "HHH-7573" ) public void LazyPropertyOnPreUpdate() throws Exception { EnhancerTestUtils.runEnhancerTestTask( TestLazyPropertyOnPreUpdateExecutable.class ); } // // reflection code to ensure isolation into the created classloader ~~~~~~~ // // private static final Class[] SIG = new Class[] {}; // private static final Object[] ARGS = new Object[] {}; // // public void executeExecutable(String name) { // Class execClass = null; // Object executable = null; // try { // execClass = Thread.currentThread().getContextClassLoader().loadClass( name ); // executable = execClass.newInstance(); // } // catch( Throwable t ) { // throw new HibernateException( "could not load executable", t ); // } // try { // execClass.getMethod( "prepare", SIG ).invoke( executable, ARGS ); // execClass.getMethod( "execute", SIG ).invoke( executable, ARGS ); // } // catch ( NoSuchMethodException e ) { // throw new HibernateException( "could not exeucte executable", e ); // } // catch ( IllegalAccessException e ) { // throw new HibernateException( "could not exeucte executable", e ); // } // catch ( InvocationTargetException e ) { // throw new HibernateException( "could not exeucte executable", e.getTargetException() ); // } // finally { // try { // execClass.getMethod( "complete", SIG ).invoke( executable, ARGS ); // } // catch ( Throwable ignore ) { // } // } // } }