/*******************************************************************************
 * 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.simultaneous;

import java.util.*;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.descriptors.DescriptorQueryManager;
import org.eclipse.persistence.expressions.*;

/**
 * Bug 3355199
 * Test to ensure the multiple addQuery()s to DescriptorQueryManager in multiple threads
 * will not result in null queries being return by getQuery.
 */
public class DescriptorQueryManagerMultithreadedTest extends MultithreadTestCase {
    protected Vector queries = null;
    public static final String QUERY_STRING = "TestQuery";

    /**
     * Inner class to test DescriptorQueryManager
     * Defined as an inner class because this class cannot properly clean up the DescriptorQueryManager
     * without using the methods in Multithreaded test.
     */
    public class DescriptorQueryManagerAddQueryTest extends AutoVerifyTestCase {
        protected DescriptorQueryManager queryManager = null;

        public DescriptorQueryManagerAddQueryTest() {
            setDescription("Ensure DescriptorQueryManager works well with concurrent getQuery() and addQuery()");
        }

        public void test() {
            queryManager = getSession().getDescriptor(Employee.class).getQueryManager();

            // get the query to see if it exists and then sleep to allow other threads to get past this
            // line of code - all threads should find the query as null
            ReadObjectQuery query = (ReadObjectQuery)queryManager.getQuery(QUERY_STRING);
            try {
                Thread.sleep(3000);
            } catch (InterruptedException exc) {
            }
            ;
            if (query == null) {
                ExpressionBuilder bld = new org.eclipse.persistence.expressions.ExpressionBuilder();
                Expression exp = bld.get("firstName").equal(bld.getParameter("myFirstName"));

                query = new ReadObjectQuery(Employee.class, exp);
                query.addArgument("myFirstName");
                // Add a query.  For the first thread, this should do a simple add, for all subsequent adds,
                // this should do a replace
                queryManager.addQuery(QUERY_STRING, query);
            }
        }

        public void verify() {
            // getQuery() will return null if either there is no query in the list, or if there
            // are multiple queries in the list since we are not providing a list of arguments.
            if (queryManager.getQuery(QUERY_STRING) == null) {
                throw new TestErrorException("QueryManager.addQuery() is having concurrency problems.");
            }
        }
    }

    // End of inner class definition
    public DescriptorQueryManagerMultithreadedTest() {
        super();
        setDescription("Tests adding queris to a DescriptorQueryManager with multiple simultaneous threads");
        Vector tests = new Vector();
        tests.add(new DescriptorQueryManagerAddQueryTest());
        tests.add(new DescriptorQueryManagerAddQueryTest());
        tests.add(new DescriptorQueryManagerAddQueryTest());
        tests.add(new DescriptorQueryManagerAddQueryTest());
        tests.add(new DescriptorQueryManagerAddQueryTest());
        tests.add(new DescriptorQueryManagerAddQueryTest());
        tests.add(new DescriptorQueryManagerAddQueryTest());
        tests.add(new DescriptorQueryManagerAddQueryTest());
        tests.add(new DescriptorQueryManagerAddQueryTest());
        tests.add(new DescriptorQueryManagerAddQueryTest());
        setTests(tests);
    }

    public void setup() {
        super.setup();
        // save the current queries
        ClassDescriptor descriptor = getSession().getClassDescriptor(Employee.class);
        Map queryTable = descriptor.getQueryManager().getQueries();
        if (queryTable != null) {
            queries = (Vector)queryTable.get(QUERY_STRING);
        }
    }

    public void reset() {
        super.reset();
        // restore the current queries
        DescriptorQueryManager queryManager = getSession().getDescriptor(Employee.class).getQueryManager();
        queryManager.removeQuery(QUERY_STRING);
        if (queries != null) {
            Enumeration enumtr = queries.elements();
            while (enumtr.hasMoreElements()) {
                queryManager.addQuery((DatabaseQuery)enumtr.nextElement());
            }
        }
    }
}
