/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     John Vandale - initial API and implementation
 ******************************************************************************/  
package org.eclipse.persistence.testing.tests.queries;

import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.exceptions.DatabaseException;

/**
 * Bug 309142 - Test that invoking hasNext() on a forward only result set does not
 * throw an SQLException.  This test uses a stored procedure call to 
 * get back a forward only result set.
 */
public class ScrollableCursorForwardOnlyResultSetTest extends TestCase {
    protected ScrollableCursor cursor;
    protected DatabaseException caughtException = null;

    public ScrollableCursorForwardOnlyResultSetTest() {
        setDescription("Test the scrollable cursor hasNext() on a forward only result set");
    }

    protected void setup() {
        if (!(getSession().getPlatform().isOracle())) {
            throwWarning("This test is intended for Oracle databases only.");
        }
    }

    public void test() {
        //stored procedure call
        StoredProcedureCall spCall = new StoredProcedureCall();
        spCall.setProcedureName("Read_All_Employees");
        spCall.useNamedCursorOutputAsResultSet("RESULT_CURSOR");

        //query
        DirectReadQuery query = new DirectReadQuery();
        query.setCall(spCall);
        query.useScrollableCursor();
        cursor = (ScrollableCursor)getSession().executeQuery(query);
        
        // If the driver returns a forward-only ResultSet initialized to afterLast there's nothing ScrollableCursor can do with it.
        try{
            if ((cursor.getResultSet().isAfterLast()) && (cursor.getResultSet().getType() == java.sql.ResultSet.TYPE_FORWARD_ONLY)) {
                throwWarning("The ResultSet returned from the query is TYPE_FORWARD_ONLY and initialized to afterLast.");
            }
        } catch (java.sql.SQLException sqle) {
            throwWarning("Unexpected SQLException thrown while checking the ResultSet.");
        }
        
        // iterate the cursor
        try {
            while (cursor.hasNext()) {
                cursor.next();
            }
        } catch (org.eclipse.persistence.exceptions.DatabaseException dbe) {
            caughtException = dbe;
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }

    /**
     * Verify if the scrollable cursor can iterate a forward only result set 
     */
    protected void verify() {
        if (caughtException != null) {
            if (caughtException.getDatabaseErrorCode() == 17075) {//SQLException: Invalid operation for forward only result set
                throwError("The scrollable cursor can't iterate a forward only result set", caughtException);
            } else {
                throwError(caughtException.getMessage(), caughtException);
            }
        }
    }
}
