blob: 3835f624c4588c9779cace29c499ed141cccc05a [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.queries;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.exceptions.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
/**
* Bug 3241138
* Ensure Rediectors are properly called when used through the Query Manager on
* operations such as session.readObject()
* Note: This test uses static variables for it's test condition and will not run very
* well on multithreaded test systems.
*/
public class RedirectorOnDescriptorTest extends TestCase {
protected static boolean redirectedReadObject = false;
protected static boolean redirectedReadAll = false;
protected static boolean redirectedDeleteObject = false;
protected static boolean redirectedUpdate = false;
protected static boolean redirectedInsert = false;
protected ReadObjectQuery readObjectQuery = null;
protected ReadAllQuery readAllQuery = null;
protected DeleteObjectQuery deleteObjectQuery = null;
protected InsertObjectQuery insertQuery = null;
protected UpdateObjectQuery updateQuery = null;
protected ClassDescriptor descriptor = null;
public void setup() {
getSession().getIdentityMapAccessor().initializeIdentityMaps();
getAbstractSession().beginTransaction();
descriptor = getSession().getProject().getDescriptors().get(Employee.class);
// Read Object
readObjectQuery = descriptor.getQueryManager().getReadObjectQuery();
QueryRedirector redirector = new MethodBaseQueryRedirector(RedirectorOnDescriptorTest.class, "readObject");
ReadObjectQuery roq = new ReadObjectQuery(descriptor.getJavaClass());
roq.setRedirector(redirector);
descriptor.getQueryManager().setReadObjectQuery(roq);
// Read All
readAllQuery = descriptor.getQueryManager().getReadAllQuery();
redirector = new MethodBaseQueryRedirector(RedirectorOnDescriptorTest.class, "readAll");
ReadAllQuery raq = new ReadAllQuery(descriptor.getJavaClass());
raq.setRedirector(redirector);
descriptor.getQueryManager().setReadAllQuery(raq);
// Delete Object
deleteObjectQuery = descriptor.getQueryManager().getDeleteQuery();
redirector = new MethodBaseQueryRedirector(RedirectorOnDescriptorTest.class, "deleteObject");
DeleteObjectQuery doq = new DeleteObjectQuery();
doq.setRedirector(redirector);
descriptor.getQueryManager().setDeleteQuery(doq);
// Insert Object
insertQuery = descriptor.getQueryManager().getInsertQuery();
redirector = new MethodBaseQueryRedirector(RedirectorOnDescriptorTest.class, "insertObject");
InsertObjectQuery ioq = new InsertObjectQuery();
ioq.setRedirector(redirector);
descriptor.getQueryManager().setInsertQuery(ioq);
// Update Object
updateQuery = descriptor.getQueryManager().getUpdateQuery();
redirector = new MethodBaseQueryRedirector(RedirectorOnDescriptorTest.class, "updateObject");
UpdateObjectQuery uoq = new UpdateObjectQuery();
uoq.setRedirector(redirector);
descriptor.getQueryManager().setUpdateQuery(uoq);
}
public void test() {
// test readAll
getSession().readAllObjects(Employee.class);
getSession().getIdentityMapAccessor().initializeIdentityMap(Employee.class);
// test readObject
Employee employee =
(Employee)getSession().readObject(Employee.class, new ExpressionBuilder().get("id").equal(99));
// test delete with an employee read from the database
employee = (Employee)getSession().readObject(Employee.class);
try {
getAbstractSession().deleteObject(employee);
} catch (DatabaseException exc) {
// if we get an integrity exception here, the query went to the DB and was not redirected
redirectedDeleteObject = false;
}
UnitOfWork uow = getSession().acquireUnitOfWork();
// test update with an employee read from the database
employee = (Employee)uow.readObject(Employee.class);
employee.setFirstName(employee.getFirstName() + "-changed");
// insert an employee to test the insert behavior
employee = new Employee();
employee.setFirstName("Paul");
employee.setLastName("Sheldon");
uow.registerObject(employee);
uow.commit();
}
public void verify() {
if (!redirectedReadObject) {
throw new TestErrorException("ReadObjectQuery was not properly redirected when redirection was set on the Descriptor.");
}
if (!redirectedReadAll) {
throw new TestErrorException("ReadAllQuery was not properly redirected when redirection was set on the Descriptor.");
}
if (!redirectedDeleteObject) {
throw new TestErrorException("DeleteQuery was not properly redirected when redirection was set on the Descriptor.");
}
if (!redirectedUpdate) {
throw new TestErrorException("UpdateObjectQuery was not properly redirected when redirection was set on the Descriptor.");
}
if (!redirectedInsert) {
throw new TestErrorException("InsertObjectQuery was not properly redirected when redirection was set on the Descriptor.");
}
}
public void reset() {
getAbstractSession().rollbackTransaction();
getSession().getIdentityMapAccessor().initializeIdentityMaps();
descriptor.getQueryManager().setReadObjectQuery(readObjectQuery);
descriptor.getQueryManager().setReadAllQuery(readAllQuery);
descriptor.getQueryManager().setDeleteQuery(deleteObjectQuery);
descriptor.getQueryManager().setInsertQuery(insertQuery);
descriptor.getQueryManager().setUpdateQuery(updateQuery);
boolean redirectedReadObject = false;
boolean redirectedReadAll = false;
boolean redirectedDeleteObject = false;
boolean redirectedInsert = false;
boolean redirectedUpdate = false;
}
/**
* Below are the methods called by the redirectors for various toplink queries
*/
public static
Object deleteObject(DatabaseQuery query, Record row, org.eclipse.persistence.sessions.Session session) {
redirectedDeleteObject = true;
return null;
}
public static Object insertObject(DatabaseQuery query, Record row, org.eclipse.persistence.sessions.Session session) {
redirectedInsert = true;
return null;
}
public static Object readAll(DatabaseQuery query, Record row, org.eclipse.persistence.sessions.Session session) {
redirectedReadAll = true;
return null;
}
public static Object readObject(DatabaseQuery query, Record row, org.eclipse.persistence.sessions.Session session) {
redirectedReadObject = true;
return null;
}
public static Object updateObject(DatabaseQuery query, Record row, org.eclipse.persistence.sessions.Session session) {
redirectedUpdate = true;
return null;
}
}