/*
 * Copyright (c) 1998, 2021 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     dminsky - initial implementation
package org.eclipse.persistence.testing.tests.optimisticlocking.cascaded;

import org.eclipse.persistence.testing.framework.TestCase;

import org.eclipse.persistence.testing.models.employee.relational.EmployeeProject;
import org.eclipse.persistence.testing.models.employee.domain.Employee;
import org.eclipse.persistence.testing.models.employee.domain.PhoneNumber;
import org.eclipse.persistence.testing.models.employee.domain.Child;
import org.eclipse.persistence.testing.models.employee.domain.Project;

import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.descriptors.VersionLockingPolicy;
import org.eclipse.persistence.mappings.ForeignReferenceMapping;

/**
 * <pre>{@code
 * Project --\
 *            ---> Employee --> PhoneNumber
 * Child ----/
 *}</pre>
 * EL bug 342632
 */
public class CascadedVersionLockingMultiplePrivateOwnedTest extends TestCase {

    protected EmployeeProject project;
    protected ClassDescriptor employeeDescriptor;
    protected ClassDescriptor projectDescriptor;
    protected ClassDescriptor childDescriptor;
    protected ClassDescriptor phoneNumberDescriptor;
    protected DatabaseSession customSession;

    public CascadedVersionLockingMultiplePrivateOwnedTest() {
        setDescription("Test the correct number of CascadeLockingPolicy objects are created for multiple private ownership");
    }

    @Override
    public void setup() {
        // Customise an EmployeeProject with private-ownership, version locking, and cascade locking
        project = new EmployeeProject();

        employeeDescriptor = project.getDescriptor(Employee.class);
        projectDescriptor = project.getDescriptor(Project.class);
        childDescriptor = project.getDescriptor(Child.class);
        phoneNumberDescriptor = project.getDescriptor(PhoneNumber.class);

        ClassDescriptor[] descriptors = new ClassDescriptor[] {
            employeeDescriptor, projectDescriptor, childDescriptor, phoneNumberDescriptor };

        for (ClassDescriptor descriptor : descriptors) {
            // configure version locking
            VersionLockingPolicy lockingPolicy = new VersionLockingPolicy();
            String versionFieldName = descriptor.getTableName() + ".VERSION";
            lockingPolicy.setWriteLockFieldName(versionFieldName);
            lockingPolicy.storeInCache();
            descriptor.setOptimisticLockingPolicy(lockingPolicy);
        }

        // cascade Project and Child descriptors, referencing the Employee Descriptor
        ((VersionLockingPolicy)projectDescriptor.getOptimisticLockingPolicy()).setIsCascaded(true);
        ((VersionLockingPolicy)childDescriptor.getOptimisticLockingPolicy()).setIsCascaded(true);

        // configure private ownership
        ForeignReferenceMapping childrenMapping = (ForeignReferenceMapping) employeeDescriptor.getMappingForAttributeName("children");
        childrenMapping.setIsPrivateOwned(false); // Configure false for this specific scenario, Normally Employee->Child is P-O

        ForeignReferenceMapping teamLeaderMapping = (ForeignReferenceMapping) projectDescriptor.getMappingForAttributeName("teamLeader");
        teamLeaderMapping.setIsPrivateOwned(true); // referencing Employee P-O

        ForeignReferenceMapping parentMapping = (ForeignReferenceMapping) childDescriptor.getMappingForAttributeName("parent");
        parentMapping.setIsPrivateOwned(true); // referencing Employee P-O

        ForeignReferenceMapping phoneNumbersMapping = (ForeignReferenceMapping) employeeDescriptor.getMappingForAttributeName("phoneNumbers");
        phoneNumbersMapping.setIsPrivateOwned(true); // referencing PhoneNumber P-O

        // use a new session
        customSession = project.createDatabaseSession();
        customSession.setLogin(getSession().getLogin().clone());
    }

    @Override
    public void test() {
        customSession.login();
    }

    @Override
    public void verify() {
        // project and child should have no cascade locking policies
        assertEquals("Project should have 0 policies", 0, projectDescriptor.getCascadeLockingPolicies().size());
        assertEquals("Child should have 0 policies", 0, childDescriptor.getCascadeLockingPolicies().size());
        // employee should have two policies (1 from employee, 1 from child)
        assertEquals("Employee should have 2 policies", 2, employeeDescriptor.getCascadeLockingPolicies().size());
        // phoneNumber should have one policy (1 from employee)
        // (in the original bug, this was the issue that was reported)
        assertEquals("PhoneNumber should have 1 policy", 1, phoneNumberDescriptor.getCascadeLockingPolicies().size());
    }

    @Override
    public void reset() {
        project = null;
        projectDescriptor = null;
        childDescriptor = null;
        employeeDescriptor = null;
        phoneNumberDescriptor = null;
        if (customSession != null && customSession.isConnected()) {
            customSession.logout();
        }
        customSession = null;
    }

}
