1. Create an account by entering username, password, first name and last name.

a. The system needs to check that the following conditions are met, and reply with the
appropriate output message:
Conditions Messages
True False
Username contains an underscore and is no
more than 5 characters long
“Username
successfully
captured”
“Username is not
correctly formatted,
please ensure that
your username
contains an
underscore and is no
more than 5
characters in length .”
Password meets the following password
complexity rules, the password must be:
• At least 8 characters long
• Contain a capital letter
• Contain a number
• Contain a special character
“Password
successfully
captured”
“Password is not
correctly formatted,
please ensure that
the password
contains at least 8
characters, a capital
letter, a number and
a special character.”
2. Login to the account using the same username and password.
a. The system should provide the following messages to verify the user’s authentication
state:
Conditions Messages
True False
The entered username and password are
correct, and the user is able to log in.
“Welcome <user first
name> ,<user last
name> it is great to
see you again.
“Username or
password incorrect,
please try again”
3. You will need to implement a Login class with the following methods to ensure that your
application meets good coding standards and that the code you write is testable.
Method Name Method Functionality
Boolean: checkUserName() This method ensures that any username contains an under
score (_) and is no more than
Boolean:
checkPasswordComplexity()
This method ensures that passwords meet the following
password complexity rules, the password must be:
• At least eight characters long.
• Contain a capital letter
• Contain a number
• Contain a special character
String registerUser() This method returns the necessary registration messaging
indicating if:
• The username is incorrectly formatted
• The password does not meet the complexity
requirements.
• The two above conditions have been met and the user
has been registered successfully.
Boolean loginUser() This method verifies that the login details entered matches
the login details stored when the user registers.
String returnLoginStatus This method returns the necessary messaging for:
• A successful login
• A failed login
4. It is good practice to never push code that has not been tested, you will need to create the
following unit tests to verify that your methods are executing as expected:
Test: (assertEquals) Test Data and expected system responses.
Username is correctly formatted:
The username contains an underscore and is no
more than 5 characters long
Test Data: “kyl_1”
The system returns:
“Welcome <user first name> ,<user last name>
it is great to see you.”
Username incorrectly formatted: Test Data: “kyle!!!!!!!”
The username does not contain an underscore
and is no more than 5 characters long
The system returns:
“Username is not correctly formatted, please
ensure that your username contains an
underscore and is no more than 5 characters in
length.”
The password meets the complexity
requirements
Test Data: “Ch&&sec@ke99!”
The system returns:
“Password successfully captured”
The password does not meet the complexity
requirements
Test Data: “password”
The system returns:
“Password is not correctly formatted, please
ensure that the password contains at least 8
characters, a capital letter, a number and a
special character.”
Test (assertTrue/False)
Login Successful The system returns:
True
Login Failed The system returns:
False
Username correctly formatted The system returns:
True
Username incorrectly formatted The system returns:
False
Password meets complexity requirements The system returns:
True
Password does not meet complexity
requirements
The system returns:
False
You can now add the following functionality to your application:
1. The users should only be able to add tasks to the application if they have logged in
successfully.
2. The applications must display the following welcome message: “Welcome to EasyKanban”.
3. The user should then be able to choose one of the following features from a numeric menu:
a. Option 1) Add tasks
b. Option 2) Show report - this feature is still in development and should display the
following message: “Coming Soon”.
c. Option 3) Quit
4. The application should run until the users selects quit to exit.
5. Users should define how many tasks they wish to enter when the application starts, the
application should allow the user to enter only the set number of tasks.
6. Each task should contain the following information:
Task Name The name of the task to be performed: “Add
Login Feature”
Task Number Tasks start with the number 0, this number is
incremented and autogenerated as more
tasks are added .
Task Description A short description of the task, this description
should not exceed 50 characters in length.
The following error message should be
displayed if the task description is too long:
“Please enter a task description of less than
50 characters”
OR
“Task successfully captured” if the message
description meets the requirements.
Developer Details The first and last name of the developer
assigned to the task.
Task Duration The estimated duration of the task in hours.
This number will be used for calculations and
should make use of an appropriate data type.
Task ID The system must autogenerate a TaskID which
contains the first two letters of the Task
Name, a colon (:), the Task Number, a colon (:)
and the last three letters of the developer assigned to the task’s name. The ID should be
displayed in all caps:
AD:0:INA
Task Status The user should be given a menu to select the
following task statuses from:
• To Do
• Done
• Doing
7. The full details of each task should be displayed on the screen (using JOptionPane) after it
has been entered and should show all the information requested in the table above in the
following order: Task Status, Developer Details, Task Number, Task Name, Task
Description, Task ID and Duration;
7. The total number of hours across all tasks should be accumulated and displayed once all
the tasks has been entered
Create a Task class that contains the following messages:
Method Name Method Functionality
Boolean: checkTaskDescription() This method ensures that the task description
is not more than 50 characters.
String: createTaskID() This method creates and returns the taskID
String: printTaskDetails() This method returns the task full task details
of each task.
Int: returnTotalHours() This method returns the total combined hours
of all entered tasks.
1. Users should be able to use to populate the following arrays:
Array Contents
Developer Contains the names of all the developers
assigned to tasks
Task Names Contains the names of all the created tasks
Task ID Contains the generated taskID’s for all tasks
Task Duration Contains the Duration of all tasks
Task Status Contains the Status of all tasks
2. Users should be able to use these arrays to:
a. Display the Developer, Task Names and Task Duration for all tasks with the status of
done.
b. Display the Developer and Duration of the class with the longest duration.
c. Search for a task with a Task Name and display the Task Name, Developer and Task
Status.
d. Search for all tasks assigned to a developer and display the Task Name and Task
Status.
e. Delete a task using the Task Name.
f. Display a report that lists the full details of all captured tasks.
in java

Here is an example of the implementation of the described functionality in Java:

```java
import java.util.Scanner;

public class EasyKanban {
private static Scanner scanner = new Scanner(System.in);
private static int numTasks;

public static void main(String[] args) {
System.out.println("Welcome to EasyKanban");

login();

String[] developers = new String[numTasks];
String[] taskNames = new String[numTasks];
int[] taskDuration = new int[numTasks];
String[] taskStatus = new String[numTasks];

for (int i = 0; i < numTasks; i++) {
System.out.println("Enter details for task " + i);
System.out.print("Task Name: ");
taskNames[i] = scanner.nextLine();
System.out.print("Task Description: ");
String description = scanner.nextLine();
if (description.length() > 50) {
System.out.println("Task description should be less than 50 characters");
i--;
continue;
}
System.out.print("Developer Details: ");
developers[i] = scanner.nextLine();
System.out.print("Task Duration (in hours): ");
taskDuration[i] = Integer.parseInt(scanner.nextLine());
System.out.print("Task Status (To Do, Done, Doing): ");
taskStatus[i] = scanner.nextLine();
}

displayTasks(developers, taskNames, taskDuration, taskStatus);

System.out.println("Total Hours: " + getTotalHours(taskDuration));
}

public static void login() {
boolean loggedIn = false;

while (!loggedIn) {
System.out.print("Username: ");
String username = scanner.nextLine();
System.out.print("Password: ");
String password = scanner.nextLine();

if (loginUser(username, password)) {
loggedIn = true;
} else {
System.out.println("Username or password incorrect, please try again");
}
}
}

public static boolean loginUser(String username, String password) {
// Method to verify if the login details are correct
return true; // Replace with actual verification logic
}

public static void displayTasks(String[] developers, String[] taskNames, int[] taskDuration, String[] taskStatus) {
for (int i = 0; i < taskNames.length; i++) {
System.out.println("Task Status: " + taskStatus[i]);
System.out.println("Developer Details: " + developers[i]);
System.out.println("Task Name: " + taskNames[i]);
System.out.println("Task Duration: " + taskDuration[i]);
System.out.println("Task ID: " + createTaskID(taskNames[i], i, developers[i]));
System.out.println("-----------------");
}
}

public static String createTaskID(String taskName, int taskNumber, String developerName) {
String prefix = taskName.substring(0, 2).toUpperCase();
String suffix = developerName.substring(developerName.length() - 3).toUpperCase();
return prefix + ":" + taskNumber + ":" + suffix;
}

public static int getTotalHours(int[] taskDuration) {
int totalHours = 0;
for (int duration : taskDuration) {
totalHours += duration;
}
return totalHours;
}
}
```

Please note that the code provided is just an example and may require modification to fit your specific implementation and requirements.

To implement all the functionality described, you would need to write the following Java code.

First, let's start with the Task class:

```java
public class Task {
private String taskName;
private int taskNumber;
private String taskDescription;
private String developerDetails;
private double taskDuration;
private String taskID;
private String taskStatus;

public Task(String taskName, int taskNumber, String taskDescription, String developerDetails,
double taskDuration, String taskStatus) {
this.taskName = taskName;
this.taskNumber = taskNumber;
this.taskDescription = taskDescription;
this.developerDetails = developerDetails;
this.taskDuration = taskDuration;
this.taskID = createTaskID();
this.taskStatus = taskStatus;
}

public String createTaskID() {
String initials = taskName.substring(0, 2).toUpperCase();
String devInitials = developerDetails.substring(developerDetails.lastIndexOf(" ") + 1).toUpperCase();
return initials + ":" + taskNumber + ":" + devInitials;
}

public boolean checkTaskDescription() {
return taskDescription.length() <= 50;
}

public String printTaskDetails() {
return "Task Status: " + taskStatus + "\nDeveloper Details: " + developerDetails + "\nTask Number: "
+ taskNumber + "\nTask Name: " + taskName + "\nTask Description: " + taskDescription + "\nTask ID: "
+ taskID + "\nDuration: " + taskDuration;
}

public static int returnTotalHours(ArrayList<Task> tasks) {
int totalHours = 0;
for (Task task : tasks) {
totalHours += task.taskDuration;
}
return totalHours;
}

public String getTaskName() {
return taskName;
}

public String getDeveloperDetails() {
return developerDetails;
}

public String getTaskStatus() {
return taskStatus;
}
}
```

Now let's implement the main logic in another class called "EasyKanban":

```java
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class EasyKanban {
private static ArrayList<Task> tasks = new ArrayList<>();
private static String[] developers = { "Developer 1", "Developer 2", "Developer 3" };
private static String[] taskStatuses = { "To Do", "Done", "Doing" };

public static void main(String[] args) {
showWelcomeMessage();

int choice;
do {
choice = showMenu();
switch (choice) {
case 1:
addTasks();
break;
case 2:
showReport();
break;
case 3:
JOptionPane.showMessageDialog(null, "Goodbye!");
break;
default:
JOptionPane.showMessageDialog(null, "Invalid choice. Please try again.");
break;
}
} while (choice != 3);
}

public static void showWelcomeMessage() {
JOptionPane.showMessageDialog(null, "Welcome to EasyKanban");
}

public static int showMenu() {
String menu = "Please choose an option:\n1) Add tasks\n2) Show report\n3) Quit";
String choice = JOptionPane.showInputDialog(null, menu);
return Integer.parseInt(choice);
}

public static void addTasks() {
int numTasks = getNumberOfTasks();
for (int i = 0; i < numTasks; i++) {
String taskName = JOptionPane.showInputDialog(null, "Enter task name:");
String taskDescription = JOptionPane.showInputDialog(null, "Enter task description:");
String developer = chooseDeveloper();
double taskDuration = Double.parseDouble(JOptionPane.showInputDialog(null, "Enter task duration:"));
String taskStatus = chooseTaskStatus();

Task task = new Task(taskName, i, taskDescription, developer, taskDuration, taskStatus);
tasks.add(task);
JOptionPane.showMessageDialog(null, "Task successfully captured:\n\n" + task.printTaskDetails());
}
}

public static int getNumberOfTasks() {
String numTasksString = JOptionPane.showInputDialog(null, "Enter the number of tasks to add:");
return Integer.parseInt(numTasksString);
}

public static String chooseDeveloper() {
StringBuilder message = new StringBuilder("Choose developer:\n");
for (int i = 0; i < developers.length; i++) {
message.append(i + 1).append(") ").append(developers[i]).append("\n");
}
int choice = Integer.parseInt(JOptionPane.showInputDialog(null, message.toString()));
return developers[choice - 1];
}

public static String chooseTaskStatus() {
StringBuilder message = new StringBuilder("Choose task status:\n");
for (int i = 0; i < taskStatuses.length; i++) {
message.append(i + 1).append(") ").append(taskStatuses[i]).append("\n");
}
int choice = Integer.parseInt(JOptionPane.showInputDialog(null, message.toString()));
return taskStatuses[choice - 1];
}

public static void showReport() {
StringBuilder report = new StringBuilder();
for (Task task : tasks) {
report.append(task.printTaskDetails()).append("\n\n");
}
JOptionPane.showMessageDialog(null, report.toString());

int totalHours = Task.returnTotalHours(tasks);
JOptionPane.showMessageDialog(null, "Total hours: " + totalHours);
}
}
```

Now, you can run the program by executing the `main()` method in the `EasyKanban` class. The program will prompt you with a menu to add tasks, show a report, or quit. It will continue running until the user selects quit.

Please note that this is a simplified implementation, and you may need to modify it based on your specific requirements.