Index: ActiviteitenOpvolging/ActiviteitenOpvolging/domain/managers/implementations/EmployeeManager.vb =================================================================== diff -u -r1714 -r1718 --- ActiviteitenOpvolging/ActiviteitenOpvolging/domain/managers/implementations/EmployeeManager.vb (.../EmployeeManager.vb) (revision 1714) +++ ActiviteitenOpvolging/ActiviteitenOpvolging/domain/managers/implementations/EmployeeManager.vb (.../EmployeeManager.vb) (revision 1718) @@ -1,4 +1,6 @@ -Public Class EmployeeManager +Imports ActiviteitenOpvolging.configs + +Public Class EmployeeManager Implements IEmployeeManager Private ReadOnly _employees As ICollection(Of IEmployee) @@ -15,44 +17,70 @@ 'Select the employees from the collection of all employees, which are not selected yet. 'The employees are compared on their initials in lowercase. Return New HashSet(Of IEmployee)(_employees.Where(Function(employee) _ - Not _selectedEmployees.Any(Function(selectedEmployee) _ + Not _selectedEmployeesDictionary.Any(Function(selectedEmployee) _ employee.Equals(selectedEmployee)))) End Get End Property - Private ReadOnly _selectedEmployees As New List(Of IEmployee) + Private ReadOnly _selectedEmployeesDictionary As new Dictionary(Of Integer, IEmployee) ''' Public ReadOnly Property SelectedEmployees As ICollection(Of IEmployee) Implements IEmployeeManager.SelectedEmployees Get - Return New HashSet(Of IEmployee)(_selectedEmployees) + Return New HashSet(Of IEmployee)(_selectedEmployeesDictionary.Values) End Get End Property Sub New() 'Initial fetching of employees, then stored. _employees = EmployeesDatabaseMapper.FetchEmployees() + 'Filling the selected employees dictionary with the employee number (an index) and 'Nothing' as value. Indicating no selected employee. + For i = 0 To ConfigsLoader.NumberOfEmployees - 1 + _selectedEmployeesDictionary.Add(i, Nothing) + Next End Sub ''' - Public Sub SelectEmployee(employee As IEmployee) Implements IEmployeeManager.SelectEmployee - 'Check whether or not that employee is already picked. - If _selectedEmployees.Any(Function(selectedEmployee) selectedEmployee.Equals(employee)) Then + Public Function GetSelectedEmployee(employeeNumber As Integer) As IEmployee Implements IEmployeeManager.GetSelectedEmployee + If _selectedEmployeesDictionary.ContainsKey(employeeNumber) Then + Throw New InternalException($"Employee number for getting the selected value is invalid, key value: {employeeNumber}.") + End If + 'Get the value. + Return _selectedEmployeesDictionary.Item(employeeNumber) + End Function + + ''' + Public Sub SelectEmployee(employeeNumber As Integer, employee As IEmployee) Implements IEmployeeManager.SelectEmployee + 'Employee number must be valid: exist in the dictionary. + If not _selectedEmployeesDictionary.ContainsKey(employeeNumber) Then + Throw New InternalException($"Employee number for selecting an employee is invalid, key value: {employeeNumber}.") + End If + 'Employee can't be nothing. + If employee Is Nothing Then + Throw New InternalException($"The soon-to-be selected Employee can't be nothing.") + End If + 'Check whether or not that employee is already picked. The selected employees can be 'Nothing'. + If _selectedEmployeesDictionary.Values.Any(Function(selectedEmployee) Not IsNothing(selectedEmployee) AndAlso selectedEmployee.Equals(employee)) Then 'Employee was picked already. Throw New Exception("Employee was already chosen.") End If - 'Add employee to list of selected employees. - _selectedEmployees.Add(employee) + 'No employee can already be selected for that number. + If _selectedEmployeesDictionary.Item(employeeNumber) IsNot Nothing Then + Throw New Exception($"An employee was already chosen for number (index): {employeeNumber}.") + End If + + 'Add employee to dictionary of selected employees -> set the value according to an employee number. + _selectedEmployeesDictionary.Item(employeeNumber) = employee End Sub ''' - Public Sub RemoveEmployeeSelection(employee As IEmployee) Implements IEmployeeManager.RemoveEmployeeSelection + Public Sub RemoveEmployeeSelection(employeeNumber As Integer) Implements IEmployeeManager.RemoveEmployeeSelection 'Find the employee to remove. - Dim employeeToRemove = _selectedEmployees.Find(Function(selectedEmployee) selectedEmployee.Equals(employee)) + Dim employeeToRemove = _selectedEmployeesDictionary.Item(employeeNumber) If employeeToRemove Is Nothing Then 'The employee was not selected, thus can't be deselected. Throw New Exception("Cannot remove the selection of a non-selected employee.") End If - 'Remove the employee. - _selectedEmployees.Remove(employeeToRemove) + 'Remove the employee -> set the value back to 'Nothing'. + _selectedEmployeesDictionary.Item(employeeNumber) = Nothing End Sub End Class