/******************************************************************************* | |
* 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.isolatedsession; | |
import java.util.*; | |
import java.io.*; | |
import java.math.BigDecimal; | |
import java.sql.Time; | |
import org.eclipse.persistence.indirection.*; | |
/** | |
* <p><b>Purpose</b>: Represent a employee of an organization. | |
* <p><b>Description</b>: An Employee is a root object in the Employee Demo. | |
* It maintains relationships to all of the other objects in the system. | |
* The employee shows usage of 1-1, 1-m, m-m, aggregate and transformation mappings. | |
* The employee also shows usage of value holder to implement indirection for its relationships | |
* (note, it is strongly suggested to always use value holders for relationships). | |
*/ | |
public class IsolatedEmployee implements Serializable { | |
/** Primary key, maped as a direct-to-field, BigDecimal -> NUMBER, that makes use of sequence numbers to generate the id. */ | |
public BigDecimal id; | |
/** Direct-to-field mapping, String -> VARCHAR. */ | |
public String firstName; | |
/** Direct-to-field mapping, String -> VARCHAR. */ | |
public String lastName; | |
/** Object-type mapping, maps "Male" -> "M", "Female" -> "F". */ | |
public String gender; | |
/** Aggregate-object mapping, stores the object in the employee's table. */ | |
public IsolatedEmploymentPeriod period; | |
/** One-to-one mapping, employee references its address through a foreign key. */ | |
public ValueHolderInterface address; | |
/** One-to-one mapping (same class relationship), employee references its manager through a foreign key. */ | |
public ValueHolderInterface manager; | |
/** One-to-many mapping (same class relationship), inverse relationship to manager, uses manager foreign key in the target. */ | |
public ValueHolderInterface managedEmployees; | |
/** One-to-many mapping, employee references its collection of phone numbers using a foreign key in the phone's table. */ | |
public ValueHolderInterface phoneNumbers; | |
/** Many-to-many mapping, employee references its projects through an intermediate join table. */ | |
public ValueHolderInterface projects; | |
/** Direct-collection mapping, employee stores its collection of plain Strings in an intermediate table. */ | |
public ValueHolderInterface responsibilitiesList; | |
/** Transformation mapping, a two(2) element array holding the employee's normal working hours (START_TIME & END_TIME), | |
this is stored into two different fields in the employee table. */ | |
public Time[] normalHours; | |
/** Direct-to-field mapping, int -> NUMBER, salary of the employee in dollars. */ | |
public int salary; | |
public boolean hasChanges = false; | |
/** For performance testing, how many times primary key extracted. */ | |
public static int getIdCallCount = 0; | |
/** | |
* For fields that make use of indirection the constructor should build the value holders. | |
*/ | |
public IsolatedEmployee() { | |
this.firstName = ""; | |
this.lastName = ""; | |
this.address = new ValueHolder(); | |
this.manager = new ValueHolder(); | |
this.managedEmployees = new ValueHolder(new Vector()); | |
this.projects = new ValueHolder(new Vector()); | |
this.responsibilitiesList = new ValueHolder(new Vector()); | |
this.phoneNumbers = new ValueHolder(new Vector()); | |
this.normalHours = new Time[2]; | |
Calendar startTime = Calendar.getInstance(); | |
startTime.set(Calendar.MILLISECOND, 0); | |
startTime.set(1970, 0, 1, 9, 0, 0); | |
this.normalHours[0] = new Time(startTime.getTime().getTime()); | |
Calendar endTime = Calendar.getInstance(); | |
endTime.set(Calendar.MILLISECOND, 0); | |
endTime.set(1970, 0, 1, 17, 0, 0); | |
this.normalHours[1] = new Time(endTime.getTime().getTime()); | |
} | |
public boolean hasChanges() { | |
return hasChanges; | |
} | |
public void clearChanges() { | |
hasChanges = false; | |
} | |
public void setChanged() { | |
hasChanges = true; | |
} | |
public static IsolatedEmployee buildEmployeeExample1() { | |
IsolatedEmployee employee = new IsolatedEmployee(); | |
employee.setFirstName("Bob"); | |
employee.setLastName("Smith"); | |
employee.setMale(); | |
employee.setSalary(35000); | |
employee.setPeriod(IsolatedEmploymentPeriod.EmploymentPeriodExample1()); | |
employee.setAddress(IsolatedAddress.AddressExample1()); | |
employee.addResponsibility("Make the coffee."); | |
employee.addResponsibility("Clean the kitchen."); | |
employee.addPhoneNumber(new IsolatedPhoneNumber("Home", "613", "555-9878")); | |
return employee; | |
} | |
public static IsolatedEmployee buildEmployeeExample2() { | |
IsolatedEmployee employee = new IsolatedEmployee(); | |
employee.setFirstName("Andy"); | |
employee.setLastName("McDurmont"); | |
employee.setMale(); | |
employee.setSalary(1500); | |
employee.setPeriod(IsolatedEmploymentPeriod.EmploymentPeriodExample2()); | |
employee.setAddress(IsolatedAddress.AddressExample2()); | |
employee.addResponsibility("Shred reports"); | |
employee.addPhoneNumber(new IsolatedPhoneNumber("Home", "613", "555-9878")); | |
return employee; | |
} | |
/** | |
* For bi-directional relationships, it is important to maintain both sides of the relationship when changing it. | |
*/ | |
public void addManagedEmployee(IsolatedEmployee employee) { | |
setChanged(); | |
getManagedEmployees().addElement(employee); | |
employee.setManager(this); | |
} | |
/** | |
* For bi-directional relationships, it is important to maintain both sides of the relationship when changing it. | |
*/ | |
public void addPhoneNumber(IsolatedPhoneNumber phoneNumber) { | |
setChanged(); | |
getPhoneNumbers().addElement(phoneNumber); | |
phoneNumber.setOwner(this); | |
} | |
public void addProject(org.eclipse.persistence.testing.models.employee.interfaces.Project project) { | |
setChanged(); | |
getProjects().addElement(project); | |
} | |
public void addResponsibility(String responsibility) { | |
setChanged(); | |
getResponsibilitiesList().addElement(responsibility); | |
} | |
/** | |
* Builds the normalHours Vector. | |
* IMPORTANT: This method builds the value but does not set it. | |
* The mapping will set it using method or direct access | |
* as defined in the descriptor. | |
*/ | |
public Time[] buildNormalHours(org.eclipse.persistence.sessions.Record row, org.eclipse.persistence.sessions.Session session) { | |
Time[] hours = new Time[2]; | |
/** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */ | |
hours[0] = (Time)session.getDatasourcePlatform().convertObject(row.get("START_TIME"), java.sql.Time.class); | |
hours[1] = (Time)session.getDatasourcePlatform().convertObject(row.get("END_TIME"), java.sql.Time.class); | |
return hours; | |
} | |
/** | |
* Builds the table definitions for this class | |
*/ | |
public static org.eclipse.persistence.tools.schemaframework.TableDefinition buildIsolatedTableDefinition() { | |
org.eclipse.persistence.tools.schemaframework.TableDefinition tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition(); | |
// SECTION: TABLE | |
tabledefinition.setName("ISOLATED_EMPLOYEE"); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field.setName("EMP_ID"); | |
field.setTypeName("NUMERIC"); | |
field.setSize(15); | |
field.setShouldAllowNull(false); | |
field.setIsPrimaryKey(true); | |
field.setUnique(false); | |
field.setIsIdentity(true); | |
tabledefinition.addField(field); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field1 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field1.setName("F_NAME"); | |
field1.setTypeName("VARCHAR"); | |
field1.setSize(40); | |
field1.setShouldAllowNull(true); | |
field1.setIsPrimaryKey(false); | |
field1.setUnique(false); | |
field1.setIsIdentity(false); | |
tabledefinition.addField(field1); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field2 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field2.setName("L_NAME"); | |
field2.setTypeName("VARCHAR"); | |
field2.setSize(40); | |
field2.setShouldAllowNull(true); | |
field2.setIsPrimaryKey(false); | |
field2.setUnique(false); | |
field2.setIsIdentity(false); | |
tabledefinition.addField(field2); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field3 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field3.setName("START_DATE"); | |
field3.setTypeName("DATE"); | |
field3.setShouldAllowNull(true); | |
field3.setIsPrimaryKey(false); | |
field3.setUnique(false); | |
field3.setIsIdentity(false); | |
tabledefinition.addField(field3); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field4 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field4.setName("END_DATE"); | |
field4.setTypeName("DATE"); | |
field4.setShouldAllowNull(true); | |
field4.setIsPrimaryKey(false); | |
field4.setUnique(false); | |
field4.setIsIdentity(false); | |
tabledefinition.addField(field4); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field5 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field5.setName("START_TIME"); | |
field5.setTypeName("DATE"); | |
field5.setShouldAllowNull(true); | |
field5.setIsPrimaryKey(false); | |
field5.setUnique(false); | |
field5.setIsIdentity(false); | |
tabledefinition.addField(field5); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field6 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field6.setName("END_TIME"); | |
field6.setTypeName("DATE"); | |
field6.setShouldAllowNull(true); | |
field6.setIsPrimaryKey(false); | |
field6.setUnique(false); | |
field6.setIsIdentity(false); | |
tabledefinition.addField(field6); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field7 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field7.setName("GENDER"); | |
field7.setTypeName("VARCHAR"); | |
field7.setSize(1); | |
field7.setShouldAllowNull(true); | |
field7.setIsPrimaryKey(false); | |
field7.setUnique(false); | |
field7.setIsIdentity(false); | |
tabledefinition.addField(field7); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field8 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field8.setName("ADDR_ID"); | |
field8.setTypeName("NUMERIC"); | |
field8.setSize(15); | |
field8.setShouldAllowNull(true); | |
field8.setIsPrimaryKey(false); | |
field8.setUnique(false); | |
field8.setIsIdentity(false); | |
field8.setForeignKeyFieldName("ISOLATED_ADDRESS.ADDRESS_ID"); | |
tabledefinition.addField(field8); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field9 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field9.setName("MANAGER_ID"); | |
field9.setTypeName("NUMERIC"); | |
field9.setSize(15); | |
field9.setShouldAllowNull(true); | |
field9.setIsPrimaryKey(false); | |
field9.setUnique(false); | |
field9.setIsIdentity(false); | |
field9.setForeignKeyFieldName("ISOLATED_EMPLOYEE.EMP_ID"); | |
tabledefinition.addField(field9); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field10 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field10.setName("VERSION"); | |
field10.setTypeName("NUMERIC"); | |
field10.setSize(15); | |
field10.setShouldAllowNull(true); | |
field10.setIsPrimaryKey(false); | |
field10.setUnique(false); | |
field10.setIsIdentity(false); | |
tabledefinition.addField(field10); | |
return tabledefinition; | |
} | |
/** | |
* TopLink generated method. | |
* <b>WARNING</b>: This code was generated by an automated tool. | |
* Any changes will be lost when the code is re-generated | |
*/ | |
public static org.eclipse.persistence.tools.schemaframework.TableDefinition buildISOLATEDRESPONSTable() { | |
org.eclipse.persistence.tools.schemaframework.TableDefinition tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition(); | |
// SECTION: TABLE | |
tabledefinition.setName("ISOLATED_RESPONS"); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field.setName("EMP_ID"); | |
field.setTypeName("NUMERIC"); | |
field.setSize(15); | |
field.setShouldAllowNull(false); | |
field.setIsPrimaryKey(true); | |
field.setUnique(false); | |
field.setIsIdentity(false); | |
field.setForeignKeyFieldName("EMPLOYEE.EMP_ID"); | |
tabledefinition.addField(field); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field1 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field1.setName("DESCRIP"); | |
field1.setTypeName("VARCHAR"); | |
field1.setSize(200); | |
field1.setShouldAllowNull(false); | |
field1.setIsPrimaryKey(true); | |
field1.setUnique(false); | |
field1.setIsIdentity(false); | |
tabledefinition.addField(field1); | |
return tabledefinition; | |
} | |
/** | |
* TopLink generated method. | |
* <b>WARNING</b>: This code was generated by an automated tool. | |
* Any changes will be lost when the code is re-generated | |
*/ | |
public static org.eclipse.persistence.tools.schemaframework.TableDefinition buildISOLATEDSALARYTable() { | |
org.eclipse.persistence.tools.schemaframework.TableDefinition tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition(); | |
// SECTION: TABLE | |
tabledefinition.setName("ISOLATED_SALARY"); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field.setName("EMP_ID"); | |
field.setTypeName("NUMERIC"); | |
field.setSize(15); | |
field.setShouldAllowNull(false); | |
field.setIsPrimaryKey(true); | |
field.setUnique(false); | |
field.setIsIdentity(false); | |
field.setForeignKeyFieldName("EMPLOYEE.EMP_ID"); | |
tabledefinition.addField(field); | |
// SECTION: FIELD | |
org.eclipse.persistence.tools.schemaframework.FieldDefinition field1 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition(); | |
field1.setName("SALARY"); | |
field1.setTypeName("NUMBER"); | |
field1.setSize(10); | |
field1.setShouldAllowNull(true); | |
field1.setIsPrimaryKey(false); | |
field1.setUnique(false); | |
field1.setIsIdentity(false); | |
tabledefinition.addField(field1); | |
return tabledefinition; | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public IsolatedAddress getAddress() { | |
return (IsolatedAddress)address.getValue(); | |
} | |
/** | |
* Return the last element of the Transformation mapped normalHours. | |
*/ | |
public Time getEndTime() { | |
return getNormalHours()[1]; | |
} | |
public String getFirstName() { | |
return firstName; | |
} | |
public String getGender() { | |
return gender; | |
} | |
/** | |
* Used for performance testing. | |
*/ | |
public static int getGetIdCallCount() { | |
return getIdCallCount; | |
} | |
/** | |
* Return the persistent identifier of the receiver. | |
*/ | |
public BigDecimal getId() { | |
getIdCallCount++; | |
return id; | |
} | |
public String getLastName() { | |
return lastName; | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public Vector getManagedEmployees() { | |
return (Vector)managedEmployees.getValue(); | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public IsolatedEmployee getManager() { | |
return (IsolatedEmployee)manager.getValue(); | |
} | |
public Time[] getNormalHours() { | |
return normalHours; | |
} | |
public IsolatedEmploymentPeriod getPeriod() { | |
return period; | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public Vector getPhoneNumbers() { | |
return (Vector)phoneNumbers.getValue(); | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public Vector getProjects() { | |
return (Vector)projects.getValue(); | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public Vector getResponsibilitiesList() { | |
return (Vector)responsibilitiesList.getValue(); | |
} | |
public int getSalary() { | |
return salary; | |
} | |
/** | |
* Return the first element of the Transformation mapped normalHours. | |
*/ | |
public java.sql.Time getStartTime() { | |
return getNormalHours()[0]; | |
} | |
/** | |
* For bi-directional relationships, it is important to maintain both sides of the relationship when changing it. | |
*/ | |
public void removeManagedEmployee(IsolatedEmployee employee) { | |
setChanged(); | |
getManagedEmployees().removeElement(employee); | |
employee.setManager(null); | |
} | |
/** | |
* Remove the phone number. | |
* The phone number's owner must not be set to null as it is part of it primary key, | |
* and you can never change the primary key of an existing object. | |
* Only in independent relationships should you null out the back reference. | |
*/ | |
public void removePhoneNumber(IsolatedPhoneNumber phoneNumber) { | |
setChanged(); | |
getPhoneNumbers().removeElement(phoneNumber); | |
} | |
public void removeProject(org.eclipse.persistence.testing.models.employee.interfaces.Project project) { | |
setChanged(); | |
getProjects().removeElement(project); | |
} | |
public void removeResponsibility(String responsibility) { | |
setChanged(); | |
getResponsibilitiesList().removeElement(responsibility); | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public void setAddress(IsolatedAddress address) { | |
setChanged(); | |
this.address.setValue(address); | |
} | |
/** | |
* Set the last element of the Transformation mapped normalHours. | |
*/ | |
public void setEndTime(Time endTime) { | |
setChanged(); | |
getNormalHours()[1] = endTime; | |
} | |
public void setFemale() { | |
setChanged(); | |
setGender("Female"); | |
} | |
public void setFirstName(String firstName) { | |
setChanged(); | |
this.firstName = firstName; | |
} | |
public void setGender(String gender) { | |
setChanged(); | |
this.gender = gender; | |
} | |
/** | |
* For performance testing. | |
*/ | |
public static void setGetIdCallCount(int value) { | |
IsolatedEmployee.getIdCallCount = value; | |
} | |
/** | |
* Set the persistent identifier of the receiver. | |
* Note this should never be changed. | |
* Consider making the primary key set methods protected or not having them. | |
* In this demo the setId is required for testing purposes. | |
*/ | |
public void setId(BigDecimal id) { | |
setChanged(); | |
this.id = id; | |
} | |
public void setLastName(String lastName) { | |
setChanged(); | |
this.lastName = lastName; | |
} | |
public void setMale() { | |
setChanged(); | |
setGender("Male"); | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public void setManagedEmployees(Vector managedEmployees) { | |
setChanged(); | |
this.managedEmployees.setValue(managedEmployees); | |
} | |
/** | |
* For bi-directional relationships, it is important to maintain both sides of the relationship when changing it. | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public void setManager(IsolatedEmployee manager) { | |
setChanged(); | |
this.manager.setValue(manager); | |
} | |
public void setNormalHours(Time[] normalHours) { | |
setChanged(); | |
this.normalHours = normalHours; | |
} | |
public void setPeriod(IsolatedEmploymentPeriod period) { | |
setChanged(); | |
this.period = period; | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public void setPhoneNumbers(Vector phoneNumbers) { | |
setChanged(); | |
this.phoneNumbers.setValue(phoneNumbers); | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public void setProjects(Vector projects) { | |
setChanged(); | |
this.projects.setValue(projects); | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public void setResponsibilitiesList(Vector responsibilitiesList) { | |
setChanged(); | |
this.responsibilitiesList.setValue(responsibilitiesList); | |
} | |
public void setSalary(int salary) { | |
setChanged(); | |
this.salary = salary; | |
} | |
/** | |
* Set the first element of the Transformation mapped normalHours. | |
*/ | |
public void setStartTime(Time startTime) { | |
setChanged(); | |
getNormalHours()[0] = startTime; | |
} | |
/** | |
* Print the first & last name | |
*/ | |
public String toString() { | |
StringWriter writer = new StringWriter(); | |
writer.write("IsolatedEmployee: "); | |
writer.write(getFirstName()); | |
writer.write(" "); | |
writer.write(getLastName()); | |
return writer.toString(); | |
} | |
} |