/*******************************************************************************
 * 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.distributedservers;

import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.testing.framework.TransactionalTestCase;


public class InsertNewObjectIntoCycleTest extends TransactionalTestCase {
    public Dist_Employee originalEmployee;
    public Company originalCompany;
    //Must use a different thread in this test as the test is tezting for an infinite recursion
    public Thread thread;

    public void test() {
        DistributedServer server = (DistributedServer)DistributedServersModel.getDistributedServers().get(0);
        originalEmployee = (Dist_Employee)server.getDistributedSession().readObject(Dist_Employee.class);
        originalCompany = (Company)server.getDistributedSession().readObject(Company.class);

        UnitOfWork uow = getSession().acquireUnitOfWork();
        originalEmployee = (Dist_Employee)uow.readObject(originalEmployee);
        originalCompany = (Company)uow.readObject(originalCompany);

        Item item = Item.example1();
        originalEmployee.heldItems.add(item);
        item.employeeHolder = originalEmployee;

        originalCompany.ownedItems.add(item);
        item.companyOwner = originalCompany;
        uow.commit();
    }

    public void verify() {
        DistributedServer server = (DistributedServer)DistributedServersModel.getDistributedServers().get(0);
        Dist_Employee emp = (Dist_Employee)server.getDistributedSession().readObject(originalEmployee);
        Company company = (Company)server.getDistributedSession().readObject(originalCompany);
        if (company.ownedItems.contains(null) || emp.heldItems.contains(null)) {
            throw new TestErrorException("Object was not merged correctly on remote cache.  Null was inserted into Collection CR 4012");
        }
    }

    public void reset() {
        super.reset();
        DistributedServer server = (DistributedServer)DistributedServersModel.getDistributedServers().get(0);
        // must make the remote session load the object so that it will be merged
        server.getDistributedSession().getIdentityMapAccessor().initializeAllIdentityMaps();
    }


}
