blob: fc20715ce8b435400c20891bc4cc89aae69f1fc6 [file] [log] [blame]
/*
* 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;
}
}