User: danch   
  Date: 01/06/05 18:07:40

  Modified:    src/main/org/jboss/ejb/plugins/jaws/jdbc JDBCCommand.java
                        JDBCLoadEntityCommand.java
  Log:
  Fixed bug caused by change in load operation associated with finder optimization.
  
  Revision  Changes    Path
  1.32      +4 -3      jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCCommand.java
  
  Index: JDBCCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCCommand.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- JDBCCommand.java  2001/05/30 23:00:42     1.31
  +++ JDBCCommand.java  2001/06/06 01:07:40     1.32
  @@ -57,7 +57,7 @@
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dirk Zimmermann</a>
  - * @version $Revision: 1.31 $
  + * @version $Revision: 1.32 $
    */
   public abstract class JDBCCommand
   {
  @@ -386,6 +386,7 @@
       protected Object getResultObject(ResultSet rs, int idx, Class destination)
           throws SQLException{
   
  +log.debug("getting a "+destination.getName()+" from resultset at index "+idx);
           Object result = null;
   
           Method method = (Method)rsTypes.get(destination.getName());
  @@ -484,9 +485,9 @@
                        } catch (RemoteException e) {
                                throw new SQLException("Unable to load EJBObject back 
from Handle: " +e);
               } catch (IOException e) {
  -                throw new SQLException("Unable to load a ResultSet column into a 
variable of type '"+destination.getName()+"': "+e);
  +                throw new SQLException("Unable to load a ResultSet column "+idx+" 
into a variable of type '"+destination.getName()+"': "+e);
               } catch (ClassNotFoundException e) {
  -                throw new SQLException("Unable to load a ResultSet column into a 
variable of type '"+destination.getName()+"': "+e);
  +                throw new SQLException("Unable to load a ResultSet column "+idx+" 
into a variable of type '"+destination.getName()+"': "+e);
               }
           }
   
  
  
  
  1.10      +55 -10    
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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- JDBCLoadEntityCommand.java        2001/05/27 00:49:15     1.9
  +++ JDBCLoadEntityCommand.java        2001/06/06 01:07:40     1.10
  @@ -11,6 +11,8 @@
   import java.lang.reflect.Method;
   
   import java.util.Iterator;
  +import java.util.ArrayList;
  +import java.util.List;
   import java.util.HashMap;
   
   import java.rmi.NoSuchObjectException;
  @@ -36,12 +38,28 @@
    * @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.9 $
  + * @author <a href="mailto:[EMAIL PROTECTED]";>danch (Dan Christopherson)</a>
  + * @version $Revision: 1.10 $
    */
   public class JDBCLoadEntityCommand
      extends JDBCQueryCommand
      implements JPMLoadEntityCommand
   {
  +   /**what is the position of each cmp field in the generated select statement?
  +    * this simply maps the position of the field in the CMP list to its position
  +    * in the generated select statement. This is neccessary because of the variable
  +    * number of key columns (which are skipped in a load) and because there can
  +    * be overlap between the two: pkfields and cmpfields are neither disjoint sets
  +    * nor is the cmpfields a subset of pkfields (not that that makes sense to
  +    * me right now, but I'll roll with it until I have more chance to analyse - 
danch)
  +    */
  +   int [] cmpFieldPositionInSelect = null;
  +
  +   /** This const is used in places where I need to add an offset to a count
  +    *  to account for the fact that JDBC counts from one whilst every other
  +    *  damn thing in the languase starts at 0, the way God intended!
  +    */
  +   private static final int JDBC_WART_OFFSET = 1;   
      // Constructors --------------------------------------------------
   
      public JDBCLoadEntityCommand(JDBCCommandFactory factory)
  @@ -62,27 +80,47 @@
         String sql = "SELECT ";
         HashMap alreadyListed = new HashMap();
         // put the key fields in first 
  +      // we'll stash the column names here so that we can later map an overlapped
  +      // column (overlap between PK and CMP) into its spot in the select statement.
  +      String[] pkColumnNames = new String[jawsEntity.getNumberOfPkFields()];
         Iterator keyIt = jawsEntity.getPkFields();
  -      boolean first = true;
  +      int fieldCount = 0;
         while (keyIt.hasNext())
         {
            PkFieldMetaData pkField = (PkFieldMetaData)keyIt.next();
            
  -         sql += (first ? "" : ",") +
  -                pkField.getColumnName();
  +         sql += ((fieldCount==0) ? "" : ",") + pkField.getColumnName();
            alreadyListed.put(pkField.getColumnName().toUpperCase(), pkField);
  -         first = false;
  +         pkColumnNames[fieldCount]=pkField.getColumnName();
  +         fieldCount++;
         }
         
  +      cmpFieldPositionInSelect = new int[jawsEntity.getNumberOfCMPFields()];
         Iterator it = jawsEntity.getCMPFields();
  -
  +      int cmpFieldCount = 0;
         while (it.hasNext())
         {
            CMPFieldMetaData cmpField = (CMPFieldMetaData)it.next();
            if (alreadyListed.get(cmpField.getColumnName().toUpperCase()) == null) {
               sql += "," + cmpField.getColumnName();
  -            alreadyListed.put(cmpField.getColumnName().toUpperCase(), cmpField);
  +            cmpFieldPositionInSelect[cmpFieldCount] = fieldCount+JDBC_WART_OFFSET;
  +            fieldCount++;//because this was another field in the select
  +         } else {
  +            //DO NOT increment field count, this isn't another in the select.
  +            //linear search (yech!) of the pkColumnNames - we only do this once per 
bean, however
  +            for (int i=0;i<pkColumnNames.length;i++) {
  +               if (pkColumnNames[i].equalsIgnoreCase(cmpField.getColumnName())) {
  +                  cmpFieldPositionInSelect[cmpFieldCount] = i+JDBC_WART_OFFSET;
  +                  break;
  +               }
  +            }
  +            if (cmpFieldPositionInSelect[cmpFieldCount] < 1) {
  +               log.error("Error: Can't find first occurence of repeated column "+
  +                         cmpField.getName()+" when building CMP load SQL for "+
  +                         jawsEntity.getName());
  +            }
            }
  +         cmpFieldCount++;
         }
         
         sql += " FROM " + jawsEntity.getTableName();
  @@ -127,7 +165,6 @@
         }
   
         // Set values
  -System.out.print("!");
         loadOneEntity(rs, ctx);
         
         return null;
  @@ -135,7 +172,14 @@
   
      protected void loadOneEntity(ResultSet rs, EntityEnterpriseContext ctx) throws 
Exception {      
         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;
         Iterator iter = jawsEntity.getCMPFields();
         while (iter.hasNext())
         {
  @@ -143,7 +187,8 @@
            
            setCMPFieldValue(ctx.getInstance(), 
                             cmpField, 
  -                          getResultObject(rs, idx++, cmpField));
  +                          getResultObject(rs, cmpFieldPositionInSelect[fieldCount], 
cmpField));
  +         fieldCount++;
         }
   
         // Store state to be able to do tuned updates
  
  
  

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

Reply via email to