/*******************************************************************************
 * 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 java.util.Vector;

import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.testing.framework.TransactionalTestCase;
import org.eclipse.persistence.testing.tests.unitofwork.Contact;
import org.eclipse.persistence.testing.tests.unitofwork.Person;
import org.eclipse.persistence.exceptions.RemoteCommandManagerException;


public class InsertNewCycleTest extends TransactionalTestCase {
    public Person originalPerson;
    //Must use a different thread in this test as the test is tezting for an infinite recursion
    public Thread thread;

    public void setup() {
        super.setup();
        //		originalPerson = new Person();
        //	originalPerson.name = "bob";
        UnitOfWork uow = getSession().acquireUnitOfWork();
        originalPerson = (Person)uow.readObject(Person.class);
        uow.commit();
        DistributedServer server = (DistributedServer)DistributedServersModel.getDistributedServers().get(0);
        // must make the remote session load the object so that it will be merged
        server.getDistributedSession().readObject(originalPerson);

    }

    public void test() {
        try {
            Person person1 = new Person();
            person1.name = "alfred";

            Contact contact = new Contact();
            contact.person = person1;

            Person person2 = new Person();
            person2.name = "William";

            Contact contact1 = new Contact();
            contact1.person = person2;

            Vector vector = new Vector();
            vector.add(contact);
            person2.contacts = vector;
            vector = new Vector();
            vector.add(contact1);
            person1.contacts = vector;

            UnitOfWork uow = getSession().acquireUnitOfWork();
            Person personClone = (Person)uow.readObject(originalPerson);
            vector = new Vector();
            Contact contact2 = new Contact();
            contact2.person = person1;
            vector.add(contact2);
            personClone.contacts = vector;
            uow.commit();
        } catch (RemoteCommandManagerException exception) {
            throw new TestErrorException("New Object Cycles are causing infinite recursion in Cache Synch");
        }
    }

    public void verify() {
    }

    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();
    }


}
