$29
Goal
The course project is your opportunity to demonstrate all of the concepts from the course in one body of work.
Project Structure
The nal project will have you apply your problem solving and development skills. The solution will require you to bring together
Abstract data types and data structures Java implementation
Basic algorithms
Software development techniques including version control, testing, debugging, and defensive programming
Good software program design Database design and use
While we provide a recommended problem for the course, you have the option of proposing a di erent problem for the project. A project proposal must include a non-trivial example of all the concepts mentioned above.
The project is not expected to include a user interface component or software that directly accesses a device’s hardware.
Recommended Problem
One of the tools to help us manage the COVID-19 pandemic is contact tracing. When one person is diagnosed with COVID-19, the ability to notify other individuals who have been in contact with the person who is COVID-positive allows us to limit the spread of the disease faster.
At the same time, the ability to use contact information to detect the frequency of large gatherings also helps us understand the community’s compliance with physical distancing advisories.
For this project, you will replicate scaled-down functionality of the Canadian federal government’s application for contact tracing.
1
The big picture of the Canadian application
At a high level, each individual has an application on their mobile phones that detect instances of the same application on nearby mobile phones through Bluetooth connections. The phones record the date and duration of the contacts with other phones and periodically report these contacts, in an anonymized manner, to a central database in the government.
When an individual is diagnosed with COVID-19, that diagnosis is also recorded in the central database. Any individual who has been in contact with the diagnosed case within 14 days is then noti ed of the contact on the next time that their mobile phone contacts the central database.
We can also use the central database to check for large gatherings. Given a large gathering, many of the individuals at the gathering will report contact with the same or similar set of individuals. Identifying these clusters of tightly-connected individuals on a daily basis gives us a sign of how frequently large groups are gathering; we can then watch for increases in COVID-19 diagnoses following those events.
Figure 1: Canadian COVID-19 tracking application overview
Privacy is maintained in the system by having each individual identi ed by a hash of device information rather than with a login. The hash cannot be inverted. Mobile phones only exchange their hashes when they detect contact, and the mobile phones only report hashes (theirs and of others) to the Canadian government, so the government cannot identify who is who.
2
Project simpli cation
In this project, you will not
Detect or create Bluetooth connections between devices
Draw device information from the hardware to create a hash
Create timers to periodically upload contact information from your implementation to the Cana-dian government’s database (or a class database)
Instead, you will have a method to record a contact with someone else and a method to trigger an upload of your collected contact information to a database.
You will need to design at least two classes. The rst class, called MobileDevice, will have the functions that the mobile phone would do:
store contacts with others and upload the contacts to the central database,
report that you have been tested positive for COVID-19 to the central database, and
report back if the central database tells us that someone we’ve been around has been diagnosed with COVID-19.
The second class, called Government, will have the functions that are centralized:
storing the overall set of contacts, storing the test results,
notifying individuals who contact the database if they have been in contact with someone who has tested positive for COVID-19, and
being able to report the number of large gatherings on any particular date.
The reporting of data from MobileDevice to Government will happen with method calls. In a full-scale implementation, they would communicate with one another through a network socket in a client-server architecture, but that’s a topic for another day.
Speci c methods are described in the next section, along with the criteria on what it means to detect a large gathering. You are permitted to add exceptions to these methods and return values. . . as long as you document them.
In the nal solution, you will also design the database. Calls to the MobileDevice and the Government classes will happen from a main() method that you provide. Marking may also have JUnit tests that invoke the methods directly.
Functionality for MobileDevice
MobileDevice(String configFile, Government contactTracer Constructor for the class. It ac-cepts a con guration le that contains the device’s network address (string) and device name (string); these would normally come from the hardware, but we’ll put them in the con guration le instead for simplicity. The con guration le will have one line for each con guration value.
The format of a line is <keyword>=<value> where keyword is either address or deviceName. You are welcome to add other con guration parameters.
contactTracer is the object that represents the government and that you will use to record your results.
3
Figure 2: General interaction structure for MobileDevice and Government classes
recordContact(String individual, int date, int duration) When our Bluetooth driver (not part of this project) detects another device, that driver calls recordContact to locally record that individual (an alphanumeric string) was near us on date for duration minutes. The date is the number of days since January 1, 2021. These contacts do not go to the government system right away. They are stored in MobileDevice until the time comes to send the bulk of contacts to the government.
positiveTest(String testHash) The user interface (not part of this project) will call positiveTest when the user asks to tell the system that they have tested positive for COVID-19. The testing agency will provide an alphanumeric string that identi es the test; the user will record that string to link those results to the individual who normally uses the mobile device. testHash will need to be matched with a test result in the Government system.
boolean synchronizeData() Some process on the mobile device (not part of this project) will invoke this method periodically to trigger an exchange with the government database. When invoked, the application will package all of the information in the mobile device into a formatted string and send that information to the government through the Government object’s mobileContact method. The information packaged up includes the device’s hash, any contacts, and positive test hashes reported by the owner of the phone (as user calls to positiveTest). The method gets back from the government an indicator of whether or not this mobile device has been near anyone diagnosed with COVID-19 in the last 14 days. That outcome is the return value of synchronizeData: true if the device has been near someone with covid-19 and false otherwise.
The MobileDevice class will not write SQL statements to the government database. You will encode your data for the government object in a String; the format is of your choice, but I recommend that you consider organizing your data in an XML format. The government object, acting as a server, will then parse the string from the mobile device and store or retrieve data from the database.
4
Functionality for Government
Government(String configFile) Constructor for the class. It accepts a con guration le that contains the domain name of the database for the government (string), the username to access the database (string) and the password to access the database (string). The con guration le will have one line for each con guration value. The format of a line is <keyword>=<value> where keyword is either database, user or password. You are welcome to add other con guration parameters.
boolean mobileContact(String initiator, String contactInfo) This method is called by the mobile device synchronizeData method to send the contact information to the government. The caller is identi ed in the system by initiator, which is a String-valued hash of the mobile device’s network address and name. The purpose of hashing the device address and name is to allow a device to be uniquely identi ed without revealing any information about the user. For a cryptographically secure hash value, I would recommend using the SHA-256 hash function from the MessageDigest class in java.security.
All the contact information is contained in the contactInfo string. You, as designer, get to de ne the structure of contactInfo. Be sure to document your format fully, either internally or externally.
The method returns whether or not the contacting mobile device has been near someone who tested positive for COVID-19 within 14 days of their contact. Only new COVID-19 contacts are reported back. These contacts must be stored in the government database to survive restarts of the program.
recordTestResult(String testHash, int date, boolean result) Record in the database that a test, identi ed by the alphanumeric string testHash, had a collection taken up on date (the number of days since January 1, 2021), and came out positive (result = true) or negative (result = false).
int findGatherings(int date, int minSize, int minTime, float density) Looking at the con-tacts reported on date, return the number of large gatherings on that date. Again the date is the number of days since January 1, 2021.
To detect a gathering, consider all pairs of individuals A and B. Find the set S of people that both A and B contacted on that day (including A and B). We only consider S as a gathering if it contains at least minSize individuals.
To determine whether the gathering S is large, count the number of pairs of individuals c within S who contacted one another on the given date for at least minTime minutes. Note that if S contains
n individuals then there can be at most m = n(n 1) possible pairs. We then compare c with this
2
maximum: if c=m is greater than density then the gathering is deemed large and worth reporting. In such an instance, we then remove all individuals in S from our continued search for large gatherings on this day.
5
Project process
A Gitlab repository has been provided to you to use for your project. You can locate it and clone it from https://git.cs.dal.ca/courses/2021-winter/csci-3901/course-project/xxx.git where you should replace xxx with your CS user ID. You are strongly encouraged to use your Git repository for version control throughout the development of your project.
You will push the nal version of your repository to the remote repository on Gitlab before the deadline, at which point I will disable pushing updates to the repository.
The nal commit in your repository should include:
The Java source les for your project
Any test harness or Java tests you wrote for testing The SQL script to create your database
A .pdf report detailing the design of your solution as well as your test plan (what tests you will and/or did run to ensure proper operation)
Milestones
Only the nal submission is graded. These milestones are provided only as a rough guideline for completion of the project. Feel free to ask the course instructor or TA for feedback on any of these milestones.
March 5: Understanding the problem
March 19: Design of the solution. data structures, algorithms, & test plan
April 2nd: Progress has begun on implementation
April 16th: Project due
Marking scheme
Documentation (10%) Test plan (15%)
Overall design and coding style (25%)
Working implementation, including e cient processing (50%)
6