/******************************************************************************* | |
* 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.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); | |
} | |
public void setup() { | |
setDescriptorV11ProxyIndirection(Actor.class, "program", ProgramInt.class); | |
getSession().getIdentityMapAccessor().initializeIdentityMaps(); | |
} // end of setup() | |
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() | |
public void reset() { | |
// do not want to keep proxy indirection on maping for | |
// attribute "program" - VariableOneToOneMapping | |
resetDescriptorV11ProxyIndirection("program"); | |
getSession().getIdentityMapAccessor().initializeAllIdentityMaps(); | |
} // end of reset() | |
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 |