blob: d2d911ca7347da27ac4c39b7857fb5288e8a5761 [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.inheritance;
import java.util.*;
import java.io.Writer;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.descriptors.*;
import org.eclipse.persistence.internal.sessions.AbstractSession;
/**
* <p>
* <b>Purpose</b>: This test checks the printIdentityMaps() method on the session when using root inheritance with no subclasses.
* This test is for bug #2675242
* <p>
*
* <b>Responsibilities</b>: Check if the printIdentityMaps functionality works properly with single inheritance with no subclasses
*/
public class SingleInheritanceTest extends TestCase {
protected InheritancePolicy originalInheritancePolicy;
protected org.eclipse.persistence.mappings.DatabaseMapping originalDbMapping;
protected Map originalDescriptors;
protected ClassDescriptor vehicleDescriptor;
protected Writer originalLogWriter;
/**
* This is required to allow subclassing.
*/
public SingleInheritanceTest() {
setDescription("The test uses inheritance on a single class w/ no subclasses and calls printIdentityMaps on the session");
}
@Override
public void reset() {
//reset the descriptors, and add back the Vehicle's inheritance info and 1:1 mapping
getSession().getProject().setDescriptors(originalDescriptors);
getAbstractSession().clearDescriptors();
vehicleDescriptor.setInheritancePolicy(originalInheritancePolicy);
vehicleDescriptor.addMapping(originalDbMapping);
getSession().setLog(originalLogWriter);
}
@Override
protected void setup() {
/*
* For this test, it is necessary to remove all subclasses of Vehicle. So,
* it is easier to remove all descriptors and re-add the vehicle descriptor - removing
* its 1:1 mapping and inheritance info pointing to other descriptors. We also need
* to remove + restore the log so that printIdentityMaps does not display output
*/
originalLogWriter = getSession().getLog();
getSession().setLog(new java.io.CharArrayWriter());
vehicleDescriptor = getSession().getDescriptor(org.eclipse.persistence.testing.models.inheritance.Vehicle.class);
originalDescriptors = getSession().getProject().getDescriptors();
originalInheritancePolicy = vehicleDescriptor.getInheritancePolicy();
originalDbMapping = vehicleDescriptor.getMappingForAttributeName("owner");
//remove the 1:1 "owner" mapping
vehicleDescriptor.getMappings().remove(originalDbMapping);
//empty Vehicle's inheritance info
InheritancePolicy newInheritancePolicy = (InheritancePolicy)originalInheritancePolicy.clone();
newInheritancePolicy.addClassIndicator(org.eclipse.persistence.testing.models.inheritance.Vehicle.class, 8L);
newInheritancePolicy.setChildDescriptors(new Vector());
newInheritancePolicy.setClassIndicatorMapping(new Hashtable(3));
vehicleDescriptor.setInheritancePolicy(newInheritancePolicy);
//empty the descriptors and re-add the Vehicle descriptor
getSession().getProject().setDescriptors(new Hashtable(3));
getSession().getProject().addDescriptor(vehicleDescriptor);
}
@Override
public void test() {
}
/**
* Verify if the objects match completely through allowing the session to use the descriptors.
* This will compare the objects and all of their privately owned parts.
*/
@Override
protected void verify() {
try {
((AbstractSession)getSession()).getIdentityMapAccessorInstance().printIdentityMaps();
return;
} catch (java.util.NoSuchElementException e) {
throw new TestErrorException("Single class inheritance (no subclasses) caused a java.util.NoSuchElementException when" + " printIdentityMaps() was called on the session");
}
}
}