/******************************************************************************* * Copyright (c) 1998, 2015 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.unitofwork; import java.util.Iterator; import java.util.Vector; import org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet; import org.eclipse.persistence.sessions.SessionEvent; import org.eclipse.persistence.sessions.SessionEventAdapter; import org.eclipse.persistence.sessions.UnitOfWork; import org.eclipse.persistence.testing.framework.AutoVerifyTestCase; import org.eclipse.persistence.testing.framework.TestErrorException; import org.eclipse.persistence.testing.framework.TestProblemException; import org.eclipse.persistence.testing.models.employee.domain.Address; import org.eclipse.persistence.testing.models.employee.domain.Employee; import org.eclipse.persistence.testing.models.employee.domain.PhoneNumber; // bug 4364283. Make sure that only change sets with changes are included in uowChangeSet.getAllChangeSets() public class AllChangeSetsTest extends AutoVerifyTestCase { static class SessionListener extends SessionEventAdapter { public int changedObjectsCount; public void preMergeUnitOfWorkChangeSet(SessionEvent event) { UnitOfWorkChangeSet uowChangeSet = (UnitOfWorkChangeSet)event.getProperty("UnitOfWorkChangeSet"); changedObjectsCount = uowChangeSet.getAllChangeSets().size(); } } SessionListener listener = new SessionListener(); int changedObjectsCount; public void reset() { if (getAbstractSession().isInTransaction()) { getAbstractSession().rollbackTransaction(); getSession().getIdentityMapAccessor().initializeAllIdentityMaps(); getSession().getEventManager().removeListener(listener); } } public void setup() { getSession().getEventManager().addListener(listener); getAbstractSession().beginTransaction(); changedObjectsCount = 0; listener.changedObjectsCount = -1; } public void test() { UnitOfWork uow = getSession().acquireUnitOfWork(); Vector employees = uow.readAllObjects(Employee.class); // We should end up with only 4 changedObjects. // To make it easy to ensure that not all registered objects are counted // let's require at least 5 object if (employees.size() <= 4) { throw new TestProblemException("only " + employees.size() + " employees were read, need at least 5"); } // Existing object has changed - should be counted Employee emp = (Employee)employees.firstElement(); emp.setFirstName("Changed"); changedObjectsCount++; Address add = emp.getAddress(); if (emp.getAddress() != null) { // Existing object has changed - should be counted add.setCity("Changed"); changedObjectsCount++; } // New object - should be counted Employee newEmp = new Employee(); Employee newEmpClone = (Employee)uow.registerObject(newEmp); newEmpClone.setFirstName("New"); changedObjectsCount++; Iterator it = emp.getPhoneNumbers().iterator(); while (it.hasNext()) { PhoneNumber phone = (PhoneNumber)it.next(); // to force reading the phone in and therefore registering in uow // Registered but not changed - should NOT be counted String code = phone.getAreaCode(); } // forcedUpdate with false - should NOT be counted (doesn't affect cache) Employee emp1 = (Employee)employees.elementAt(1); uow.forceUpdateToVersionField(emp1, false); // forcedUpdate with true - should be counted Employee emp2 = (Employee)employees.elementAt(2); uow.forceUpdateToVersionField(emp2, true); changedObjectsCount++; uow.commit(); } public void verify() { if (listener.changedObjectsCount == -1) { throw new TestProblemException("postCalculateUnitOfWorkChangeSet was not handled"); } if (listener.changedObjectsCount != changedObjectsCount) { throw new TestErrorException("uowChangeSet.getAllChangeSets().size() == " + listener.changedObjectsCount + "; " + changedObjectsCount + " is expected"); } } }