Hopefully they won't get truncated. I've reverted back to using ToStringBuilder now that I've eliminated it as the problem.
I know the design is not ideal and we're using composite keys but we're kind of stuck with a legacy database that we cannot change without significant impacts to existing applications.
Code:
package edu.vanderbilt.mis.miswork.model;
import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import edu.vanderbilt.mis.commons.lang.DateUtils;
/**
* A <code>TimeSheet</code> collects the hours worked by a given worker in a
* given week (as indicated by the week-ending date). The hours are recorded
* in {@link TimeSheetEntry}s.
*
* <p>Copyright 2004 Vanderbilt University</p>
* @author B squad, Management Information Systems
* @version ($Revision: 1.25 $, $Date: 2004/12/15 19:58:22 $)
*/
public class TimeSheet implements Serializable
{
private Worker worker;
private Date weekEndDate;
private Date submitDate;
private String oprId;
private boolean submitted;
private Set entries = new TreeSet();
private String historicalDiscriminator;
public static final String CURRENT_TIMESHEET = "C";
public static final String HISTORICAL_TIMESHEET = "H";
/**
* Default no-arg constructor
*/
public TimeSheet()
{
super();
}
/**
* Alternate constructor, specifying <code>TimeSheet<code>'s "key" fields:
* Worker and Week End Date
* @param worker worker whose time is recorded on this Time Sheet.
* @param weekEndDate week ending date of this Time Sheet
*/
public TimeSheet(Worker worker, Date weekEndDate)
{
// TODO do we want to prevent null worker and week end date?
this.worker = worker;
this.weekEndDate = weekEndDate;
if ( worker != null )
this.oprId = worker.getOprid();
this.submitted = false;
this.historicalDiscriminator = CURRENT_TIMESHEET;
}
/**
* Worker associated with this time sheet
* @return Returns the worker.
*/
public Worker getWorker()
{
return worker;
}
/**
* Set the worker associated with this time sheet
* @param worker The worker to set.
*/
private void setWorker(Worker worker)
{
this.worker = worker;
}
/**
* Time sheet's week-ending date. By convention weeks end on a Saturday.
* @return Returns the weekEndDate.
*/
public Date getWeekEndDate()
{
return weekEndDate;
}
/**
* Date of the week this timehsheet started on.
* @return Returns the starting date for this timehsheet.
*/
public Date getWeekStartDate()
{
return DateUtils.subtractDays(getWeekEndDate(), 6);
}
/**
* Set the week-ending date. By convention, weeks end on a Saturday.
* <p>
* It is the responsibility of the developer to ensure that the provided
* date is on a Saturday.
*
* @param weekEndDate The weekEndDate to set.
*/
private void setWeekEndDate(Date weekEndDate)
{
this.weekEndDate = weekEndDate;
}
/**
* Date time sheet was submitted.
* @return Returns the submitDate.
*/
public Date getSubmitDate()
{
return submitDate;
}
/**
* Yes/No flag indicating whether the timesheet has been submitted.
* @return Returns the submitFlag.
*/
public boolean isSubmitted()
{
return submitted;
}
/**
* Set the submit flag
* @param submitFlag The submitFlag to set.
*/
public void submit()
{
submitted = true;
submitDate = new Date();
}
/**
* Sets the <code>java.util.Set</code> of {@link TimeSheetEntry}
* for the <code>TimeSheet</code>.
*
* @param entries The entries to set.
*/
public void setEntries(Set entries)
{
this.entries = entries;
}
/**
* Returns the set of all {@link TimeSheetEntry} for the
* <code>TimeSheet</code>.
*
* @return Returns the entries.
*/
public Set getEntries()
{
return entries;
}
/**
* Adds an individual {@link TimeSheetEntry} to the set of
* {@link TimeSheetEntry}.
*
* @param entry an entry to add to the set.
* @return True if this time sheet did not already contain a timesheet entry for
* <code>entry.getWorkId()</code>.
*/
public boolean addEntry(TimeSheetEntry entry)
{
entry.setTimeSheet(this);
return entries.add(entry);
}
/**
* Sets the oprid for the timesheet.
* <p>
* The timesheet oprid should always match the oprid on
* the associated {@link Worker}. These methods are
* provided so that hibernate can deal with the legacy
* datbase
*
* @return Returns the oprId.
*/
public String getOprId()
{
// TODO maybe we should delegate to Worker.oprId
return oprId;
}
/**
* Gets the oprid for the timesheet.
* <p>
* The timesheet oprid should always match the oprid on
* the associated {@link Worker}. These methods are
* provided so that hibernate can deal with the legacy
* datbase
*
* @param oprId The oprId to set.
*/
public void setOprId(String oprId)
{
this.oprId = oprId;
}
public String getHistoricalDiscriminator()
{
return historicalDiscriminator;
}
public Float getTotalHours()
{
float total = 0;
for (Iterator iter = entries.iterator(); iter.hasNext();)
{
TimeSheetEntry entry = (TimeSheetEntry) iter.next();
total += entry.getHoursWorked().floatValue();
}
return new Float( total );
}
/**
* Determine if two Time Sheets are equal by comparing their "key" fields:
* Worker and Week End Date
* @param obj object to compare for equality
*/
public boolean equals(Object obj)
{
boolean result = false;
if (obj instanceof TimeSheet)
{
TimeSheet rhs = (TimeSheet)obj;
result = new EqualsBuilder().append(worker, rhs.getWorker()).append(weekEndDate,
rhs.getWeekEndDate()).isEquals();
}
return result;
}
/**
* Calculate hash codes using the "key" fields: Worker and Week End Date
*/
public int hashCode()
{
return new HashCodeBuilder(11, 13).append(worker).append(weekEndDate).toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
public String toString()
{
return new ToStringBuilder(this)
.append("weekEndDate", weekEndDate)
.append("worker", worker)
.append("submitDate", submitDate)
.append("submitted", submitted)
//TODO: We've run into a problem with the entries collection with hibernate.
// For some reason hibernate is using a lazy fetching strategy for the entries
// collection. This leads to a StackOverflowError during toString(). It would be nice
// if we could figure out what is going on and fix it. For now, we'll just remove
// the entries collection from the toString().
//.append("entries", entries)
.toString();
}
}
/* @(#) $Id: TimeSheetEntry.java,v 1.13 2004/09/27 18:03:49 murray Exp $ */
package edu.vanderbilt.mis.miswork.model;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
/**
* A <code>TimeSheetEntry</code> records the number of hours worked on a given
* <code>Work</code> item. <code>TimeSheetEntrys</code> are collected on {@link TimeSheet}s
* and dont' exist independently.
*
* @copyright 2004 Vanderbilt University
* @author B squad, Management Information Systems
* @version ($Revision: 1.13 $, $Date: 2004/09/27 18:03:49 $)
*/
public class TimeSheetEntry implements Serializable, Comparable
{
private Long version;
private TimeSheet timeSheet;
private Work work;
private Float hoursWorked;
private String saveFlag = "Y";
private String historicalDiscriminator;
/**
* {@link TimeSheet} where this entry is entered.
* @return timesheet
*/
public TimeSheet getTimeSheet()
{
return timeSheet;
}
/**
* Set the {@link TimeSheet} for this entry. Note that this method is
* package friendly as it should only be called from TimeSheet by the
* {@link TimeSheet#addEntry(TimeSheetEntry)}
* @param sheet
*/
void setTimeSheet(TimeSheet sheet)
{
this.timeSheet = sheet;
historicalDiscriminator = sheet.getHistoricalDiscriminator();
}
/**
* Work item for which hours have been recorded.
* @return Returns the work item.
*/
public Work getWork()
{
return work;
}
/**
* Set work item.
* @param work The work item to set.
*/
public void setWork(Work work)
{
this.work = work;
}
/**
* Hours worked on the work item.
* @return Returns the hoursWorked.
*/
public Float getHoursWorked()
{
return hoursWorked;
}
/**
* Set hours worked
* @param hoursWorked The hoursWorked to set.
*/
public void setHoursWorked(Float hoursWorked)
{
this.hoursWorked = hoursWorked;
}
/**
* Flag indicating whether a <code>TimeSheetEntry</code> should be copied to
* the next week after a {@link TimeSheet} is submitted. In the PeopleSoft
* version of MISwork this was used to define default work ID's to keep on
* the time sheet. In the web version, there is no notion of defaults so we're
* going to force the flag to true so that all work items are copied to the
* next week's sheet.
*
* @return Returns the saveFlag.
*/
private String getSaveFlag()
{
return "Y";
}
/**
* Set the save flag.
* @param saveFlag The saveFlag to set.
*/
private void setSaveFlag(String saveFlag)
{
// Do nothing because we don't care about the save flag
}
/**
* The attribute used for tracking versioned <code>TimeSheetEntry</code>s.
* <p>
* This property should strictly only be used by hibernate and is
* not intended for the application to set or modify its value.
*
* @return the hibernate version for the row of data
*/
private Long getVersion()
{
return version;
}
/**
* The attribute used for tracking versioned <code>TimeSheetEntry</code>s.
* <p>
* This property should strictly only be used by hibernate and is
* not intended for the application to set or modify its value.
*
* @param version the hibernate version for the row of data
*/
private void setVersion(Long version)
{
this.version = version;
}
/**
* Determine object equality by comparing the "key fields" <code>timeSheet</code>
* and <code>work</code>.
*/
public boolean equals(Object object)
{
boolean result = false;
if (object instanceof TimeSheetEntry)
{
TimeSheetEntry rhs = (TimeSheetEntry)object;
result = new EqualsBuilder()
.append( this.getTimeSheet(), rhs.getTimeSheet() )
.append( this.getWork(), rhs.getWork() )
.isEquals();
}
return result;
}
/**
* Calculate hashe code based on the "key fields" <code>timeSheet</code>
* and <code>work</code>.
* @see java.lang.Object#hashCode()
*/
public int hashCode()
{
return new HashCodeBuilder(23, 29)
.append( getTimeSheet() )
.append( getWork() )
.toHashCode();
}
/*
* @see java.lang.Object#toString()
*/
public String toString()
{
return new ToStringBuilder(this)
.append( "work", work)
.append( "hoursWorked", hoursWorked)
.append( "saveFlag", saveFlag)
.append( "version", version )
.toString();
}
/*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(Object o)
{
TimeSheetEntry rhs = (TimeSheetEntry)o;
return work.getWorkId().compareTo(rhs.getWork().getWorkId());
}
}