/*******************************************************************************
 * 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.unitofwork;

import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.AutoVerifyTestCase;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.testing.framework.TestWarningException;


public class ConcurrentReadOnInsertTest extends AutoVerifyTestCase {
    // used as monitor for test
    public static ConcurrentAddress readAddress;
    protected ConcurrentAddress addressClone;

    //used in remote unit of work tests to control when the lock is released
    public static int depth;

    public ConcurrentReadOnInsertTest() {
    }

    public void setup() {
        // The purpose of this test is to test multi-threaded server execution,
        // remote is for a single client, so this test is not relevant.
        if (getSession().isDistributedSession()) {
            throw new TestWarningException("Test unavailable on Remote UnitOfWork.");
        }
        getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
    }

    public void test() {
        ConcurrentAddress address = new ConcurrentAddress();
        address.setCity("Toronto");
        address.setPostalCode("L5J2B5");
        address.setProvince("ONT");
        address.setStreet("1450 Acme Cr., suite 4");
        address.setCountry("Canada");
        Thread thread = new Thread(this.runnable());
        UnitOfWork uow = getSession().acquireUnitOfWork();
        addressClone = (ConcurrentAddress)uow.registerObject(address);
        //used by thread as a monitor and process control
        ConcurrentReadOnInsertTest.readAddress = new ConcurrentAddress();
        try {
            synchronized (ConcurrentReadOnInsertTest.readAddress) {
                ConcurrentReadOnInsertTest.depth = 1;

                //start the thread and wait for the thread to get under way before continueing.
                thread.start();
                ConcurrentReadOnInsertTest.readAddress.wait();
            }
        } catch (Exception ex) {
            //just ignore
        }
        uow.commit();
        try {
            thread.join();
        } catch (Exception ex) {
            //just an inturrupt ignore
        }
        if (address != ConcurrentReadOnInsertTest.readAddress) {
            throw new TestErrorException(" The object returned from the Cache and the object merged into the cache are of different identity. see bug 2632705");
        }
    }

    public Runnable runnable() {
        return new Runnable() {
                public void run() {
                    try {
                        synchronized (readAddress) {
                            //wake up the unit of work
                            readAddress.notifyAll();
                            readAddress.wait();
                        }
                    } catch (Exception ex) {
                        //just an inturrupt ignore
                    }
                    readAddress = (ConcurrentAddress)getSession().readObject(addressClone);
                }
            };
    }

    public void reset() {
        try {
            UnitOfWork unitOfWork = getSession().acquireUnitOfWork();
            unitOfWork.deleteObject(ConcurrentReadOnInsertTest.readAddress);
            unitOfWork.commit();
        } finally {
            ConcurrentReadOnInsertTest.readAddress = null;
        }
        getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
    }
}
