[jboss-cvs] jboss-seam/src/main/org/jboss/seam/core ...
Gavin King
gavin.king at jboss.com
Sat Oct 14 14:27:35 EDT 2006
User: gavin
Date: 06/10/14 14:27:35
Modified: src/main/org/jboss/seam/core Expressions.java
ManagedHibernateSession.java
ManagedPersistenceContext.java
Added: src/main/org/jboss/seam/core EntityManagerFactory.java
HibernateSessionFactory.java
Removed: src/main/org/jboss/seam/core Hibernate.java
Log:
JBSEAM-411 JPA outside Java EE 5 / EJB3
give ManagedXXX components a soft reference to their factories
let Hibernate look up its factory as a seam component, instead of via JNDI
JBSEAM-63 multiple sessionfactories
Revision Changes Path
1.3 +48 -32 jboss-seam/src/main/org/jboss/seam/core/Expressions.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Expressions.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/core/Expressions.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- Expressions.java 8 Oct 2006 20:58:03 -0000 1.2
+++ Expressions.java 14 Oct 2006 18:27:34 -0000 1.3
@@ -1,8 +1,10 @@
-//$Id: Expressions.java,v 1.2 2006/10/08 20:58:03 gavin Exp $
+//$Id: Expressions.java,v 1.3 2006/10/14 18:27:34 gavin Exp $
package org.jboss.seam.core;
import static org.jboss.seam.InterceptionType.NEVER;
+import java.io.Serializable;
+
import javax.faces.context.FacesContext;
import org.jboss.seam.Component;
@@ -24,86 +26,100 @@
public class Expressions
{
- public ValueBinding createValueBinding(String expression)
+ public ValueBinding createValueBinding(final String expression)
+ {
+
+ return new ValueBinding()
{
- final javax.faces.el.ValueBinding vb = FacesContext.getCurrentInstance()
- .getApplication().createValueBinding(expression);
- return new ValueBinding() {
+ private transient javax.faces.el.ValueBinding cachedValueBinding;
public String getExpressionString()
{
- return vb.getExpressionString();
+ return expression;
}
public Class getType()
{
- return vb.getType( FacesContext.getCurrentInstance() );
+ return getFacesValueBinding().getType( FacesContext.getCurrentInstance() );
}
public Object getValue()
{
- return vb.getValue( FacesContext.getCurrentInstance() );
+ return getFacesValueBinding().getValue( FacesContext.getCurrentInstance() );
}
public boolean isReadOnly()
{
- return vb.isReadOnly( FacesContext.getCurrentInstance() );
+ return getFacesValueBinding().isReadOnly( FacesContext.getCurrentInstance() );
}
public void setValue(Object value)
{
- vb.setValue( FacesContext.getCurrentInstance(), value );
+ getFacesValueBinding().setValue( FacesContext.getCurrentInstance(), value );
+ }
+
+ javax.faces.el.ValueBinding getFacesValueBinding()
+ {
+ if (cachedValueBinding==null)
+ {
+ cachedValueBinding = FacesContext.getCurrentInstance().getApplication().createValueBinding(expression);
+ }
+ return cachedValueBinding;
}
};
}
- public MethodBinding createMethodBinding(String expression)
+ public MethodBinding createMethodBinding(final String expression)
+ {
+ return new MethodBinding()
{
- final javax.faces.el.MethodBinding mb = FacesContext.getCurrentInstance()
- .getApplication().createMethodBinding(expression, null);
- return new MethodBinding() {
+ private transient javax.faces.el.MethodBinding cachedMethodBinding;
public String getExpressionString()
{
- return mb.getExpressionString();
+ return getFacesMethodBinding().getExpressionString();
}
public Class getType()
{
- return mb.getType( FacesContext.getCurrentInstance() );
+ return getFacesMethodBinding().getType( FacesContext.getCurrentInstance() );
}
public Object invoke(Object... args)
{
- return mb.invoke( FacesContext.getCurrentInstance(), args );
+ return getFacesMethodBinding().invoke( FacesContext.getCurrentInstance(), args );
+ }
+
+ javax.faces.el.MethodBinding getFacesMethodBinding()
+ {
+ if (cachedMethodBinding==null)
+ {
+ cachedMethodBinding = FacesContext.getCurrentInstance().getApplication().createMethodBinding(expression, null);
+ }
+ return cachedMethodBinding;
}
};
}
- public static interface ValueBinding
+ public static interface ValueBinding<T> extends Serializable
{
public String getExpressionString();
-
- public Class getType();
-
- public Object getValue();
-
+ public Class<T> getType();
+ public T getValue();
public boolean isReadOnly();
-
- public void setValue(Object value);
+ public void setValue(T value);
}
- public static interface MethodBinding {
+ public static interface MethodBinding<T> extends Serializable
+ {
public String getExpressionString();
-
- public Class getType();
-
- public Object invoke(Object... args);
+ public Class<T> getType();
+ public T invoke(Object... args);
}
public static Expressions instance()
1.22 +53 -23 jboss-seam/src/main/org/jboss/seam/core/ManagedHibernateSession.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ManagedHibernateSession.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/core/ManagedHibernateSession.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- ManagedHibernateSession.java 13 Oct 2006 05:30:26 -0000 1.21
+++ ManagedHibernateSession.java 14 Oct 2006 18:27:34 -0000 1.22
@@ -1,4 +1,4 @@
-//$Id: ManagedHibernateSession.java,v 1.21 2006/10/13 05:30:26 gavin Exp $
+//$Id: ManagedHibernateSession.java,v 1.22 2006/10/14 18:27:34 gavin Exp $
package org.jboss.seam.core;
import static org.jboss.seam.InterceptionType.NEVER;
@@ -22,6 +22,7 @@
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Unwrap;
+import org.jboss.seam.core.Expressions.ValueBinding;
import org.jboss.seam.util.Naming;
/**
@@ -45,6 +46,7 @@
private Session session;
private String sessionFactoryJndiName;
private String componentName;
+ private ValueBinding<SessionFactory> sessionFactory;
public boolean clearDirty()
{
@@ -71,15 +73,7 @@
private void createSession()
{
- try
- {
- session = getSessionFactory().openSession();
- }
- catch (NamingException ne)
- {
- throw new IllegalArgumentException("SessionFactory not found", ne);
- }
-
+ session = getSessionFactoryFromJndiOrValueBinding().openSession();
setFlushMode( PersistenceContexts.instance().getFlushMode() );
}
@@ -119,20 +113,28 @@
session.close();
}
- private SessionFactory getSessionFactory()
- throws NamingException
+ private SessionFactory getSessionFactoryFromJndiOrValueBinding()
+ {
+ if (sessionFactory==null)
+ {
+ try
{
return (SessionFactory) Naming.getInitialContext().lookup(sessionFactoryJndiName);
}
-
- public String getSessionFactoryJndiName()
+ catch (NamingException ne)
{
- return sessionFactoryJndiName;
+ throw new IllegalArgumentException("SessionFactory not found in JNDI", ne);
}
-
- public void setSessionFactoryJndiName(String sessionFactoryName)
+ }
+ else
{
- this.sessionFactoryJndiName = sessionFactoryName;
+ SessionFactory result = sessionFactory.getValue();
+ if (result==null)
+ {
+ throw new IllegalStateException("SessionFactory not found");
+ }
+ return result;
+ }
}
public String getComponentName() {
@@ -155,6 +157,34 @@
}
}
+ /**
+ * The JNDI name of the Hibernate SessionFactory, if it is
+ * to be obtained from JNDI
+ */
+ public String getSessionFactoryJndiName()
+ {
+ return sessionFactoryJndiName;
+ }
+
+ public void setSessionFactoryJndiName(String sessionFactoryName)
+ {
+ this.sessionFactoryJndiName = sessionFactoryName;
+ }
+
+ /**
+ * A value binding expression that returns a SessionFactory,
+ * if it is to be obtained as a Seam component reference
+ */
+ public void setSessionFactory(ValueBinding<SessionFactory> sessionFactory)
+ {
+ this.sessionFactory = sessionFactory;
+ }
+
+ public ValueBinding<SessionFactory> getSessionFactory()
+ {
+ return sessionFactory;
+ }
+
public String toString()
{
return "ManagedHibernateSession(" + sessionFactoryJndiName + ")";
1.23 +45 -16 jboss-seam/src/main/org/jboss/seam/core/ManagedPersistenceContext.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ManagedPersistenceContext.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/core/ManagedPersistenceContext.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- ManagedPersistenceContext.java 13 Oct 2006 05:30:26 -0000 1.22
+++ ManagedPersistenceContext.java 14 Oct 2006 18:27:34 -0000 1.23
@@ -1,4 +1,4 @@
-//$Id: ManagedPersistenceContext.java,v 1.22 2006/10/13 05:30:26 gavin Exp $
+//$Id: ManagedPersistenceContext.java,v 1.23 2006/10/14 18:27:34 gavin Exp $
package org.jboss.seam.core;
import static org.jboss.seam.InterceptionType.NEVER;
@@ -21,6 +21,7 @@
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Unwrap;
+import org.jboss.seam.core.Expressions.ValueBinding;
import org.jboss.seam.persistence.PersistenceProvider;
import org.jboss.seam.util.Naming;
import org.jboss.seam.util.Transactions;
@@ -43,6 +44,7 @@
private EntityManager entityManager;
private String persistenceUnitJndiName;
private String componentName;
+ private ValueBinding<EntityManagerFactory> entityManagerFactory;
public boolean clearDirty()
{
@@ -64,21 +66,20 @@
if ( log.isDebugEnabled() )
{
+ if (entityManagerFactory==null)
+ {
log.debug("created seam managed persistence context for persistence unit: "+ persistenceUnitJndiName);
}
- }
-
- private void createEntityManager()
+ else
{
- try
- {
- entityManager = getEntityManagerFactory().createEntityManager();
+ log.debug("created seam managed persistence context from EntityManagerFactory");
+ }
}
- catch (NamingException ne)
- {
- throw new IllegalArgumentException("EntityManagerFactory not found", ne);
}
+ private void createEntityManager()
+ {
+ entityManager = getEntityManagerFactoryFromJndiOrValueBinding().createEntityManager();
setFlushMode( PersistenceContexts.instance().getFlushMode() );
}
@@ -121,14 +122,42 @@
entityManager.close();
}
- private EntityManagerFactory getEntityManagerFactory()
- throws NamingException
+ public EntityManagerFactory getEntityManagerFactoryFromJndiOrValueBinding()
+ {
+ if (entityManagerFactory==null)
+ {
+ try
{
return (EntityManagerFactory) Naming.getInitialContext().lookup(persistenceUnitJndiName);
}
+ catch (NamingException ne)
+ {
+ throw new IllegalArgumentException("EntityManagerFactory not found in JNDI", ne);
+ }
+ }
+ else
+ {
+ return entityManagerFactory.getValue();
+ }
+ }
+
+ /**
+ * A value binding expression that returns an EntityManagerFactory,
+ * for use of JPA outside of Java EE 5 / Embeddable EJB3.
+ */
+ public ValueBinding<EntityManagerFactory> getEntityManagerFactory()
+ {
+ return entityManagerFactory;
+ }
+
+ public void setEntityManagerFactory(ValueBinding<EntityManagerFactory> entityManagerFactory)
+ {
+ this.entityManagerFactory = entityManagerFactory;
+ }
/**
- * The JNDI name of the EntityManagerFactory
+ * The JNDI name of the EntityManagerFactory, for
+ * use of JPA in Java EE 5 / Embeddable EJB3.
*/
public String getPersistenceUnitJndiName()
{
1.1 date: 2006/10/14 18:27:34; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/core/EntityManagerFactory.java
Index: EntityManagerFactory.java
===================================================================
//$Id: EntityManagerFactory.java,v 1.1 2006/10/14 18:27:34 gavin Exp $
package org.jboss.seam.core;
import static org.jboss.seam.InterceptionType.NEVER;
import java.util.Map;
import javax.persistence.Persistence;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Startup;
import org.jboss.seam.annotations.Unwrap;
/**
* A Seam component that boostraps an EntityManagerFactory,
* for use of JPA outside of Java EE 5 / Embeddable EJB3.
*
* @author Gavin King
*/
@Scope(ScopeType.APPLICATION)
@Intercept(NEVER)
@Startup(depends="org.jboss.seam.core.microcontainer")
@Name("org.jboss.seam.core.jpa") //this usage is deprecated, install it via components.xml
public class EntityManagerFactory
{
private String persistenceUnitName;
private Map persistenceUnitProperties;
private javax.persistence.EntityManagerFactory entityManagerFactory;
@Unwrap
public javax.persistence.EntityManagerFactory getEntityManagerFactory()
{
return entityManagerFactory;
}
@Create
public void startup() throws Exception
{
if (persistenceUnitProperties==null)
{
entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
}
else
{
entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName, persistenceUnitProperties);
}
}
@Destroy
public void shutdown()
{
entityManagerFactory.close();
}
/**
* The persistence unit name
*/
protected String getPersistenceUnitName()
{
return persistenceUnitName;
}
protected void setPersistenceUnitName(String persistenceUnitName)
{
this.persistenceUnitName = persistenceUnitName;
}
/**
* Properties to pass to Persistence.createEntityManagerFactory()
*/
protected Map getPersistenceUnitProperties()
{
return persistenceUnitProperties;
}
protected void setPersistenceUnitProperties(Map persistenceUnitProperties)
{
this.persistenceUnitProperties = persistenceUnitProperties;
}
}
1.1 date: 2006/10/14 18:27:34; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/core/HibernateSessionFactory.java
Index: HibernateSessionFactory.java
===================================================================
//$Id: HibernateSessionFactory.java,v 1.1 2006/10/14 18:27:34 gavin Exp $
package org.jboss.seam.core;
import static org.jboss.seam.InterceptionType.NEVER;
import org.hibernate.SessionFactory;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Startup;
import org.jboss.seam.annotations.Unwrap;
import org.jboss.seam.microcontainer.HibernateFactory;
/**
* A Seam component that boostraps a Hibernate SessionFactory
*
* @author Gavin King
*/
@Scope(ScopeType.APPLICATION)
@Intercept(NEVER)
@Startup(depends="org.jboss.seam.core.microcontainer")
@Name("org.jboss.seam.core.hibernate") //this usage is deprecated, install it via components.xml
public class HibernateSessionFactory extends HibernateFactory
{
private SessionFactory sessionFactory;
@Unwrap
public SessionFactory getSessionFactory()
{
return sessionFactory;
}
@Create
public void startup() throws Exception
{
sessionFactory = createSessionFactory();
}
@Destroy
public void shutdown()
{
sessionFactory.close();
}
}
More information about the jboss-cvs-commits
mailing list