"It must allow the user to search the data for all records, or for records where the name and/or location fields exactly match values specified by the user."
but the DB interface also specifies;
// Returns an array of record numbers that match the specified
// criteria. Field n in the database file is described by
// criteria[n]. A null value in criteria[n] matches any field
// value. A non-null value in criteria[n] matches any field
// value that begins with criteria[n]. (For example, "Fred"
// matches "Fred" or "Freddy".)
public int find(String criteria);
Now at the moment my GUI will return results as per the find specification, so if you enter "Fred" as the contractor name you'll get back results where the name is "Freddy". Am I right in thinking that this does not meet the above requirement? Furthermore, am I right to assume that the search should be case sensitive?
"Fred" should only return these records with name = "Fred" (not "Freddy" nor "Fredi"). The find-method of your Data class should return the records with name = "Fred", "Freddy" and "Fredi". So at the GUI (or business service) some "exactly matching" filtering is required.
I decided to implement a case-insensitive search in Data class and business service, but that is not a requirement. I explained also in choices.txt why I chose this approach.