User: dsundstrom
  Date: 01/11/01 15:16:33

  Modified:    src/main/org/jboss/ejb/plugins/cmp/jdbc
                        JDBCDefinedFinderCommand.java
  Log:
  Added support for ejbSelect queries.
  
  Revision  Changes    Path
  1.4       +144 -42   
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCDefinedFinderCommand.java
  
  Index: JDBCDefinedFinderCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCDefinedFinderCommand.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JDBCDefinedFinderCommand.java     2001/09/01 22:03:15     1.3
  +++ JDBCDefinedFinderCommand.java     2001/11/01 23:16:33     1.4
  @@ -14,6 +14,9 @@
   
   import org.jboss.ejb.DeploymentException;
   
  +import org.jboss.ejb.Container;
  +import org.jboss.ejb.EntityContainer;
  +import org.jboss.ejb.plugins.CMPPersistenceManager;
   import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCQueryMetaData;
   import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCDeclaredQueryMetaData;
   
  @@ -30,35 +33,136 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Michel de Groot</a>
    * @author <a href="[EMAIL PROTECTED]">danch (Dan Christopherson</a>
  - * @version $Revision: 1.3 $
  + * @version $Revision: 1.4 $
    */
  -public class JDBCDefinedFinderCommand extends JDBCFinderCommand
  -{
  -   // Attributes ----------------------------------------------------
  +public class JDBCDefinedFinderCommand extends JDBCFinderCommand {
      
      private JDBCDeclaredQueryMetaData metadata;
      private int[] parameterArray;
   
  -   // Constructors --------------------------------------------------
  +   public JDBCDefinedFinderCommand(JDBCStoreManager manager, 
  +         JDBCQueryMetaData q) throws DeploymentException {
   
  -   public JDBCDefinedFinderCommand(JDBCStoreManager manager, JDBCQueryMetaData q) 
throws DeploymentException {
         super(manager, q);
   
         metadata = (JDBCDeclaredQueryMetaData) q;
         
  +      initSelectObject();
  +
  +      String sql = buildSQL();
  +
  +      setSQL(parseParameters(sql));
  +
  +    }
  + 
  +   protected void setParameters(PreparedStatement ps, Object argOrArgs) 
  +         throws Exception {
  +
  +      Object[] args = (Object[])argOrArgs;
  +   
  +      for(int i = 0; i < parameterArray.length; i++) {
  +         Object arg = args[parameterArray[i]];
  +         int jdbcType = manager.getJDBCTypeFactory().getJDBCTypeForJavaType(
  +               arg.getClass());
  +         JDBCUtil.setParameter(log, ps, i+1, jdbcType, arg);
  +      }
  +   }
  +   
  +   /**
  +    * Initializes the entity or field to be selected.
  +    * @throws DeploymentException if the specified object is invalid or
  +    *    non-existant
  +    */
  +   private void initSelectObject() throws DeploymentException {
  +      if(metadata.getEJBName() != null) {
  +         Container c = manager.getContainer().getApplication().getContainer(
  +               metadata.getEJBName());
  +
  +
  +         if( !(c instanceof EntityContainer)) {
  +            throw new DeploymentException("declared sql can only select an " +
  +                  "entity bean");
  +         }      
  +         EntityContainer entityContainer = (EntityContainer) c;
  +      
  +         // check that the entity is managed by a CMPPersistenceManager
  +         if( !(entityContainer.getPersistenceManager() instanceof 
  +                  CMPPersistenceManager)) {
  +            throw new DeploymentException("declared-sql can only select " +
  +                  "cmp entities.");
  +         }                  
  +         CMPPersistenceManager cmpPM = (CMPPersistenceManager)
  +               entityContainer.getPersistenceManager();
  +         if( !(cmpPM.getPersistenceStore() instanceof JDBCStoreManager)) {
  +            throw new DeploymentException("declared-sql can only select " +
  +                  "a JDBC cmp entity.");
  +         }
  +         JDBCStoreManager storeManager = (JDBCStoreManager)
  +               cmpPM.getPersistenceStore();
  +      
  +         if(storeManager.getEntityBridge() == null) {
  +             throw new DeploymentException("The entity to select has not be " +
  +                   "properly initialized");
  +         }
  +         
  +         if(metadata.getFieldName() != null) {
  +            selectEntity = null;
  +            selectCMPField = storeManager.getEntityBridge()
  +                  .getCMPFieldByName(metadata.getFieldName());
  +            if(selectCMPField == null) {
  +               throw new DeploymentException("Unknown cmp field: " +
  +                     metadata.getFieldName());
  +            }
  +         } else {
  +            selectEntity = storeManager.getEntityBridge();
  +         }
  +      }
  +   }
  +   
  +   /**
  +    * Builds the sql statement based on the delcared-sql metadata specification.
  +    * @return the sql statement for this query
  +    */
  +   private String buildSQL() {
         StringBuffer sql = new StringBuffer();
  +
  +      sql.append("SELECT ");
  +      if(metadata.isSelectDistinct()) {
  +         sql.append("DISTINCT ");
  +      }
         
         String from = metadata.getFrom();
  -      if(from != null && from.length()>0) {
  -         sql.append("SELECT 
").append(SQLUtil.getColumnNamesClause(entity.getJDBCPrimaryKeyFields(), 
entityMetaData.getTableName()));
  -         sql.append(" FROM ").append(entityMetaData.getTableName());
  +      if(from != null && from.trim().length()>0) {
  +         if(selectCMPField == null) {
  +            sql.append(SQLUtil.getColumnNamesClause(
  +                  selectEntity.getJDBCPrimaryKeyFields(), 
  +                  selectEntity.getMetaData().getTableName()));
  +            sql.append(" FROM ");
  +            sql.append(selectEntity.getMetaData().getTableName());
  +         } else {
  +            sql.append(SQLUtil.getColumnNamesClause(
  +                  selectCMPField,
  +                  selectCMPField.getMetaData().getEntity().getTableName()));
  +            sql.append(" FROM ");
  +            sql.append(selectCMPField.getMetaData().getEntity().getTableName());
  +         }
  +
  +         sql.append(" ").append(from);
         } else {
  -         sql.append("SELECT 
").append(SQLUtil.getColumnNamesClause(entity.getJDBCPrimaryKeyFields()));
  -         sql.append(" FROM ").append(entityMetaData.getTableName());
  +         if(selectCMPField == null) {
  +            sql.append(SQLUtil.getColumnNamesClause(
  +                  selectEntity.getJDBCPrimaryKeyFields()));
  +            sql.append(" FROM ");
  +            sql.append(selectEntity.getMetaData().getTableName());
  +         } else {
  +            sql.append(SQLUtil.getColumnNamesClause(selectCMPField));
  +            sql.append(" FROM ");
  +            sql.append(selectCMPField.getMetaData().getEntity().getTableName());
  +         }
         }
         
  -      String where = parseWhere(metadata.getWhere());
  -      if(where.length() > 0) {
  +      String where = metadata.getWhere();
  +      if(where != null && where.trim().length() > 0) {
            sql.append(" WHERE ").append(where);
         }
         
  @@ -71,54 +175,52 @@
         if(other != null && other.trim().length() > 0) {
            sql.append(other);
         }
  -
  -      setSQL(sql.toString());
  +      return sql.toString();
      }
  - 
  -   // JDBCFinderCommand overrides ------------------------------------
   
  -   protected void setParameters(PreparedStatement ps, Object argOrArgs) throws 
Exception {
  -      Object[] args = (Object[])argOrArgs;
  -   
  -      for(int i = 0; i < parameterArray.length; i++) {
  -         Object arg = args[parameterArray[i]];
  -         int jdbcType = 
manager.getJDBCTypeFactory().getJDBCTypeForJavaType(arg.getClass());
  -         JDBCUtil.setParameter(log, ps, i+1, jdbcType, arg);
  -      }
  -   }
  -   
  -   protected String parseWhere(String where) throws DeploymentException {
  -      StringBuffer whereBuf = new StringBuffer();
  +   /**
  +    * Replaces the parameters in the specifiec sql with question marks, and 
  +    * initializes the parameter setting code. Parameters are encoded in curly
  +    * brackets use a zero based index.
  +    * @param sql the sql statement that is parsed for parameters
  +    * @return the original sql statement with the parameters replaced with a 
  +    *    question mark
  +    * @throws DeploymentException if a error occures while parsing the sql
  +    */
  +   private String parseParameters(String sql) throws DeploymentException {
  +      StringBuffer sqlBuf = new StringBuffer();
         ArrayList parameters = new ArrayList();      
         
         // Replace placeholders {0} with ?
  -      if(where != null) {
  -         where = where.trim();
  +      if(sql != null) {
  +         sql = sql.trim();
   
  -         StringTokenizer queryWhere = new StringTokenizer(where,"{}", true);
  -         while(queryWhere.hasMoreTokens()) {
  -            String token = queryWhere.nextToken();
  +         StringTokenizer tokens = new StringTokenizer(sql,"{}", true);
  +         while(tokens.hasMoreTokens()) {
  +            String token = tokens.nextToken();
               if(token.equals("{")) {
                  
  -               token = queryWhere.nextToken();
  +               token = tokens.nextToken();
                  try {
                     Integer parameterIndex = new Integer(token);
                     
  -                  // of if we are here we can assume that we have a parameter and 
not a function
  -                  whereBuf.append("?");
  +                  // of if we are here we can assume that we have 
  +                  // a parameter and not a function
  +                  sqlBuf.append("?");
                     parameters.add(parameterIndex);
                     
  -                  if(!queryWhere.nextToken().equals("}")) {
  -                     throw new DeploymentException("Invalid parameter - missing 
closing '}' : " + where);
  +                  if(!tokens.nextToken().equals("}")) {
  +                     throw new DeploymentException("Invalid parameter - " +
  +                           "missing closing '}' : " + sql);
                     }
                  } catch(NumberFormatException e) {
                     // ok we don't have a parameter, we have a function
                     // push the tokens on the buffer and continue
  -                  whereBuf.append("{").append(token);                  
  +                  sqlBuf.append("{").append(token);                  
                  }   
               } else {
                  // not parameter... just append it
  -               whereBuf.append(token);
  +               sqlBuf.append(token);
               }
            }
         }
  @@ -129,6 +231,6 @@
            parameterArray[i] = ((Integer)parameters.get(i)).intValue();
         }
         
  -      return whereBuf.toString().trim();
  +      return sqlBuf.toString().trim();
      }
   }
  
  
  

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

Reply via email to