/*******************************************************************************
 * 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:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.tests.customsqlstoredprocedures;

import java.util.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
import org.eclipse.persistence.exceptions.*;

/**
 * CR# 3978 DatabaseAccessor.executeCall(...) not currently set up to retrieve BOTH a ResultSet and
 * an OUT parameter from the same  stored procedure. This problem only surfaces on database
 * platforms that provide stored procedure support for BOTH ResultSets and OUT parameters e.g. DB2
 * and Sybase
 */
public class StoredProcedureResultSetAndOutputTest extends TestCase {
    protected StoredProcedureCall call = null;
    protected DatabaseException caughtException = null;
    protected Vector events = null;
    protected Vector result = null;
    private boolean shouldBindAllParameters;
    private boolean shouldBindAllParametersOriginal;

    public StoredProcedureResultSetAndOutputTest() {
        this(true);
    }

    public StoredProcedureResultSetAndOutputTest(boolean shouldBindAllParameters) {
        super();
        this.shouldBindAllParameters = shouldBindAllParameters;
        setName(getName() + " bind = " + shouldBindAllParameters);
    }

    /**
     * this method is required to retrieve the "call" variable in all sub-classes
     */
    public StoredProcedureCall getStoredProcedureCall() {
        return call;
    }

    public void setup() {
        shouldBindAllParametersOriginal = getSession().getLogin().shouldBindAllParameters();
        // Note: Normally we build a stored procedure for execution in the setup method.
        // DB2 does not allow us to do that, so we assume the procedure exists.
        // Stored procecures with both result sets and output parameters are not supported
        // on all DBs currently we just test DB2.
        // ET: This test does not support jcc driver(bug 3551317)
        if (!(getSession().getPlatform().isDB2()) || (getSession().getLogin().getDatabaseURL().indexOf("jcc") == -1)) {
            throw new TestWarningException("This test can only be run in DB2, and not support jcc driver.");
        }
        getSession().getIdentityMapAccessor().initializeAllIdentityMaps();

        // Setup the event listener for the output parameters
        events = new Vector();
        getSession().getEventManager().addListener(new StoredProcedureOutputListener(this.events));

        call = new StoredProcedureCall();

        getSession().getLogin().setShouldBindAllParameters(shouldBindAllParameters);
        buildStoredProcedureCall();
    }

    /**
     * build instance of StoredProcedureCall
     */
    public void buildStoredProcedureCall() {
        call.setProcedureName("OUT_RES_TEST");
        call.addUnamedOutputArgument("OUT1");
        call.addUnamedOutputArgument("OUT2");
        call.addUnamedOutputArgument("OUT3");
        call.setReturnsResultSet(true);
    }

    /**
     * ReadAllQuery used to determine if correct results obtained from stored procedure call
     */
    public void test() {
        ReportQuery query = new ReportQuery(Employee.class, new org.eclipse.persistence.expressions.ExpressionBuilder());
        query.setCall(call);
        query.addAttribute("firstName");
        try {
            result = (Vector)getSession().executeQuery(query);
        } catch (DatabaseException de) {
            caughtException = de;
        }
    }

    public void verify() throws Exception {
        if (caughtException != null) {
            throw new TestErrorException("Test to return a ResultSet and an OUT parameter from a stored procedure failed.\n" + "This exception thrown while testing test case.\n" + "----- StoredProcedureResultSetAndOutputTest() -----\n" + caughtException.getMessage());
        }
        if ((result == null) || (result.size() != 12)) {
            throw new TestErrorException("The stored procedure was executed but no values were returned in the result set: " + result);

        }
        if (events.isEmpty() || (((DatabaseRecord)((SessionEvent)events.elementAt(0)).getResult()).getFields().size() != 3)) {
            throw new TestErrorException("The stored procedure was executed but the return values were not returned.");
        }
    }

    public void reset() {
        getSession().getLogin().setShouldBindAllParameters(shouldBindAllParametersOriginal);
        getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
    }
}
