blob: 21226ff80d3fa8114b00094c2d47739c925f25bc [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 java.util.Vector;
import java.util.Enumeration;
import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
/**
* This test added for bug 2766379: Expression.doesConform not unwrapping as
* it traverses object relationships.
* <p><b>Test description:</b>
* <ul>
* <li>A wrapping policy is used on Employee, and conforming is enabled.
* <li>A query with expression emp.anyOf("managedEmployees").get("firstName").equal("Marcus") is called.
* <li>The registered result then has its valueholders triggered, so that conform
* result on the second query can work.
* <li>The query is then repeated. When the anyOf is traversed in doesConform,
* the resulting collection should be correctly unwrapped, allowing the
* second doesConform and the test to suceed.
* </ul>
* @author Stephen McRitchie
*/
public class ConformResultsAcrossWrappedOneToManyTest extends ConformResultsInUnitOfWorkTest {
public Vector expectedResult;
public ConformResultsAcrossWrappedOneToManyTest() {
setShouldUseWrapperPolicy(true);
}
public void buildConformQuery() {
if (conformedQuery != null) {
return;
}
conformedQuery = new ReadAllQuery(Employee.class);
ExpressionBuilder emp = new ExpressionBuilder();
Expression expression = emp.anyOf("managedEmployees").get("firstName").equal("Marcus");
conformedQuery.setSelectionCriteria(expression);
conformedQuery.conformResultsInUnitOfWork();
}
public void prepareTest() {
// The key to this test is already having a triggered valueholder in the
// unit of work cache.
buildConformQuery();
ReadAllQuery conformedQuery = (ReadAllQuery)this.conformedQuery;
Vector employees = (Vector)unitOfWork.executeQuery(conformedQuery);
// Now unwrap the result to access clone.
employees = conformedQuery.getContainerPolicy().vectorFor(employees, (UnitOfWorkImpl)unitOfWork);
for (Enumeration enumtr = employees.elements(); enumtr.hasMoreElements();) {
Employee employee = (Employee)enumtr.nextElement();
// Now unwrap the value holders and trigger the indirection.
conformedQuery.getContainerPolicy().vectorFor(employee.getManagedEmployees(), (UnitOfWorkImpl)unitOfWork);
}
expectedResult = employees;
}
public void verify() {
int resultSize = ((Vector)result).size();
if (resultSize != expectedResult.size()) {
throw new TestErrorException("Result probably was not unwrapped while conforming.");
}
}
}