package book.example.persistence.tests;
import javax.persistence.Id;
import javax.persistence.Transient;
import java.lang.reflect.Field;
import static java.lang.reflect.Modifier.isTransient;
import static org.junit.Assert.assertEquals;
public class PersistenceReflection {
public static Object idOf(Object entity) {
for (Class<?> c = entity.getClass(); c != Object.class; c = c.getSuperclass()) {
for (Field field : c.getDeclaredFields()) {
if (field.isAnnotationPresent(Id.class)) {
return fieldValue(entity, field);
}
}
}
throw new IllegalArgumentException(entity + " does not have an entity id");
}
public static void assertHaveSamePersistentFields(Object e1, Object e2) {
for (Class<?> c = e1.getClass(); c != Object.class; c = c.getSuperclass()) {
for (Field field : c.getDeclaredFields()) {
if (!isTransient(field.getModifiers()) && !field.isAnnotationPresent(Transient.class)) {
assertEquals(c.getSimpleName() + "." + field.getName(), fieldValue(e1, field), fieldValue(e2, field));
}
}
}
}
private static Object fieldValue(Object entity, Field field) throws Error {
field.setAccessible(true);
try {
return field.get(entity);
} catch (IllegalAccessException e) {
throw new Error("could not access accessible field " + field);
}
}
}