/* * 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.test.bytecode.enhancement.extended; import java.util.Arrays; import java.util.List; import java.util.Set; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; import org.hibernate.engine.spi.PersistentAttributeInterceptable; import org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils; import org.hibernate.test.bytecode.enhancement.AbstractEnhancerTestTask; import org.hibernate.test.bytecode.enhancement.basic.ObjectAttributeMarkerInterceptor; import org.junit.Assert; /** * @author Luis Barreiro */ public class ExtendedEnhancementTestTask extends AbstractEnhancerTestTask { public Class<?>[] getAnnotatedClasses() { return new Class<?>[] {SimpleEntity.class}; } public void prepare() { } public void execute() { // test uses ObjectAttributeMarkerInterceptor to ensure that field access is routed through enhanced methods SimpleEntity entity = new SimpleEntity(); ( (PersistentAttributeInterceptable) entity ).$$_hibernate_setInterceptor( new ObjectAttributeMarkerInterceptor() ); Object decoy = new Object(); entity.anUnspecifiedObject = decoy; Object gotByReflection = EnhancerTestUtils.getFieldByReflection( entity, "anUnspecifiedObject" ); Assert.assertNotSame( gotByReflection, decoy ); Assert.assertSame( gotByReflection, ObjectAttributeMarkerInterceptor.WRITE_MARKER ); Object entityObject = entity.anUnspecifiedObject; Assert.assertNotSame( entityObject, decoy ); Assert.assertSame( entityObject, ObjectAttributeMarkerInterceptor.READ_MARKER ); // do some more calls on the various types, without the interceptor ( (PersistentAttributeInterceptable) entity ).$$_hibernate_setInterceptor( null ); entity.id = 1234567890l; Assert.assertEquals( entity.id, 1234567890l ); entity.name = "Entity Name"; Assert.assertSame( entity.name, "Entity Name" ); entity.active = true; Assert.assertTrue( entity.active ); entity.someStrings = Arrays.asList( "A", "B", "C", "D" ); Assert.assertArrayEquals( new String[] { "A", "B", "C", "D" }, entity.someStrings.toArray() ); } protected void cleanup() { } @Entity public class SimpleEntity { @Id public long id; public String name; public boolean active; public long someNumber; public int anInt; public Object anUnspecifiedObject; public List<String> someStrings; @OneToMany public Set<Integer> someInts; } }