/*******************************************************************************
 * 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:
 *     08/15/2008-1.0.1 Chris Delahunt 
 *       - 237545: List attribute types on OneToMany using @OrderBy does not work with attribute change tracking
 ******************************************************************************/ 
package org.eclipse.persistence.testing.tests.distributedcache;

import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.testing.models.employee.domain.Child;
import org.eclipse.persistence.testing.models.employee.domain.Employee;

public class OrderedListMergeTest3 extends OrderedListMergeTest {
    
    Child childtoremove;
    
    protected void modifyCollection(UnitOfWork uow, Object objectToModify) {
        Child newChildWC = (Child)uow.registerNewObject(newItemForCollection());
        ((Employee)objectToModify).children.set(0, newChildWC);
        newChildWC.parent = (Employee)objectToModify;
        
        childtoremove = (Child)((Employee)objectToModify).children.remove(1);
    }
    
    protected void test() {
        Session clientSession1 = cluster1Session.acquireClientSession();
        Session clientSession2 = cluster2Session.acquireClientSession();

        cluster2Session.getIdentityMapAccessor().initializeAllIdentityMaps();
        cluster2Session.getEventManager().addListener(buildCacheMergeBlockingListener());
        
        //load object in both sessions:
        Object object1 = findOriginalObject(clientSession1);

        if (object1 == null) {
            throw new TestErrorException("Employee does not exist on Server 1");
        }
        int initialNumProjs = getCollectionSize(object1);
        
        Object object2 = findOriginalObject(clientSession2);
        if (object2 == null) {
            throw new TestErrorException("Employee does not exist on Server 2");
        }
        getCollectionSize(object2);
        
        //run test:
        
        UnitOfWork uow = clientSession1.acquireUnitOfWork();
        Object newEmpWC = uow.registerObject(object1);
        modifyCollection(uow, newEmpWC);
        
        semaphore.acquire();

        uow.commit();
        
        try {
            //wait till we are sure the other session is ready to merge
            while (semaphore.getNumberOfWritersWaiting() == 0) {
                Thread.sleep(10);
            }
        } catch (Exception e) {
            throw new TestErrorException("Error while getting Thread to sleep", e);
        }
        
        semaphore.release();
        //wait for session2 to merge 
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            throw new TestErrorException("Error while getting Thread to sleep", e);
        }

        semaphore.acquire();
        
        if ( getCollectionSize(object1) != getCollectionSize(object2) ){
            throw new TestErrorException("Size of the collections do not match, expected "+ getCollectionSize(object1)+" got "+getCollectionSize(object2));
        }
        //check objects collection ordering against each other
        if (!compareObjectsCollections(object1, object2)) {
            throw new TestErrorException("order does not match what is expected");
        }
        semaphore.release();
    }

}
