package org.eclipse.persistence.testing.tests.events; import org.eclipse.persistence.sessions.UnitOfWork; import org.eclipse.persistence.testing.framework.TestErrorException; import org.eclipse.persistence.testing.models.events.*; import java.util.Vector; import org.eclipse.persistence.descriptors.ClassDescriptor; public class CloneEventOnIsolatedSessionTest extends EventHookTestCase { Vector<ClassDescriptor> issolatedDescriptors; boolean hasIsolatedClasses = false; public void setup() { //set all descriptors in this package as isolated issolatedDescriptors = new Vector(); issolatedDescriptors.add(getSession().getDescriptor(Address.class)); issolatedDescriptors.add(getSession().getDescriptor(Phone.class)); issolatedDescriptors.add(getSession().getDescriptor(CreditCard.class)); issolatedDescriptors.add(getSession().getDescriptor(Customer.class)); issolatedDescriptors.add(getSession().getDescriptor(EmailAccount.class)); issolatedDescriptors.add(getSession().getDescriptor(Order.class)); for (ClassDescriptor descriptor : issolatedDescriptors){ descriptor.setIsIsolated(true); /// the value assigned by default during initialization for an isolated descriptor. descriptor.setUnitOfWorkCacheIsolationLevel(ClassDescriptor.ISOLATE_CACHE_ALWAYS); } hasIsolatedClasses = getDatabaseSession().getProject().hasIsolatedClasses(); getDatabaseSession().getProject().setHasIsolatedClasses(true); super.setup(); getDatabaseSession().writeObject(getEmailAccount()); getDatabaseSession().writeObject(getPhoneNumber()); getDatabaseSession().writeObject(getAddress()); getSession().getIdentityMapAccessor().initializeAllIdentityMaps(); } public void reset() { for (ClassDescriptor descriptor : issolatedDescriptors){ descriptor.setIsIsolated(false); /// the value assigned by default during initialization for a non-isolated descriptor. descriptor.setUnitOfWorkCacheIsolationLevel(ClassDescriptor.ISOLATE_NEW_DATA_AFTER_TRANSACTION); } getDatabaseSession().getProject().setHasIsolatedClasses(hasIsolatedClasses); super.reset(); } protected void test() { UnitOfWork uow = getSession().acquireUnitOfWork(); EmailAccount emailAccountCopy = (EmailAccount)uow.readObject(getEmailAccount()); // Must change the object or no merge will happen emailAccountCopy.setHostName("localHost"); Phone phoneNumberCopy = (Phone)uow.readObject(getPhoneNumber()); phoneNumberCopy.phoneNo = "555-5555"; Address addressCopy = (Address)uow.readObject(getAddress()); addressCopy.address = "No Where"; uow.commit(); if (!emailAccountCopy.postCloneExecuted) { throw new TestErrorException("Event hook failed. The post clone method on " + emailAccountCopy + " failed to execute."); } if (!phoneNumberCopy.postCloneExecuted) { throw new TestErrorException("Event hook failed. The post clone method on " + phoneNumberCopy + " failed to execute."); } } }