blob: 2d1089c7d3ac08531ad910a6bc57fa2e382b6757 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// 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;
@Override
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);
}
@Override
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();
}
@Override
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.");
}
}
@Override
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, DataRecord row, org.eclipse.persistence.sessions.Session session) {
redirectedDeleteObject = true;
return null;
}
public static Object insertObject(DatabaseQuery query, DataRecord row, org.eclipse.persistence.sessions.Session session) {
redirectedInsert = true;
return null;
}
public static Object readAll(DatabaseQuery query, DataRecord row, org.eclipse.persistence.sessions.Session session) {
redirectedReadAll = true;
return null;
}
public static Object readObject(DatabaseQuery query, DataRecord row, org.eclipse.persistence.sessions.Session session) {
redirectedReadObject = true;
return null;
}
public static Object updateObject(DatabaseQuery query, DataRecord row, org.eclipse.persistence.sessions.Session session) {
redirectedUpdate = true;
return null;
}
}