HHH-14006 Test extended bytecode enhancement for mapped superclasses and entity superclasses
This commit is contained in:
parent
5c5b347614
commit
1a28fd419e
|
@ -8,7 +8,7 @@ package org.hibernate.test.bytecode.enhancement.basic;
|
||||||
|
|
||||||
import org.hibernate.engine.spi.ManagedEntity;
|
import org.hibernate.engine.spi.ManagedEntity;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
|
||||||
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
|
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
|
||||||
import org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils;
|
import org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
@ -20,7 +20,6 @@ import javax.persistence.Id;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
|
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
|
@ -115,104 +114,6 @@ public class BasicEnhancementTest {
|
||||||
|
|
||||||
// --- //
|
// --- //
|
||||||
|
|
||||||
public static class ObjectAttributeMarkerInterceptor implements PersistentAttributeInterceptor {
|
|
||||||
|
|
||||||
public static final Object READ_MARKER = new Object();
|
|
||||||
public static final Object WRITE_MARKER = new Object();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean readBoolean(Object obj, String name, boolean oldValue) {
|
|
||||||
return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean writeBoolean(Object obj, String name, boolean oldValue, boolean newValue) {
|
|
||||||
return newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte readByte(Object obj, String name, byte oldValue) {
|
|
||||||
return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte writeByte(Object obj, String name, byte oldValue, byte newValue) {
|
|
||||||
return newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public char readChar(Object obj, String name, char oldValue) {
|
|
||||||
return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public char writeChar(Object obj, String name, char oldValue, char newValue) {
|
|
||||||
return newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public short readShort(Object obj, String name, short oldValue) {
|
|
||||||
return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public short writeShort(Object obj, String name, short oldValue, short newValue) {
|
|
||||||
return newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int readInt(Object obj, String name, int oldValue) {
|
|
||||||
return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int writeInt(Object obj, String name, int oldValue, int newValue) {
|
|
||||||
return newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public float readFloat(Object obj, String name, float oldValue) {
|
|
||||||
return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public float writeFloat(Object obj, String name, float oldValue, float newValue) {
|
|
||||||
return newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double readDouble(Object obj, String name, double oldValue) {
|
|
||||||
return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double writeDouble(Object obj, String name, double oldValue, double newValue) {
|
|
||||||
return newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long readLong(Object obj, String name, long oldValue) {
|
|
||||||
return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long writeLong(Object obj, String name, long oldValue, long newValue) {
|
|
||||||
return newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object readObject(Object obj, String name, Object oldValue) {
|
|
||||||
return READ_MARKER;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object writeObject(Object obj, String name, Object oldValue, Object newValue) {
|
|
||||||
return WRITE_MARKER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- //
|
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
private static class SimpleEntity {
|
private static class SimpleEntity {
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,13 @@ package org.hibernate.test.bytecode.enhancement.basic;
|
||||||
|
|
||||||
import org.hibernate.bytecode.enhance.spi.DefaultEnhancementContext;
|
import org.hibernate.bytecode.enhance.spi.DefaultEnhancementContext;
|
||||||
import org.hibernate.bytecode.enhance.spi.UnloadedClass;
|
import org.hibernate.bytecode.enhance.spi.UnloadedClass;
|
||||||
|
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
|
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
|
||||||
import org.hibernate.testing.bytecode.enhancement.CustomEnhancementContext;
|
import org.hibernate.testing.bytecode.enhancement.CustomEnhancementContext;
|
||||||
import org.hibernate.testing.bytecode.enhancement.EnhancerTestContext;
|
import org.hibernate.testing.bytecode.enhancement.EnhancerTestContext;
|
||||||
|
import org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@ -15,6 +18,9 @@ import javax.persistence.Version;
|
||||||
|
|
||||||
import static org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils.checkDirtyTracking;
|
import static org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils.checkDirtyTracking;
|
||||||
import static org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils.clearDirtyTracking;
|
import static org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils.clearDirtyTracking;
|
||||||
|
import static org.junit.Assert.assertNotSame;
|
||||||
|
import static org.junit.Assert.assertSame;
|
||||||
|
import static org.junit.Assume.assumeTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Luis Barreiro
|
* @author Luis Barreiro
|
||||||
|
@ -54,11 +60,39 @@ public class InheritedTest {
|
||||||
checkDirtyTracking( bob, "rate", "oca" );
|
checkDirtyTracking( bob, "rate", "oca" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adapted from BasicEnhancementTest#basicExtendedEnhancementTest
|
||||||
|
@Test
|
||||||
|
@TestForIssue(jiraKey = "HHH-14006")
|
||||||
|
public void extendedEnhancementTest() {
|
||||||
|
// This test only works if lazy loading bytecode enhancement is enabled,
|
||||||
|
// otherwise extended bytecode enhancement does not do anything we can check.
|
||||||
|
assumeTrue( PersistentAttributeInterceptable.class.isAssignableFrom( Employee.class ) );
|
||||||
|
|
||||||
|
Employee entity = new Employee();
|
||||||
|
( (PersistentAttributeInterceptable) entity ).$$_hibernate_setInterceptor( new ObjectAttributeMarkerInterceptor() );
|
||||||
|
|
||||||
|
Object decoy = new Object();
|
||||||
|
// This accesses "anUnspecifiedObject" on a variable of type Employee,
|
||||||
|
// but "anUnspecifiedObject" is defined the superclass Person.
|
||||||
|
// Such "virtual" access used to break extended bytecode enhancement.
|
||||||
|
entity.anUnspecifiedObject = decoy;
|
||||||
|
|
||||||
|
Object gotByReflection = EnhancerTestUtils.getFieldByReflection( entity, "anUnspecifiedObject" );
|
||||||
|
assertNotSame( decoy, gotByReflection );
|
||||||
|
assertSame( ObjectAttributeMarkerInterceptor.WRITE_MARKER, gotByReflection );
|
||||||
|
|
||||||
|
Object gotByEnhancedDirectAccess = entity.anUnspecifiedObject;
|
||||||
|
assertNotSame( decoy, gotByEnhancedDirectAccess );
|
||||||
|
assertSame( ObjectAttributeMarkerInterceptor.READ_MARKER, gotByEnhancedDirectAccess );
|
||||||
|
}
|
||||||
|
|
||||||
// --- //
|
// --- //
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
private static abstract class Person {
|
private static abstract class Person {
|
||||||
|
|
||||||
|
Object anUnspecifiedObject;
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
String name;
|
String name;
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,14 @@ package org.hibernate.test.bytecode.enhancement.basic;
|
||||||
|
|
||||||
import org.hibernate.bytecode.enhance.spi.DefaultEnhancementContext;
|
import org.hibernate.bytecode.enhance.spi.DefaultEnhancementContext;
|
||||||
import org.hibernate.bytecode.enhance.spi.UnloadedClass;
|
import org.hibernate.bytecode.enhance.spi.UnloadedClass;
|
||||||
|
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
|
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
|
||||||
import org.hibernate.testing.bytecode.enhancement.CustomEnhancementContext;
|
import org.hibernate.testing.bytecode.enhancement.CustomEnhancementContext;
|
||||||
import org.hibernate.testing.bytecode.enhancement.EnhancerTestContext;
|
import org.hibernate.testing.bytecode.enhancement.EnhancerTestContext;
|
||||||
|
import org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils;
|
||||||
|
import org.junit.Assume;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@ -16,6 +20,9 @@ import javax.persistence.Version;
|
||||||
|
|
||||||
import static org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils.checkDirtyTracking;
|
import static org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils.checkDirtyTracking;
|
||||||
import static org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils.clearDirtyTracking;
|
import static org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils.clearDirtyTracking;
|
||||||
|
import static org.junit.Assert.assertNotSame;
|
||||||
|
import static org.junit.Assert.assertSame;
|
||||||
|
import static org.junit.Assume.assumeTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Luis Barreiro
|
* @author Luis Barreiro
|
||||||
|
@ -41,11 +48,39 @@ public class MappedSuperclassTest {
|
||||||
checkDirtyTracking( charles, "title", "oca" );
|
checkDirtyTracking( charles, "title", "oca" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adapted from BasicEnhancementTest#basicExtendedEnhancementTest
|
||||||
|
@Test
|
||||||
|
@TestForIssue(jiraKey = "HHH-14006")
|
||||||
|
public void extendedEnhancementTest() {
|
||||||
|
// This test only works if lazy loading bytecode enhancement is enabled,
|
||||||
|
// otherwise extended bytecode enhancement does not do anything we can check.
|
||||||
|
assumeTrue( PersistentAttributeInterceptable.class.isAssignableFrom( Employee.class ) );
|
||||||
|
|
||||||
|
Employee entity = new Employee();
|
||||||
|
( (PersistentAttributeInterceptable) entity ).$$_hibernate_setInterceptor( new ObjectAttributeMarkerInterceptor() );
|
||||||
|
|
||||||
|
Object decoy = new Object();
|
||||||
|
// This accesses "name" on a variable of type Employee,
|
||||||
|
// but "anUnspecifiedObject" is defined the superclass Person.
|
||||||
|
// Such "virtual" access used to break extended bytecode enhancement.
|
||||||
|
entity.anUnspecifiedObject = decoy;
|
||||||
|
|
||||||
|
Object gotByReflection = EnhancerTestUtils.getFieldByReflection( entity, "anUnspecifiedObject" );
|
||||||
|
assertNotSame( decoy, gotByReflection );
|
||||||
|
assertSame( ObjectAttributeMarkerInterceptor.WRITE_MARKER, gotByReflection );
|
||||||
|
|
||||||
|
Object gotByEnhancedDirectAccess = entity.anUnspecifiedObject;
|
||||||
|
assertNotSame( decoy, gotByEnhancedDirectAccess );
|
||||||
|
assertSame( ObjectAttributeMarkerInterceptor.READ_MARKER, gotByEnhancedDirectAccess );
|
||||||
|
}
|
||||||
|
|
||||||
// --- //
|
// --- //
|
||||||
|
|
||||||
@MappedSuperclass
|
@MappedSuperclass
|
||||||
private static class Person {
|
private static class Person {
|
||||||
|
|
||||||
|
Object anUnspecifiedObject;
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
String name;
|
String name;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
* 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.basic;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
|
|
||||||
|
public class ObjectAttributeMarkerInterceptor implements PersistentAttributeInterceptor {
|
||||||
|
|
||||||
|
public static final Object READ_MARKER = new Object();
|
||||||
|
public static final Object WRITE_MARKER = new Object();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean readBoolean(Object obj, String name, boolean oldValue) {
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean writeBoolean(Object obj, String name, boolean oldValue, boolean newValue) {
|
||||||
|
return newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte readByte(Object obj, String name, byte oldValue) {
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte writeByte(Object obj, String name, byte oldValue, byte newValue) {
|
||||||
|
return newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public char readChar(Object obj, String name, char oldValue) {
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public char writeChar(Object obj, String name, char oldValue, char newValue) {
|
||||||
|
return newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short readShort(Object obj, String name, short oldValue) {
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short writeShort(Object obj, String name, short oldValue, short newValue) {
|
||||||
|
return newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int readInt(Object obj, String name, int oldValue) {
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int writeInt(Object obj, String name, int oldValue, int newValue) {
|
||||||
|
return newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float readFloat(Object obj, String name, float oldValue) {
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float writeFloat(Object obj, String name, float oldValue, float newValue) {
|
||||||
|
return newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double readDouble(Object obj, String name, double oldValue) {
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double writeDouble(Object obj, String name, double oldValue, double newValue) {
|
||||||
|
return newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long readLong(Object obj, String name, long oldValue) {
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long writeLong(Object obj, String name, long oldValue, long newValue) {
|
||||||
|
return newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object readObject(Object obj, String name, Object oldValue) {
|
||||||
|
return READ_MARKER;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object writeObject(Object obj, String name, Object oldValue, Object newValue) {
|
||||||
|
return WRITE_MARKER;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue