User: danch   
  Date: 01/05/26 17:49:16

  Modified:    src/main/org/jboss/ejb/plugins/jaws/jdbc
                        JDBCCommandFactory.java JDBCFindAllCommand.java
                        JDBCFindEntitiesCommand.java
                        JDBCFindEntityCommand.java JDBCFinderCommand.java
                        JDBCLoadEntityCommand.java
  Added:       src/main/org/jboss/ejb/plugins/jaws/jdbc
                        JDBCLoadEntitiesCommand.java
  Log:
  added 'read-ahead' option for finders in JAWS
  
  Revision  Changes    Path
  1.7       +10 -4     
jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCCommandFactory.java
  
  Index: JDBCCommandFactory.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCCommandFactory.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- JDBCCommandFactory.java   2001/03/26 15:19:36     1.6
  +++ JDBCCommandFactory.java   2001/05/27 00:49:15     1.7
  @@ -25,6 +25,7 @@
   import org.jboss.ejb.plugins.jaws.JPMCreateEntityCommand;
   import org.jboss.ejb.plugins.jaws.JPMRemoveEntityCommand;
   import org.jboss.ejb.plugins.jaws.JPMLoadEntityCommand;
  +import org.jboss.ejb.plugins.jaws.JPMLoadEntitiesCommand;
   import org.jboss.ejb.plugins.jaws.JPMStoreEntityCommand;
   import org.jboss.ejb.plugins.jaws.JPMActivateEntityCommand;
   import org.jboss.ejb.plugins.jaws.JPMPassivateEntityCommand;
  @@ -42,7 +43,7 @@
    * JAWSPersistenceManager JDBCCommandFactory
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
  - * @version $Revision: 1.6 $
  + * @version $Revision: 1.7 $
    */
   public class JDBCCommandFactory implements JPMCommandFactory
   {
  @@ -130,9 +131,9 @@
         return beanExistsCommand;
      }
      
  -   public JPMFindEntitiesCommand createFindAllCommand()
  +   public JPMFindEntitiesCommand createFindAllCommand(FinderMetaData f)
      {
  -      return new JDBCFindAllCommand(this);
  +      return new JDBCFindAllCommand(this, f);
      }
      
      public JPMFindEntitiesCommand createDefinedFinderCommand(FinderMetaData f)
  @@ -140,7 +141,7 @@
         return new JDBCDefinedFinderCommand(this, f);
      }
      
  -   public JPMFindEntitiesCommand createFindByCommand(Method finderMethod)
  +   public JPMFindEntitiesCommand createFindByCommand(Method finderMethod, 
FinderMetaData f)
         throws IllegalArgumentException
      {
         return new JDBCFindByCommand(this, finderMethod);
  @@ -204,6 +205,11 @@
      public JPMLoadEntityCommand createLoadEntityCommand()
      {
         return new JDBCLoadEntityCommand(this);
  +   }
  +   
  +   public JPMLoadEntitiesCommand createLoadEntitiesCommand()
  +   {
  +      return new JDBCLoadEntitiesCommand(this);
      }
      
      public JPMStoreEntityCommand createStoreEntityCommand()
  
  
  
  1.4       +5 -3      
jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindAllCommand.java
  
  Index: JDBCFindAllCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindAllCommand.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JDBCFindAllCommand.java   2000/12/07 15:44:36     1.3
  +++ JDBCFindAllCommand.java   2001/05/27 00:49:15     1.4
  @@ -7,6 +7,8 @@
   
   package org.jboss.ejb.plugins.jaws.jdbc;
   
  +import org.jboss.ejb.plugins.jaws.metadata.FinderMetaData;
  +
   /**
    * JAWSPersistenceManager JDBCFindAllCommand
    *
  @@ -15,15 +17,15 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
  - * @version $Revision: 1.3 $
  + * @version $Revision: 1.4 $
    */
   public class JDBCFindAllCommand extends JDBCFinderCommand
   {
      // Constructors --------------------------------------------------
      
  -   public JDBCFindAllCommand(JDBCCommandFactory factory)
  +   public JDBCFindAllCommand(JDBCCommandFactory factory, FinderMetaData f)
      {
  -      super(factory, "FindAll");
  +      super(factory, f);
         
         String sql = "SELECT " + getPkColumnList() + " FROM " + 
jawsEntity.getTableName();
   
  
  
  
  1.9       +15 -8     
jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindEntitiesCommand.java
  
  Index: JDBCFindEntitiesCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindEntitiesCommand.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- JDBCFindEntitiesCommand.java      2001/02/12 18:31:13     1.8
  +++ JDBCFindEntitiesCommand.java      2001/05/27 00:49:15     1.9
  @@ -22,6 +22,7 @@
   import org.jboss.ejb.plugins.jaws.JPMFindEntitiesCommand;
   import org.jboss.ejb.plugins.jaws.metadata.FinderMetaData;
   import org.jboss.ejb.plugins.jaws.bmp.CustomFindByEntitiesCommand;
  +import org.jboss.util.FinderResults;
   
   /**
    * Keeps a map from finder name to specific finder command, and
  @@ -32,7 +33,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
  - * @version $Revision: 1.8 $
  + * @version $Revision: 1.9 $
    */
   public class JDBCFindEntitiesCommand implements JPMFindEntitiesCommand
   {
  @@ -68,7 +69,7 @@
                                         knownFinderCommands.put(remoteName, new 
CustomFindByEntitiesCommand(m));
                                         factory.getLog().debug("Added custom finder " 
+ remoteName +".");
                                 } catch (IllegalArgumentException e) {
  -                                 factory.getLog().debug("Could not create the 
custom finder " + remoteName+".");
  +                                 factory.getLog().error("Could not create the 
custom finder " + remoteName+".");
                                 }
                         }
                  }
  @@ -85,8 +86,12 @@
            
            if ( !knownFinderCommands.containsKey(f.getName()) )
            {
  -            JPMFindEntitiesCommand finderCommand =
  -               factory.createDefinedFinderCommand(f);
  +            JPMFindEntitiesCommand finderCommand = null;
  +            if (f.getName().equals("findAll")) {
  +               finderCommand = factory.createFindAllCommand(f);
  +            } else {
  +               finderCommand = factory.createDefinedFinderCommand(f);
  +            }
                  
               knownFinderCommands.put(f.getName(), finderCommand);
            }
  @@ -105,12 +110,14 @@
            {
               if (name.equals("findAll"))
               {
  -               knownFinderCommands.put(name, factory.createFindAllCommand());
  +               FinderMetaData f = new FinderMetaData("findAll");
  +               knownFinderCommands.put(name, factory.createFindAllCommand(f));
               } else if (name.startsWith("findBy")  && 
!name.equals("findByPrimaryKey"))
               {
                  try
                  {
  -                  knownFinderCommands.put(name, factory.createFindByCommand(m));
  +                  FinderMetaData f = new FinderMetaData(name);
  +                  knownFinderCommands.put(name, factory.createFindByCommand(m, f));
                  } catch (IllegalArgumentException e)
                  {
                     factory.getLog().debug("Could not create the finder " + name +
  @@ -124,7 +131,7 @@
      
      // JPMFindEntitiesCommand implementation -------------------------
      
  -   public Collection execute(Method finderMethod,
  +   public FinderResults execute(Method finderMethod,
                                Object[] args,
                                EntityEnterpriseContext ctx)
         throws RemoteException, FinderException
  @@ -142,6 +149,6 @@
         // JF: Shouldn't tolerate the "not found" case!
         
         return (finderCommand != null) ?
  -         finderCommand.execute(finderMethod, args, ctx) : new ArrayList();
  +         finderCommand.execute(finderMethod, args, ctx) : new FinderResults(new 
ArrayList(),null,null,null);
      }
   }
  
  
  
  1.6       +5 -4      
jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindEntityCommand.java
  
  Index: JDBCFindEntityCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindEntityCommand.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- JDBCFindEntityCommand.java        2000/12/07 15:44:37     1.5
  +++ JDBCFindEntityCommand.java        2001/05/27 00:49:15     1.6
  @@ -29,7 +29,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
  - * @version $Revision: 1.5 $
  + * @version $Revision: 1.6 $
    */
   public class JDBCFindEntityCommand implements JPMFindEntityCommand
   {
  @@ -60,15 +60,16 @@
         }
         else
         {
  -         ArrayList result =
  -            (ArrayList)findEntitiesCommand.execute(finderMethod, args, ctx);
  +         Collection result =
  +            (Collection)findEntitiesCommand.execute(finderMethod, args, ctx);
            
            if (result.size() == 0)
            {
               throw new ObjectNotFoundException("No such entity!");
            } else if (result.size() == 1)
            {
  -            return result.get(0);
  +            Object [] objects = result.toArray();
  +            return objects[0];
            } else
            {
               throw new FinderException("More than one entity matches the finder 
criteria.");
  
  
  
  1.10      +29 -6     
jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFinderCommand.java
  
  Index: JDBCFinderCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFinderCommand.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- JDBCFinderCommand.java    2000/12/07 15:44:37     1.9
  +++ JDBCFinderCommand.java    2001/05/27 00:49:15     1.10
  @@ -23,7 +23,9 @@
   
   import org.jboss.ejb.EntityEnterpriseContext;
   import org.jboss.ejb.plugins.jaws.JPMFindEntitiesCommand;
  +import org.jboss.ejb.plugins.jaws.metadata.FinderMetaData;
   import org.jboss.ejb.plugins.jaws.metadata.PkFieldMetaData;
  +import org.jboss.util.FinderResults;
   
   /**
    * Abstract superclass of finder commands that return collections.
  @@ -33,31 +35,52 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
  - * @version $Revision: 1.9 $
  + * @version $Revision: 1.10 $
    */
   public abstract class JDBCFinderCommand
      extends JDBCQueryCommand
      implements JPMFindEntitiesCommand
   {
  +   protected FinderMetaData finderMetaData = null;
      // Constructors --------------------------------------------------
   
  -   public JDBCFinderCommand(JDBCCommandFactory factory, String name)
  +   public JDBCFinderCommand(JDBCCommandFactory factory, FinderMetaData f)
      {
  -      super(factory, name);
  +      super(factory, f.getName());
  +      
  +      finderMetaData = f;
      }
  +   
  +   public FinderMetaData getFinderMetaData() {
  +      return finderMetaData;
  +   }
   
      // JPMFindEntitiesCommand implementation -------------------------
   
  -   public Collection execute(Method finderMethod,
  +   public FinderResults execute(Method finderMethod,
                                Object[] args,
                                EntityEnterpriseContext ctx)
         throws RemoteException, FinderException
      {
  -      Collection result = null;
  +      FinderResults result = null;
   
         try
         {
  -         result = (Collection)jdbcExecute(args);
  +         Collection keys = (Collection)jdbcExecute(args);
  +         /** @todo: remove this next bit and add 'getWhereClause' to FinderCommands 
*/
  +         //look for 'where' and ditch everything before it
  +         String sql = getSQL(args);
  +         sql.toUpperCase();
  +         int pos = sql.indexOf("WHERE");
  +         String where = "";
  +         if (pos != -1) {
  +            where = sql.substring(pos);
  +         }
  +         if (finderMetaData.hasReadAhead()) {
  +            result = new FinderResults(keys, where, this, args);
  +         } else {
  +            result = new FinderResults(keys, null, null, null);
  +         }
         } catch (Exception e)
         {
            log.debug(e);
  
  
  
  1.9       +42 -15    
jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCLoadEntityCommand.java
  
  Index: JDBCLoadEntityCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCLoadEntityCommand.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- JDBCLoadEntityCommand.java        2001/03/26 15:55:43     1.8
  +++ JDBCLoadEntityCommand.java        2001/05/27 00:49:15     1.9
  @@ -11,6 +11,7 @@
   import java.lang.reflect.Method;
   
   import java.util.Iterator;
  +import java.util.HashMap;
   
   import java.rmi.NoSuchObjectException;
   import java.rmi.RemoteException;
  @@ -23,6 +24,7 @@
   import org.jboss.ejb.plugins.jaws.JAWSPersistenceManager;
   import org.jboss.ejb.plugins.jaws.JPMLoadEntityCommand;
   import org.jboss.ejb.plugins.jaws.metadata.CMPFieldMetaData;
  +import org.jboss.ejb.plugins.jaws.metadata.PkFieldMetaData;
   import org.jboss.ejb.plugins.jaws.metadata.JawsEntityMetaData;
   
   /**
  @@ -34,7 +36,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dirk Zimmermann</a>
  - * @version $Revision: 1.8 $
  + * @version $Revision: 1.9 $
    */
   public class JDBCLoadEntityCommand
      extends JDBCQueryCommand
  @@ -46,30 +48,48 @@
      {
         super(factory, "Load");
   
  +      String sql = createSelectClause() + " WHERE " + getPkColumnWhereList();
  +      if (jawsEntity.hasSelectForUpdate())
  +      {
  +         sql += " FOR UPDATE";
  +      }
  +
  +      setSQL(sql);
  +   }
  +
  +   protected String createSelectClause() {
         // Select SQL
         String sql = "SELECT ";
  -      Iterator it = jawsEntity.getCMPFields();
  +      HashMap alreadyListed = new HashMap();
  +      // put the key fields in first 
  +      Iterator keyIt = jawsEntity.getPkFields();
         boolean first = true;
  -
  -      while (it.hasNext())
  +      while (keyIt.hasNext())
         {
  -         CMPFieldMetaData cmpField = (CMPFieldMetaData)it.next();
  +         PkFieldMetaData pkField = (PkFieldMetaData)keyIt.next();
            
            sql += (first ? "" : ",") +
  -                cmpField.getColumnName();
  +                pkField.getColumnName();
  +         alreadyListed.put(pkField.getColumnName().toUpperCase(), pkField);
            first = false;
         }
         
  -      sql += " FROM " + jawsEntity.getTableName() +
  -             " WHERE " + getPkColumnWhereList();
  -      if (jawsEntity.hasSelectForUpdate())
  +      Iterator it = jawsEntity.getCMPFields();
  +
  +      while (it.hasNext())
         {
  -         sql += " FOR UPDATE";
  +         CMPFieldMetaData cmpField = (CMPFieldMetaData)it.next();
  +         if (alreadyListed.get(cmpField.getColumnName().toUpperCase()) == null) {
  +            sql += "," + cmpField.getColumnName();
  +            alreadyListed.put(cmpField.getColumnName().toUpperCase(), cmpField);
  +         }
         }
  -
  -      setSQL(sql);
  +      
  +      sql += " FROM " + jawsEntity.getTableName();
  +      
  +      return sql;
      }
  -
  +   
      // JPMLoadEntityCommand implementation ---------------------------
   
      public void execute(EntityEnterpriseContext ctx)
  @@ -107,6 +127,13 @@
         }
   
         // Set values
  +System.out.print("!");
  +      loadOneEntity(rs, ctx);
  +      
  +      return null;
  +   }
  +
  +   protected void loadOneEntity(ResultSet rs, EntityEnterpriseContext ctx) throws 
Exception {      
         int idx = 1;
         
         Iterator iter = jawsEntity.getCMPFields();
  @@ -125,9 +152,9 @@
         if (jawsEntity.isReadOnly()) pCtx.lastRead = System.currentTimeMillis();
         pCtx.state = getState(ctx);
   
  -      return null;
  -   }
   
  +   }
  +   
      // Protected -----------------------------------------------------
   
      protected boolean isTimedOut(EntityEnterpriseContext ctx)
  
  
  
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCLoadEntitiesCommand.java
  
  Index: JDBCLoadEntitiesCommand.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  
  package org.jboss.ejb.plugins.jaws.jdbc;
  
  import java.lang.reflect.Field;
  import java.lang.reflect.Method;
  
  import java.util.Map;
  import java.util.Iterator;
  
  import java.rmi.NoSuchObjectException;
  import java.rmi.RemoteException;
  import java.rmi.ServerException;
  
  import java.sql.PreparedStatement;
  import java.sql.ResultSet;
  
  import org.jboss.ejb.EntityEnterpriseContext;
  import org.jboss.ejb.plugins.jaws.JAWSPersistenceManager;
  import org.jboss.ejb.plugins.jaws.JPMLoadEntitiesCommand;
  import org.jboss.ejb.plugins.jaws.metadata.CMPFieldMetaData;
  import org.jboss.ejb.plugins.jaws.metadata.FinderMetaData;
  import org.jboss.ejb.plugins.jaws.metadata.JawsEntityMetaData;
  import org.jboss.ejb.plugins.jaws.metadata.PkFieldMetaData;
  import org.jboss.util.FinderResults;
  
  /**
   * JAWSPersistenceManager JDBCLoadEntityCommand
   *
   * @see <related>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Rickard Öberg</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Dirk Zimmermann</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>danch (Dan Christopherson)</a>
   * @version $Revision: 1.1 $
   */
  public class JDBCLoadEntitiesCommand
     extends JDBCLoadEntityCommand
     implements JPMLoadEntitiesCommand
  {
     String selectClause;
     // Constructors --------------------------------------------------
  
     public JDBCLoadEntitiesCommand(JDBCCommandFactory factory)
     {
        super(factory);
  
        selectClause = super.createSelectClause();
     }
  
     // JPMLoadEntitiesCommand implementation.
     
     public void execute(FinderResults keys)
        throws RemoteException
     {
        JDBCFinderCommand finder = (JDBCFinderCommand)keys.getFinder();
        FinderMetaData metaData = null;
        if (finder != null)
           metaData = finder.getFinderMetaData();
        if (metaData != null && metaData.hasReadAhead() && keys.getQueryData() != null)
        {
           try
           {
              Object[] args = {keys};
              jdbcExecute(args);
           } catch (Exception e)
           {
              throw new ServerException("Load failed", e);
           }
        }
     }
     
     // JDBCQueryCommand overrides ------------------------------------
  
     protected Object handleResult(ResultSet rs, Object argOrArgs) throws Exception
     {
        FinderResults keys = (FinderResults)((Object[])argOrArgs)[0];
        Map instances = keys.getEntityMap();
        while (rs.next())
        {
           Object key = createKey(rs);
           
           //find the context
           EntityEnterpriseContext ctx = (EntityEnterpriseContext)instances.get(key);
           if (ctx != null) {
              //if the context says it's already valid, don't load it.
              if (!ctx.isValid()) {
                 loadOneEntity(rs, ctx);
                 ctx.setValid(true);
              }
           } else {
              //if ctx was null, the CMPPersistenceManager doesn't want us to try
              // to load it due to a transaction issue.
           }
        }
        return null;
     }
     
     protected void setParameters(PreparedStatement stmt, Object argOrArgs)
        throws Exception
     {
        FinderResults keys = (FinderResults)((Object[])argOrArgs)[0];
        JDBCFinderCommand finder = (JDBCFinderCommand)keys.getFinder();
        Object[] args = keys.getQueryArgs();
        finder.setParameters(stmt, args);
     }
        
     // JDBCommand ovverrides -----------------------------------------
     protected String getSQL(Object argOrArgs) throws Exception
     {
        FinderResults keys = (FinderResults)((Object[])argOrArgs)[0];
        return selectClause + " " + keys.getQueryData().toString();
     }
     
     // protected -----------------------------------------------------
     
     protected Object createKey(ResultSet rs) throws Exception {
     
        if (jawsEntity.hasCompositeKey())
        {
           // Compound key
           try
           {
              Object pk = jawsEntity.getPrimaryKeyClass().newInstance();
              int i = 1;   // parameter index
              Iterator it = jawsEntity.getPkFields();
              
              while (it.hasNext())
              {
                 PkFieldMetaData pkFieldMetaData = (PkFieldMetaData)it.next();
                 Field pkField = pkFieldMetaData.getPkField();
                 String colName = pkFieldMetaData.getColumnName();
                 pkField.set(pk, getResultObject(rs, 
                                                 i++, 
                                                 pkField.getType()));
              }
              return pk;
           } catch (Exception e)
           {
              return null;
           }
        } else
        {
           // Primitive key
           Iterator it = jawsEntity.getPkFields();
           PkFieldMetaData pkFieldMetaData = (PkFieldMetaData)it.next();
           return getResultObject(rs, 1, pkFieldMetaData.getCMPField().getType());
        }
     }
     
  }
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to