[jboss-cvs] jboss-seam/src/main/org/jboss/seam/framework ...
Gavin King
gavin.king at jboss.com
Sun Oct 8 10:01:53 EDT 2006
User: gavin
Date: 06/10/08 10:01:53
Modified: src/main/org/jboss/seam/framework
EntityNotFoundException.java Query.java
Added: src/main/org/jboss/seam/framework EntityHome.java
Home.java
Removed: src/main/org/jboss/seam/framework EntityActions.java
ManagedEntity.java ManagedHibernateEntity.java
ManagedObject.java
Log:
refactored framework
added converters for page parameters
fixed bugs in <factory/>
added <factory value=...>
Revision Changes Path
1.2 +3 -0 jboss-seam/src/main/org/jboss/seam/framework/EntityNotFoundException.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: EntityNotFoundException.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/framework/EntityNotFoundException.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- EntityNotFoundException.java 6 Oct 2006 00:22:38 -0000 1.1
+++ EntityNotFoundException.java 8 Oct 2006 14:01:53 -0000 1.2
@@ -1,8 +1,11 @@
package org.jboss.seam.framework;
+import javax.ejb.ApplicationException;
+
import org.jboss.seam.annotations.HttpError;
@HttpError(errorCode=404)
+ at ApplicationException(rollback=true)
public class EntityNotFoundException extends RuntimeException
{
}
1.6 +95 -78 jboss-seam/src/main/org/jboss/seam/framework/Query.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Query.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/framework/Query.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- Query.java 6 Oct 2006 02:58:24 -0000 1.5
+++ Query.java 8 Oct 2006 14:01:53 -0000 1.6
@@ -1,7 +1,5 @@
package org.jboss.seam.framework;
-import static org.jboss.seam.InterceptionType.NEVER;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -10,17 +8,14 @@
import javax.faces.model.DataModel;
import javax.persistence.EntityManager;
-import org.jboss.seam.annotations.Intercept;
+import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.core.Expressions;
import org.jboss.seam.core.Expressions.ValueBinding;
import org.jboss.seam.jsf.ListDataModel;
- at Intercept(NEVER)
public class Query
{
private String ejbql;
- private String queryName;
- private List<ValueBinding> queryParameters;
private Integer firstResult;
private Integer maxResults;
private EntityManager entityManager;
@@ -31,10 +26,17 @@
private List resultList;
private DataModel dataModel;
private Object singleResult;
+ private Long resultCount;
+
+ private String parsedEjbql;
+ private List<ValueBinding> queryParameters;
+ private List<String> parsedRestrictions;
+ private List<ValueBinding> restrictionParameters;
+ @Transactional
public List getResultList()
{
- //if (resultList==null)
+ if (resultList==null)
{
javax.persistence.Query query = createQuery();
resultList = query==null ? null : query.getResultList();
@@ -42,26 +44,31 @@
return resultList;
}
+ @Transactional
public Object getSingleResult()
{
if (singleResult==null)
{
javax.persistence.Query query = createQuery();
- singleResult = query==null ? null : query.getSingleResult();
+ singleResult = query==null ?
+ null : query.getSingleResult();
}
return singleResult;
}
+ @Transactional
public Long getResultCount()
{
- if (singleResult==null)
+ if (resultCount==null)
{
javax.persistence.Query query = createCountQuery();
- singleResult = query==null ? null : query.getSingleResult();
+ resultCount = query==null ?
+ null : (Long) query.getSingleResult();
}
- return (Long) singleResult;
+ return (Long) resultCount;
}
+ @Transactional
public DataModel getDataModel()
{
if (dataModel==null)
@@ -71,64 +78,58 @@
return dataModel;
}
- private javax.persistence.Query createCountQuery()
+ protected javax.persistence.Query createQuery()
{
- prepareEjbql();
+ parseEjbql();
getEntityManager().joinTransaction();
-
- int loc = ejbql.indexOf("from");
- String countEjbql = "select count(*) " + ejbql.substring(loc);
-
- javax.persistence.Query query = getEntityManager().createQuery(countEjbql);
- for (int i=0; i<queryParameters.size(); i++)
- {
- Object parameterValue = queryParameters.get(i).getValue();
- if (parameterValue==null)
+ javax.persistence.Query query = getEntityManager().createQuery( getRenderedEjbql() );
+ setParameters(query, queryParameters, 0);
+ setParameters(query, restrictionParameters, queryParameters.size());
+ if (firstResult!=null) query.setFirstResult(firstResult);
+ if (maxResults!=null) query.setMaxResults(maxResults);
+ if (hints!=null)
{
- return null;
- }
- else
+ for (Map.Entry<String, String> me: hints.entrySet())
{
- query.setParameter( i, parameterValue );
+ query.setHint(me.getKey(), me.getValue());
}
}
return query;
}
- private javax.persistence.Query createQuery()
+ protected javax.persistence.Query createCountQuery()
{
- prepareEjbql();
+ parseEjbql();
getEntityManager().joinTransaction();
- javax.persistence.Query query = getEntityManager().createQuery(ejbql);
- for (int i=0; i<queryParameters.size(); i++)
- {
- Object parameterValue = queryParameters.get(i).getValue();
- if (parameterValue==null)
- {
- return null;
+
+ String countEjbql = getCountEjbql();
+
+ javax.persistence.Query query = getEntityManager().createQuery(countEjbql);
+ setParameters(query, queryParameters, 0);
+ setParameters(query, restrictionParameters, queryParameters.size());
+ return query;
}
- else
+
+ private void setParameters(javax.persistence.Query query, List<ValueBinding> parameters, int start)
{
- query.setParameter( i, parameterValue );
- }
- }
- if (firstResult!=null) query.setFirstResult(firstResult);
- if (maxResults!=null) query.setMaxResults(maxResults);
- if (hints!=null)
+ for (int i=0; i<parameters.size(); i++)
{
- for (Map.Entry<String, String> me: hints.entrySet())
+ Object parameterValue = parameters.get(i).getValue();
+ if (parameterValue!=null)
{
- query.setHint(me.getKey(), me.getValue());
+ query.setParameter(start++, parameterValue);
}
}
- return query;
}
public void refresh()
{
dataModel = null;
+ resultCount = null;
+ resultList = null;
+ singleResult = null;
}
public void last()
@@ -155,6 +156,7 @@
dataModel = null;
}
+ @Transactional
public long getLastFirstResult()
{
return ( getResultCount() / maxResults ) * maxResults;
@@ -162,7 +164,6 @@
public int getNextFirstResult()
{
- //TODO: check to see if there are more results
return ( firstResult==null ? 0 : firstResult ) + maxResults;
}
@@ -178,10 +179,11 @@
}
}
- public void prepareEjbql()
+ protected void parseEjbql()
{
- //if (ejbql!=null)
+ if (parsedEjbql==null)
{
+
queryParameters = new ArrayList<ValueBinding>();
StringTokenizer ejbqlTokens = new StringTokenizer(ejbql, "#}", true);
StringBuilder ejbqlBuilder = new StringBuilder();
@@ -199,6 +201,10 @@
ejbqlBuilder.append(token);
}
}
+ parsedEjbql = ejbqlBuilder.toString();
+
+ parsedRestrictions = new ArrayList<String>( restrictions.size() );
+ restrictionParameters = new ArrayList<ValueBinding>( restrictions.size() );
for (String restriction: restrictions)
{
@@ -212,7 +218,7 @@
{
String expression = token + tokens.nextToken() + tokens.nextToken();
valueBinding = Expressions.instance().createValueBinding(expression);
- builder.append("?").append( queryParameters.size() );
+ builder.append("?").append( queryParameters.size() + restrictionParameters.size() );
}
else
{
@@ -226,26 +232,47 @@
throw new IllegalArgumentException("no value binding in restriction: " + restriction);
}
- Object parameterValue = valueBinding.getValue();
+ parsedRestrictions.add(builder.toString());
+ restrictionParameters.add(valueBinding);
+ }
+
+ }
+ }
+
+ protected String getRenderedEjbql()
+ {
+ StringBuilder builder = new StringBuilder()
+ .append(parsedEjbql);
+
+ for (int i=0; i<restrictions.size(); i++)
+ {
+ Object parameterValue = restrictionParameters.get(i).getValue();
if (parameterValue!=null)
{
- queryParameters.add(valueBinding);
- if ( ejbqlBuilder.toString().toLowerCase().indexOf("where")>0 )
+ if ( builder.toString().toLowerCase().indexOf("where")>0 )
{
- ejbqlBuilder.append(" and ");
+ builder.append(" and ");
}
else
{
- ejbqlBuilder.append(" where ");
+ builder.append(" where ");
}
- ejbqlBuilder.append(builder);
+ builder.append( parsedRestrictions.get(i) );
}
}
- if (order!=null) ejbqlBuilder.append(order);
+ if (order!=null) builder.append(" order by ").append(order);
- ejbql = ejbqlBuilder.toString();
+ return builder.toString();
}
+
+ protected String getCountEjbql()
+ {
+ String ejbql = getRenderedEjbql();
+ int fromLoc = ejbql.indexOf("from");
+ int orderLoc = ejbql.indexOf("order");
+ if (orderLoc<0) orderLoc = ejbql.length();
+ return "select count(*) " + ejbql.substring(fromLoc, orderLoc);
}
public String getEjbql()
@@ -310,16 +337,6 @@
this.hints = hints;
}
- public String getQueryName()
- {
- return queryName;
- }
-
- public void setQueryName(String queryName)
- {
- this.queryName = queryName;
- }
-
public List<String> getRestrictions()
{
return restrictions;
1.1 date: 2006/10/08 14:01:53; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/framework/EntityHome.java
Index: EntityHome.java
===================================================================
package org.jboss.seam.framework;
import javax.persistence.EntityManager;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.core.FacesMessages;
import org.jboss.seam.util.Persistence;
public class EntityHome<E> extends Home<E>
{
private EntityManager entityManager;
private Object id;
@In(create=true)
private FacesMessages facesMessages;
@Transactional
public boolean isManaged()
{
return getEntityManager().contains( getInstance() );
}
@Transactional
public String update()
{
getEntityManager().joinTransaction();
getEntityManager().flush();
facesMessages.add("Successfully updated");
return "updated";
}
@Transactional
public String persist()
{
getEntityManager().joinTransaction();
getEntityManager().persist( getInstance() );
getEntityManager().flush();
setId( Persistence.getId( getInstance(), getEntityManager() ) );
facesMessages.add("Successfully created");
return "persisted";
}
@Transactional
public String remove()
{
getEntityManager().joinTransaction();
getEntityManager().remove( getInstance() );
getEntityManager().flush();
facesMessages.add("Successfully deleted");
return "removed";
}
@Transactional
public E find(Object id)
{
getEntityManager().joinTransaction();
E result = getEntityManager().find( getEntityClass(), id );
if (result==null) result = handleNotFound();
return result;
}
protected E find()
{
return find( getId() );
}
protected E handleNotFound()
{
throw new EntityNotFoundException();
}
@Override
protected void initInstance()
{
if ( isIdDefined() )
{
//we cache the instance so that it does not "disappear"
//after remove() is called on the instance
//is this really a Good Idea??
setInstance( find() );
}
else
{
super.initInstance();
}
}
public EntityManager getEntityManager()
{
return entityManager;
}
public void setEntityManager(EntityManager entityManager)
{
this.entityManager = entityManager;
}
public Class<E> getEntityClass()
{
return getObjectClass();
}
public void setEntityClass(Class<E> entityClass)
{
setObjectClass(entityClass);
}
public Object getId()
{
return id;
}
public void setId(Object id)
{
this.id = id;
}
public boolean isIdDefined()
{
return getId()!=null && !"".equals( getId() );
}
}
1.1 date: 2006/10/08 14:01:53; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/framework/Home.java
Index: Home.java
===================================================================
package org.jboss.seam.framework;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.core.Expressions;
import org.jboss.seam.core.Expressions.ValueBinding;
import org.jboss.seam.util.Reflections;
/**
* Manager component for an instance of any class.
*
* @author Gavin King
*
*/
public class Home<E>
{
private Class<E> objectClass;
protected E instance;
private Map<String, String> initialFieldValues;
private Map<String, String> initialPropertyValues;
public Class<E> getObjectClass()
{
return objectClass;
}
public void setObjectClass(Class<E> objectClass)
{
this.objectClass = objectClass;
}
@Transactional
public E getInstance()
{
if (instance==null)
{
initInstance();
}
return instance;
}
protected void initInstance()
{
setInstance( createInstance() );
initialize(instance);
}
public void setInstance(E instance)
{
this.instance = instance;
}
protected E createInstance()
{
try
{
return getObjectClass().newInstance();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
protected void initialize(E instance)
{
if (initialFieldValues!=null)
{
for ( Map.Entry<String, String> initializer: initialFieldValues.entrySet() )
{
Object value = Expressions.instance().createValueBinding( initializer.getValue() ).getValue();
if ( value!=null )
{
Field field = Reflections.getField( getObjectClass(), initializer.getKey() );
if ( !field.isAccessible() ) field.setAccessible(true);
Reflections.setAndWrap(field, instance, value);
}
}
}
if (initialPropertyValues!=null)
{
for ( Map.Entry<String, String> initializer: initialPropertyValues.entrySet() )
{
ValueBinding valueBinding = Expressions.instance().createValueBinding( initializer.getValue() );
Object value = valueBinding.getValue();
if ( value!=null )
{
Method method = Reflections.getSetterMethod( getObjectClass(), initializer.getKey() );
if ( !method.isAccessible() ) method.setAccessible(true);
Reflections.invokeAndWrap(method, instance, value);
}
}
}
}
public Map<String, String> getInitialFieldValues()
{
return initialFieldValues;
}
public void setInitialFieldValues(Map<String, String> initializers)
{
this.initialFieldValues = initializers;
}
public Map<String, String> getInitialPropertyValues()
{
return initialPropertyValues;
}
public void setInitialPropertyValues(Map<String, String> initialPropertyValues)
{
this.initialPropertyValues = initialPropertyValues;
}
}
More information about the jboss-cvs-commits
mailing list