[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