[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