Linked Inventory Management

profilesssssssss
CS2336Project3.pdf

CS 2336 PROJECT 3 – Linked Inventory Management

Project Due: 11/04 by 11:59 PM

KEY ITEMS: Key items are marked in red. Failure to include or complete key items will incur additional deductions

as noted beside the item.

Submission:

• The file containing main must be named Main.java. (-5 points)

• The project files must be in packages that start with LinkedInventoryManagement.* (-5 points)

• All project deliverables are to be submitted in eLearning until further notice

o Zip the contents of the src directory into a single zipped file

o Make sure the zipped file has a .zip extension (not .tar, .rar, .7z, etc.) (-5 points)

o Add your project’s presentation link in the comments section in eLearning

• Programs must compile and run with Java SE 13.

• Each student is responsible for developing unit test cases to ensure their program works as expected.

• Type your name and netID in the comments at the top of all files submitted. (-5 points)

Objectives:

• Create a modular code solution with multi-packages

• Use the Singleton pattern to create and manage the Scanner object

• Create and manipulate a multi-directional LinkedList in Java

• Use Java Generics to create generic classes and methods

• Implement and use the Comparable interface

Problem: A small electronics company has hired you to write an application to manage their inventory. The

company requested a role-based access control (RBAC) to increase the security around using the new application.

The company also requested that the application menu must be flexible enough to allow adding new menu items

to the menu with minimal changes. This includes re-ordering the menu items and making changes to the

description of a menu item without having to change the code.

Security: The company has suggested to start the application by asking the user for a username and password to

ensure that the user is authorized to access the application. There are two types of users at this company,

managers and employees. If managers log on to the application, they will see all options on the menu list. If

employees log on to the application, they will see a limited set of options on the menu list. User information is

stored in Users.dat file, which may or may not exist at the start of the program. A super user “admin” with

password “admin” has already been hardcoded in the program to allow for the initial setup and the creation of

other users. The Users.dat file contains the FirstName, LastName, Username (case insensitive), HashedPassword

and a flag to indicate whether a user is a manager or not. The file is comma separated and it is formatted as

follows:

Joe, Last, jlast, 58c536ed8facc2c2a293a18a48e3e120, true

Sam,, sone, 2c2a293a18a48e3e12058c536ed8facc, false

Jane, Best, jbest, 293a18a48e3e12052058c536ed8facc2c, false

Application Menu: The menu of the application is dynamically loaded and displayed to the user only after the

user successfully logs on. The menu items will be loaded from file “MenuList.dat”, which may or may not exist at

the start of the application. If the file doesn’t exist, the application should show at least an Exit menu item as

default. The file will contain all menu items details, including the name of the command that will be executed

when the menu item is selected. The file may contain duplicate menu items. Your program should detect this by

checking the command name as a key to compare menu items and prevent showing duplicates in the menu. If a

menu item is marked as restricted (Boolean flag), only managers can see that item. The file contains the following

comma separated fields, Description, a Boolean flag to indicate if the option is restricted to managers only, and

the name of the menu command that will be executed when the option is chosen. The order and option number

of a menu item may change depending on how they are listed in the file. The Exit option will always be listed last

and it will not be in the file. Below is a sample of how the MenuList.dat file looks like:

Add User, true, AddUserCommand

Delete User, true, DeleteUserCommand

Change Password, false, ChangePasswordCommand

Add New Product, true, AddProductCommand

*Note: The command name of each menu item must match the name of the class that you will create in the code

(See AddProductCommand class in the code for example).

Inventory: The inventory consists of multiple products of type Product stored in class ProductCatalog. The

ProductCatalog is responsible of all inventory operations that add, remove, find and update a product. When

printing a product information, the product retail price should be calculated and displayed as well. Retail price =

(cost + (margin * cost/100)). A list of functions has been added to this class in the provided code template. You

must implement all listed functions. The inventory products will be saved in file Inventory.dat, which may or may

not exist when the program first starts. The file will contain the product unique id (int), product name (string),

cost (double), quantity (int) and margin (int, integer that represents margin percentage). Your program must

prevent the user from inserting duplicate products by checking existing products using the product name (ignore

case) as a comparison key. The Inventory.dat file is comma separated and formatted as follows:

3424, Smart Watch, 20.45, 23, 80

65454, Flat Screen TV, 465.98, 15, 35

435, Computer Monitor, 123.54, 84, 43

Data Structure: The MenuList and ProductCatalog classes must use a custom LinkedList that you will create

instead of using an ArrayList. The nodes in this list must be multi-directional to facilitate moving from current

node to next node and from current node to previous node if needed. This custom linked list must be named

InventoryLinkedList, must be generic, and must contain at least the following methods:

- public InventoryLinkedList(E[] elements) //Constructor

- public E GetFirst() //Get the first element in the list

- public E GetLast() //Get the last element in the list

- public void Insert(int index, E element) //Inserts element e at the specified index

- public E Remove(int index) //Remove the element at the specified index

- public String toString() //Return formatted elements information

- public boolean Contains(E element) //Check if list contains the element

- public E SetElement(int index, E element) //Set the element at the specified index

- public E GetElement(int index) //Get the element at the specified index

- public Integer GetLength() //Returns the number of elements in the list

Output Format: Enter username: some username Enter password: some password //Repeat prompts until user is authenticated OR show error and option to exit. Invalid username or password! Press enter to continue or “Exit” to exit: Enter username: some username Enter password: some password Welcome Firstname LastName! Inventory Management System Menu //This is the header of the MenuList // The order and option number of a menu item may change depending on how they are listed in the MenuList.dat file. The Exit option will always be listed last and it will not be in the MenuList.dat file. 1- Add user 2- Remove user 3- Change password 4- Add new product 5- Update product information 6- Delete product 7- Display product information 8- Display inventory 9- Exit Enter your selection: 7 Enter product name: sMaRt wAtCh Id Name Cost Quantity Retail ------------------------------------------------------------ 3424 Smart Watch $20.45 23 $36.81

Type “Next” or “Previous” to display next/previous product, press enter to return: next

Id Name Cost Quantity Retail ------------------------------------------------------------ 65454 Flat Screen TV $465.98 15 $629.07

Type “Next” or “Previous” to display next/previous product, press enter to return: next

End of products list… //Displayed if no more products in the list Type “Next” or “Previous” to display next/previous product, press enter to return: //Enter //Repeat the menu after each command is executed

Program Flow: • Program starts in main() method • Prompt user for username and password • Authenticate user and maintain the logged-on user object • Load inventory • Load and create menu list • Display menu list and prompt the user for option • Execute selected option • Keep displaying the menu until the user chooses to exit

Unit Testing: A unit test method is required to test each of the methods listed below. These methods will be used by the unit testing framework to test the accuracy of your code.

• InventoryLinkedList.GetFirst()

• InventoryLinkedList.GetLast()

• InventoryLinkedList.Insert(int index, E element)

• InventoryLinkedList.Remove(int index)

• InventoryLinkedList.Contains(E element)

• InventoryLinkedList.SetElement(int index, E element)

• InventoryLinkedList.GetElement(int index)

Grading: • Coding standards, style and comments (10 Points) • Unit testing methods x 7, one for each of the methods mentioned above (14 Points) • The rest of the grade will be broken down as follows: • InventoryManagementSecurity.AuthenticateUser (5 Points) • InventoryManagementSecurity.AddNewUser (5 Points) • InventoryManagementSecurity.RemoveUser (5 Points) • InventoryManagementSecurity.ChangePassword (5 Points) • MenuList.AddMenuItem() (20 Points) //This includes implementing all commands for the menu list • ProductCatalog.AddUpdateProduct(Product product) (10 Points) • ProductCatalog.RemoveProduct(Product product) (7 Points) • ProductCatalog.FindProduct(Product product) (7 Points) • ProductCatalog.PrintProductInformation(Product product) (6 Points) • ProductCatalog.PrintInventoryList() (6 Points)

Notes:

• The “LinkedInventoryManagement” Maven solution zip file has been provided to you in eLearning.

• All *.dat files are assumed to be local to the current executable.

• Do not change the signature of the methods/constructors in the template. If in doubt, please ask.

• Your program is expected to have basic input validation (Only input from user).

• Your program must use the ScannerFactory class (included in the template) to get a Singleton Scanner

instance. This ensures that only one instance of the Scanner object is created throughout your program.

• You may NOT use ArrayList for this project. You must create and use a generic LinkedList class. Your class

should not inherit Java’s LinkedList class.

• Deliverables: Three minutes project video presentation (MS Teams) with a functioning program including

Unit Testing methods.