blob: 8befd84d54c8d8faffba7e4739a2371836dcc874 [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:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.unitofwork;
import java.util.Vector;
import org.eclipse.persistence.exceptions.OptimisticLockException;
import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.sessions.SessionEventListener;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.testing.framework.TestWarningException;
import org.eclipse.persistence.testing.models.employee.domain.Employee;
import org.eclipse.persistence.testing.models.employee.domain.LargeProject;
import org.eclipse.persistence.testing.models.employee.domain.SmallProject;
public class MultipleUnitOfWorkTest extends org.eclipse.persistence.testing.framework.WriteObjectTest {
public Object firstUnitOfWorkWorkingCopy;
public UnitOfWork firstUnitOfWork;
public Object secondUnitOfWorkWorkingCopy;
public UnitOfWork secondUnitOfWork;
// On some platforms (Sybase) if conn1 updates a row but hasn't yet committed transaction then
// reading the row through conn2 may hang.
// To avoid this problem the listener would decrement transaction isolation level,
// then reading through conn2 no longer hangs, however may result (results on Sybase)
// in reading of uncommitted data.
SessionEventListener listener;
/**
* MultipleUnitOfWorkTest constructor comment.
*/
public MultipleUnitOfWorkTest() {
super();
}
/**
* MultipleUnitOfWorkTest constructor comment.
* @param originalObject java.lang.Object
*/
public MultipleUnitOfWorkTest(Object originalObject) {
super(originalObject);
}
protected void changeFirstUnitOfWorkWorkingCopy() {
Employee employee = (Employee)this.firstUnitOfWorkWorkingCopy;
// Transformation
employee.setNormalHours(new java.sql.Time[3]);
employee.setStartTime(Helper.timeFromHourMinuteSecond(2, 2, 2));
employee.setEndTime(Helper.timeFromHourMinuteSecond(2, 2, 2));
// Aggregate
employee.setPeriod(new org.eclipse.persistence.testing.models.employee.domain.EmploymentPeriod(Helper.dateFromYearMonthDate(1903,
3,
3),
Helper.dateFromYearMonthDate(1904,
4,
4)));
// One to many private
employee.setPhoneNumbers(new Vector());
employee.addPhoneNumber(new org.eclipse.persistence.testing.models.employee.domain.PhoneNumber("home", "514",
"2263374"));
employee.addPhoneNumber(new org.eclipse.persistence.testing.models.employee.domain.PhoneNumber("office", "509",
"8224599"));
}
protected void changeSecondUnitOfWorkWorkingCopy() {
Employee employee = (Employee)this.secondUnitOfWorkWorkingCopy;
// Many to many
employee.setProjects(new Vector());
employee.addProject((org.eclipse.persistence.testing.models.employee.domain.Project)this.secondUnitOfWork.readObject(SmallProject.class));
employee.addProject((org.eclipse.persistence.testing.models.employee.domain.Project)this.secondUnitOfWork.readObject(LargeProject.class));
// Direct collection
employee.setResponsibilitiesList(new Vector());
employee.addResponsibility("does not make cafee");
employee.addResponsibility("does not buy donuts");
// One to one private/public
employee.setAddress(new org.eclipse.persistence.testing.models.employee.domain.Address());
employee.setManager((Employee)this.secondUnitOfWork.readObject(Employee.class));
}
@Override
public void reset() {
super.reset();
if(listener != null) {
getAbstractSession().getParent().getEventManager().removeListener(listener);
listener = null;
}
}
@Override
protected void setup() {
if(getSession().isClientSession()) {
listener = checkTransactionIsolation();
}
if (getSession().isRemoteSession() && getSession().getDatasourcePlatform().isDerby()) {
throw new TestWarningException("This test uses functionality that does not work over remote sessions in Apache Derby.");
}
super.setup();
// Acquire first unit of work
this.firstUnitOfWork = getSession().acquireUnitOfWork();
this.firstUnitOfWorkWorkingCopy = this.firstUnitOfWork.registerObject(this.objectToBeWritten);
changeFirstUnitOfWorkWorkingCopy();
// Use the original session for comparision
if (!compareObjects(this.originalObject, this.objectToBeWritten)) {
throw new TestErrorException("The original object was changed through changing the clone.");
}
// Acquire second unit of work
this.secondUnitOfWork = getSession().acquireUnitOfWork();
this.secondUnitOfWorkWorkingCopy = this.secondUnitOfWork.registerObject(this.objectToBeWritten);
changeSecondUnitOfWorkWorkingCopy();
if (!getAbstractSession().compareObjectsDontMatch(this.firstUnitOfWorkWorkingCopy,
this.secondUnitOfWorkWorkingCopy)) {
throw new TestErrorException("The original object was changed through changing the clone.");
}
}
@Override
protected void test() {
this.firstUnitOfWork.commit();
try {
this.secondUnitOfWork.commit();
} catch (OptimisticLockException exception) {
;
}
}
}