package org.eclipse.persistence.testing.tests.jpa.advanced.concurrency;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.eclipse.persistence.internal.identitymaps.CacheKey;
import org.eclipse.persistence.internal.jpa.EntityManagerImpl;
import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
import org.eclipse.persistence.testing.models.jpa.advanced.Department;
import org.eclipse.persistence.testing.models.jpa.advanced.Equipment;
public class Runner1 implements Runnable {
protected Object waitOn;
protected Object equipPK;
protected Object deptPK;
protected EntityManagerFactory emf;
public Runner1(Object waitOn, Object deptPK, Object equipPK, EntityManagerFactory emf) {
this.waitOn = waitOn;
this.equipPK = equipPK;
this.deptPK = deptPK;
this.emf = emf;
}
public void run() {
try {
EntityManager em =emf.createEntityManager();
Department dept = em.find(Department.class, deptPK);
Equipment equip = em.find(Equipment.class, equipPK);
dept.getEquipment().put(equip.getId(), equip);
UnitOfWorkImpl uow = ((EntityManagerImpl) em).getActivePersistenceContext(null);
try {
Thread.currentThread().sleep(4000);
} catch (InterruptedException e) {
}
uow.issueSQLbeforeCompletion(true);
synchronized (this.waitOn) {
try {
this.waitOn.notify();
this.waitOn.wait();
} catch (InterruptedException e) {
}
}
CacheKey cacheKey = uow.getParent().getParent().getIdentityMapAccessorInstance().getCacheKeyForObject(dept);
synchronized (cacheKey) {
cacheKey.notify();
}
try {
Thread.currentThread().sleep(4000);
} catch (InterruptedException e) {
}
uow.mergeClonesAfterCompletion();
} catch (Exception ex) {
}
}
}