blob: 2d102f1a42b45ee84cd98e75e10b41744feaf41d [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.interfaces;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.mappings.*;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.internal.indirection.*;
import org.eclipse.persistence.testing.models.interfaces.*;
/**
* VariableOneToOneMapping doesn't work with proxyIndirection,
* throws a nullPointerException when building the object reference.
* Scenario: 2 classes (A and B) and an interface C, where A implements C.
* Set up the mapping from B to A as VariableOneToOneMapping();
* Then read in a B object that references an A object. It will throw
* the following exception :
* java.lang.NullPointerException
* at TOPLink.Private.Indirection.ProxyIndirectionPolicy.valueFromQuery(
* ProxyIndirectionPolicy.java:123)
*
* Class created on Mar 22/2002; CR#3838 in StarTeam; Predrag
*/
public class QueryAccrossV11ProxyIndirectionTest extends AutoVerifyTestCase {
protected Exception caughtException;
protected ClassDescriptor descriptor;
protected IndirectionPolicy indirectionPolicy = null;
public QueryAccrossV11ProxyIndirectionTest() {
super();
setDescription("Test that VariableOneToOneMapping mapping with ProxyIndirection" + " works correctly");
}
public ClassDescriptor getDescriptorV11ProxyIndirection() {
return descriptor;
}
public void setDescriptorV11ProxyIndirection(Class<?> cls, String attributeName, Class<?> proxyIndirectClass) {
// instruct descriptor to use proxy indirection since
// VariableOneToOneMapping maping for attribute "program"
// in InterfaceWithoutTablesProject.java, did not set it;
ClassDescriptor descriptorToReturn = null;
descriptorToReturn = getSession().getClassDescriptor(cls);
ObjectReferenceMapping mappingForAttribute =
(ObjectReferenceMapping)descriptorToReturn.getMappingForAttributeName(attributeName);
indirectionPolicy = mappingForAttribute.getIndirectionPolicy();
mappingForAttribute.useProxyIndirection(proxyIndirectClass);
this.descriptor = descriptorToReturn;
} // end of setDescriptorNamedQuery
public void resetDescriptorV11ProxyIndirection(String attributeName) {
ObjectReferenceMapping mappingForAttribute =
(ObjectReferenceMapping)descriptor.getMappingForAttributeName(attributeName);
mappingForAttribute.setIndirectionPolicy(indirectionPolicy);
}
@Override
public void setup() {
setDescriptorV11ProxyIndirection(Actor.class, "program", ProgramInt.class);
getSession().getIdentityMapAccessor().initializeIdentityMaps();
} // end of setup()
@Override
public void test() {
try {
java.util.Vector actors = getSession().readAllObjects(Actor.class);
for (int x = 0; x < actors.size(); x++) {
Actor actor = (Actor)actors.elementAt(x);
//trigger indirection
String name = actor.program.getName();
}
} catch (NullPointerException e) {
caughtException = e;
}
} // end of test()
@Override
public void reset() {
// do not want to keep proxy indirection on maping for
// attribute "program" - VariableOneToOneMapping
resetDescriptorV11ProxyIndirection("program");
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
} // end of reset()
@Override
public void verify() {
if (caughtException != null) {
throw new org.eclipse.persistence.testing.framework.TestErrorException("Test that VariableOneToOneMapping mapping with" +
" ProxyIndirection works correctly.\n" +
"This exception thrown while testing test case.\n" +
"----- QueryAccrossV11ProxyIndirectionTest() -----\n" +
caughtException.getMessage());
}
}
} // end of class QueryAccrossV11ProxyIndirectionTest