/******************************************************************************* | |
* Copyright (c) 1998, 2008 Oracle. 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: | |
* dclarke - Dynamic Persistence INCUBATION - Enhancement 200045 | |
* http://wiki.eclipse.org/EclipseLink/Development/JPA/Dynamic | |
* | |
* This code is being developed under INCUBATION and is not currently included | |
* in the automated EclipseLink build. The API in this code may change, or | |
* may never be included in the product. Please provide feedback through mailing | |
* lists or the bug database. | |
******************************************************************************/ | |
package org.eclipse.persistence.testing.models.dynamic.employee; | |
import java.sql.Date; | |
import java.util.ArrayList; | |
import java.util.Calendar; | |
import java.util.Collection; | |
import java.util.Collections; | |
import java.util.Comparator; | |
import java.util.List; | |
import junit.framework.Assert; | |
import org.eclipse.persistence.descriptors.ClassDescriptor; | |
import org.eclipse.persistence.dynamic.DynamicEntity; | |
import org.eclipse.persistence.dynamic.DynamicHelper; | |
import org.eclipse.persistence.expressions.Expression; | |
import org.eclipse.persistence.expressions.ExpressionBuilder; | |
import org.eclipse.persistence.queries.DeleteAllQuery; | |
import org.eclipse.persistence.queries.ReadObjectQuery; | |
import org.eclipse.persistence.queries.ReportQuery; | |
import org.eclipse.persistence.sessions.DatabaseSession; | |
import org.eclipse.persistence.sessions.Session; | |
import org.eclipse.persistence.sessions.UnitOfWork; | |
/** | |
* | |
* @author dclarke | |
* @since EclipseLink - Dynamic Incubator (1.1.0-branch) | |
*/ | |
@SuppressWarnings("deprecation") | |
public class Sample { | |
private DatabaseSession session; | |
public DynamicEntity[] employees; | |
public DynamicEntity[] smallProjects; | |
public DynamicEntity[] largeProjects; | |
public Sample(DatabaseSession session) { | |
this.session = session; | |
this.employees = new DynamicEntity[] { basicEmployeeExample1(), basicEmployeeExample2(), basicEmployeeExample3(), basicEmployeeExample4(), basicEmployeeExample5(), basicEmployeeExample6(), basicEmployeeExample7(), basicEmployeeExample8(), basicEmployeeExample9(), basicEmployeeExample10(), basicEmployeeExample11(), basicEmployeeExample12() }; | |
this.smallProjects = new DynamicEntity[] { basicSmallProjectExample1(), basicSmallProjectExample2(), basicSmallProjectExample3(), basicSmallProjectExample4(), basicSmallProjectExample5(), basicSmallProjectExample7(), basicSmallProjectExample8(), basicSmallProjectExample9(), basicSmallProjectExample10() }; | |
this.largeProjects = new DynamicEntity[] { basicLargeProjectExample1(), basicLargeProjectExample2(), basicLargeProjectExample3(), basicLargeProjectExample4(), basicLargeProjectExample5() }; | |
// Setup management hierarchy | |
addManagedEmployees(0, new int[] { 2, 3, 4 }); | |
addManagedEmployees(1, new int[] { 5, 0 }); | |
addManagedEmployees(2, new int[] {}); | |
addManagedEmployees(3, new int[] {}); | |
addManagedEmployees(4, new int[] {}); | |
addManagedEmployees(5, new int[] {}); | |
addManagedEmployees(6, new int[] {}); | |
addManagedEmployees(7, new int[] {}); | |
addManagedEmployees(8, new int[] {}); | |
addManagedEmployees(9, new int[] { 7, 8, 10, 11 }); | |
addManagedEmployees(10, new int[] { 6 }); | |
addManagedEmployees(11, new int[] { 1 }); | |
// Setup Employee-Project associations | |
addProjects(0, new int[] { 0, 1, 2 }, new int[] {}); | |
addProjects(1, new int[] { 3, 4, 0 }, new int[] {}); | |
addProjects(2, new int[] { 3 }, new int[] { 3, 4 }); | |
addProjects(4, new int[] { 3, 1 }, new int[] { 2, 4 }); | |
addProjects(5, new int[] {}, new int[] { 1 }); | |
addProjects(6, new int[] {}, new int[] { 1 }); | |
// Setup LargeProject leads | |
this.largeProjects[0].set("teamLeader", this.employees[1]); | |
this.largeProjects[3].set("teamLeader", this.employees[2]); | |
this.largeProjects[4].set("teamLeader", this.employees[2]); | |
} | |
private DynamicEntity newInstance(String entityAlias) { | |
ClassDescriptor descriptor = this.session.getDescriptorForAlias(entityAlias); | |
return (DynamicEntity) descriptor.getInstantiationPolicy().buildNewInstance(); | |
} | |
private Class getDynamicClass(String entityAlias) { | |
ClassDescriptor descriptor = this.session.getDescriptorForAlias(entityAlias); | |
return descriptor.getJavaClass(); | |
} | |
private DynamicEntity addPhoneNumber(DynamicEntity employee, String type, String areaCode, String number) { | |
DynamicEntity phone = newInstance("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; | |
} | |
private void setPeriod(DynamicEntity employee, Date startDate, Date endDate) { | |
DynamicEntity period = newInstance("EmploymentPeriod"); | |
period.set("startDate", startDate); | |
period.set("endDate", endDate); | |
employee.set("period", period); | |
} | |
public DynamicEntity basicEmployeeExample1() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Bob"); | |
employee.set("lastName", "Smith"); | |
employee.set("gender", "Male"); | |
employee.set("salary", 35000); | |
setPeriod(employee, new Date(1993, 0, 1), new Date(1996, 0, 1)); | |
DynamicEntity address = newInstance("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); | |
// employee.add("responsibilities", "Water the office plants."); | |
// employee.add("responsibilities", "Maintain the kitchen facilities."); | |
addPhoneNumber(employee, "Work", "613", "5558812"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample10() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Jill"); | |
employee.set("lastName", "May"); | |
employee.set("gender", "Female"); | |
setPeriod(employee, new Date(1991, 10, 111), null); | |
DynamicEntity address = newInstance("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(employee, "Work", "613", "5558812"); | |
addPhoneNumber(employee, "Work Fax", "613", "5555943"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample11() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Sarah-Lou"); | |
employee.set("lastName", "Smitty"); | |
employee.set("gender", "Female"); | |
setPeriod(employee, new Date(1993, 0, 1), new Date(1996, 0, 1)); | |
DynamicEntity address = newInstance("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(employee, "Work Fax", "613", "5555943"); | |
addPhoneNumber(employee, "Home", "613", "5551234"); | |
addPhoneNumber(employee, "Cellular", "416", "5551111"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample12() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Jim-Bob"); | |
employee.set("lastName", "Jefferson"); | |
employee.set("gender", "Male"); | |
setPeriod(employee, new Date(1995, 0, 12), new Date(2001, 11, 31)); | |
DynamicEntity address = newInstance("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(employee, "Home", "613", "5551234"); | |
addPhoneNumber(employee, "Cellular", "416", "5551111"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample2() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "John"); | |
employee.set("lastName", "Way"); | |
employee.set("gender", "Male"); | |
employee.set("salary", 53000); | |
setPeriod(employee, new Date(1991, 10, 11), null); | |
DynamicEntity address = newInstance("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); | |
// employee.add("responsibilities", | |
// "Hire people when more people are required."); | |
// employee.add("responsibilities", | |
// "Lay off employees when less people are required."); | |
addPhoneNumber(employee, "Work", "613", "5558812"); | |
addPhoneNumber(employee, "ISDN", "905", "5553691"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample3() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Charles"); | |
employee.set("lastName", "Chanley"); | |
employee.set("gender", "Male"); | |
employee.set("salary", 43000); | |
setPeriod(employee, new Date(1995, 0, 1), new Date(2001, 11, 31)); | |
DynamicEntity address = newInstance("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); | |
// employee.add("responsibilities", | |
// "Perform code reviews as required."); | |
addPhoneNumber(employee, "Pager", "976", "5556666"); | |
addPhoneNumber(employee, "ISDN", "905", "5553691"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample4() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Emanual"); | |
employee.set("lastName", "Smith"); | |
employee.set("gender", "Male"); | |
employee.set("salary", 49631); | |
setPeriod(employee, new Date(2001, 11, 31), new Date(1995, 0, 1)); | |
DynamicEntity address = newInstance("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); | |
// employee.add("responsibilities", | |
// "Have to fix the Database problem."); | |
addPhoneNumber(employee, "Work Fax", "613", "5555943"); | |
addPhoneNumber(employee, "Cellular", "416", "5551111"); | |
addPhoneNumber(employee, "Pager", "976", "5556666"); | |
addPhoneNumber(employee, "ISDN", "905", "5553691"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample5() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Sarah"); | |
employee.set("lastName", "Way"); | |
employee.set("gender", "Female"); | |
employee.set("salary", 87000); | |
setPeriod(employee, new Date(2001, 6, 31), new Date(1995, 4, 1)); | |
DynamicEntity address = newInstance("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); | |
// employee.add("responsibilities", "Write code documentation."); | |
addPhoneNumber(employee, "Work", "613", "5558812"); | |
addPhoneNumber(employee, "ISDN", "905", "5553691"); | |
addPhoneNumber(employee, "Home", "613", "5551234"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample6() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Marcus"); | |
employee.set("lastName", "Saunders"); | |
employee.set("gender", "Male"); | |
employee.set("salary", 54300); | |
setPeriod(employee, new Date(2001, 11, 31), new Date(1995, 0, 12)); | |
DynamicEntity address = newInstance("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); | |
// employee.add("responsibilities", "Write user specifications."); | |
addPhoneNumber(employee, "ISDN", "905", "5553691"); | |
addPhoneNumber(employee, "Work", "613", "5558812"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample7() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Nancy"); | |
employee.set("lastName", "White"); | |
employee.set("gender", "Female"); | |
employee.set("salary", 31000); | |
setPeriod(employee, new Date(1996, 0, 1), new Date(1993, 0, 1)); | |
DynamicEntity address = newInstance("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(employee, "Home", "613", "5551234"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample8() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Fred"); | |
employee.set("lastName", "Jones"); | |
employee.set("gender", "Male"); | |
employee.set("salary", 500000); | |
setPeriod(employee, new Date(2001, 11, 31), new Date(1995, 0, 1)); | |
DynamicEntity address = newInstance("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(employee, "Cellular", "416", "5551111"); | |
addPhoneNumber(employee, "ISDN", "905", "5553691"); | |
return employee; | |
} | |
public DynamicEntity basicEmployeeExample9() { | |
DynamicEntity employee = newInstance("Employee"); | |
employee.set("firstName", "Betty"); | |
employee.set("lastName", "Jones"); | |
employee.set("gender", "Female"); | |
employee.set("salary", 500001); | |
setPeriod(employee, new Date(2001, 11, 31), new Date(1995, 0, 1)); | |
DynamicEntity address = newInstance("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(employee, "Work", "613", "5558812"); | |
addPhoneNumber(employee, "ISDN", "905", "5553691"); | |
return employee; | |
} | |
private void setCalendar(DynamicEntity entity, String name, int year, int month, int day, int hour, int minute, int seconds) { | |
Calendar cal = entity.<Calendar> get(name); | |
if (cal == null) { | |
cal = Calendar.getInstance(); | |
entity.set(name, cal); | |
} | |
cal.set(year, month, day, hour, minute, seconds); | |
} | |
public DynamicEntity basicLargeProjectExample1() { | |
DynamicEntity largeProject = newInstance("LargeProject"); | |
largeProject.set("name", "Sales Reporting"); | |
largeProject.set("description", "A reporting application to report on the corporations database through TopLink."); | |
largeProject.set("budget", (double) 5000); | |
setCalendar(largeProject, "milestone", 1991, 10, 11, 12, 0, 0); | |
return largeProject; | |
} | |
public DynamicEntity basicLargeProjectExample2() { | |
DynamicEntity largeProject = newInstance("LargeProject"); | |
largeProject.set("name", "Light Reporter"); | |
largeProject.set("description", "A lightweight application to report on the corporations database through TopLink."); | |
largeProject.set("budget", 100.98); | |
setCalendar(largeProject, "milestone", 1999, 11, 25, 11, 40, 44); | |
return largeProject; | |
} | |
public DynamicEntity basicLargeProjectExample3() { | |
DynamicEntity largeProject = newInstance("LargeProject"); | |
largeProject.set("name", "TOPEmployee Management"); | |
largeProject.set("description", "A management application to report on the corporations database through TopLink."); | |
largeProject.set("budget", 4000.98); | |
setCalendar(largeProject, "milestone", 1997, 10, 12, 1, 0, 0); | |
return largeProject; | |
} | |
public DynamicEntity basicLargeProjectExample4() { | |
DynamicEntity largeProject = newInstance("LargeProject"); | |
largeProject.set("name", "Enterprise System"); | |
largeProject.set("description", "A enterprise wide application to report on the corporations database through TopLink."); | |
largeProject.set("budget", 40.98); | |
setCalendar(largeProject, "milestone", 1996, 8, 6, 6, 40, 44); | |
return largeProject; | |
} | |
public DynamicEntity basicLargeProjectExample5() { | |
DynamicEntity largeProject = newInstance("LargeProject"); | |
largeProject.set("name", "Problem Reporting System"); | |
largeProject.set("description", "A PRS application to report on the corporations database through TopLink."); | |
largeProject.set("budget", 101.98); | |
setCalendar(largeProject, "milestone", 1997, 9, 6, 1, 40, 44); | |
return largeProject; | |
} | |
public DynamicEntity basicSmallProjectExample1() { | |
DynamicEntity smallProject = newInstance("SmallProject"); | |
smallProject.set("name", "Enterprise"); | |
smallProject.set("description", "A enterprise wide application to report on the corporations database through TopLink."); | |
return smallProject; | |
} | |
public DynamicEntity basicSmallProjectExample10() { | |
DynamicEntity smallProject = newInstance("SmallProject"); | |
smallProject.set("name", "Staff Query Tool"); | |
smallProject.set("description", "A tool to help staff query various things."); | |
return smallProject; | |
} | |
public DynamicEntity basicSmallProjectExample2() { | |
DynamicEntity smallProject = newInstance("SmallProject"); | |
smallProject.set("name", "Sales Reporter"); | |
smallProject.set("description", "A reporting application using JDK to report on the corporations database through TopLink."); | |
return smallProject; | |
} | |
public DynamicEntity basicSmallProjectExample3() { | |
DynamicEntity smallProject = newInstance("SmallProject"); | |
smallProject.set("name", "TOP-Employee Manager"); | |
smallProject.set("description", "A management application to report on the corporations database through TopLink."); | |
return smallProject; | |
} | |
public DynamicEntity basicSmallProjectExample4() { | |
DynamicEntity smallProject = newInstance("SmallProject"); | |
smallProject.set("name", "Problem Reporter"); | |
smallProject.set("description", "A PRS application to report on the corporations database through TopLink."); | |
return smallProject; | |
} | |
public DynamicEntity basicSmallProjectExample5() { | |
DynamicEntity smallProject = newInstance("SmallProject"); | |
smallProject.set("name", "Feather Reporter"); | |
smallProject.set("description", "An extremely lightweight application to report on the corporations database through TopLink."); | |
return smallProject; | |
} | |
public DynamicEntity basicSmallProjectExample6() { | |
DynamicEntity smallProject = newInstance("SmallProject"); | |
smallProject.set("name", "Makework"); | |
smallProject.set("description", "A makework project."); | |
return smallProject; | |
} | |
public DynamicEntity basicSmallProjectExample7() { | |
DynamicEntity smallProject = newInstance("SmallProject"); | |
smallProject.set("name", "Marketing Query Tool"); | |
smallProject.set("description", "A tool to help marketing query various things."); | |
return smallProject; | |
} | |
public DynamicEntity basicSmallProjectExample8() { | |
DynamicEntity smallProject = newInstance("SmallProject"); | |
smallProject.set("name", "Shipping Query Tool"); | |
smallProject.set("description", "A tool to help shipping query various things."); | |
return smallProject; | |
} | |
public DynamicEntity basicSmallProjectExample9() { | |
DynamicEntity smallProject = newInstance("SmallProject"); | |
smallProject.set("name", "Accounting Query Tool"); | |
smallProject.set("description", "A tool to help accounting query various things."); | |
return smallProject; | |
} | |
private void addManagedEmployees(int managerIndex, int[] employeeIndeces) { | |
DynamicEntity manager = this.employees[managerIndex]; | |
if (manager.<Collection> get("managedEmployees").isEmpty()) { | |
for (int index = 0; index < employeeIndeces.length; index++) { | |
manager.<Collection> get("managedEmployees").add(this.employees[employeeIndeces[index]]); | |
} | |
} | |
} | |
private void addProjects(int empIndex, int[] smallProjIndeces, int[] largeProjIndeces) { | |
DynamicEntity employee = this.employees[empIndex]; | |
for (int index = 0; index < smallProjIndeces.length; index++) { | |
employee.<Collection> get("projects").add(this.smallProjects[smallProjIndeces[index]]); | |
} | |
for (int index = 0; index < largeProjIndeces.length; index++) { | |
employee.<Collection> get("projects").add(this.largeProjects[largeProjIndeces[index]]); | |
} | |
} | |
/** | |
* Register all of the population in the provided EntityManager to be | |
* persisted This method should only be called from within a test case. It | |
* asserts that the provided EntityManager is in a transaction and that the | |
* database tables are empty. | |
*/ | |
public void persistAll(Session session) { | |
UnitOfWork uow = session.acquireUnitOfWork(); | |
// Verify that the database tables are empty | |
assertCount(session, "Employee", 0); | |
assertCount(session, "Address", 0); | |
assertCount(session, "PhoneNumber", 0); | |
assertCount(session, "Project", 0); | |
for (int index = 0; index < this.employees.length; index++) { | |
uow.registerNewObject(this.employees[index]); | |
} | |
for (int index = 0; index < this.smallProjects.length; index++) { | |
uow.registerNewObject(this.smallProjects[index]); | |
} | |
for (int index = 0; index < this.largeProjects.length; index++) { | |
uow.registerNewObject(this.largeProjects[index]); | |
} | |
uow.commit(); | |
verifyCounts(session); | |
} | |
public void verifyCounts(Session session) { | |
assertCount(session, "Employee", this.employees.length); | |
assertCount(session, "Address", this.employees.length); | |
assertCount(session, "Project", this.smallProjects.length + this.largeProjects.length); | |
} | |
/** | |
* Verify that the provided entity type has no rows in the database using a | |
* native ReportQuery. | |
* | |
* @param entityClass | |
* @param count | |
*/ | |
public void assertCount(Session session, String entityAlias, int count) { | |
Class entityClass = getDynamicClass(entityAlias); | |
ReportQuery query = new ReportQuery(entityClass, new ExpressionBuilder()); | |
query.addCount(); | |
query.setShouldReturnSingleValue(true); | |
int dbCount = ((Number) session.executeQuery(query)).intValue(); | |
Assert.assertEquals("Incorrect quantity found of " + entityClass, count, dbCount); | |
} | |
/** | |
* Verify that the provided list of Employee instances matches the sample | |
* population. | |
* | |
* @param employees | |
*/ | |
public void assertSame(List<DynamicEntity> dbEmps) { | |
Assert.assertEquals("Incorrect quantity of employees", this.employees.length, dbEmps.size()); | |
Collections.sort(dbEmps, new DynamicEntityComparator()); | |
List<DynamicEntity> sampleEmps = new ArrayList<DynamicEntity>(); | |
for (int index = 0; index < this.employees.length; index++) { | |
sampleEmps.add(this.employees[index]); | |
} | |
Collections.sort(sampleEmps, new DynamicEntityComparator()); | |
for (int index = 0; index < this.employees.length; index++) { | |
DynamicEntity emp = sampleEmps.get(index); | |
DynamicEntity dbEmp = dbEmps.get(index); | |
Assert.assertEquals("First name does not match on employees[" + index + "]", emp.<String> get("firstName"), dbEmp.<String> get("firstName")); | |
Assert.assertEquals("Last name does not match on employees[" + index + "]", emp.<String> get("lastName"), dbEmp.<String> get("lastName")); | |
Assert.assertEquals("Salary does not match on employees[" + index + "]", emp.<Integer> get("salary"), dbEmp.<Integer> get("salary")); | |
} | |
} | |
/** | |
* Simple comparator used to order the employees for use within assertSame | |
*/ | |
class DynamicEntityComparator implements Comparator<DynamicEntity> { | |
public int compare(DynamicEntity emp1, DynamicEntity emp2) { | |
return emp1.<Integer> get("id") - emp2.<Integer> get("id"); | |
} | |
} | |
/** | |
* Extract the id's from the sample Employee instances. | |
* | |
* @param em | |
* @return | |
*/ | |
public int[] getEmployeeIds(Session session) { | |
int[] ids = new int[this.employees.length]; | |
for (int index = 0; index < this.employees.length; index++) { | |
ids[index] = this.employees[index].<Integer> get("id"); | |
} | |
return ids; | |
} | |
/** | |
* Reset the database so that only the sample population exists. | |
* | |
* @param em | |
*/ | |
public void resetDatabase(DatabaseSession session) { | |
DeleteAllQuery deleteEmpsQuery = new DeleteAllQuery(getDynamicClass("Employee")); | |
ExpressionBuilder eb = deleteEmpsQuery.getExpressionBuilder(); | |
deleteEmpsQuery.setSelectionCriteria(eb.get("id").notIn(getEmployeeIds(session))); | |
deleteEmpsQuery.setFlushOnExecute(true); | |
UnitOfWork uow = session.acquireUnitOfWork(); | |
uow.executeQuery(deleteEmpsQuery); | |
uow.commit(); | |
} | |
public void resetSalary(UnitOfWork uow) { | |
DynamicHelper helper = new DynamicHelper(this.session); | |
for (int index = 0; index < this.employees.length; index++) { | |
DynamicEntity emp = this.employees[index]; | |
ReadObjectQuery query = helper.newReadObjectQuery("Employee"); | |
ExpressionBuilder eb = query.getExpressionBuilder(); | |
Expression fnExp = eb.get("firstName").equal(emp.get("firstName")); | |
Expression lnExp = eb.get("lastName").equal(emp.get("lastName")); | |
query.setSelectionCriteria(fnExp.and(lnExp)); | |
DynamicEntity dbEmp = (DynamicEntity) session.executeQuery(query); | |
dbEmp.set("salary", this.employees[index].<Integer> get("salary")); | |
} | |
} | |
} |