blob: b04a69f3fcceb5a1df2f3c71593a2b6f3e1ef309 [file] [log] [blame]
/*******************************************************************************
* 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.queries;
import org.eclipse.persistence.queries.ObjectBuildingQuery;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.exceptions.*;
/**
* Test pessimistic locking.
*/
public class PessimisticLockTest extends RefreshTest {
public UnitOfWork uow;
public int lockMode;
/**
* PessimisticLockTest constructor comment.
*/
public PessimisticLockTest(int lockMode) {
this.lockMode = lockMode;
setName(getName() + "(mode=" + lockMode + ")");
setDescription("This test verifies the pessimistic locking feature works properly");
}
public void reset() {
super.reset();
if (uow != null) {
uow.release();
}
}
public void test() throws Exception {
checkSelectForUpateSupported();
// HANA supports SELECT FOR UPDATE but not with queries that select from multiple tables
if (getSession().getPlatform().isHANA()) {
throw new TestWarningException("This database does not support FOR UPDATE on multiple tables");
}
if (this.lockMode == ObjectBuildingQuery.LOCK_NOWAIT) {
checkNoWaitSupported();
}
uow = getSession().acquireUnitOfWork();
this.employeeObject = (Employee)uow.registerObject(employeeObject);
city = employeeObject.getAddress().getCity();
employeeObject.getAddress().setCity("Chelmsford");
startTime = employeeObject.getStartTime();
employeeObject.setStartTime(null);
endDate = employeeObject.getPeriod().getEndDate();
employeeObject.getPeriod().setEndDate(null);
managerName = employeeObject.getManager().getFirstName();
employeeObject.getManager().setFirstName("Karl");
collectionSize = employeeObject.getPhoneNumbers().size();
employeeObject.getPhoneNumbers().removeAllElements();
responsibilityListSize = employeeObject.getResponsibilitiesList().size();
employeeObject.getResponsibilitiesList().removeAllElements();
uow.refreshAndLockObject(employeeObject, (short)this.lockMode);
// Test the lock.
DatabaseSession session2 = null;
UnitOfWork uow2 = null;
try {
if (getSession() instanceof org.eclipse.persistence.sessions.remote.RemoteSession) {
session2 = org.eclipse.persistence.testing.tests.remote.RemoteModel.getServerSession().getProject().createDatabaseSession();
} else {
session2 = getSession().getProject().createDatabaseSession();
}
session2.setSessionLog(getSession().getSessionLog());
session2.login();
uow2 = session2.acquireUnitOfWork();
boolean isLocked = false;
Object result = null;
try {
result = uow2.refreshAndLockObject(employeeObject, org.eclipse.persistence.queries.ObjectBuildingQuery.LOCK_NOWAIT);
} catch (EclipseLinkException exeception) {
session2.logMessage(exeception.toString());
isLocked = true;
}
if (result == null) {
isLocked = true;
}
if (!isLocked) {
throw new TestWarningException("Select for update does not acquire a lock");
}
} finally {
if (uow2 != null) {
uow2.release();
}
if (session2 != null) {
session2.logout();
}
}
}
}