User: danch   
  Date: 02/04/16 16:10:17

  Modified:    src/main/org/jboss/ejb/plugins/jaws/jdbc Tag: Branch_2_4
                        JDBCLoadEntityCommand.java
  Log:
  merged patch #520200 for bug 517062 (resultset column ordering)
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.11.2.3  +248 -241  
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.11.2.2
  retrieving revision 1.11.2.3
  diff -u -r1.11.2.2 -r1.11.2.3
  --- JDBCLoadEntityCommand.java        14 Jul 2001 21:43:24 -0000      1.11.2.2
  +++ JDBCLoadEntityCommand.java        16 Apr 2002 23:10:17 -0000      1.11.2.3
  @@ -1,241 +1,248 @@
  -/*
  - * 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.Iterator;
  -import java.util.ArrayList;
  -import java.util.List;
  -import java.util.HashMap;
  -
  -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.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;
  -
  -/**
  - * 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.11.2.2 $
  - */
  -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)
  -   {
  -      super(factory, "Load");
  -
  -      String sql = createSelectClause() + " FROM " + jawsEntity.getTableName() 
  -                   + " WHERE " + getPkColumnWhereList();
  -      if (jawsEntity.hasSelectForUpdate())
  -      {
  -         sql += " FOR UPDATE";
  -      }
  -
  -      setSQL(sql);
  -   }
  -
  -   protected String createSelectClause() {
  -      // Select SQL
  -      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();
  -      int fieldCount = 0;
  -      while (keyIt.hasNext())
  -      {
  -         PkFieldMetaData pkField = (PkFieldMetaData)keyIt.next();
  -         
  -         sql += ((fieldCount==0) ? "" : ",") + 
  -                jawsEntity.getTableName() + "." + pkField.getColumnName();
  -         alreadyListed.put(pkField.getColumnName().toUpperCase(), pkField);
  -         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 += "," + jawsEntity.getTableName() + "." + cmpField.getColumnName();
  -            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++;
  -      }
  -      
  -      
  -      
  -      return sql;
  -   }
  -   
  -   // JPMLoadEntityCommand implementation ---------------------------
  -
  -   public void execute(EntityEnterpriseContext ctx)
  -      throws RemoteException
  -   {
  -      if ( !jawsEntity.isReadOnly() || isTimedOut(ctx) )
  -      {
  -         try
  -         {
  -            //first check to see if the data was preloaded
  -            Object[] data = factory.getPreloadData(ctx.getId());
  -            if (data != null) {
  -               loadFromPreload(data, ctx);
  -            } else {
  -               jdbcExecute(ctx);
  -            }
  -         } catch (Exception e)
  -         {
  -            throw new ServerException("Load failed", e);
  -         }
  -      }
  -   }
  -
  -   // JDBCQueryCommand overrides ------------------------------------
  -
  -   protected void setParameters(PreparedStatement stmt, Object argOrArgs)
  -      throws Exception
  -   {
  -      EntityEnterpriseContext ctx = (EntityEnterpriseContext)argOrArgs;
  -
  -      setPrimaryKeyParameters(stmt, 1, ctx.getId());
  -   }
  -
  -   protected Object handleResult(ResultSet rs, Object argOrArgs) throws Exception
  -   {
  -      EntityEnterpriseContext ctx = (EntityEnterpriseContext)argOrArgs;
  -
  -      if (!rs.next())
  -      {
  -         throw new NoSuchObjectException("Entity "+ctx.getId()+" not found");
  -      }
  -
  -      // Set values
  -      loadOneEntity(rs, ctx);
  -      
  -      return null;
  -   }
  -
  -   protected void loadFromPreload(Object[] data, EntityEnterpriseContext ctx) 
throws Exception {
  -//log.debug("PRELOAD: Loading from preload - entity "+ctx.getId());   
  -      int fieldCount = 0;
  -      Iterator iter = jawsEntity.getCMPFields();
  -      while (iter.hasNext())
  -      {
  -         CMPFieldMetaData cmpField = (CMPFieldMetaData)iter.next();
  -         
  -         setCMPFieldValue(ctx.getInstance(),
  -                          cmpField,
  -                          data[fieldCount]);
  -         fieldCount++;
  -      }
  -
  -      // Store state to be able to do tuned updates
  -      JAWSPersistenceManager.PersistenceContext pCtx =
  -         (JAWSPersistenceManager.PersistenceContext)ctx.getPersistenceContext();
  -      if (jawsEntity.isReadOnly()) pCtx.lastRead = System.currentTimeMillis();
  -      pCtx.state = getState(ctx);
  -   }
  -   
  -   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())
  -      {
  -         CMPFieldMetaData cmpField = (CMPFieldMetaData)iter.next();
  -         
  -         setCMPFieldValue(ctx.getInstance(),
  -                          cmpField,
  -                          getResultObject(rs, cmpFieldPositionInSelect[fieldCount], 
cmpField));
  -         fieldCount++;
  -      }
  -
  -      // Store state to be able to do tuned updates
  -      JAWSPersistenceManager.PersistenceContext pCtx =
  -         (JAWSPersistenceManager.PersistenceContext)ctx.getPersistenceContext();
  -      if (jawsEntity.isReadOnly()) pCtx.lastRead = System.currentTimeMillis();
  -      pCtx.state = getState(ctx);
  -
  -
  -   }
  -   
  -   // Protected -----------------------------------------------------
  -
  -   protected boolean isTimedOut(EntityEnterpriseContext ctx)
  -   {
  -      JAWSPersistenceManager.PersistenceContext pCtx =
  -         (JAWSPersistenceManager.PersistenceContext)ctx.getPersistenceContext();
  -              
  -      return (System.currentTimeMillis() - pCtx.lastRead) > 
jawsEntity.getReadOnlyTimeOut();
  -   }
  -}
  +/*
  + * 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.*;
  +
  +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.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;
  +
  +/**
  + * 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.11.2.3 $
  + */
  +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)
  +   {
  +      super(factory, "Load");
  +
  +      String sql = createSelectClause() + " FROM " + jawsEntity.getTableName() 
  +                   + " WHERE " + getPkColumnWhereList();
  +      if (jawsEntity.hasSelectForUpdate())
  +      {
  +         sql += " FOR UPDATE";
  +      }
  +
  +      setSQL(sql);
  +   }
  +
  +   protected String createSelectClause() {
  +      // Select SQL
  +      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();
  +      int fieldCount = 0;
  +      while (keyIt.hasNext())
  +      {
  +         PkFieldMetaData pkField = (PkFieldMetaData)keyIt.next();
  +         
  +         sql += ((fieldCount==0) ? "" : ",") + 
  +                jawsEntity.getTableName() + "." + pkField.getColumnName();
  +         alreadyListed.put(pkField.getColumnName().toUpperCase(), pkField);
  +         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 += "," + jawsEntity.getTableName() + "." + cmpField.getColumnName();
  +            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++;
  +      }
  +      
  +      
  +      
  +      return sql;
  +   }
  +   
  +   // JPMLoadEntityCommand implementation ---------------------------
  +
  +   public void execute(EntityEnterpriseContext ctx)
  +      throws RemoteException
  +   {
  +      if ( !jawsEntity.isReadOnly() || isTimedOut(ctx) )
  +      {
  +         try
  +         {
  +            //first check to see if the data was preloaded
  +            Object[] data = factory.getPreloadData(ctx.getId());
  +            if (data != null) {
  +               loadFromPreload(data, ctx);
  +            } else {
  +               jdbcExecute(ctx);
  +            }
  +         } catch (Exception e)
  +         {
  +            throw new ServerException("Load failed", e);
  +         }
  +      }
  +   }
  +
  +   // JDBCQueryCommand overrides ------------------------------------
  +
  +   protected void setParameters(PreparedStatement stmt, Object argOrArgs)
  +      throws Exception
  +   {
  +      EntityEnterpriseContext ctx = (EntityEnterpriseContext)argOrArgs;
  +
  +      setPrimaryKeyParameters(stmt, 1, ctx.getId());
  +   }
  +
  +   protected Object handleResult(ResultSet rs, Object argOrArgs) throws Exception
  +   {
  +      EntityEnterpriseContext ctx = (EntityEnterpriseContext)argOrArgs;
  +
  +      if (!rs.next())
  +      {
  +         throw new NoSuchObjectException("Entity "+ctx.getId()+" not found");
  +      }
  +
  +      // Set values
  +      loadOneEntity(rs, ctx);
  +      
  +      return null;
  +   }
  +
  +   protected void loadFromPreload(Object[] data, EntityEnterpriseContext ctx) 
throws Exception {
  +//log.debug("PRELOAD: Loading from preload - entity "+ctx.getId());   
  +      int fieldCount = 0;
  +      Iterator iter = jawsEntity.getCMPFields();
  +      while (iter.hasNext())
  +      {
  +         CMPFieldMetaData cmpField = (CMPFieldMetaData)iter.next();
  +         
  +         setCMPFieldValue(ctx.getInstance(),
  +                          cmpField,
  +                          data[fieldCount]);
  +         fieldCount++;
  +      }
  +
  +      // Store state to be able to do tuned updates
  +      JAWSPersistenceManager.PersistenceContext pCtx =
  +         (JAWSPersistenceManager.PersistenceContext)ctx.getPersistenceContext();
  +      if (jawsEntity.isReadOnly()) pCtx.lastRead = System.currentTimeMillis();
  +      pCtx.state = getState(ctx);
  +   }
  +   
  +   protected void loadOneEntity(ResultSet rs, EntityEnterpriseContext ctx) throws 
Exception { 
  +      int idx = JDBC_WART_OFFSET;
  +      // skip the PK fields at the beginning of the select.
  +      Iterator keyIt = jawsEntity.getPkFields();
  +       LinkedList pkList = new LinkedList();
  +      while (keyIt.hasNext()) {
  +         PkFieldMetaData pkField = (PkFieldMetaData) keyIt.next();
  +         // Creating a new object seems a little excessive but I didn't want to 
changed the PkFieldMetaData.java
  +              // XXX: Add a method to the PkFieldMetaData.java that returns the 
CMPFieldMetaData object.
  +              CMPFieldMetaData cmpField = new CMPFieldMetaData( pkField.getName(), 
pkField.getJawsEntity() );
  +              setCMPFieldValue(ctx.getInstance(),
  +                                                cmpField,
  +                                                getResultObject( rs, idx, cmpField 
) );
  +          pkList.add(pkField.getName());
  +               idx++;
  +      }
  +
  +
  +      Iterator iter = jawsEntity.getCMPFields();
  +       while (iter.hasNext())
  +      {
  +              CMPFieldMetaData cmpField = (CMPFieldMetaData)iter.next();
  +         if (!pkList.contains(cmpField.getName()) ) {// The PKs where set in the 
loop above.
  +                      setCMPFieldValue(ctx.getInstance(),
  +                                                       cmpField,
  +                                                       getResultObject(rs, idx, 
cmpField) );
  +                      idx++;
  +              }
  +
  +      }
  +
  +      // Store state to be able to do tuned updates
  +      JAWSPersistenceManager.PersistenceContext pCtx =
  +         (JAWSPersistenceManager.PersistenceContext)ctx.getPersistenceContext();
  +      if (jawsEntity.isReadOnly()) pCtx.lastRead = System.currentTimeMillis();
  +      pCtx.state = getState(ctx);
  +
  +
  +   }
  +   
  +   // Protected -----------------------------------------------------
  +
  +   protected boolean isTimedOut(EntityEnterpriseContext ctx)
  +   {
  +      JAWSPersistenceManager.PersistenceContext pCtx =
  +         (JAWSPersistenceManager.PersistenceContext)ctx.getPersistenceContext();
  +              
  +      return (System.currentTimeMillis() - pCtx.lastRead) > 
jawsEntity.getReadOnlyTimeOut();
  +   }
  +}
  
  
  

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

Reply via email to