User: patriot1burke
  Date: 01/06/21 15:00:43

  Added:       src/main/org/jboss/ejb/plugins/jaws/jdbc
                        JDBCPreloadFinderCommand.java
  Log:
  combination of LoadEntites and a finder.  This class makes JDBCLoadEntitiesCommand
  obsolete and now combines read-ahead with finders in the same SQL select.
  
  Revision  Changes    Path
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCPreloadFinderCommand.java
  
  Index: JDBCPreloadFinderCommand.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.util.ArrayList;
  import java.util.Collection;
  
  import java.rmi.NoSuchObjectException;
  import java.rmi.RemoteException;
  import java.rmi.ServerException;
  
  import java.sql.PreparedStatement;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  
  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.ejb.plugins.jaws.metadata.TypeMappingMetaData;
  import org.jboss.util.FinderResults;
  
  /**
   * Preloads data for all entities in where clause
   *
   * @see <related>
   * @author <a href="mailto:[EMAIL PROTECTED]";>danch (Dan Christopherson)</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Bill Burke</a>
   * @version $Revision: 1.1 $
   */
  public class JDBCPreloadFinderCommand
     extends JDBCFinderCommand
  {
     protected JDBCDefinedFinderCommand defined;
     protected JDBCLoadEntityCommand loadCommand;
  
     // Constructors --------------------------------------------------
  
     public JDBCPreloadFinderCommand(JDBCCommandFactory factory, String name)
     {
        super(factory, name);
        loadCommand = new JDBCLoadEntityCommand(factory);
     }
     public JDBCPreloadFinderCommand(JDBCCommandFactory factory, FinderMetaData f)
     {
        super(factory, "PreloadFinder " + f.getName());
        loadCommand = new JDBCLoadEntityCommand(factory);
        defined = new JDBCDefinedFinderCommand(factory, f);
        String sql = loadCommand.createSelectClause() + " "
           + defined.getFromClause() + " "
           + defined.getWhereClause() + " "
           + defined.getOrderByClause();
        if (jawsEntity.hasSelectForUpdate())
        {
           sql += " FOR UPDATE";
        }
        setSQL(sql);
     }
  
     public String getWhereClause() {
        return defined.getWhereClause();
     }
     public String getFromClause() {
        return defined.getFromClause();
     }
     public String getOrderByClause() {
        return defined.getOrderByClause();
     }
  
     protected Object handleResult(ResultSet rs, Object argOrArgs) throws Exception
     {
        Collection result = new ArrayList();
        while (rs.next())
        {
           Object key = createKey(rs);
           result.add(key);
           preloadOneEntity(rs, key);
        }
        return result;
     }
     
     protected void preloadOneEntity(ResultSet rs, Object key) {
        if (debug)
           log.debug("PRELOAD: preloading entity "+key);   
        int idx = 1;
        // skip the PK fields at the beginning of the select.
        Iterator keyIt = jawsEntity.getPkFields();
        while (keyIt.hasNext()) {
           keyIt.next();
           idx++;
        }
  
        int fieldCount = 0;
        Object[] allValues = new Object[jawsEntity.getNumberOfCMPFields()];
        Iterator iter = jawsEntity.getCMPFields();
        try {
           while (iter.hasNext())
           {
              CMPFieldMetaData cmpField = (CMPFieldMetaData)iter.next();
              
              Object value = getResultObject(rs, 
loadCommand.cmpFieldPositionInSelect[fieldCount], cmpField);
              allValues[fieldCount] = value;
              fieldCount++;
           }
           if (debug)
              log.debug("adding to preload data: " + key.toString());
           factory.addPreloadData(key, allValues);
        } catch (Exception sqle) {
           log.warning("SQL Error preloading data for key "+key);
        }
     }
     
     // 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());
        }
     }
     
     protected void setParameters(PreparedStatement stmt, Object argOrArgs)
        throws Exception
     {
        Object[] args = (Object[])argOrArgs;
  
        TypeMappingMetaData typeMapping = 
jawsEntity.getJawsApplication().getTypeMapping();
        for (int i = 0; i < defined.getParameterArray().length; i++)
        {
           Object arg = args[defined.getParameterArray()[i]];
           int jdbcType = typeMapping.getJdbcTypeForJavaType(arg.getClass());
           setParameter(stmt,i+1,jdbcType,arg);
        }
     }
  }
  
  
  

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

Reply via email to