package fr.openwide.core.jpa.util; import java.util.Collection; import java.util.Map; import org.hibernate.Hibernate; import org.hibernate.proxy.HibernateProxy; import com.google.common.base.Optional; public final class HibernateUtils { public static Class<?> getClass(Object potentiallyProxyfiedObject) { return Hibernate.getClass(potentiallyProxyfiedObject); } @SuppressWarnings("unchecked") public static <E> E unwrap(E potentiallyProxyfiedObject) { if (potentiallyProxyfiedObject instanceof HibernateProxy) { return (E) ((HibernateProxy) potentiallyProxyfiedObject).getHibernateLazyInitializer().getImplementation(); } else { return potentiallyProxyfiedObject; } } @SuppressWarnings("unchecked") public static <E> Optional<E> cast(Object potentiallyProxyfiedObject, Class<E> acceptableClass) { return cast(potentiallyProxyfiedObject, acceptableClass, new Class[0]); } @SafeVarargs public static <E> Optional<E> cast(Object potentiallyProxyfiedObject, Class<? extends E> acceptableClass, Class<? extends E> ... otherAcceptableClasses) { Object unwrapped = unwrap(potentiallyProxyfiedObject); if (acceptableClass.isInstance(unwrapped)) { return Optional.of((E)acceptableClass.cast(unwrapped)); } for (Class<? extends E> otherAcceptableClass : otherAcceptableClasses) { if (otherAcceptableClass.isInstance(unwrapped)) { return Optional.of((E)otherAcceptableClass.cast(unwrapped)); } } return Optional.absent(); } public static void initialize(Object potentiallyProxyfiedObject) { Hibernate.initialize(potentiallyProxyfiedObject); // Initialize wrapped collections (Collections.unmodifiableCollection, for instance) if (potentiallyProxyfiedObject instanceof Collection) { ((Collection<?>)potentiallyProxyfiedObject).iterator(); } // Initialize wrapped maps if (potentiallyProxyfiedObject instanceof Map) { ((Map<?,?>)potentiallyProxyfiedObject).entrySet().iterator(); } } private HibernateUtils() { } }