package org.eclipse.persistence.testing.tests.distributedservers.rcm;
import java.util.Iterator;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.testing.models.optimisticlocking.ListHolder;
import org.eclipse.persistence.testing.models.optimisticlocking.ListItem;
import org.eclipse.persistence.testing.tests.distributedservers.DistributedServer;
import org.eclipse.persistence.testing.tests.distributedservers.DistributedServersModel;
// test for bug 357103
public class NewObjectWithOptimisticLockingTest extends ConfigurableCacheSyncDistributedTest {
protected ListHolder holder = null;
public NewObjectWithOptimisticLockingTest(){
super();
cacheSyncConfigValues.put(ListHolder.class, new Integer(ClassDescriptor.SEND_OBJECT_CHANGES));
cacheSyncConfigValues.put(ListItem.class, new Integer(ClassDescriptor.SEND_OBJECT_CHANGES));
}
public void setup(){
super.setup();
// super.setup begins transaction with intention to keep it until reset.
// Cannot do it in this test because both sessions share the same accessor connection,
// therefore end transaction.
getAbstractSession().rollbackTransaction();
UnitOfWork uow = getSession().acquireUnitOfWork();
ListHolder holder = new ListHolder();
holder = (ListHolder)uow.registerObject(holder);
ListItem item = new ListItem();
item.setDescription("test");
item = (ListItem)uow.registerObject(item);
holder.getItems().add(item);
item.setHolder(holder);
uow.commit();
}
public void test(){
DistributedServer server = (DistributedServer)DistributedServersModel.getDistributedServers().get(0);
UnitOfWork uow = server.getDistributedSession().acquireUnitOfWork();
holder = (ListHolder)uow.readObject(ListHolder.class);
ListItem item = new ListItem();
item.setDescription("test2");
item = (ListItem)uow.registerObject(item);
holder.getItems().add(item);
uow.commit();
}
public void verify(){
// ensure the changes are propagated
try{
Thread.sleep(1000);
} catch (InterruptedException e){};
holder = (ListHolder)getSession().readObject(ListHolder.class);
if (holder.getItems().size() != 2){
throw new TestErrorException("Incorrect number of items");
}
boolean found = false;
Iterator i = holder.getItems().iterator();
while (i.hasNext()){
ListItem item = (ListItem)i.next();
if (item.getDescription() != null && item.getDescription().equals("test2")){
found = true;
}
}
if (!found){
throw new TestErrorException("A new object was not complete propogated.");
}
}
public void reset(){
UnitOfWork uow = getSession().acquireUnitOfWork();
holder = (ListHolder)uow.readObject(ListHolder.class);
Iterator i = holder.getItems().iterator();
while (i.hasNext()){
uow.deleteObject(i.next());
}
uow.deleteObject(holder);
uow.commit();
// super.reset ends transaction - but none is active, so begins transaction.
getAbstractSession().beginTransaction();
super.reset();
}
}