[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