blob: c6c3f120aa4f9aeb98e4902104e60cc218524faf [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.expressions.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.exceptions.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
import org.eclipse.persistence.testing.framework.*;
/**
* For bug 3431017 tests when a NO_LOCK query joins an attribute which should be locked.
* <p>
* The correct behavior is that the object should be read again.
*/
public class PessimisticLockNoLockJoinedTest extends PessimisticLockJoinedAttributeTest {
public PessimisticLockNoLockJoinedTest() {
this.lockMode = ObjectLevelReadQuery.LOCK_NOWAIT;
setDescription("For bug 3431017 tests when a NO_LOCK query joins an attribute which should be locked.");
}
public void test () throws Exception
{
if (!(getSession().getPlatform().isOracle() || getSession().getPlatform().isSQLServer())) {
throw new TestWarningException("This test only runs on Oracle where writes do not block reads.");
}
uow = getSession().acquireUnitOfWork();
ReadObjectQuery query = new ReadObjectQuery(LargeProject.class);
// Only Charles Chanley and John Way are team leaders of projects they are also working on.
Expression expression = query.getExpressionBuilder().get("teamLeader").get("firstName").equal("Charles");
query.setSelectionCriteria(expression);
query.addJoinedAttribute(query.getExpressionBuilder().get("teamLeader"));
query.addJoinedAttribute(query.getExpressionBuilder().get("teamLeader").get("address"));
// This is what differentiates from the super class test.
query.setLockMode(ObjectLevelReadQuery.NO_LOCK);
LargeProject uow1Project = (LargeProject)uow.executeQuery(query);
uow1Project.getTeamLeader().getAddress();
// Test the lock.
// Because this is on a ServerSession the second UOW will have its own
// ClientSession/exclusive connection.
UnitOfWork uow2 = getSession().acquireUnitOfWork();
try {
boolean isLocked = false;
LargeProject uow2Project = (LargeProject)uow2.executeQuery(query);
try {
uow2Project.getTeamLeader();
} catch (EclipseLinkException exception) {
isLocked = true;
}
if (!isLocked) {
throw new TestWarningException("A joined attribute in an explicit NO_LOCK query is not being locked. This breaks bug 3431017.");
}
} catch (RuntimeException e) {
throw e;
} finally {
if (uow2 != null) {
uow2.release();
}
}
}
}