blob: a29a625517f7802c834507f6058742530f57bbe1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 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");
}
}
}