-
Notifications
You must be signed in to change notification settings - Fork 1
/
ConsoleManagerUI.java
320 lines (302 loc) · 12.3 KB
/
ConsoleManagerUI.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Scanner;
/**
* Represents an instance of a manager login session.
* @author Dennis Kenyon
* @author Brian Crabtree
* @author David Anderson
* @version 31May2015
*
*/
public class ConsoleManagerUI {
/**
* A shared Scanner resource used for any place there is System.in.
*/
Scanner myScanner = null;
public ConsoleManagerUI(String theEmail, ArrayList<ParkManager> theManagerList, ArrayList<Job> theJobList, Scanner theScanner) throws FileNotFoundException {
myScanner = theScanner;
this.managerMenu(theEmail, theManagerList, theJobList);
}
/**
* The park manager menu choice 'hub.'
* @param theEmail the park manager's email used to log the park manager on
* @param theManagerList a complete list of park manager objects to help instantiate the current user with
* @param theJobList a master list of every job that exists
* @throws FileNotFoundException if persistent data files do not exist
*/
private void managerMenu(String theEmail, ArrayList<ParkManager> theManagerList, ArrayList<Job> theJobList) throws FileNotFoundException {
ParkManager currentUser = null;
for (ParkManager manager : theManagerList) {
if (manager.getEmail().equals(theEmail)) {
currentUser = manager;
}
}
System.out.println();
System.out.println("Welcome, ParkManager " + currentUser.getFirstName() + " " + currentUser.getLastName() + "!");
promptManagerMenu();
String userInput = myScanner.next();
while (!userInput.equals("5")) {
if (userInput.equals("1")) {// user selects menu choice 1
managerMenu1(currentUser, theJobList, myScanner);
}
else if (userInput.equals("2")) {// user selects menu choice 2
managerMenu2(currentUser);
}
else if (userInput.equals("3")) {// user selects menu choice 3
managerMenu3(currentUser);
}
else if(userInput.equals("4")) {// user selects menu choice 4
managerMenu4(currentUser);
} else {
System.out.println("Not a valid command. Type 1, 2, 3, 4, or 5.");
}
userInput = myScanner.next();
}
System.out.println("Goodbye.");
System.out.println("---CONSOLE DEMO OFFLINE---");
}
/**
* This method represents User Story 1: As a Park Manager, I want to submit a new job request.
* @param currentUser the current park manager user
* @param theJobList a master list of all jobs that exist
* @param scanner a passed scanner to take in text in the console
*/
private void managerMenu1(ParkManager currentUser, ArrayList<Job> theJobList, Scanner scanner) {
String userInput = null;
Calendar cal = Calendar.getInstance();
int currentDay = cal.get(Calendar.DAY_OF_MONTH);
int currentMonth = cal.get(Calendar.MONTH) + 1;
int currentYear = 2015;
int currentDayCount = (currentMonth * 30) + currentDay + (currentYear * 365);
//check to see if 30 total jobs exist business rule 1
if (businessRuleOneCheck(theJobList)) {
promptManagerMenu();
} else {
String jobName = null;
int jobMonth = 0;
int jobDay = 0;
int jobYear = 0;
String jobLocation = null;
int maxLight = 0;
int maxMed = 0;
int maxHeavy = 0;
String otherInfo = null;
System.out.println("JOB REQUEST FORM");
System.out.print("Job name: ");
scanner.nextLine(); //consume line, go to next
jobName = scanner.nextLine();
System.out.print("Job day (dd): ");
jobDay = scanner.nextInt();
System.out.print("Job month (mm): ");
jobMonth = scanner.nextInt();
System.out.print("Job year (yyyy): ");
jobYear = scanner.nextInt();
if (!businessRuleFiveCheck(currentDayCount, jobYear, jobMonth, jobDay)) { //IF BUSINESS RULE 5 VIOLATION
promptManagerMenu();
} else if (!businessRuleTwoCheck(theJobList, jobMonth, jobDay, currentMonth, currentDay)) { //IF BUSINESS RULE 2 VIOLATION
promptManagerMenu();
}
else {
System.out.print("Park name: ");
scanner.nextLine();
jobLocation = scanner.nextLine();
if (!businessRuleEightCheck(currentUser, jobLocation)) { //IF BUSINESS RULE 8 VIOLATION
promptManagerMenu();
} else {
System.out.print("Max number of light-load volunteers: ");
maxLight = scanner.nextInt();
System.out.print("Max number of medium-load volunteers: ");
maxMed = scanner.nextInt();
System.out.print("Max number of heavy-load volunteers: ");
maxHeavy = scanner.nextInt();
System.out.println("Other information about the job: ");
scanner.nextLine();
otherInfo = scanner.nextLine();
System.out.println("Your job looks like this:");
System.out.println(" Name: " + jobName);
System.out.println(" Date: " + jobMonth + "/" + jobDay + "/2015");
System.out.println(" Location: " + jobLocation);
System.out.println(" Maximum Workers per load:");
System.out.println(" Light: " + maxLight);
System.out.println(" Medium: " + maxMed);
System.out.println(" Heavy: " + maxHeavy);
System.out.println(" Other information: " + otherInfo);
System.out.println("Submit job request (Y/N)?: ");
userInput = scanner.next();
if (userInput.equalsIgnoreCase("Y")) {
Job job = new Job(jobName, jobMonth, jobDay, jobLocation, maxLight, maxMed, maxHeavy, otherInfo);
currentUser.submitJob(job);
//following try/catch is from: http://stackoverflow.com/questions/1625234/how-to-append-text-to-an-existing-file-in-java
try(FileWriter fileWriter = new FileWriter("src/jobs.txt", true);
BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
PrintWriter out = new PrintWriter(bufferWriter)){
out.print(jobName + "," + jobMonth + "," + jobDay + "," + jobLocation + "," + maxLight + "," + maxMed + "," +
maxHeavy + "," + otherInfo + ",");
}
catch( IOException e ){
// File writing/opening failed at some stage.
}
System.out.println("---Your job has been sent in.---\n\n");
currentUser.addJob(job); //not only does this job save in the persistent data, but it is also added in this session's job list
promptManagerMenu();
} else if (userInput.equalsIgnoreCase("N")) {
System.out.println("---Job request cancelled.---\n\n");
promptManagerMenu();
} else {
System.out.println("Type 'Y' for yes or 'N' for no.");
}
}
}
}
}
/**
* This method represents User Story 5: As a Park Manager, I want to view upcoming jobs in the parks that I manage.
* @param currentUser the current park manager user
*/
private void managerMenu2(ParkManager currentUser) {
System.out.println("---Upcoming jobs for parks I manage:---");
for (String park : currentUser.getMyParks()) {
System.out.println(" " + park);
for (Job job : currentUser.getMyJobs()) {
if (job.getLocation().equals(park)) {
System.out.println(" " + job.getName() + " - " + job.getMonth() + "/" + job.getDay() + "/2015");
}
}
}
System.out.println("---End of upcoming jobs list.---\n\n");
promptManagerMenu();
}
/**
* This method represents User Story 6: As a Park Manager, I want to view the volunteers for a job in the parks that I manage.
* @param currentUser the current park manager user
*/
private void managerMenu3(ParkManager currentUser) {
System.out.println("---Volunteers for jobs I manage:---");
for (Job job : currentUser.getMyJobs()) {
System.out.println(" Job: " + job.getName() + " @ " + job.getLocation());
if (job.getVolunteers().size() == 0) {
System.out.println(" -NO VOLUNTEERS POSTED FOR THIS JOB-");
} else {
for (Volunteer volunteer : job.getVolunteers()) {
System.out.println(" " + volunteer);
}
}
System.out.println();
System.out.println();
}
promptManagerMenu();
}
/**
* Lists the account details for this park manager.
* @param currentUser the current park manage user
*/
private void managerMenu4(ParkManager currentUser) {
System.out.println("Account details:");
System.out.println(" Name: " + currentUser.getFirstName() + " " + currentUser.getLastName());
System.out.println(" Email: " + currentUser.getEmail());
System.out.println(" Phone number: " + currentUser.getPhoneNumber());
System.out.println(" Address: " + currentUser.getAddress());
System.out.println(" Access level: Park Manager");
System.out.println();
System.out.println();
promptManagerMenu();
}
/**
* Prints out the park manager menu prompt.
*/
private void promptManagerMenu() {
System.out.println("---PARK MANAGER OPTIONS---");
System.out.println(" 1) Submit a new job request");
System.out.println(" 2) View upcoming jobs in parks I manage");
System.out.println(" 3) View the volunteers for a for a job in the parks I manage");
System.out.println(" 4) View my account information");
System.out.println(" 5) Logout");
}
/**
* Checks to see if business rule 1 is violated.
* Business rule 1 is: A job may not be added if the total number of pending jobs is currently 30.
* @param theJobList the master job list
* @return true if it is violated, false otherwise
*/
private boolean businessRuleOneCheck(ArrayList<Job> theJobList) {
if (theJobList.size() >= 30) {
System.out.println("--ERROR: Too many pending jobs (30) in the system exist. Try again later.");
System.out.println();
return true;
} else {
return false;
}
}
/**
* Checks to see if business rule 2 is violated.
* Business rule 2: A job may not be added if the total number of pending jobs during that week (3 days on either side of the job days)
* is currently 5. In other words, during any consecutive 7 day period there can be no more than 5 jobs.
* @theJobList the master job list
* @jobMonth the month
* @jobDay the day
* @currentMonth the current month from today's date
* @currentDay the current day from today's date
* @return false if this business rule is violated, true otherwise
*/
private boolean businessRuleTwoCheck(ArrayList<Job> theJobList, int jobMonth, int jobDay, int currentMonth, int currentDay) {
int leftBound7Day = ((jobMonth * 30) + jobDay ) - 3; // used for enforcing business rule 2
int rightBound7Day = ((jobMonth * 30) + jobDay ) + 3; // used for enforcing business rule 2
int businessRule2Counter = 0; //used for business rule 2; if over 5, can't add this job
for (Job job : theJobList) { //used to tally businessRule2Counter
int thisJobsDayCount = job.getMonth() * 30 + job.getDay();
if (thisJobsDayCount <= rightBound7Day && thisJobsDayCount >= leftBound7Day) {
businessRule2Counter++;
}
}
if (((jobMonth * 30) + jobDay) - ((currentMonth * 30) + currentDay) > 90) {
System.out.println("--ERROR: Job is too far from today's date. Jobs must be no more than three months in the future.");
System.out.println();
System.out.println();
return false;
} else if (businessRule2Counter > 4) { //check for business rule 2
System.out.println("--ERROR: There are already five jobs scheduled in this seven day period, so this job can't be added.");
System.out.println();
System.out.println();
return false;
}
return true;
}
/**
* Checks to see if business rule 5 is violated.
* Business rule 5: A job may not be added that is in the past or more than three months in the future.
* @return false if violated, true otherwise
*/
private boolean businessRuleFiveCheck(int currentDayCount, int jobYear, int jobMonth, int jobDay) {
if (currentDayCount > ((jobMonth * 30) + jobDay + (jobYear * 365))) {
System.out.println("--ERROR: You can't add a job that is supposed to happen in the past.");
System.out.println();
System.out.println();
return false;
} else {
return true;
}
}
/**
* Checks to see if business rule 8 is violated.
* Business rule 8: A Park Manager can create jobs only for those parks that he/she manages.
* @param currentUser the current park manager user session
* @param jobLocation the park location's name
* @return false if a park manager does not own this jobLocation, true otherwise
*/
private boolean businessRuleEightCheck(ParkManager currentUser, String jobLocation) {
if (!currentUser.ownsPark(jobLocation)) {
System.out.println("--ERROR: You don't own this park and therefore can't create a job for it.");
System.out.println();
System.out.println();
return false;
} else {
return true;
}
}
}