>  I imlemented this feature, it's a bit 'commentless' now, and i
couldn't
> test it yet.
>  I hope this will helps.
>
> bye
>  Zsombor Gegesy
>

 uhh, sorry, i forgot to implement some nice method for the Iterator,
which accepts Criteria object. (i didn't follow the ancient golden rule:
do not write code between 2 AM and 10 AM :-)

 Now i have time to test it, and as far as I see, it's okay.

In the attachment there is just the Iterator.vm and BaseIterator.java
which
i changed. The Control.vm, and Peer.vm remains the same as in my
previous email.

bye
 Zsombor

#set ($db = $table.Database)
#if ($db.Package)
    #set ($package = $db.Package)
#else
    #set ($package = $targetPackage)
#end
package ${package};

#set ($iteratorName = "${table.JavaName}Iterator")

import java.sql.Connection;
import com.workingdogs.village.Value;
import org.apache.torque.Torque;
import org.apache.torque.TorqueException;
import org.apache.torque.util.BaseIterator;
import org.apache.torque.util.Criteria;

/**
#if ($addTimeStamp)
 * This class was autogenerated by Torque on:
 *
 * [$now]
 *
#end
 *
 * <p>A simple iterator.
 *  You should use similar to <code>${table.JavaName}Peer.doSelect(Criteria)<code>
 *  Simple create a <code>Criteria</code>, after create a 
<code>${table.JavaName}Iterator</code>,
 *  and fetch EVERY <code>${table.JavaName}</code> object,
 *  or explicitly close the iterator to free the allocated 
<code>Connection</code>,<code>Statement</code>,
 *  <code>ResultSet</code>.
 *
 * <p><code>
 *   Criteria criteria = new Criteria();
 *   for ( ${iteratorName} iterator = ${iteratorName}.create${iteratorName} (criteria);
 *          iterator.hasNext(); ) {
 *       ${table.JavaName} myobject = iterator.next${table.JavaName} ();
 *      ....
 *  }
 */
public class ${iteratorName}
    extends BaseIterator
{

    /**
     * create an iterator which release the connection after finishing
     */
    private ${iteratorName}(Criteria criteria)
        throws TorqueException
    {
        super(criteria);
    }

    /**
     * create an iterator which NOT release the connection, after the finish.
     * I'm not sure this is the preferred behaviour
     */
    private ${iteratorName}(Criteria criteria,Connection con)
        throws TorqueException
    {
        super(criteria,con);
    }


    public ${table.JavaName} next${table.JavaName}()
    {
        return (${table.JavaName}) next();
    }

    public Object convert(Value[] values)
        throws TorqueException
    {
        return ${table.JavaName}Peer.row2Object( values, 0,
            ${table.JavaName}Peer.getOMClass() );
    }


    /**
     * create an iterator which release the connection after finishing
     */
    public static ${iteratorName} create${iteratorName} (Criteria criteria) 
        throws TorqueException     
    {
        return create${iteratorName} (criteria,null);
    }

    /**
     * create an iterator which NOT release the connection, after the finish, if 
Connection is not null
     * I'm not sure this is the preferred behaviour
     */
    public static ${iteratorName} create${iteratorName} (Criteria criteria,Connection 
con) 
        throws TorqueException     
    {
        if (criteria.getSelectColumns().size() == 0)
        {
            ${table.JavaName}Peer.addSelectColumns(criteria);
        }
                                                             
        // Set the correct dbName if it has not been overridden
        // criteria.getDbName will return the same object if not set to
        // another value so == check is okay and faster
        if (criteria.getDbName() == Torque.getDefaultDB())
        {
            criteria.setDbName(${table.JavaName}Peer.DATABASE_NAME);
        }

        if (con!=null) {
            return new ${iteratorName} (criteria,con);
        } else {
            return new ${iteratorName} (criteria);
        }
    }

}

package org.apache.torque.util;

/* ====================================================================
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Apache" and "Apache Software Foundation" and
 *    "Apache Turbine" must not be used to endorse or promote products
 *    derived from this software without prior written permission. For
 *    written permission, please contact [EMAIL PROTECTED]
 *
 * 5. Products derived from this software may not be called "Apache",
 *    "Apache Turbine", nor may "Apache" appear in their name, without
 *    prior written permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */

import java.util.Iterator;
import java.util.NoSuchElementException;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import com.workingdogs.village.Value;

import org.apache.torque.TorqueException;
import org.apache.torque.TorqueRuntimeException;

/**
 * This is the base class, for fetching object one-by-one from a
 * java.sql.ResultSet.
 * @author <a href="mailto:[EMAIL PROTECTED]";>Zsombor Gegesy</a>
 */
public abstract class BaseIterator implements Iterator {

    Connection connection;
    Statement statement;
    
    ResultSetMetaData metadata;
    ResultSet resultSet;
    boolean closed=false;

    boolean hasNextRow;

    public BaseIterator (ResultSet resultset)
        throws TorqueException
    {
        init(null, null, resultset);
    }

    protected BaseIterator(Connection con, String queryString) 
        throws TorqueException 
    {
        init( con, queryString );
    }
    
    protected BaseIterator(String dbName, String queryString) 
        throws TorqueException
    {
        init(dbName, queryString);
    }

    /**
     * create an iterator which release the connection after finishing
     */
    protected BaseIterator(Criteria criteria) 
        throws TorqueException 
    {
        init( criteria.getDbName(),
            BasePeer.createQueryString(criteria) );
    }

    /**
     * create an iterator which NOT release the connection, after the finish.
     * I'm not sure this is the preferred behaviour
     */
    protected BaseIterator(Criteria criteria, Connection con) 
        throws TorqueException
    {
        init( con, BasePeer.createQueryString(criteria) );
    }

    private void init(Connection con, String queryString ) 
        throws TorqueException
    {
        try {
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery( queryString );
            init(null, stmt, rs);
        } catch (SQLException sql) {
            throw new TorqueException("SQL Error:"+sql.getMessage());
        }
    }    

    private void init(String dbName, String queryString ) 
        throws TorqueException
    {
        try {
            // get the connection
            Connection con = Transaction.beginOptional(dbName, false);
            
            // create a statement 
            Statement stmt = con.createStatement();
            
            // execute the query
            ResultSet rs = stmt.executeQuery( queryString );
            
            // set up ...
            init(con, stmt, rs);        
        } catch (SQLException sql) {
            throw new TorqueException("Exception in the contructor of a BaseIterator, 
query="+queryString, sql);
        }
    }
    


    private void init(Connection con, Statement stmt, ResultSet resultset) 
        throws TorqueException 
    {
        try {
            this.connection = con;
            this.statement = stmt;
            this.resultSet  = resultset;
            this.metadata= resultSet.getMetaData();

            this.hasNextRow = resultSet.next();
        } catch (SQLException sql) {
            throw new TorqueException("SQL Error:"+sql.getMessage(),sql);
        }
    }
    


    /**
     * explicitly close the resultset/statement/connection
     */
    public synchronized void close() {
        if (!closed) {
            closed= true;
            hasNextRow = false;
            try {
                resultSet.close();
            } catch (SQLException sql) {
                // silently ignore ...
            }
            try {
                if (statement!=null) {
                    statement.close();
                }
            } catch (SQLException sql) {
                // silently ignore ...
            }                
            statement = null;
            if (connection!=null) {
                try {
                    Transaction.commit(connection);
                } catch (TorqueException te) {
                    throw new TorqueRuntimeException("TorqueException when 
"+this.getClass().getName()+" release connection", te);
                } finally {                                     
                    connection = null;
                }                    
            }
        }
    }

    /**
     * return the next Object, and when it's reach the end, close the statement with 
close()
     */
    public Object next() {
        try {
            Object result = null;
            if (hasNextRow) {
                Value[] values = new Value[ metadata.getColumnCount() ];
                for(int i=0; i<values.length;i++) {
                    values[i] = new Value( resultSet,i+1, metadata.getColumnType( i+1 
));
                }
                result = convert( values );
                hasNextRow = resultSet.next();
            }
            if (!hasNextRow) {
                close();
            }
            return result;
        } catch (TorqueException te) {
            close();
            throw new NoSuchElementException("Object creation broken, torque throwed 
an exception:"+te.getMessage());
        } catch (SQLException sql) {
            close();
            throw new NoSuchElementException("Object creation broken, sql 
exception:"+sql.getMessage());
        }
    }

    public boolean hasNext() {
        return hasNextRow;
    }

    public void remove() {
        throw new UnsupportedOperationException("Remove not supported on 
BaseIterator");
    }


    public abstract Object convert(Value[] values) throws TorqueException;
   
}
--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to