blob: 02b67fcf456c2e2e045ec61a61c8554b74fb0139 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.lockmgr;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import org.apache.openjpa.lib.log.Log;
import org.apache.openjpa.persistence.test.SQLListenerTestCase;
/**
* Test find, lock and refresh em methods against non-versioned entity.
*/
public class TestMixedLockManagerNonVersion extends SQLListenerTestCase {
private String empTableName;
@Override
protected String getPersistenceUnitName() {
return "locking-test";
}
public void setUp() {
setUp(LockEmployeeNonVersion.class
, "openjpa.LockManager", "mixed"
, "openjpa.Optimistic", "false"
);
commonSetUp();
}
/*
* Test em.find(lockMode) on non-versioned entity.
*/
public void testFindNonVersionWithLock() {
commonFindNonVerWithLock(LockModeType.NONE);
commonFindNonVerWithLock(LockModeType.READ);
commonFindNonVerWithLock(LockModeType.WRITE);
commonFindNonVerWithLock(LockModeType.OPTIMISTIC);
commonFindNonVerWithLock(LockModeType.OPTIMISTIC_FORCE_INCREMENT);
commonFindNonVerWithLock(LockModeType.PESSIMISTIC_READ);
commonFindNonVerWithLock(LockModeType.PESSIMISTIC_WRITE);
commonFindNonVerWithLock(LockModeType.PESSIMISTIC_FORCE_INCREMENT);
}
private void commonFindNonVerWithLock(LockModeType lockMode) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LockEmployeeNonVersion emp = em.find(LockEmployeeNonVersion.class, 1,
lockMode);
assertNotNull(emp);
String lastLastName = emp.getLastName();
em.getTransaction().commit();
em.clear();
em.getTransaction().begin();
emp = em.find(LockEmployeeNonVersion.class, 1);
assertNotNull(emp);
assertEquals(lastLastName, emp.getLastName());
emp = em.find(LockEmployeeNonVersion.class, 1, lockMode);
emp.setLastName(lockMode.toString());
em.getTransaction().commit();
emp = em.find(LockEmployeeNonVersion.class, 1);
assertNotNull(emp);
assertEquals(lockMode.toString(), emp.getLastName());
em.close();
}
/*
* Test em.lock(lockMode) on non-versioned entity.
*/
public void testLockNonVersionWithLock() {
commonLockNonVerWithLock(LockModeType.NONE);
commonLockNonVerWithLock(LockModeType.READ);
commonLockNonVerWithLock(LockModeType.WRITE);
commonLockNonVerWithLock(LockModeType.OPTIMISTIC);
commonLockNonVerWithLock(LockModeType.OPTIMISTIC_FORCE_INCREMENT);
commonLockNonVerWithLock(LockModeType.PESSIMISTIC_READ);
commonLockNonVerWithLock(LockModeType.PESSIMISTIC_WRITE);
commonLockNonVerWithLock(LockModeType.PESSIMISTIC_FORCE_INCREMENT);
}
private void commonLockNonVerWithLock(LockModeType lockMode) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LockEmployeeNonVersion emp = em.find(LockEmployeeNonVersion.class, 1);
assertNotNull(emp);
em.lock(emp, lockMode);
String lastLastName = emp.getLastName();
em.getTransaction().commit();
em.clear();
em.getTransaction().begin();
emp = em.find(LockEmployeeNonVersion.class, 1);
assertNotNull(emp);
assertEquals(lastLastName, emp.getLastName());
emp = em.find(LockEmployeeNonVersion.class, 2);
em.lock(emp, lockMode);
emp.setLastName(lockMode.toString());
em.getTransaction().commit();
emp = em.find(LockEmployeeNonVersion.class, 2);
assertNotNull(emp);
assertEquals(lockMode.toString(), emp.getLastName());
em.close();
}
/*
* Test em.refresh(lockMode) on non-versioned entity.
*/
public void testRefreshNonVersionWithLock() {
commonRefreshNonVerWithLock(LockModeType.NONE);
commonRefreshNonVerWithLock(LockModeType.READ);
commonRefreshNonVerWithLock(LockModeType.WRITE);
commonRefreshNonVerWithLock(LockModeType.OPTIMISTIC);
commonRefreshNonVerWithLock(LockModeType.OPTIMISTIC_FORCE_INCREMENT);
commonRefreshNonVerWithLock(LockModeType.PESSIMISTIC_READ);
commonRefreshNonVerWithLock(LockModeType.PESSIMISTIC_WRITE);
commonRefreshNonVerWithLock(LockModeType.PESSIMISTIC_FORCE_INCREMENT);
}
private void commonRefreshNonVerWithLock(LockModeType lockMode) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LockEmployeeNonVersion emp = em.find(LockEmployeeNonVersion.class, 1);
assertNotNull(emp);
String lastLastName = emp.getLastName();
em.refresh(emp, lockMode);
assertEquals(lastLastName, emp.getLastName());
em.getTransaction().commit();
em.clear();
em.getTransaction().begin();
emp = em.find(LockEmployeeNonVersion.class, 1);
assertNotNull(emp);
assertEquals(lastLastName, emp.getLastName());
emp = em.find(LockEmployeeNonVersion.class, 3);
em.refresh(emp, lockMode);
emp.setLastName(lockMode.toString());
em.getTransaction().commit();
emp = em.find(LockEmployeeNonVersion.class, 3);
assertNotNull(emp);
assertEquals(lockMode.toString(), emp.getLastName());
em.close();
}
protected void commonSetUp() {
empTableName = getMapping(LockEmployeeNonVersion.class).getTable()
.getFullName();
cleanupDB();
LockEmployeeNonVersion e1, e2, e3;
e1 = newEmployee(1);
e2 = newEmployee(2);
e3 = newEmployee(3);
resetSQL();
EntityManager em = null;
try {
em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(e1);
em.persist(e2);
em.persist(e3);
em.getTransaction().commit();
} finally {
if (em != null && em.isOpen()) {
em.close();
}
}
assertAllSQLInOrder("INSERT INTO " + empTableName + " .*");
}
private void cleanupDB() {
EntityManager em = null;
try {
em = emf.createEntityManager();
em.getTransaction().begin();
em.createQuery("delete from " + empTableName).executeUpdate();
em.getTransaction().commit();
} catch(Exception e) {
e.printStackTrace();
} finally {
if (em != null && em.isOpen()) {
em.close();
}
}
}
private LockEmployeeNonVersion newEmployee(int id) {
LockEmployeeNonVersion e = new LockEmployeeNonVersion();
e.setId(id);
return e;
}
protected Log getLog() {
return emf.getConfiguration().getLog("Tests");
}
protected Log getDumpStackLog() {
return emf.getConfiguration().getLog("DumpStack");
}
protected void logStack(Throwable t) {
StringWriter str = new StringWriter();
PrintWriter print = new PrintWriter(str);
t.printStackTrace(print);
getDumpStackLog().trace(str.toString());
}
}