blob: b82b1539ee8df619c50f24c727dddd8fc9c97a2a [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.models.mapping;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.descriptors.RelationalDescriptor;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.internal.databaseaccess.DatabasePlatform;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.mappings.*;
public class MappingSystem extends TestSystem {
protected static boolean useFastTableCreatorAfterInitialCreate = Boolean
.getBoolean("eclipselink.test.toggle-fast-table-creator");
protected static boolean isFirstCreation = true;
protected Project legacyProject;
protected Project multipleTableProject;
protected Project keyboardProject;
protected Project bidirectionalProject;
public MappingSystem() {
project = new MappingProject();
legacyProject = new LegacyTestProject();
multipleTableProject = new MultipleTableTestProject();
keyboardProject = new KeyboardProject();
bidirectionalProject = new BiDirectionInserOrderTestProject();
}
@Override
public void addDescriptors(DatabaseSession session) {
DatabasePlatform platform = session.getLogin().getPlatform();
ClassDescriptor empDescriptor = (project.getDescriptors().get(Employee.class));
Employee.addToDescriptor(empDescriptor);
ClassDescriptor hardwareDescriptor = (project.getDescriptors().get(Hardware.class));
Hardware.addToDescriptor(hardwareDescriptor);
ClassDescriptor monitorDescriptor = (project.getDescriptors().get(Monitor.class));
Monitor.addToDescriptor(monitorDescriptor);
// If on Access exclude the jobDescription mapping
if (platform.isAccess()) {
empDescriptor.getMappings().removeElement(empDescriptor.getMappingForAttributeName("jobDescription"));
}
if (platform.getDefaultSequence().shouldAcquireValueAfterInsert()) {
RelationalDescriptor cubicleDescriptor = ((RelationalDescriptor) project.getDescriptors().get(Cubicle.class));
cubicleDescriptor.setSequenceNumberField(null);
cubicleDescriptor.setSequenceNumberName(null);
}
(session).addDescriptors(project);
// Add the Legacy Test Project.
(session).addDescriptors(legacyProject);
// Add the MultipleTableTest Test Project.
(session).addDescriptors(multipleTableProject);
// Add the keyboard project - tests constraints.
(session).addDescriptors(keyboardProject);
ClassDescriptor joystickDescriptor = (keyboardProject.getDescriptors().get(Joystick.class));
joystickDescriptor.addConstraintDependencies(Keyboard.class);
// Add the insert order project.
(session).addDescriptors(bidirectionalProject);
}
@Override
public void createTables(DatabaseSession session) {
SchemaManager schemaManager = new SchemaManager(session);
boolean orig_FAST_TABLE_CREATOR = SchemaManager.FAST_TABLE_CREATOR;
// on Symfoware, to avoid table locking issues only the first invocation
// of an instance of this class (drops & re-)creates the tables.
if (useFastTableCreatorAfterInitialCreate && !isFirstCreation) {
SchemaManager.FAST_TABLE_CREATOR = true;
}
(new LegacyTableMaker()).replaceTables(session);
(new MultipleTableTestTableMaker()).replaceTables(session);
(new KeyboardTables()).replaceTables(session);
//insert order test table creation
new BiDirectionInsertOrderTableMaker().replaceTables(session);
//TableDefinition emp1Definition = Employee1.tableDefinition();
TableDefinition empDefinition = Employee.tableDefinition();
DatabasePlatform platform = session.getLogin().getPlatform();
// Only add this field if NOT on Access or DB2
if (!platform.isAccess()) {
empDefinition.addField("JDESC", Byte[].class);
}
try {
schemaManager.replaceObject(empDefinition);
schemaManager.replaceObject(Employee.joinTableDefinition());
schemaManager.replaceObject(Employee.employeePhoneJoinTableDefinition());
schemaManager.replaceObject(Phone.tableDefinition());
schemaManager.replaceObject(CompanyCard.tableDefinition());
schemaManager.replaceObject(Computer.tableDefinition());
schemaManager.replaceObject(Cubicle.tableDefinition());
schemaManager.replaceObject(EmergencyExit.tableDefinition());
schemaManager.replaceObject(EmergencyExit.relationTableDefinition());
schemaManager.replaceObject(Shipment.tableDefinition());
schemaManager.replaceObject(getPolicyTableDefinition());
schemaManager.replaceObject(Address.tableDefinition());
schemaManager.replaceObject(Monitor.tableDefinition());
schemaManager.replaceObject(Hardware.tableDefinition());
schemaManager.replaceObject(Peripheral.tableDefinition());
schemaManager.replaceObject(SecureSystem.tableDefinition());
schemaManager.replaceObject(Identification.tableDefinition());
schemaManager.createSequences();
} finally {
if (useFastTableCreatorAfterInitialCreate && !isFirstCreation) {
SchemaManager.FAST_TABLE_CREATOR = orig_FAST_TABLE_CREATOR;
}
}
// next time it deletes the rows instead.
isFirstCreation = false;
}
public static TableDefinition getPolicyTableDefinition() {
TableDefinition definition = new TableDefinition();
definition.setName("MAP_POL");
definition.addField("FNAME", String.class, 20);
definition.addField("LNAME", String.class, 20);
definition.addField("POLICY", String.class, 20);
return definition;
}
@Override
public void populate(DatabaseSession session) {
PopulationManager manager = PopulationManager.getDefaultManager();
UnitOfWork unitOfWork = session.acquireUnitOfWork();
Employee1 employee_1 = Employee1.example1();
Employee1 employee_2 = Employee1.example2();
Employee1 employee_3 = Employee1.example3();
unitOfWork.registerObject(employee_1);
manager.registerObject(employee_1, "example1");
manager.registerObject(employee_2, "example2");
unitOfWork.registerObject(employee_3);
manager.registerObject(employee_3, "example3");
/////////////////////////////////////////
// Populate the MultipleTableTest
Employee2 employee2_1 = Employee2.example1();
Employee2 employee2_2 = Employee2.example2();
unitOfWork.registerObject(employee2_1);
manager.registerObject(employee2_1, "example1");
manager.registerObject(employee2_2, "example2");
/////////////////////////////////////////
Employee employee1 = Employee.example1();
Employee employee2 = Employee.example2();
Employee employee3 = Employee.example3();
Employee employee4 = Employee.example4();
Employee employee5 = Employee.example5();
Employee employee6 = Employee.example6();
ClassDescriptor cubicleDescriptor = session.getClassDescriptor(Cubicle.class);
if (!cubicleDescriptor.usesSequenceNumbers()) {
Employee[] employees = { employee1, employee2, employee3, employee4, employee5, employee6 };
int id = 100;
for (int i = 0; i < employees.length; i++) {
if ((employees[i].cubicle != null) && (employees[i].cubicle.id == null)) {
employees[i].cubicle.id = new java.math.BigDecimal(id);
id = id + 10;
}
}
}
employee1.setManager(null);
employee1.addManagedEmployee(employee2);
employee1.addManagedEmployee(employee3);
employee2.setManager(employee1);
employee2.addManagedEmployee(employee4);
employee3.setManager(employee1);
employee3.addManagedEmployee(employee5);
employee4.setManager(employee2);
employee5.setManager(employee3);
employee5.addManagedEmployee(employee6);
employee6.setManager(employee5);
unitOfWork.registerObject(employee1);
manager.registerObject(employee1, "example1");
manager.registerObject(employee1.computer, "example1");
manager.registerObject(employee1.shipments.firstElement(), "example1");
unitOfWork.registerObject(employee2);
manager.registerObject(employee2, "example2");
manager.registerObject(employee2.computer, "example2");
manager.registerObject(employee2.shipments.firstElement(), "example2");
unitOfWork.registerObject(employee3);
manager.registerObject(employee3, "example3");
manager.registerObject(employee3.computer, "example3");
unitOfWork.registerObject(employee4);
manager.registerObject(employee4, "example4");
manager.registerObject(employee4.computer, "example4");
manager.registerObject(employee4.shipments.firstElement(), "example4");
unitOfWork.registerObject(employee5);
manager.registerObject(employee5, "example5");
manager.registerObject(employee5.computer, "example5");
manager.registerObject(employee5.shipments.firstElement(), "example5");
unitOfWork.registerObject(employee6);
manager.registerObject(employee6, "example6");
manager.registerObject(employee6.computer, "example6");
Address address1 = Address.example1();
Address address2 = Address.example2();
manager.registerObject(address1, "example1");
manager.registerObject(address2, "example2");
unitOfWork.registerObject(address1);
unitOfWork.registerObject(address2);
unitOfWork.commit();
}
/**
* CR3922
* This method tests OneToOneMapping.buildSelectionCriteria(), which would allow customers to
* get the potential selection criteria for a mapping prior to initialization.
* This would allow them to more easily create an ammendment method that would ammend the SQL for the join.
* Add a selection criteria that retrievs all cubicles with location 3rd floor, Section R, Third qubicle on left.
*/
public static void modifyOneToOneMappingDescriptor(org.eclipse.persistence.descriptors.ClassDescriptor descriptor) {
OneToOneMapping oneToOneMapping = (OneToOneMapping)descriptor.getMappingForAttributeName("cubicle");
Expression exp = oneToOneMapping.buildSelectionCriteria();
ExpressionBuilder builder = exp.getBuilder();
Expression addedExpression = builder.getField("MAP_CUB.LOCATION").equal("3rd floor, Section R, Third qubicle on left");
oneToOneMapping.setSelectionCriteria(exp.and(addedExpression));
}
/**
* CR3922
* This method tests OneToManyMapping.buildSelectionCriteria(), which would allow customers to
* get the potential selection criteria for a mapping prior to initialization.
* This would allow them to more easily create an ammendment method that would ammend the SQL for the join.
* Add a selection criteria that retrievs all phone numbers with area code 613.
*/
public static void modifyOneToManyMappingDescriptor(org.eclipse.persistence.descriptors.ClassDescriptor descriptor) {
OneToManyMapping oneToManyMapping = (OneToManyMapping)descriptor.getMappingForAttributeName("managedEmployees");
Expression exp = oneToManyMapping.buildSelectionCriteria();
ExpressionBuilder builder = exp.getBuilder();
Expression addedExpression = builder.getField("MAP_EMP.LNAME").equal("Chapman");
oneToManyMapping.setSelectionCriteria(exp.and(addedExpression));
}
/**
* CR3922
* This method tests OneToOneMapping.buildSelectionCriteria() when mapping has target foreign keys, which would allow customers to
* get the potential selection criteria for a mapping prior to initialization.
* This would allow them to more easily create an ammendment method that would ammend the SQL for the join.
* Add a selection criteria that retrievs all hardware (computers) with employee's last name Louis.
*/
public static void modifyTargetOneToOneMappingDescriptor(org.eclipse.persistence.descriptors.ClassDescriptor descriptor) {
OneToOneMapping oneToOneMapping = (OneToOneMapping)descriptor.getMappingForAttributeName("computer");
Expression exp = oneToOneMapping.buildSelectionCriteria();
ExpressionBuilder builder = exp.getBuilder();
Expression addedExpression = builder.getField("MAP_HRW.EMP_LNAME").equal("Louis");
oneToOneMapping.setSelectionCriteria(exp.and(addedExpression));
}
}