/*
 * Copyright (c) 1998, 2021 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.identitymaps.cache;

import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.internal.identitymaps.*;

public class ConcurrentAccessTest extends AutoVerifyTestCase {
    CacheIdentityMap cache;

    public ConcurrentAccessTest() {
    }

    @Override
    public void test() {
        this.cache = new CacheIdentityMap(10, null, getAbstractSession(), false);

        org.eclipse.persistence.testing.models.employee.domain.Employee employee = new org.eclipse.persistence.testing.models.employee.domain.Employee();
        java.math.BigDecimal id = new java.math.BigDecimal(7777);
        java.util.Vector primaryKeys = new java.util.Vector();

        employee.setId(id);
        employee.setFirstName("Joe");
        employee.setLastName("Blow");
        primaryKeys.addElement(id);

        ConcurrentAccessTest.Updater updater1 = new ConcurrentAccessTest.Updater(employee, primaryKeys, this.cache);
        Thread thread1 = new Thread(updater1);

        employee = new org.eclipse.persistence.testing.models.employee.domain.Employee();
        id = new java.math.BigDecimal(6666);
        primaryKeys = new java.util.Vector();

        employee.setId(id);
        employee.setFirstName("Andy");
        employee.setLastName("Blow");
        primaryKeys.addElement(id);

        ConcurrentAccessTest.Updater updater2 = new ConcurrentAccessTest.Updater(employee, primaryKeys, this.cache);
        Thread thread2 = new Thread(updater2);

        employee = new org.eclipse.persistence.testing.models.employee.domain.Employee();
        id = new java.math.BigDecimal(5555);
        primaryKeys = new java.util.Vector();

        employee.setId(id);
        employee.setFirstName("Darlene");
        employee.setLastName("Blow");
        primaryKeys.addElement(id);

        ConcurrentAccessTest.Updater updater3 = new ConcurrentAccessTest.Updater(employee, primaryKeys, this.cache);
        Thread thread3 = new Thread(updater3);

        thread1.start();
        thread2.start();
        thread3.start();

        try {
            thread1.join();
            thread2.join();
            thread3.join();
        } catch (InterruptedException ex) {
        }
        if (updater1.hadError() || updater2.hadError() || updater3.hadError()) {
            throw new TestErrorException("Null Pointer thrown within Cache Access");
        }
    }

    private class Updater implements Runnable {
        protected Object object;
        protected java.util.Vector primaryKeys;
        protected CacheIdentityMap cache;
        protected boolean experienceError = false;

        public Updater(Object object, java.util.Vector primaryKeys, CacheIdentityMap cache) {
            this.object = object;
            this.primaryKeys = primaryKeys;
            this.cache = cache;
        }

        @Override
        public void run() {
            try {
                for (int count = 0; count < 10000; ++count) {
                    cache.put(primaryKeys, object, null, 0);
                    cache.remove(primaryKeys, null);
                }
            } catch (NullPointerException ex) {
                this.experienceError = true;
            }
        }

        public boolean hadError() {
            return experienceError;
        }
    }
}
