Newer
Older
package com.example.scheduler_server;
Rafi Zereselasie (raz070)
committed
import java.util.Locale;
Rafi Zereselasie (raz070)
committed
/*
Name: UserThread
Description: This class handles messages sent from the clients, and the required parsing to be used for in the
Shift and Schedule classes.
*/
public class UserThread extends Thread {
Rafi Zereselasie (raz070)
committed
private final Socket socket;
private final ScheduleServer server;
Rafi Zereselasie (raz070)
committed
private final DataBaseQuery dbQuery;
Rafi Zereselasie (raz070)
committed
/*
Name: UserThread
Parameters:
Socket socket: socket for communicating to the client.
ScheduleServer server: The class responsible for establishing the first connection to a new client and creating
a UserThread for it.
DataBaseQuery dbQuery: Class responsible for connecting to the database, and containing all the methods on it.
Description: Constructor class that gets the input stream to be read when client messages are sent.
Return: UserThread
*/
public UserThread(Socket socket, ScheduleServer server, DataBaseQuery dbQuery) {
this.socket = socket;
this.server = server;
Rafi Zereselasie (raz070)
committed
this.dbQuery = dbQuery;
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
OutputStream output = socket.getOutputStream();
writer = new PrintWriter(output, true);
String serverMessage;
String clientMessage;
serverMessage = dbQuery.staff.allEmployees();
sendMessage(serverMessage);
Rafi Zereselasie (raz070)
committed
serverMessage = dbQuery.schedule.allShifts();
serverMessage = dbQuery.availability.allAvailabilities();
sendMessage(serverMessage);
serverMessage = dbQuery.timeOff.allTimeOff();
sendMessage(serverMessage);
Rafi Zereselasie (raz070)
committed
serverMessage = dbQuery.positions.allPositions();
sendMessage(serverMessage);
do {
clientMessage = reader.readLine();
String[] args = clientMessage.split("/");
Rafi Zereselasie (raz070)
committed
System.out.println(clientMessage);
if(args.length == 7){
try {
String newEmployee = dbQuery.staff.addEmployee(args[1], args[2], args[3], args[4], args[5],
Float.parseFloat(args[6]));
if (!newEmployee.isEmpty()){
String newEmployeeAvailability = dbQuery.availability
.newEmployeeAvailability(Integer.parseInt(newEmployee.split(",")[0]));
server.broadcast("addEmployee/" + newEmployee);
server.broadcast("newEmployeeAvailability/" + newEmployeeAvailability);
}
} catch (Exception exception) {
System.out.println("Error: Formatting exception while adding employee");
exception.printStackTrace();
Rafi Zereselasie (raz070)
committed
}
}
break;
case "removeEmployee":
try {
Rafi Zereselasie (raz070)
committed
int employeeID = Integer.parseInt(args[1]);
Rafi Zereselasie (raz070)
committed
dbQuery.schedule.removeAllShiftsByID(employeeID);
dbQuery.timeOff.removeAllTimeOffByID(employeeID);
dbQuery.availability.removeEmployeeAvailability(employeeID);
Rafi Zereselasie (raz070)
committed
if (employeeID == dbQuery.staff.removeEmployee(employeeID)) {
Rafi Zereselasie (raz070)
committed
server.broadcast("removeEmployee/" + employeeID);
server.broadcast("removeEmployeeAvailability/" + employeeID);
server.broadcast("removeAllShiftsByID/" + employeeID);
server.broadcast("removeAllTimeOffByID/" + employeeID);
Rafi Zereselasie (raz070)
committed
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while removing employee");
exception.printStackTrace();
case "editShift":
try {
Rafi Zereselasie (raz070)
committed
String editedShift = dbQuery.schedule.editShift(Integer.parseInt(args[1]), args[2], args[3],
args[4], args[5], Integer.parseInt(args[6]));
if (!editedShift.isEmpty()) {
server.broadcast("editShift/" + editedShift);
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while editing shift");
exception.printStackTrace();
Rafi Zereselasie (raz070)
committed
String newShift = dbQuery.schedule.addShift(Integer.parseInt(args[1]), args[2],
Integer.parseInt(args[3]), Integer.parseInt(args[4]), args[5]);
if (!newShift.isEmpty()){
server.broadcast("addShift/" + newShift);
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while adding shift");
exception.printStackTrace();
Rafi Zereselasie (raz070)
committed
case "editShiftAvailability":
try {
String editedShiftAvailability = dbQuery.schedule.editShiftAvailability(Integer.parseInt(args[1]), args[2]);
if (!editedShiftAvailability.isEmpty()) {
server.broadcast("editShiftAvailability/" + args[1] + "/" + args[2]);
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while setting time off approval");
exception.printStackTrace();
}
break;
int shiftID = Integer.parseInt(args[1]);
Rafi Zereselasie (raz070)
committed
if (shiftID == dbQuery.schedule.removeShiftByID(shiftID)) {
server.broadcast("removeShift/" + shiftID);
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while removing shift");
exception.printStackTrace();
}
break;
case "editAvailability":
try {
String editedAvailability = dbQuery.availability.editAvailability(Integer.parseInt(args[1]),
Integer.parseInt(args[2]), Integer.parseInt(args[3]), Integer.parseInt(args[4]));
if (!editedAvailability.isEmpty()) {
server.broadcast("editedAvailability/" + editedAvailability);
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while editing availability");
exception.printStackTrace();
}
break;
case "addTimeOff":
try {
String newTimeOff = dbQuery.timeOff.addTimeOff(Integer.parseInt(args[1]), args[2], args[3],
false, args[4]);
if (!newTimeOff.isEmpty()) {
server.broadcast("addTimeOff/" + newTimeOff);
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while add time off");
exception.printStackTrace();
}
break;
case "removeTimeOff":
try {
int timeOffID = Integer.parseInt(args[1]);
if (timeOffID == dbQuery.timeOff.removeTimeOff(Integer.parseInt(args[1]))) {
server.broadcast("removeTimeOff/" + timeOffID);
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while removing time off");
exception.printStackTrace();
}
break;
case "setTimeOffApproval":
try {
String newTimeOffApproval = dbQuery.timeOff.setTimeOffApproval(Integer.parseInt(args[1]), args[2]);
if (!newTimeOffApproval.isEmpty()) {
server.broadcast("timeOffApproval/" + newTimeOffApproval);
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while setting time off approval");
exception.printStackTrace();
Rafi Zereselasie (raz070)
committed
case "addPosition":
Rafi Zereselasie (raz070)
committed
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
try {
String newPosition = dbQuery.positions.addPosition(args[1], Integer.parseInt(args[2]));
if (!newPosition.isEmpty()) {
server.broadcast("addPosition/" + newPosition);
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while setting time off approval");
exception.printStackTrace();
}
break;
case "editPosition":
try {
String editedPosition = dbQuery.positions.editPosition(args[1], Float.parseFloat(args[2]));
if (!editedPosition.isEmpty()) {
server.broadcast("addPosition/" + editedPosition);
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while setting time off approval");
exception.printStackTrace();
}
break;
case "removePosition":
try {
dbQuery.staff.removePositionALLEmployee(args[1]);
dbQuery.positions.removePosition(args[1]);
server.broadcast("removePositionAllEmployees/" + args[1].toLowerCase(Locale.ROOT));
server.broadcast("removePosition/" + args[1].toLowerCase(Locale.ROOT));
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while setting time off approval");
exception.printStackTrace();
}
break;
case "addEmployeePosition":
Rafi Zereselasie (raz070)
committed
try {
String addedPosition = dbQuery.staff.addPosition(Integer.parseInt(args[1]), args[2]);
if (!addedPosition.isEmpty()) {
Rafi Zereselasie (raz070)
committed
server.broadcast("addEmployeePosition/" + addedPosition);
Rafi Zereselasie (raz070)
committed
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while setting time off approval");
exception.printStackTrace();
}
break;
Rafi Zereselasie (raz070)
committed
case "removeEmployeePosition":
Rafi Zereselasie (raz070)
committed
try {
String removedPosition = dbQuery.staff.removePosition(Integer.parseInt(args[1]), args[2]);
if (!removedPosition.isEmpty()) {
Rafi Zereselasie (raz070)
committed
server.broadcast("removeEmployeePosition/" + removedPosition);
Rafi Zereselasie (raz070)
committed
}
} catch (NumberFormatException exception) {
System.out.println("Error: Formatting exception while setting time off approval");
exception.printStackTrace();
}
break;
case "allEmployees":
//Returns all Employees
serverMessage = dbQuery.staff.allEmployees();
sendMessage(serverMessage);
break;
case "allShifts":
Rafi Zereselasie (raz070)
committed
serverMessage = dbQuery.schedule.allShifts();
sendMessage(serverMessage);
break;
case "allAvailabilities":
serverMessage = dbQuery.availability.allAvailabilities();
sendMessage(serverMessage);
break;
case "allTimeOff":
serverMessage = dbQuery.timeOff.allTimeOff();
sendMessage(serverMessage);
break;
}
} while (!clientMessage.equals("logout"));
server.removeUser(this);
socket.close();
Rafi Zereselasie (raz070)
committed
} catch (IOException exception) {
System.out.println("Error in UserThread: " + exception.getMessage());
exception.printStackTrace();
Rafi Zereselasie (raz070)
committed
/*
Name: sendMessage
Parameters:
String message: message to be sent.
Description: Sends a message to the client of this thread.
Return: void