[jboss-cvs] jboss-seam/src/main/org/jboss/seam/framework ...

Gavin King gavin.king at jboss.com
Tue Sep 26 23:53:49 EDT 2006


  User: gavin   
  Date: 06/09/26 23:53:49

  Added:       src/main/org/jboss/seam/framework     EntityActions.java
                        ManagedEntity.java ManagedHibernateEntity.java
                        Query.java
  Log:
  stateful seam interceptors
  page parameters
  crud framework prototype
  bugfixes to PC passivation stuff
  
  Revision  Changes    Path
  1.1      date: 2006/09/27 03:53:49;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/framework/EntityActions.java
  
  Index: EntityActions.java
  ===================================================================
  package org.jboss.seam.framework;
  
  import javax.persistence.EntityManager;
  
  import org.jboss.seam.annotations.Transactional;
  
  public class EntityActions
  {
     private EntityManager entityManager;
     private Object entity;
     
     @Transactional
     public void persist()
     {
        entityManager.joinTransaction();
        entityManager.persist(entity);
     }
  
     @Transactional
     public void remove()
     {
        entityManager.joinTransaction();
        entityManager.remove(entity);
     }
     
     public boolean isManaged()
     {
        return entityManager.contains(entity);
     }
  
     public EntityManager getEntityManager()
     {
        return entityManager;
     }
  
     public void setEntityManager(EntityManager entityManager)
     {
        this.entityManager = entityManager;
     }
  
     public Object getEntity()
     {
        return entity;
     }
  
     public void setEntity(Object entity)
     {
        this.entity = entity;
     }
     
  }
  
  
  
  1.1      date: 2006/09/27 03:53:49;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/framework/ManagedEntity.java
  
  Index: ManagedEntity.java
  ===================================================================
  package org.jboss.seam.framework;
  
  import static org.jboss.seam.InterceptionType.NEVER;
  
  import javax.faces.context.FacesContext;
  import javax.faces.convert.Converter;
  import javax.persistence.EntityManager;
  
  import org.jboss.seam.annotations.Intercept;
  import org.jboss.seam.annotations.Unwrap;
  import org.jboss.seam.util.Reflections;
  
  /**
   * Manager component for an EJB 3.0 entity instance. Allows
   * auto-fetching of contextual entities. The identifier
   * is determined by evaluating an EL expression and then
   * using JSF type conversion if necessary.
   * 
   * @author Gavin King
   *
   */
  @Intercept(NEVER)
  public class ManagedEntity
  {
     private EntityManager entityManager;
     private Object id;
     private String entityClass;
     private String idClass;
     private Object newInstance;
     private String idConverterId;
     private Converter idConverter;
     
     public EntityManager getEntityManager()
     {
        return entityManager;
     }
  
     public void setEntityManager(EntityManager entityManager)
     {
        this.entityManager = entityManager;
     }
  
     public Object getId()
     {
        return id;
     }
  
     public void setId(Object id)
     {
        this.id = id;
     }
     
     public String getEntityClass()
     {
        return entityClass;
     }
  
     public void setEntityClass(String entityClass)
     {
        this.entityClass = entityClass;
     }
  
     @Unwrap
     public Object getInstance() throws Exception
     {
        Class<?> clazz = Reflections.classForName(entityClass);
        if ( id==null || "".equals(id) )
        {
           if (newInstance==null)
           {
              newInstance = clazz.newInstance();
           }
           return newInstance;
        }
        else
        {
           entityManager.joinTransaction();
           return entityManager.find( clazz, getConvertedId() );
        }
     }
     
     //////////// TODO: copy/paste from ManagedHibernateEntity ///////////////////
     
     private Object getConvertedId() throws Exception
     {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (idConverter==null)
        {
           if (idConverterId==null)
           {
              //TODO: guess the id class using @Id
              idConverter = facesContext.getApplication().createConverter( Reflections.classForName(idClass) );
           }
           else
           {
              idConverter = facesContext.getApplication().createConverter(idConverterId); //cache the lookup
           }
        }
        
        if (idConverter==null)
        {
           return id;
        }
        else
        {
           return idConverter.getAsObject( 
                 facesContext, 
                 facesContext.getViewRoot(), 
                 (String) id 
              );
        }
     }
  
     public String getIdConverterId()
     {
        return idConverterId;
     }
  
     public void setIdConverterId(String converterId)
     {
        this.idConverterId = converterId;
     }
  
     public Converter getIdConverter()
     {
        return idConverter;
     }
  
     public void setIdConverter(Converter converter)
     {
        this.idConverter = converter;
     }
  
     public String getIdClass()
     {
        return idClass;
     }
  
     public void setIdClass(String idClass)
     {
        this.idClass = idClass;
     }
  
  }
  
  
  
  1.1      date: 2006/09/27 03:53:49;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/framework/ManagedHibernateEntity.java
  
  Index: ManagedHibernateEntity.java
  ===================================================================
  package org.jboss.seam.framework;
  
  import java.io.Serializable;
  
  import javax.faces.context.FacesContext;
  import javax.faces.convert.Converter;
  
  import org.hibernate.Session;
  import org.jboss.seam.annotations.Transactional;
  import org.jboss.seam.annotations.Unwrap;
  import org.jboss.seam.util.Reflections;
  
  /**
   * Manager component for a Hibernate entity instance. Allows
   * auto-fetching of contextual entities. The identifier
   * is determined by evaluating an EL expression and then
   * using JSF type conversion if necessary.
   * 
   * @author Gavin King
   *
   */
  public class ManagedHibernateEntity
  {
     private Session session;
     private Serializable id;
     private String entityClass;
     private String idClass;
     private Object newInstance;
     private String idConverterId;
     private Converter idConverter;
     
     public Session getSession()
     {
        return session;
     }
  
     public void setSession(Session session)
     {
        this.session = session;
     }
  
     public Serializable getId()
     {
        return id;
     }
  
     public void setId(Serializable id)
     {
        this.id = id;
     }
     
     public String getEntityClass()
     {
        return entityClass;
     }
  
     public void setEntityClass(String entityClass)
     {
        this.entityClass = entityClass;
     }
  
     @Unwrap @Transactional
     public Object getInstance() throws Exception
     {
        Class clazz = Reflections.classForName(entityClass);
        if ( id==null || "".equals(id) )
        {
           if (newInstance==null)
           {
              newInstance = clazz.newInstance();
           }
           return newInstance;
        }
        else
        {
           return session.get( clazz, getConvertedId() );
        }
     }
     
     ////////////TODO: copy/paste from ManagedEntity ///////////////////
  
     private Serializable getConvertedId() throws Exception
     {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (idConverter==null)
        {
           if (idConverterId==null)
           {
              //TODO: guess the id class using @Id
              idConverter = facesContext.getApplication().createConverter( Reflections.classForName(idClass) );
           }
           else
           {
              idConverter = facesContext.getApplication().createConverter(idConverterId); //cache the lookup
           }
        }
        
        if (idConverter==null)
        {
           return id;
        }
        else
        {
           return (Serializable) idConverter.getAsObject( 
                 facesContext, 
                 facesContext.getViewRoot(), 
                 (String) id 
              );
        }
     }
  
     public String getIdConverterId()
     {
        return idConverterId;
     }
  
     public void setIdConverterId(String converterId)
     {
        this.idConverterId = converterId;
     }
  
     public Converter getIdConverter()
     {
        return idConverter;
     }
  
     public void setIdConverter(Converter converter)
     {
        this.idConverter = converter;
     }
  
     public String getIdClass()
     {
        return idClass;
     }
  
     public void setIdClass(String idClass)
     {
        this.idClass = idClass;
     }
  
  }
  
  
  
  1.1      date: 2006/09/27 03:53:49;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/framework/Query.java
  
  Index: Query.java
  ===================================================================
  package org.jboss.seam.framework;
  
  import static org.jboss.seam.InterceptionType.NEVER;
  
  import java.util.ArrayList;
  import java.util.List;
  import java.util.Map;
  import java.util.StringTokenizer;
  
  import javax.faces.context.FacesContext;
  import javax.faces.el.ValueBinding;
  import javax.faces.model.DataModel;
  import javax.persistence.EntityManager;
  
  import org.jboss.seam.annotations.Intercept;
  import org.jboss.seam.jsf.ListDataModel;
  
  @Intercept(NEVER)
  public class Query
  {
     private String ejbql;
     private String queryName;
     private List<ValueBinding> queryParameters;
     private Integer firstResult;
     private Integer maxResults;
     private EntityManager entityManager;
     private Map<String, String> hints;
     private List<String> restrictions;
     private String order;
     
     private List resultList;
     private DataModel dataModel;
     private Object singleResult;
     
     public List getResultList()
     {
        //if (resultList==null)
        {
           javax.persistence.Query query = createQuery();
           resultList = query==null ? null : query.getResultList();
        }
        return resultList;
     }
     
     public Object getSingleResult()
     {
        if (singleResult==null)
        {
           javax.persistence.Query query = createQuery();
           singleResult = query==null ? null : query.getSingleResult();
        }
        return singleResult;
     }
  
     public DataModel getDataModel()
     {
        if (dataModel==null)
        {
           dataModel = new ListDataModel( getResultList() );
        }
        return dataModel;
     }
     
     private javax.persistence.Query createQuery()
     {
        prepareEjbql();
        
        entityManager.joinTransaction();
        javax.persistence.Query query = entityManager.createQuery(ejbql);
        for (int i=0; i<queryParameters.size(); i++)
        {
           Object parameterValue = queryParameters.get(i).getValue( FacesContext.getCurrentInstance() );
           if (parameterValue==null)
           {
              return null;
           }
           else
           {
              query.setParameter( i, parameterValue );
           }
        }
        if (firstResult!=null) query.setFirstResult(firstResult);
        if (maxResults!=null) query.setMaxResults(maxResults);
        if (hints!=null)
        {
           for (Map.Entry<String, String> me: hints.entrySet())
           {
              query.setHint(me.getKey(), me.getValue());
           }
        }
        return query;
     }
     
     public void refresh()
     {
        dataModel = null;
     }
     
     public void next()
     {
        firstResult = getNextFirstResult();
        dataModel = null;
     }
  
     public void previous()
     {
        firstResult = getPreviousFirstResult();
        dataModel = null;
     }
  
     public int getNextFirstResult()
     {
        //TODO: check to see if there are more results
        return ( firstResult==null ? 0 : firstResult ) + maxResults;
     }
  
     public int getPreviousFirstResult()
     {
        if (maxResults>firstResult) 
        {
           return 0;
        }
        else
        {
           return firstResult - maxResults;
        }
     }
     
     public void prepareEjbql()
     {
        //if (ejbql!=null)
        {
           queryParameters = new ArrayList<ValueBinding>();
           StringTokenizer ejbqlTokens = new StringTokenizer(ejbql, "#}", true);
           StringBuilder ejbqlBuilder = new StringBuilder();
           while ( ejbqlTokens.hasMoreTokens() )
           {
              String token = ejbqlTokens.nextToken();
              if ( "#".equals(token) )
              {
                 String expression = token + ejbqlTokens.nextToken() + ejbqlTokens.nextToken();
                 queryParameters.add( FacesContext.getCurrentInstance().getApplication().createValueBinding(expression) );
                 ejbqlBuilder.append("?").append( queryParameters.size() );
              }
              else
              {
                 ejbqlBuilder.append(token);
              }
           }
           
           for (String restriction: restrictions)
           {
              StringTokenizer tokens = new StringTokenizer(restriction, "#}", true);
              StringBuilder builder = new StringBuilder();
              ValueBinding valueBinding = null;
              while ( tokens.hasMoreTokens() )
              {
                 String token = tokens.nextToken();
                 if ( "#".equals(token) )
                 {
                    String expression = token + tokens.nextToken() + tokens.nextToken();
                    valueBinding = FacesContext.getCurrentInstance().getApplication().createValueBinding(expression);
                    builder.append("?").append( queryParameters.size() );
                 }
                 else
                 {
                    builder.append(token);
                 }
                 
              }
              
              if (valueBinding==null) 
              {
                 throw new IllegalArgumentException("no value binding in restriction: " + restriction);
              }
              
              Object parameterValue = valueBinding.getValue( FacesContext.getCurrentInstance() );
              if (parameterValue!=null)
              {
                 queryParameters.add(valueBinding);
                 if ( ejbqlBuilder.toString().toLowerCase().indexOf("where")>0 )
                 {
                    ejbqlBuilder.append(" and ");
                 }
                 else
                 {
                    ejbqlBuilder.append(" where ");
                 }
                 ejbqlBuilder.append(builder);
              }
           }
           
           if (order!=null) ejbqlBuilder.append(order);
           
           ejbql = ejbqlBuilder.toString();
        }
     }
  
     public String getEjbql()
     {
        return ejbql;
     }
  
     public void setEjbql(String ejbql)
     {
        this.ejbql = ejbql;
     }
  
     public EntityManager getEntityManager()
     {
        return entityManager;
     }
  
     public void setEntityManager(EntityManager entityManager)
     {
        this.entityManager = entityManager;
     }
  
     public Integer getFirstResult()
     {
        return firstResult;
     }
     
     public boolean isPreviousExists()
     {
        return firstResult!=null && firstResult!=0;
     }
  
     public boolean isNextExists()
     {
        return true; //TODO!
     }
  
     public void setFirstResult(Integer firstResult)
     {
        dataModel = null;
        this.firstResult = firstResult;
     }
  
     public Integer getMaxResults()
     {
        return maxResults;
     }
  
     public void setMaxResults(Integer maxResults)
     {
        dataModel = null;
        this.maxResults = maxResults;
     }
  
     public Map<String, String> getHints()
     {
        return hints;
     }
  
     public void setHints(Map<String, String> hints)
     {
        this.hints = hints;
     }
  
     public String getQueryName()
     {
        return queryName;
     }
  
     public void setQueryName(String queryName)
     {
        this.queryName = queryName;
     }
  
     public List<String> getRestrictions()
     {
        return restrictions;
     }
  
     public void setRestrictions(List<String> restrictions)
     {
        this.restrictions = restrictions;
     }
  
     public String getOrder()
     {
        return order;
     }
  
     public void setOrder(String order)
     {
        this.order = order;
     }
  
  }
  
  
  



More information about the jboss-cvs-commits mailing list