/*******************************************************************************
 * 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.jpql;

import java.util.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.*;

public class SimpleParameterTestChangingParameters extends JPQLParameterTestCase {
    Employee first;
    Employee second;
    Vector firstParameters;
    Vector secondParameters;

    public void setup() {
        // Get the baseline employees for the verify
        Vector employees = getSomeEmployees();
        first = (Employee)employees.firstElement();
        second = (Employee)employees.elementAt(1);

        String parameterName = "firstName";
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression whereClause = builder.get("firstName").equal(builder.getParameter(parameterName));

        ReadAllQuery raq = new ReadAllQuery();
        raq.setReferenceClass(Employee.class);
        raq.setSelectionCriteria(whereClause);
        raq.addArgument(parameterName);

        firstParameters = new Vector();
        firstParameters.add(first.getFirstName());
        secondParameters = new Vector();
        secondParameters.add(second.getFirstName());

        Vector firstEmployees = (Vector)getSession().executeQuery(raq, firstParameters);
        Vector secondEmployees = (Vector)getSession().executeQuery(raq, secondParameters);
        Vector allEmployees = new Vector();
        allEmployees.addAll(firstEmployees);
        allEmployees.addAll(secondEmployees);

        // Set up the EJBQL using the retrieved employees
        String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
        ejbqlString = ejbqlString + "emp.firstName = ?1 ";

        setEjbqlString(ejbqlString);
        setOriginalOject(allEmployees);

        //        setArguments(parameters);
        Vector myArgumentNames = new Vector();
        myArgumentNames.add("1");

        //setArgumentsNames(myArgumentNames);
        // Finish the setup
        super.setup();
    }

    public void test() {
        try {
            Vector firstSetOfResults;
            Vector secondSetOfResults;

            //populateQuery();
            getQuery().addArgument("1");
            getSession().logMessage("Running EJBQL -> " + getEjbqlString());
            firstSetOfResults = (Vector)getSession().executeQuery(getQuery(), firstParameters);
            secondSetOfResults = (Vector)getSession().executeQuery(getQuery(), secondParameters);

            Vector allResults = new Vector();
            allResults.addAll(firstSetOfResults);
            allResults.addAll(secondSetOfResults);

            setReturnedObjects(allResults);
        } catch (Exception e) {
            throw new TestErrorException(e.getMessage());
        }
    }
}
