[jboss-cvs] jboss-seam/src/main/org/jboss/seam/util ...
Norman Richards
norman.richards at jboss.com
Wed Oct 11 23:38:51 EDT 2006
User: nrichards
Date: 06/10/11 23:38:51
Modified: src/main/org/jboss/seam/util Persistence.java
Log:
JBSEAM-364: use reflection
Revision Changes Path
1.6 +49 -22 jboss-seam/src/main/org/jboss/seam/util/Persistence.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Persistence.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/util/Persistence.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- Persistence.java 8 Oct 2006 14:01:54 -0000 1.5
+++ Persistence.java 12 Oct 2006 03:38:51 -0000 1.6
@@ -2,44 +2,71 @@
import javax.persistence.EntityManager;
-import org.hibernate.FlushMode;
-import org.hibernate.Session;
+import java.lang.reflect.Method;
+import java.lang.reflect.Field;
public class Persistence
{
+ private static Object hibernateSession(EntityManager entityManager) {
+ try {
+ Object session = entityManager.getDelegate();
+
+ if (Reflections.classForName("org.hibernate.Session").isAssignableFrom(session.getClass())) {
+ return session;
+ }
+ } catch (Exception e) {
+ // eat it
+ }
+
+ return null;
+ }
public static void setFlushModeManual(EntityManager entityManager)
{
- if (entityManager.getDelegate() instanceof Session)
- {
- ( (Session) entityManager.getDelegate() ).setFlushMode(FlushMode.NEVER);
+ Object session = hibernateSession(entityManager);
+ if (session != null) {
+ try {
+ Class flushMode = Reflections.classForName("org.hibernate.FlushMode");
+ Method setFlushMode = Reflections.getSetterMethod(session.getClass(), "flushMode");
+ Object never = Reflections.getField(flushMode,"NEVER").get(null);
+ Reflections.invokeAndWrap(setFlushMode, session, never);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("FlushMode.MANUAL only supported for Hibernate EntityManager", e);
}
- else
- {
+
+ } else {
throw new IllegalArgumentException("FlushMode.MANUAL only supported for Hibernate EntityManager");
}
+
}
public static boolean isDirty(EntityManager entityManager)
{
- if (entityManager.getDelegate() instanceof Session)
- {
- return ( (Session) entityManager.getDelegate() ).isDirty();
+ Object session = hibernateSession(entityManager);
+ if (session != null) {
+ try {
+ Method isDirty = session.getClass().getMethod("isDirty", new Class[] {});
+ return (Boolean) Reflections.invokeAndWrap(isDirty, session);
+ } catch (NoSuchMethodException e) {
+ return true; // same asssumption as below
}
- else
- {
+ } else {
return true; //best we can do!
}
}
public static Object getId(Object bean, EntityManager entityManager)
{
- if (entityManager.getDelegate() instanceof Session)
- {
- return ( (Session) entityManager.getDelegate() ).getIdentifier(bean);
+ Object session = hibernateSession(entityManager);
+ if (session != null) {
+ try {
+ Method getIdentifier = session.getClass().getMethod("getIdentifier",
+ new Class[] {Object.class});
+ return Reflections.invokeAndWrap(getIdentifier, session, bean);
+ } catch (NoSuchMethodException e) {
+ throw new IllegalArgumentException("Please use Hibernate as the persistence provider");
}
- else
- {
+ } else {
throw new IllegalArgumentException("Please use Hibernate as the persistence provider");
}
/*for (Class beanClass=entityClass; beanClass!=Object.class; beanClass=beanClass.getSuperclass() )
More information about the jboss-cvs-commits
mailing list