blob: f4a42e4e360c4205399621ffe4a32ad273ec3ec0 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 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:
// dclarke - Dynamic Persistence
// http://wiki.eclipse.org/EclipseLink/Development/Dynamic
// (https://bugs.eclipse.org/bugs/show_bug.cgi?id=200045)
// mnorman - tweaks to work from Ant command-line,
// get database properties from System, etc.
//
package org.eclipse.persistence.testing.tests.dynamic.employee;
//javase imports
import java.util.Collection;
import java.util.Date;
//EclipseLink imports
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.dynamic.DynamicClassLoader;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.dynamic.DynamicHelper;
import org.eclipse.persistence.dynamic.DynamicTypeBuilder;
import org.eclipse.persistence.mappings.OneToManyMapping;
import org.eclipse.persistence.mappings.OneToOneMapping;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.UnitOfWork;
public class DynamicEmployeeSystem {
public static final String PACKAGE_PREFIX = DynamicEmployeeSystem.class.getPackage().getName();
protected DynamicEntity[] employees = null;
protected DynamicEntity[] projects = null;
public DynamicEmployeeSystem() {
super();
}
public DynamicEntity[] employees() {
return employees;
}
public DynamicEntity[] projects() {
return projects;
}
public static DynamicEmployeeSystem buildProject(DynamicHelper dynamicHelper) {
DynamicClassLoader dcl = dynamicHelper.getDynamicClassLoader();
Class<?> employeeClass = dcl.createDynamicClass(PACKAGE_PREFIX + ".Employee");
Class<?> addressClass = dcl.createDynamicClass(PACKAGE_PREFIX + ".Address");
Class<?> phoneClass = dcl.createDynamicClass(PACKAGE_PREFIX + ".PhoneNumber");
Class<?> periodClass = dcl.createDynamicClass(PACKAGE_PREFIX + ".EmploymentPeriod");
Class<?> projectClass = dcl.createDynamicClass(PACKAGE_PREFIX + ".Project");
DynamicTypeBuilder employee = new DynamicTypeBuilder(employeeClass, null,
"D_EMPLOYEE", "D_SALARY");
DynamicTypeBuilder address = new DynamicTypeBuilder(addressClass, null, "D_ADDRESS");
DynamicTypeBuilder phone = new DynamicTypeBuilder(phoneClass, null, "D_PHONE");
DynamicTypeBuilder period = new DynamicTypeBuilder(periodClass, null);
DynamicTypeBuilder project = new DynamicTypeBuilder(projectClass, null, "D_PROJECT");
configureAddress(address);
configureEmployee(employee, address, phone, period, project);
configurePhone(phone, employee);
configurePeriod(period);
configureProject(project, employee);
employee.addManyToManyMapping("projects", project.getType(), "D_PROJ_EMP");
dynamicHelper.addTypes(true, true, employee.getType(), address.getType(), phone.getType(),
period.getType(), project.getType());
return new DynamicEmployeeSystem();
}
private static void configurePhone(DynamicTypeBuilder phone, DynamicTypeBuilder employee) {
phone.setPrimaryKeyFields("PHONE_TYPE", "EMP_ID");
phone.addDirectMapping("type", String.class, "PHONE_TYPE");
phone.addDirectMapping("ownerId", int.class, "EMP_ID").readOnly();
phone.addDirectMapping("areaCode", String.class, "AREA_CODE");
phone.addDirectMapping("number", String.class, "PNUMBER");
phone.addOneToOneMapping("owner", employee.getType(), "EMP_ID");
}
private static void configureAddress(DynamicTypeBuilder address) {
address.setPrimaryKeyFields("ADDR_ID");
address.addDirectMapping("id", int.class, "ADDR_ID");
address.addDirectMapping("street", String.class, "STREET");
address.addDirectMapping("city", String.class, "CITY");
address.addDirectMapping("province", String.class, "PROV");
address.addDirectMapping("postalCode", String.class, "P_CODE");
address.addDirectMapping("country", String.class, "COUNTRY");
address.configureSequencing("ADDR_SEQ", "ADDR_ID");
}
private static void configureEmployee(DynamicTypeBuilder employee, DynamicTypeBuilder address,
DynamicTypeBuilder phone, DynamicTypeBuilder period, DynamicTypeBuilder project) {
employee.setPrimaryKeyFields("EMP_ID");
employee.addDirectMapping("id", int.class, "D_EMPLOYEE.EMP_ID");
employee.addDirectMapping("firstName", String.class, "D_EMPLOYEE.F_NAME");
employee.addDirectMapping("lastName", String.class, "D_EMPLOYEE.L_NAME");
employee.addDirectMapping("gender", String.class, "D_EMPLOYEE.GENDER");
employee.addDirectMapping("salary", int.class, "D_SALARY.SALARY");
OneToOneMapping addressMapping =
employee.addOneToOneMapping("address", address.getType(), "ADDR_ID");
addressMapping.setCascadeAll(true);
addressMapping.setIsPrivateOwned(true);
employee.addOneToOneMapping("manager", employee.getType(), "MANAGER_ID");
OneToManyMapping phoneMapping =
employee.addOneToManyMapping("phoneNumbers", phone.getType(), "EMP_ID");
phoneMapping.setCascadeAll(true);
phoneMapping.setIsPrivateOwned(true);
employee.addAggregateObjectMapping("period", period.getType(), true);
employee.addOneToManyMapping("managedEmployees", employee.getType(), "MANAGER_ID");
employee.configureSequencing("EMP_SEQ", "EMP_ID");
}
private static void configurePeriod(DynamicTypeBuilder period) {
period.addDirectMapping("startDate", Date.class, "START_DATE");
period.addDirectMapping("endDate", Date.class, "END_DATE");
}
private static void configureProject(DynamicTypeBuilder project, DynamicTypeBuilder employee) {
project.setPrimaryKeyFields("PROJ_ID");
project.addDirectMapping("id", int.class, "PROJ_ID");
project.addDirectMapping("name", String.class, "NAME");
project.addDirectMapping("description", String.class, "DESCRIP");
project.configureSequencing("PROJ_SEQ", "PROJ_ID");
}
public void populate(DynamicHelper dynamicHelper) {
DatabaseSession ds = dynamicHelper.getSession();
DynamicEntity[] employees = {
basicEmployeeExample1(ds),
basicEmployeeExample2(ds),
basicEmployeeExample3(ds),
basicEmployeeExample4(ds),
basicEmployeeExample5(ds),
basicEmployeeExample6(ds),
basicEmployeeExample7(ds),
basicEmployeeExample8(ds),
basicEmployeeExample9(ds),
basicEmployeeExample10(ds),
basicEmployeeExample11(ds),
basicEmployeeExample12(ds)
};
this.employees = employees;
DynamicEntity[] projects = {
basicProjectExample1(ds),
basicProjectExample2(ds),
basicProjectExample3(ds),
basicProjectExample4(ds),
basicProjectExample5(ds),
basicProjectExample6(ds),
basicProjectExample7(ds),
basicProjectExample8(ds),
basicProjectExample9(ds),
basicProjectExample10(ds)
};
this.projects = projects;
// Setup management hierarchy
addManagedEmployees(ds, employees, 0, new int[]{ 2, 3, 4 });
addManagedEmployees(ds, employees, 1, new int[]{ 5, 0 });
addManagedEmployees(ds, employees, 2, new int[]{});
addManagedEmployees(ds, employees, 3, new int[]{});
addManagedEmployees(ds, employees, 4, new int[]{});
addManagedEmployees(ds, employees, 5, new int[]{});
addManagedEmployees(ds, employees, 6, new int[]{});
addManagedEmployees(ds, employees, 7, new int[]{});
addManagedEmployees(ds, employees, 8, new int[]{});
addManagedEmployees(ds, employees, 9, new int[]{ 7, 8, 10, 11 });
addManagedEmployees(ds, employees, 10, new int[]{ 6 });
addManagedEmployees(ds, employees, 11, new int[]{ 1 });
// Setup Employee-Project associations
addProjects(ds, employees, projects, 0, new int[]{ 0, 1, 2 });
addProjects(ds, employees, projects, 1, new int[]{ 3, 4, 0 });
addProjects(ds, employees, projects, 2, new int[]{ 3 });
addProjects(ds, employees, projects, 4, new int[]{ 3, 1 });
addProjects(ds, employees, projects, 5, new int[]{});
addProjects(ds, employees, projects, 6, new int[]{});
UnitOfWork uow = dynamicHelper.getSession().acquireUnitOfWork();
for (int index = 0; index < employees.length; index++) {
uow.registerNewObject(employees[index]);
}
for (int index = 0; index < projects.length; index++) {
uow.registerNewObject(projects[index]);
}
uow.commit();
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample1(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Bob");
employee.set("lastName", "Smith");
employee.set("gender", "Male");
employee.set("salary", 35000);
setPeriod(ds, employee, new Date(1993, 0, 1), new Date(1996, 0, 1));
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Toronto");
address.set("postalCode", "L5J2B5");
address.set("province", "ONT");
address.set("street", "1450 Acme Cr., Suite 4");
address.set("country", "Canada");
employee.set("address", address);
addPhoneNumber(ds, employee, "Work", "613", "5558812");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample2(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "John");
employee.set("lastName", "Way");
employee.set("gender", "Male");
employee.set("salary", 53000);
setPeriod(ds, employee, new Date(1991, 10, 11), null);
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Ottawa");
address.set("postalCode", "K5J2B5");
address.set("province", "ONT");
address.set("street", "12 Merivale Rd., Suite 5");
address.set("country", "Canada");
employee.set("address", address);
addPhoneNumber(ds, employee, "Work", "613", "5558812");
addPhoneNumber(ds, employee, "ISDN", "905", "5553691");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample3(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Charles");
employee.set("lastName", "Chanley");
employee.set("gender", "Male");
employee.set("salary", 43000);
setPeriod(ds, employee, new Date(1995, 0, 1), new Date(2001, 11, 31));
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Montreal");
address.set("postalCode", "Q2S5Z5");
address.set("province", "QUE");
address.set("street", "1 Canadien Place");
address.set("country", "Canada");
employee.set("address", address);
addPhoneNumber(ds, employee, "Pager", "976", "5556666");
addPhoneNumber(ds, employee, "ISDN", "905", "5553691");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample4(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Emanual");
employee.set("lastName", "Smith");
employee.set("gender", "Male");
employee.set("salary", 49631);
setPeriod(ds, employee, new Date(2001, 11, 31), new Date(1995, 0, 1));
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Vancouver");
address.set("postalCode", "N5J2N5");
address.set("province", "BC");
address.set("street", "20 Mountain Blvd., Floor 53, Suite 6");
address.set("country", "Canada");
employee.set("address", address);
addPhoneNumber(ds, employee, "Work Fax", "613", "5555943");
addPhoneNumber(ds, employee, "Cellular", "416", "5551111");
addPhoneNumber(ds, employee, "Pager", "976", "5556666");
addPhoneNumber(ds, employee, "ISDN", "905", "5553691");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample5(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Sarah");
employee.set("lastName", "Way");
employee.set("gender", "Female");
employee.set("salary", 87000);
setPeriod(ds, employee, new Date(2001, 6, 31), new Date(1995, 4, 1));
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Prince Rupert");
address.set("postalCode", "K3K5D5");
address.set("province", "BC");
address.set("street", "3254 Parkway Place");
address.set("country", "Canada");
employee.set("address", address);
addPhoneNumber(ds, employee, "Work", "613", "5558812");
addPhoneNumber(ds, employee, "ISDN", "905", "5553691");
addPhoneNumber(ds, employee, "Home", "613", "5551234");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample6(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Marcus");
employee.set("lastName", "Saunders");
employee.set("gender", "Male");
employee.set("salary", 54300);
setPeriod(ds, employee, new Date(2001, 11, 31), new Date(1995, 0, 12));
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Perth");
address.set("postalCode", "Y3Q2N9");
address.set("province", "ONT");
address.set("street", "234 Caledonia Lane");
address.set("country", "Canada");
employee.set("address", address);
addPhoneNumber(ds, employee, "ISDN", "905", "5553691");
addPhoneNumber(ds, employee, "Work", "613", "5558812");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample7(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Nancy");
employee.set("lastName", "White");
employee.set("gender", "Female");
employee.set("salary", 31000);
setPeriod(ds, employee, new Date(1996, 0, 1), new Date(1993, 0, 1));
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Metcalfe");
address.set("postalCode", "Y4F7V6");
address.set("province", "ONT");
address.set("street", "2 Anderson Rd.");
address.set("country", "Canada");
employee.set("address", address);
addPhoneNumber(ds, employee, "Home", "613", "5551234");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample8(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Fred");
employee.set("lastName", "Jones");
employee.set("gender", "Male");
employee.set("salary", 500000);
setPeriod(ds, employee, new Date(2001, 11, 31), new Date(1995, 0, 1));
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Victoria");
address.set("postalCode", "Z5J2N5");
address.set("province", "BC");
address.set("street", "382 Hyde Park Blvd.");
address.set("country", "Canada");
employee.set("address", address);
addPhoneNumber(ds, employee, "Cellular", "416", "5551111");
addPhoneNumber(ds, employee, "ISDN", "905", "5553691");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample9(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Betty");
employee.set("lastName", "Jones");
employee.set("gender", "Female");
employee.set("salary", 500001);
setPeriod(ds, employee, new Date(2001, 11, 31), new Date(1995, 0, 1));
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Smith Falls");
address.set("postalCode", "C6C6C6");
address.set("province", "ONT");
address.set("street", "89 Chocolate Drive");
address.set("country", "Canada");
employee.set("address", address);
addPhoneNumber(ds, employee, "Work", "613", "5558812");
addPhoneNumber(ds, employee, "ISDN", "905", "5553691");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample10(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Jill");
employee.set("lastName", "May");
employee.set("gender", "Female");
setPeriod(ds, employee, new Date(1991, 10, 111), null);
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Calgary");
address.set("postalCode", "J5J2B5");
address.set("province", "AB");
address.set("street", "1111 Mooseland Rd.");
address.set("country", "Canada");
employee.set("address", address);
employee.set("salary", 56232);
addPhoneNumber(ds, employee, "Work", "613", "5558812");
addPhoneNumber(ds, employee, "Work Fax", "613", "5555943");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample11(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Sarah-Lou");
employee.set("lastName", "Smitty");
employee.set("gender", "Female");
setPeriod(ds, employee, new Date(1993, 0, 1), new Date(1996, 0, 1));
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Arnprior");
address.set("postalCode", "W1A2B5");
address.set("province", "ONT");
address.set("street", "1 Hawthorne Drive");
address.set("country", "Canada");
employee.set("address", address);
employee.set("salary", 75000);
addPhoneNumber(ds, employee, "Work Fax", "613", "5555943");
addPhoneNumber(ds, employee, "Home", "613", "5551234");
addPhoneNumber(ds, employee, "Cellular", "416", "5551111");
return employee;
}
@SuppressWarnings("deprecation")
protected DynamicEntity basicEmployeeExample12(DatabaseSession ds) {
DynamicEntity employee = newInstance(ds, "Employee");
employee.set("firstName", "Jim-Bob");
employee.set("lastName", "Jefferson");
employee.set("gender", "Male");
setPeriod(ds, employee, new Date(1995, 0, 12), new Date(2001, 11, 31));
DynamicEntity address = newInstance(ds, "Address");
address.set("city", "Yellowknife");
address.set("postalCode", "Y5J2N5");
address.set("province", "YK");
address.set("street", "1112 Gold Rush Rd.");
address.set("country", "Canada");
employee.set("address", address);
employee.set("salary", 50000);
addPhoneNumber(ds, employee, "Home", "613", "5551234");
addPhoneNumber(ds, employee, "Cellular", "416", "5551111");
return employee;
}
protected DynamicEntity basicProjectExample1(DatabaseSession ds) {
DynamicEntity project = newInstance(ds, "Project");
project.set("name", "Enterprise");
project.set("description", "A enterprise wide application to report on the corporations database through TopLink.");
return project;
}
protected DynamicEntity basicProjectExample2(DatabaseSession ds) {
DynamicEntity project = newInstance(ds, "Project");
project.set("name", "Sales Reporter");
project.set("description", "A reporting application using JDK to report on the corporations database through TopLink.");
return project;
}
protected DynamicEntity basicProjectExample3(DatabaseSession ds) {
DynamicEntity project = newInstance(ds, "Project");
project.set("name", "TOP-Employee Manager");
project.set("description", "A management application to report on the corporations database through TopLink.");
return project;
}
protected DynamicEntity basicProjectExample4(DatabaseSession ds) {
DynamicEntity project = newInstance(ds, "Project");
project.set("name", "Problem Reporter");
project.set("description", "A PRS application to report on the corporations database through TopLink.");
return project;
}
protected DynamicEntity basicProjectExample5(DatabaseSession ds) {
DynamicEntity project = newInstance(ds, "Project");
project.set("name", "Feather Reporter");
project.set("description", "An extremely lightweight application to report on the corporations database through TopLink.");
return project;
}
protected DynamicEntity basicProjectExample6(DatabaseSession ds) {
DynamicEntity project = newInstance(ds, "Project");
project.set("name", "Makework");
project.set("description", "A makework project.");
return project;
}
protected DynamicEntity basicProjectExample7(DatabaseSession ds) {
DynamicEntity project = newInstance(ds, "Project");
project.set("name", "Marketing Query Tool");
project.set("description", "A tool to help marketing query various things.");
return project;
}
protected DynamicEntity basicProjectExample8(DatabaseSession ds) {
DynamicEntity project = newInstance(ds, "Project");
project.set("name", "Shipping Query Tool");
project.set("description", "A tool to help shipping query various things.");
return project;
}
protected DynamicEntity basicProjectExample9(DatabaseSession ds) {
DynamicEntity project = newInstance(ds, "Project");
project.set("name", "Accounting Query Tool");
project.set("description", "A tool to help accounting query various things.");
return project;
}
protected DynamicEntity basicProjectExample10(DatabaseSession ds) {
DynamicEntity project = newInstance(ds, "Project");
project.set("name", "Staff Query Tool");
project.set("description", "A tool to help staff query various things.");
return project;
}
@SuppressWarnings("unchecked")
protected DynamicEntity addPhoneNumber(DatabaseSession ds, DynamicEntity employee, String type,
String areaCode, String number) {
DynamicEntity phone = newInstance(ds, "PhoneNumber");
phone.set("type", type);
phone.set("areaCode", areaCode);
phone.set("number", number);
phone.set("owner", employee);
employee.<Collection>get("phoneNumbers").add(phone);
return phone;
}
protected void setPeriod(DatabaseSession ds, DynamicEntity employee, Date startDate, Date endDate) {
DynamicEntity period = newInstance(ds, "EmploymentPeriod");
period.set("startDate", startDate);
period.set("endDate", endDate);
employee.set("period", period);
}
@SuppressWarnings("unchecked")
protected void addManagedEmployees(DatabaseSession ds, DynamicEntity[] employees,
int managerIndex, int[] employeeIndeces) {
DynamicEntity manager = employees[managerIndex];
if (manager.<Collection> get("managedEmployees").isEmpty()) {
for (int index = 0; index < employeeIndeces.length; index++) {
manager.<Collection> get("managedEmployees").add(employees[employeeIndeces[index]]);
}
}
}
@SuppressWarnings("unchecked")
protected void addProjects(DatabaseSession ds, DynamicEntity[] employees,
DynamicEntity[] projects, int empIndex, int[] projIndeces) {
DynamicEntity employee = employees[empIndex];
for (int index = 0; index < projIndeces.length; index++) {
employee.<Collection> get("projects").add(projects[projIndeces[index]]);
}
}
protected DynamicEntity newInstance(DatabaseSession session, String entityAlias) {
ClassDescriptor descriptor = session.getDescriptorForAlias(entityAlias);
return (DynamicEntity)descriptor.getInstantiationPolicy().buildNewInstance();
}
}