/*******************************************************************************
 * 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.expressions.ExpressionBuilder;
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.models.employee.domain.Employee;
import org.eclipse.persistence.testing.models.employee.domain.PhoneNumber;


//Bug4736360  A new clone from parent UOW should only be registered once in a nested UOW
public class NestedUOWWithNewObjectRegisteredTwiceTest extends AutoVerifyTestCase {
    public NestedUOWWithNewObjectRegisteredTwiceTest() {
        setDescription("");
    }

    String firstName;
    String areaCode;
    PhoneNumber pNT02REL;
    PhoneNumber pNT02REG;

    public void setup() {
        getAbstractSession().beginTransaction();

        firstName = "Master_" + System.currentTimeMillis();
        areaCode = "617";

        UnitOfWork uow = getSession().acquireUnitOfWork();
        Employee emp = (Employee)uow.registerObject(new Employee());
        emp.setFirstName(firstName);
        uow.commit();
    }

    public void reset() {
        getAbstractSession().rollbackTransaction();
    }

    public void test() {

        Employee empRO = 
            (Employee)getSession().readObject(Employee.class, new ExpressionBuilder().get("firstName").equal(firstName));

        // start transaction T0
        UnitOfWork uowT0 = getSession().acquireUnitOfWork();
        Employee empT0 = (Employee)uowT0.registerObject(empRO);

        // create phone number and commit in a nested unit of work
        UnitOfWork uowT01 = uowT0.acquireUnitOfWork();
        Employee empT01 = (Employee)uowT01.registerObject(empT0);
        PhoneNumber pN = (PhoneNumber)uowT01.registerObject(new PhoneNumber());
        pN.setAreaCode(areaCode);
        empT01.addPhoneNumber(pN);
        uowT01.commit();

        // the phone number is a new object in uowT0
        PhoneNumber pNT0 = (PhoneNumber)empT0.getPhoneNumbers().get(0);

        // start another nested unit of work
        UnitOfWork uowT02 = uowT0.acquireUnitOfWork();
        uowT02.setShouldNewObjectsBeCached(true);
        // load empT0 from the parent cache and clone and register it
        Employee empT02 = (Employee)uowT02.registerObject(empT0);
        // get detail via relation.  this will trigger the value holder and clone and register phone number in uowT02
        pNT02REL = (PhoneNumber)empT02.getPhoneNumbers().get(0);
        // get detail via registration.  this should return the same clone as referenced by pNT02REL
        pNT02REG = (PhoneNumber)uowT02.registerObject(pNT0);

        uowT0.commit();
    }

    protected void verify() {
        if (pNT02REL != pNT02REG) {
            throw new TestErrorException("PhoneNumber is registered twice in the nested unit of work");
        }
    }
}
