[jboss-cvs] jboss-seam/trinidad/src/org/jboss/seam/trinidad ...

Peter Muir peter at bleepbleep.org.uk
Sun Apr 15 13:45:44 EDT 2007


  User: pmuir   
  Date: 07/04/15 13:45:44

  Added:       trinidad/src/org/jboss/seam/trinidad      
                        EntityKeyManager.java SeamCollectionModel.java
                        EntityCollectionModel.java
                        HibernateEntityCollectionModel.java
                        TrinidadJsfProvider.java
                        HibernateEntityKeyManager.java
  Log:
  JBSEAM-757, move Trinidad example to trinidad directory
  
  Revision  Changes    Path
  1.1      date: 2007/04/15 17:45:44;  author: pmuir;  state: Exp;jboss-seam/trinidad/src/org/jboss/seam/trinidad/EntityKeyManager.java
  
  Index: EntityKeyManager.java
  ===================================================================
  package org.jboss.seam.trinidad;
  
  import static org.jboss.seam.ScopeType.PAGE;
  import static org.jboss.seam.InterceptionType.NEVER;
  import static org.jboss.seam.annotations.Install.BUILT_IN;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import javax.persistence.EntityManager;
  
  import org.jboss.seam.Component;
  import org.jboss.seam.annotations.Install;
  import org.jboss.seam.annotations.Intercept;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.annotations.Transactional;
  import org.jboss.seam.core.AbstractMutable;
  import org.jboss.seam.framework.EntityIdentifier;
  
  /**
   * EntityIdentifier manager for EntityCollectionModel
   * @author pmuir
   *
   */
  
  @Name("org.jboss.seam.trinidad.entityKeyManager")
  @Scope(PAGE)
  @Intercept(NEVER)
  @Install(precedence=BUILT_IN)
  public class EntityKeyManager extends AbstractMutable
  {
     
     private List<EntityIdentifier> rows = new ArrayList<EntityIdentifier>();
   
     public static EntityKeyManager instance()
     {
        return (EntityKeyManager) Component.getInstance(EntityKeyManager.class);
     }
  
     @Transactional
     public int getIndex(Integer key, List wrappedList, EntityManager entityManager)
     {
        Object entity = rows.get(key).find(entityManager);
        int index = wrappedList.indexOf(entity);
        return index;
     }
  
     
     @Transactional
     public Object getKey(int rowIndex, List wrappedList, EntityManager entityManager)
     {
        EntityIdentifier key = new EntityIdentifier(wrappedList.get(rowIndex), entityManager);
        if (!rows.contains(key))
        {
           rows.add(key);
           setDirty();
        }
        return rows.indexOf(key);
     }
     
  }
  
  
  
  1.1      date: 2007/04/15 17:45:44;  author: pmuir;  state: Exp;jboss-seam/trinidad/src/org/jboss/seam/trinidad/SeamCollectionModel.java
  
  Index: SeamCollectionModel.java
  ===================================================================
  package org.jboss.seam.trinidad;
  
  import java.util.ArrayList;
  import java.util.List;
  import java.util.StringTokenizer;
  
  import org.apache.myfaces.trinidad.model.CollectionModel;
  import org.apache.myfaces.trinidad.model.SortCriterion;
  import org.jboss.seam.framework.Query;
  
  /**
   * Abstract base class for an Apache Trinidad CollectionModel
   * 
   * Implementing classes need to provide conversion between the
   * current row index and a key for the unchanging row.
   * 
   * Using rowIndex when backing the CollectionModel with a Query
   * is not possible as sorting and paging alters the rowIndex
   * outside the control of the CollectionModel.
   * 
   * @author pmuir
   *
   */
  public abstract class SeamCollectionModel extends CollectionModel
  {
  
     //private Object rowKey;
     
     private int rowIndex = -1;
     
     private List<SortCriterion> criteria;
     
     @Override
     public Object getWrappedData()
     {
        return getWrappedList();
     }
  
     public void refresh()
     {
        getQuery().refresh();
     }
  
     @Override
     public int getRowCount()
     {
        return getQuery().getResultCount().intValue();
     }
  
     @Override
     public void setWrappedData(Object arg0)
     {
        throw new UnsupportedOperationException("Immutable DataModel");
     }
  
     protected List getWrappedList()
     {
        return getQuery().getResultList();
     }
     
     protected abstract Query getQuery();
     
     @Override
     public boolean isSortable(String property)
     {
        return true;
     }
  
     @Override
     public List<SortCriterion> getSortCriteria()
     {
        if (criteria == null)
        {
           criteria = asCriteria(getQuery().getOrder());
        }
        return criteria;
     }
  
     @Override
     public void setSortCriteria(List<SortCriterion> criteria)
     {
        if (criteria != null && !criteria.equals(this.criteria))
        {
           getQuery().setOrder(asQl(criteria));
           this.criteria = null;
           refresh();
        }
     }
     
     @Override
     public void setRowIndex(int rowIndex)
     {
        this.rowIndex = rowIndex;
        //rowKey = null;
     }
  
     @Override
     public int getRowIndex()
     {
        return rowIndex;
     }
  
     @Override
     public Object getRowData()
     {
        // We can attempt to do lazy loading
        if (getQuery().getMaxResults() != null)
        {
           boolean refresh = false;
           // Lazy load data
           refresh = page();
           if (refresh)
           {
              refresh();
           }
           return getWrappedList().get(getRowIndex() - getFirstResult());
        }
        else
        {
           return getWrappedList().get(getRowIndex());
        }
     }
  
     private boolean page()
     {
        if (getRowIndex() < getFirstResult())
        {
           while (getRowIndex() < getFirstResult())
           {
              getQuery().previous();
           }
           return true;
        }
        else if (getRowIndex() >= getQuery().getNextFirstResult())
        {
           while (getRowIndex() >= getQuery().getNextFirstResult())
           {
              getQuery().next();
           }
           return true;
        }
        else
        {
           return false;
        }
     }
  
     protected int getFirstResult()
     {
        if (getQuery().getFirstResult() == null)
        {
           getQuery().setFirstResult(0);
        }
        return getQuery().getFirstResult();
     }
  
     @Override
     public boolean isRowAvailable()
     {
        return getRowIndex() >= 0 && getRowIndex() < getRowCount();
     }
     
     protected String asQl(List<SortCriterion> criteria)
     {
        if (criteria != null && criteria.size() > 0)
        {
           String sql = "";
           for (SortCriterion sortCriterion : criteria)
           {
              sql += sortCriterion.getProperty() + (sortCriterion.isAscending() ? " ASC" : " DESC");
           }
           if (!"".equals(sql))
           {
              sql.substring(0, sql.length() - 1);
           }
           return sql;
        }
        else
        {
           return null;
        }
     }
  
     protected List<SortCriterion> asCriteria(String sql)
     {
        List<SortCriterion> criteria = new ArrayList<SortCriterion>();
        if (!(sql == null || "".equals(sql)))
        {
           StringTokenizer tokenizer = new StringTokenizer(sql, ",");
           while (tokenizer.hasMoreTokens())
           {
              SortCriterion sortCriterion;
              String fragment = tokenizer.nextToken();
              String s = fragment.substring(fragment.lastIndexOf(" "));
              if (" ASC".equalsIgnoreCase(s))
              {
                 sortCriterion = new SortCriterion(fragment.substring(0, fragment.length() - 4), true);
              }
              else if (" DESC".equalsIgnoreCase(s))
              {
                 sortCriterion = new SortCriterion(fragment.substring(0, fragment.length() - 5),
                          false);
              }
              else
              {
                 sortCriterion = new SortCriterion(fragment, false);
              }
              criteria.add(sortCriterion);
           }
        }
        return criteria;
     }
  
  }
  
  
  1.1      date: 2007/04/15 17:45:44;  author: pmuir;  state: Exp;jboss-seam/trinidad/src/org/jboss/seam/trinidad/EntityCollectionModel.java
  
  Index: EntityCollectionModel.java
  ===================================================================
  package org.jboss.seam.trinidad;
  
  import org.jboss.seam.framework.EntityQuery;
  import org.jboss.seam.framework.Query;
  
  public class EntityCollectionModel extends SeamCollectionModel
  {
     private EntityQuery entityQuery;
  
     public EntityCollectionModel(EntityQuery entityQuery)
     {
        this.entityQuery = entityQuery;
     }
  
     @Override
     public Object getRowKey()
     {   
        if (getRowIndex() == -1)
        {
          return null;
        }
        else
        {
          return EntityKeyManager.instance().getKey(getRowIndex() - getFirstResult(), getWrappedList(), entityQuery.getEntityManager());
        }
     }
  
     @Override
     public void setRowKey(Object rowKey)
     {
        if (rowKey == null)
        {
           setRowIndex(-1);
        }
        else
        {
           setRowIndex(EntityKeyManager.instance().getIndex((Integer) rowKey, getWrappedList(), entityQuery.getEntityManager()) + getFirstResult());
        }
     }
  
     @Override
     protected Query getQuery()
     {
        return entityQuery;
     }
  
  }
  
  
  1.1      date: 2007/04/15 17:45:44;  author: pmuir;  state: Exp;jboss-seam/trinidad/src/org/jboss/seam/trinidad/HibernateEntityCollectionModel.java
  
  Index: HibernateEntityCollectionModel.java
  ===================================================================
  package org.jboss.seam.trinidad;
  
  import org.jboss.seam.framework.HibernateEntityQuery;
  import org.jboss.seam.framework.Query;
  
  public class HibernateEntityCollectionModel extends SeamCollectionModel
  {
     
     private HibernateEntityQuery hibernateEntityQuery;
  
     public HibernateEntityCollectionModel(HibernateEntityQuery query)
     {
        this.hibernateEntityQuery = query;
     }
  
     @Override
     protected Query getQuery()
     {
        return hibernateEntityQuery;
     }
  
     @Override
     public Object getRowKey()
     {   
        if (getRowIndex() == -1)
        {
          return null;
        }
        else
        {
          return HibernateEntityKeyManager.instance().getKey(getRowIndex() - getFirstResult(), getWrappedList(), hibernateEntityQuery.getSession());
        }
     }
  
     @Override
     public void setRowKey(Object rowKey)
     {
        if (rowKey == null)
        {
           setRowIndex(-1);
        }
        else
        {
           setRowIndex(HibernateEntityKeyManager.instance().getIndex((Integer) rowKey, getWrappedList(), hibernateEntityQuery.getSession()) + getFirstResult());
        }
     }
  
  }
  
  
  
  1.1      date: 2007/04/15 17:45:44;  author: pmuir;  state: Exp;jboss-seam/trinidad/src/org/jboss/seam/trinidad/TrinidadJsfProvider.java
  
  Index: TrinidadJsfProvider.java
  ===================================================================
  package org.jboss.seam.trinidad;
  
  import static org.jboss.seam.InterceptionType.NEVER;
  import static org.jboss.seam.ScopeType.STATELESS;
  import static org.jboss.seam.annotations.Install.FRAMEWORK;
  
  import javax.faces.model.DataModel;
  
  import org.jboss.seam.annotations.Install;
  import org.jboss.seam.annotations.Intercept;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.framework.EntityQuery;
  import org.jboss.seam.framework.HibernateEntityQuery;
  import org.jboss.seam.framework.Query;
  import org.jboss.seam.jsf.JsfProvider;
  
  /**
   * Provide enhanced features when Trinidad is used as a JSF component set
   * @author pmuir
   *
   */
  
  @Name("org.jboss.seam.jsf.jsfProvider")
  @Install(precedence=FRAMEWORK, classDependencies="org.apache.myfaces.trinidad.component.UIXComponent")
  @Scope(STATELESS)
  @Intercept(NEVER)
  public class TrinidadJsfProvider extends JsfProvider
  {
     
     @Override
     public DataModel getDataModel(Query query)
     {
        // If an EntityQuery is in use we can return a CollectionModel
        // backed by the database
        if (query instanceof EntityQuery)
        {
           return new EntityCollectionModel((EntityQuery) query);
        }
        else if (query instanceof HibernateEntityQuery)
        {
           return new HibernateEntityCollectionModel((HibernateEntityQuery) query);
        }
        else
        {
           return super.getDataModel(query);
        }
     }
     
     
  }
  
  
  
  1.1      date: 2007/04/15 17:45:44;  author: pmuir;  state: Exp;jboss-seam/trinidad/src/org/jboss/seam/trinidad/HibernateEntityKeyManager.java
  
  Index: HibernateEntityKeyManager.java
  ===================================================================
  package org.jboss.seam.trinidad;
  
  import static org.jboss.seam.ScopeType.PAGE;
  import static org.jboss.seam.InterceptionType.NEVER;
  import static org.jboss.seam.annotations.Install.BUILT_IN;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import org.hibernate.Session;
  import org.jboss.seam.Component;
  import org.jboss.seam.annotations.Install;
  import org.jboss.seam.annotations.Intercept;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.annotations.Transactional;
  import org.jboss.seam.core.AbstractMutable;
  import org.jboss.seam.framework.HibernateEntityIdentifier;
  
  /**
   * EntityIdentifier manager for EntityCollectionModel
   * @author pmuir
   *
   */
  
  @Name("org.jboss.seam.trinidad.hibernateEntityKeyManager")
  @Scope(PAGE)
  @Intercept(NEVER)
  @Install(precedence=BUILT_IN)
  public class HibernateEntityKeyManager extends AbstractMutable
  {
     
     private List<HibernateEntityIdentifier> rows = new ArrayList<HibernateEntityIdentifier>();
   
     public static HibernateEntityKeyManager instance()
     {
        return (HibernateEntityKeyManager) Component.getInstance(HibernateEntityKeyManager.class);
     }
  
     @Transactional
     public int getIndex(Integer key, List wrappedList, Session session)
     {
        Object entity = rows.get(key).find(session);
        int index = wrappedList.indexOf(entity);
        return index;
     }
  
     
     @Transactional
     public Object getKey(int rowIndex, List wrappedList, Session session)
     {
        HibernateEntityIdentifier key = new HibernateEntityIdentifier(wrappedList.get(rowIndex), session);
        if (!rows.contains(key))
        {
           rows.add(key);
           setDirty();
        }
        return rows.indexOf(key);
     }
     
  }
  
  
  



More information about the jboss-cvs-commits mailing list