diff --git a/Answers/40230112037/Library-Management-System/.gitignore b/Answers/40230112037/Library-Management-System/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/Answers/40230112037/Library-Management-System/.idea/.gitignore b/Answers/40230112037/Library-Management-System/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/Answers/40230112037/Library-Management-System/.idea/encodings.xml b/Answers/40230112037/Library-Management-System/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/Answers/40230112037/Library-Management-System/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Answers/40230112037/Library-Management-System/.idea/misc.xml b/Answers/40230112037/Library-Management-System/.idea/misc.xml new file mode 100644 index 0000000..82dbec8 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Answers/40230112037/Library-Management-System/.idea/vcs.xml b/Answers/40230112037/Library-Management-System/.idea/vcs.xml new file mode 100644 index 0000000..c2365ab --- /dev/null +++ b/Answers/40230112037/Library-Management-System/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Answers/40230112037/Library-Management-System/pom.xml b/Answers/40230112037/Library-Management-System/pom.xml new file mode 100644 index 0000000..d9fe00e --- /dev/null +++ b/Answers/40230112037/Library-Management-System/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + org.LMS + Library-Management-System + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + + + + com.mysql + mysql-connector-j + 8.4.0 + + + + + commons-codec + commons-codec + 1.17.0 + + + + + \ No newline at end of file diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Book.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Book.java new file mode 100644 index 0000000..850dce4 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Book.java @@ -0,0 +1,40 @@ +package org.LMS; + +public class Book { + private final String title, author, description; + private int id; + + public Book(int id, String title, String author, String description) { + this.id = id; + this.title = title; + this.author = author; + this.description = description; + } + + public Book(String title, String author, String description) { + this.title = title; + this.author = author; + this.description = description; + } + + @Override + public String toString() { + return "Id:" + id + "\tTitle: " + title + "\tAuthor: " + author + "\tDescription: " + description; + } + + public String getAuthor() { + return author; + } + + public String getDescription() { + return description; + } + + public int getId() { + return id; + } + + public String getTitle() { + return title; + } +} diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/CLI.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/CLI.java new file mode 100644 index 0000000..65fddbd --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/CLI.java @@ -0,0 +1,481 @@ +package org.LMS; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Scanner; + +public class CLI { + private final Scanner scanner = new Scanner(System.in); + boolean loggedIn = false; + OptionSelector normalUserMainOptions = new OptionSelector(); + OptionSelector adminUserMainOptions = new OptionSelector(); + private Library library; + + { + OptionSelector userOptions = new OptionSelector(); + userOptions.add("remove", arguments -> { + if (arguments.length == 0) { + try { + if (!library.removeUser(library.currentUser.id)) System.out.println("User not found!"); + else loggedIn = false; + } catch (SQLException e) { + if (e.getErrorCode() == 1451) + System.out.println("Couldn't remove User!\nUser have some rented books!"); + else e.printStackTrace(); + } catch (NumberFormatException e) { + System.out.println("Please enter a number!"); + } + } else { + PrintError.manyArguments(); + } + }); + + OptionSelector bookOptions = new OptionSelector(); + + + bookOptions.add("list", arguments -> { + + if (arguments.length == 0) { + try { + ArrayList result = library.listBooks(); + for (Book book : result) { + System.out.println(book.toString()); + } + } catch (SQLException ignored) { + } + } else if (arguments.length == 1) { + + try { + ArrayList result = library.listBooks(arguments[0]); + for (Book book : result) { + System.out.println(book.toString()); + } + } catch (SQLException ignored) { + } + } + }); + + bookOptions.add("show-available", arguments -> { + if (arguments.length == 0) { + try { + ArrayList result = library.listBooks(true); + for (Book book : result) { + System.out.println(book.toString()); + } + } catch (SQLException ignored) { + } + } else if (arguments.length == 1) { + + try { + ArrayList result = library.listBooks(arguments[0]); + for (Book book : result) { + System.out.println(book.toString()); + } + } catch (SQLException ignored) { + } + } + }); + + bookOptions.add("show-rented", arguments -> { + if (arguments.length == 0) { + try { + ArrayList result = library.listBooks(false, library.currentUser.id); + for (Book book : result) { + System.out.println(book.toString()); + } + } catch (SQLException ignored) { + } + } else PrintError.manyArguments(); + }); + bookOptions.add("rent", arguments -> { + switch (arguments.length) { + case 0: + PrintError.fewArguments(); + break; + case 1: + try { + library.rentBook(library.currentUser.id, Integer.parseInt(arguments[0])); + } catch (SQLException e) { + if (e.getErrorCode() == 1062) + System.out.println("Couldn't rent book!\bBook is already rented!"); + else e.printStackTrace(); + } catch (NumberFormatException e) { + System.out.println("Please enter a number!"); + } + break; + default: + PrintError.manyArguments(); + } + }); + + bookOptions.add("return", arguments -> { + switch (arguments.length) { + case 0: + PrintError.fewArguments(); + break; + case 1: + try { + if (!library.returnBook(Integer.parseInt(arguments[0]))) + System.out.println("Book is not rented or not rented by you!"); + } catch (SQLException e) { + e.printStackTrace(); + } catch (NumberFormatException e) { + System.out.println("Please enter a number!"); + } + break; + default: + PrintError.manyArguments(); + } + }); + + OptionSelector libraryOptions = new OptionSelector(); + libraryOptions.add("book", bookOptions::select); + libraryOptions.add("user", userOptions::select); + libraryOptions.add("get-hrs", arguments -> { + if (arguments.length > 0) { + PrintError.manyArguments(); + return; + } + System.out.println(library.getHours()); + }); + + normalUserMainOptions.add("lib", libraryOptions::select); + normalUserMainOptions.add("exit", arguments -> loggedIn = false); + normalUserMainOptions.add("help", arguments -> System.out.println("lib user remove : Remove your user.\n" + + "lib book list (optional) : Show all book or search through them.\n" + + "lib book show-available : Show all available books.\n" + + "lib book show-rented : Show all books rented by you.\n" + + "lib book rent : Rents a book.\n" + + "lib book return : Returns a book.\n" + + "lib get-hrs : Retrieve library operating hours.\n" + + "\n" + + "exit : Logout from library.\n" + + "help : Show this help.")); + } + + { + OptionSelector userOptions = new OptionSelector(); + userOptions.add("add-user", arguments -> { + switch (arguments.length) { + case 0: + case 1: + case 2: + PrintError.fewArguments(); + break; + case 3: + try { + if (!UserInput.verifyPhoneNumber(arguments[2])) { + System.out.println("Wrong phone number!"); + break; + } + library.addNormalUser(new NormalUser(arguments[0], arguments[1], arguments[2])); + } catch (SQLException e) { + System.out.println("Couldn't add User! (username is used by another user)"); + } + break; + default: + PrintError.manyArguments(); + } + }); + + userOptions.add("add-admin", arguments -> { + switch (arguments.length) { + case 0: + case 1: + case 2: + case 3: + PrintError.fewArguments(); + break; + case 4: + try { + if (!UserInput.verifyPhoneNumber(arguments[2])) { + System.out.println("Wrong phone number!"); + break; + } + library.addAdminUser(new AdminUser(arguments[0], arguments[1], arguments[2], new Password(arguments[3]))); + } catch (SQLException e) { + System.out.println("Couldn't add User! (username is used by another user)"); + } + break; + default: + PrintError.manyArguments(); + } + }); + userOptions.add("remove", arguments -> { + switch (arguments.length) { + case 0: + PrintError.fewArguments(); + break; + case 1: + try { + if (!library.removeUser(arguments[0])) System.out.println("User not found!"); + } catch (SQLException e) { + System.out.println("Couldn't remove book!"); + } catch (NumberFormatException e) { + System.out.println("Please enter a number!"); + } + break; + default: + PrintError.manyArguments(); + } + }); + + userOptions.add("list", arguments -> { + try { + System.out.println("Admins:"); + for (AdminUser admin : library.getAdminUserList()) { + System.out.println(admin); + } + System.out.println("Normal Users:"); + for (NormalUser normalUser : library.getNormalUserList()) { + System.out.println(normalUser); + } + } catch (SQLException e) { + e.printStackTrace(); + } + }); + + + OptionSelector bookOptions = new OptionSelector(); + bookOptions.add("add", arguments -> { + switch (arguments.length) { + case 0: + case 1: + case 2: + PrintError.fewArguments(); + break; + case 3: + try { + if (arguments[0].isEmpty()) { + System.out.println("Book name can't be empty!"); + break; + } + library.addBook(new Book(arguments[0], arguments[1], arguments[2])); + } catch (SQLException e) { + System.out.println("Couldn't add book!"); + } + break; + default: + PrintError.manyArguments(); + } + }); + + bookOptions.add("remove", arguments -> { + switch (arguments.length) { + case 0: + PrintError.fewArguments(); + break; + case 1: + try { + if (!library.removeBook(Integer.parseInt(arguments[0]))) + System.out.println("No book to remove!"); + } catch (SQLException e) { + System.out.println("Couldn't remove book!"); + } + break; + default: + PrintError.manyArguments(); + } + }); + + + bookOptions.add("list", arguments -> { + + if (arguments.length == 0) { + try { + ArrayList result = library.listBooks(); + for (Book book : result) { + System.out.println(book.toString()); + } + } catch (SQLException ignored) { + } + } else if (arguments.length == 1) { + + try { + ArrayList result = library.listBooks(arguments[0]); + for (Book book : result) { + System.out.println(book.toString()); + } + } catch (SQLException ignored) { + } + } + }); + + bookOptions.add("show-available", arguments -> { + if (arguments.length == 0) { + try { + ArrayList result = library.listBooks(true); + for (Book book : result) { + System.out.println(book.toString()); + } + } catch (SQLException ignored) { + } + } else if (arguments.length == 1) { + + try { + ArrayList result = library.listBooks(arguments[0]); + for (Book book : result) { + System.out.println(book.toString()); + } + } catch (SQLException ignored) { + } + } + }); + bookOptions.add("rent", arguments -> { + switch (arguments.length) { + case 0: + PrintError.fewArguments(); + break; + case 1: + try { + library.rentBook(library.currentUser.id, Integer.parseInt(arguments[0])); + } catch (SQLException e) { + if (e.getErrorCode() == 1062) + System.out.println("Couldn't rent book!\bBook is already rented!"); + else e.printStackTrace(); + } catch (NumberFormatException e) { + System.out.println("Please enter a number!"); + } + break; + case 2: + try { + library.rentBook(Integer.parseInt(arguments[1]), Integer.parseInt(arguments[0])); + } catch (SQLException e) { + if (e.getErrorCode() == 1062) + System.out.println("Couldn't rent book!\bBook is already rented!"); + else e.printStackTrace(); + } catch (NumberFormatException e) { + System.out.println("Please enter a number!"); + } + break; + default: + PrintError.manyArguments(); + } + }); + + bookOptions.add("return", arguments -> { + switch (arguments.length) { + case 0: + PrintError.fewArguments(); + break; + case 1: + try { + if (!library.returnBook(Integer.parseInt(arguments[0]))) + System.out.println("Book is not rented or not rented by you!"); + } catch (SQLException e) { + e.printStackTrace(); + } catch (NumberFormatException e) { + System.out.println("Please enter a number!"); + } + break; + default: + PrintError.manyArguments(); + } + }); + + OptionSelector libraryOptions = new OptionSelector(); + libraryOptions.add("book", bookOptions::select); + libraryOptions.add("user", userOptions::select); + libraryOptions.add("get-hrs", arguments -> { + if (arguments.length > 0) { + PrintError.manyArguments(); + return; + } + System.out.println(library.getHours()); + }); + libraryOptions.add("set-hrs", arguments -> { + switch (arguments.length) { + case 0: + PrintError.fewArguments(); + break; + case 1: + library.setHours(arguments[0]); + break; + default: + PrintError.manyArguments(); + } + }); + + adminUserMainOptions.add("lib", libraryOptions::select); + adminUserMainOptions.add("exit", arguments -> loggedIn = false); + adminUserMainOptions.add("help", arguments -> { + System.out.println("lib user remove : Remove your user.\n" + + "lib book list (optional) : Show all book or search through them.\n" + + "lib book show-available : Show all available books.\n" + + "lib book show-rented : Show all books rented by you.\n" + + "lib book rent (optional): Rents a book (for a specific user).\n" + + "lib book return : Returns a book.\n" + + "lib book add <Author> <Description> : Add a book to library.\n" + + "lib book remove <bookID> : Remove a book from library. \n" + + "\n" + + "lib user add-user <UserName> <FullName> <PhoneNumber> : Add a normal user.\n" + + "lib user add-admin <UserName> <FullName> <PhoneNumber> <password>: Add an admin.\n" + + "lib user remove <UserName> : Remove a user.\n" + + "lib user list : List all users.\n" + + "\n" + + "lib get-hrs : Retrieve library operating hours.\n" + + "lib set-hrs <Hours> : Set library operating hours.\n" + + "\n" + + "exit : Logout from library.\n" + + "help : Show this help."); + }); + } + + CLI() { + try { + library = Library.getInstance("My org.LMS.Library", "localhost", "LMS", "LMS_password"); + System.out.println("Welcome to Library!"); + while (true) { + if (!login()) break; + } + } catch (Exception e) { + System.out.println("Couldn't connect to database!"); + } + } + + private boolean login() { + library.currentUser = null; + User user = null; + System.out.print("Username: "); + String username = scanner.nextLine(); + if (username.isBlank()) return false; + try { + user = library.getUser(username); + } catch (SQLException ignored) { + + } + if (user instanceof NormalUser) { + loginAsNormalUser((NormalUser) user); + } else if (user instanceof AdminUser admin) { + System.out.print("Password: "); + if (admin.password.verifyPassword(scanner.nextLine())) { + loginAsAdminUser(admin); + } else { + System.out.println("Wrong password!"); + } + } else { + System.out.println("User not found!"); + } + return true; + } + + void loginAsNormalUser(NormalUser user) { + library.currentUser = user; + loggedIn = true; + while (loggedIn) { + System.out.print(">>> "); + String[] args = UserInput.argumentsToArray(scanner.nextLine()); + normalUserMainOptions.select(args); + } + } + + void loginAsAdminUser(AdminUser admin) { + library.currentUser = admin; + loggedIn = true; + while (loggedIn) { + System.out.print(">>> "); + String[] args = UserInput.argumentsToArray(scanner.nextLine()); + adminUserMainOptions.select(args); + } + } +} diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Library.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Library.java new file mode 100644 index 0000000..4462639 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Library.java @@ -0,0 +1,172 @@ +package org.LMS; + +// Todo : create database if not exist + +import java.sql.*; +import java.util.ArrayList; + +public class Library { + private final static String database = "LMS"; + private final Connection connection; + private final Statement statement; + protected User currentUser; + private String name; + private String hours = "8 A.M to 18 P.M"; + private Integer capacity; + private PreparedStatement preparedStatement; + private ResultSet resultSet; + private Library(String name, Connection connection) throws SQLException { + this.connection = connection; + statement = connection.createStatement(); + } + + public static Library getInstance(String name, String sqlUrl, String sqlUserName, String sqlPassword) throws SQLException { + Connection connection; + try { + connection = DriverManager.getConnection("jdbc:mysql://" + sqlUrl + "/" + database, sqlUserName, sqlPassword); + + } catch (SQLException e) { + return null; + } + return new Library(name, connection); + } + + public String getHours() { + return hours; + } + + public void setHours(String hours) { + this.hours = hours; + } + + ArrayList<Book> resultSetToBookArrayList(ResultSet resultSet) throws SQLException { + ArrayList<Book> result = new ArrayList<>(); + while (resultSet.next()) { + result.add(new Book(resultSet.getInt(1), resultSet.getString(2), resultSet.getString(3), resultSet.getString(4))); + } + return result; + } + + ArrayList<Book> listBooks() throws SQLException { + resultSet = statement.executeQuery("SELECT * FROM Books"); + return resultSetToBookArrayList(resultSet); + } + + ArrayList<Book> listBooks(Boolean available) throws SQLException { + return listBooks(available, 0); + } + + ArrayList<Book> listBooks(Boolean available, int userId) throws SQLException { + resultSet = statement.executeQuery(((!available) ? "SELECT a.* FROM Books a JOIN Rents b ON a.id = b.bookId" : "SELECT a.* FROM Books a LEFT OUTER JOIN Rents b ON a.id = b.bookId WHERE b.id IS NULL") + ((userId != 0) ? " AND b.userId = " + userId : "")); + return resultSetToBookArrayList(resultSet); + } + + ArrayList<Book> listBooks(String searchString) throws SQLException { + preparedStatement = connection.prepareStatement("SELECT * FROM Books WHERE title LIKE ? OR author LIKE ? OR description LIKE ?"); + String searchExpression = '%' + UserInput.sqlLikeRegex(searchString) + '%'; + preparedStatement.setString(1, searchExpression); + preparedStatement.setString(2, searchExpression); + preparedStatement.setString(3, searchExpression); + resultSet = preparedStatement.executeQuery(); + return resultSetToBookArrayList(resultSet); + } + + ArrayList<Book> listBooks(String searchString, boolean isAvailable) throws SQLException { + preparedStatement = connection.prepareStatement("SELECT * FROM Books WHERE title isAvailable=" + isAvailable + " AND (LIKE ? OR author LIKE ? OR description LIKE ?)"); + String searchExpression = '%' + UserInput.sqlLikeRegex(searchString) + '%'; + preparedStatement.setString(1, searchExpression); + preparedStatement.setString(2, searchExpression); + preparedStatement.setString(3, searchExpression); + resultSet = preparedStatement.executeQuery(); + return resultSetToBookArrayList(resultSet); + } + + void addBook(Book book) throws SQLException { + preparedStatement = connection.prepareStatement("INSERT INTO Books (title,author,description) VALUES (?, ?, ?)"); + preparedStatement.setString(1, book.getTitle()); + preparedStatement.setString(2, book.getAuthor()); + preparedStatement.setString(3, book.getTitle()); + preparedStatement.executeUpdate(); + } + + boolean removeBook(int id) throws SQLException { + preparedStatement = connection.prepareStatement("DELETE FROM Books WHERE id = " + id); + return preparedStatement.executeUpdate() != 0; + } + + User getUser(String username) throws SQLException { + preparedStatement = connection.prepareStatement("SELECT * FROM Users WHERE username = ?"); + preparedStatement.setString(1, username); + resultSet = preparedStatement.executeQuery(); + if (resultSet.next()) { + if (resultSet.getBoolean("isAdmin")) { + return new AdminUser(resultSet.getInt("id"), resultSet.getString("username"), resultSet.getString("fullName"), resultSet.getString("phoneNumber"), resultSet.getString("password")); + } else { + return new NormalUser(resultSet.getInt("id"), resultSet.getString("username"), resultSet.getString("fullName"), resultSet.getString("phoneNumber"), resultSet.getDate("registrationDate")); + } + } + return null; + + } + + ArrayList<AdminUser> getAdminUserList() throws SQLException { + preparedStatement = connection.prepareStatement("SELECT * FROM Users WHERE isAdmin = 1"); + resultSet = preparedStatement.executeQuery(); + ArrayList<AdminUser> retuenArrayList = new ArrayList<>(); + while (resultSet.next()) { + retuenArrayList.add(new AdminUser(resultSet.getInt("id"), resultSet.getString("username"), resultSet.getString("fullName"), resultSet.getString("phoneNumber"), resultSet.getString("password"))); + } + return retuenArrayList; + } + + ArrayList<NormalUser> getNormalUserList() throws SQLException { + preparedStatement = connection.prepareStatement("SELECT * FROM Users WHERE isAdmin = 0"); + resultSet = preparedStatement.executeQuery(); + ArrayList<NormalUser> retuenArrayList = new ArrayList<>(); + while (resultSet.next()) { + retuenArrayList.add(new NormalUser(resultSet.getInt("id"), resultSet.getString("username"), resultSet.getString("fullName"), resultSet.getString("phoneNumber"), resultSet.getDate("registrationDate"))); + } + return retuenArrayList; + } + + + void addAdminUser(AdminUser adminUser) throws SQLException { + preparedStatement = connection.prepareStatement("INSERT INTO Users (username,fullName,phoneNumber,password,isAdmin) VALUES (?,?,?,?,true)"); + preparedStatement.setString(1, adminUser.username); + preparedStatement.setString(2, adminUser.fullName); + preparedStatement.setString(3, adminUser.phoneNumber); + preparedStatement.setString(4, adminUser.password.getHashedPassword()); + preparedStatement.executeUpdate(); + } + + void addNormalUser(NormalUser normalUser) throws SQLException { + preparedStatement = connection.prepareStatement("INSERT INTO Users (username,fullName,phoneNumber,registrationDate,isAdmin) VALUES (?,?,?,?,false)"); + preparedStatement.setString(1, normalUser.username); + preparedStatement.setString(2, normalUser.fullName); + preparedStatement.setString(3, normalUser.phoneNumber); + preparedStatement.setDate(4, new Date(System.currentTimeMillis())); + preparedStatement.executeUpdate(); + } + + boolean removeUser(int id) throws SQLException { + preparedStatement = connection.prepareStatement("DELETE FROM Users WHERE id = " + id); + return preparedStatement.executeUpdate() != 0; + } + boolean removeUser(String username) throws SQLException { + preparedStatement = connection.prepareStatement("DELETE FROM Users WHERE id = ?"); + preparedStatement.setString(1,username); + return preparedStatement.executeUpdate() != 0; + } + void rentBook(int userId, int bookId) throws SQLException { + preparedStatement = connection.prepareStatement("INSERT INTO Rents (userId,bookId,rentDate) VALUES (?,?,?)"); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, bookId); + preparedStatement.setDate(3, new Date(System.currentTimeMillis())); + preparedStatement.executeUpdate(); + } + + boolean returnBook(int bookId) throws SQLException { + preparedStatement = connection.prepareStatement("DELETE FROM Rents WHERE bookId = " + bookId + ((!(currentUser instanceof AdminUser)) ? " AND userId = " + currentUser.id : "")); + return preparedStatement.executeUpdate() != 0; + } +} diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/MyApp.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/MyApp.java new file mode 100644 index 0000000..e27ca40 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/MyApp.java @@ -0,0 +1,7 @@ +package org.LMS; + +public class MyApp { + public static void main(String[] args) { + new CLI(); + } +} diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Option.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Option.java new file mode 100644 index 0000000..84d9ab8 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Option.java @@ -0,0 +1,32 @@ +package org.LMS; + + +@FunctionalInterface +interface Func { + void func(String[] arguments); +} + +public class Option implements Func { + final public String option; + final public String help; + final private Func function; + + Option(String option, Func function) { + this.function = function; + this.option = option; + this.help = null; + } + + Option(String option, Func function, String help) { + this.function = function; + this.option = option; + this.help = help; + } + + @Override + public void func(String[] arguments) { + if (this.function != null) { + this.function.func(arguments); + } + } +} diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/OptionSelector.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/OptionSelector.java new file mode 100644 index 0000000..b98ca0f --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/OptionSelector.java @@ -0,0 +1,42 @@ +package org.LMS; + +import java.util.ArrayList; +import java.util.Arrays; + +public class OptionSelector { + ArrayList<Option> options = new ArrayList<>(); + + void add(String optionName, Func function) { + options.add(new Option(optionName, function)); + } + + void add(ArrayList<Option> options) { + this.options.addAll(options); + } + + void help() { + System.out.println("Available options:"); + for (Option option : options) { + System.out.print(option.option); + if (option.help != null) { + System.out.printf(": %s", option.help); + } + System.out.println(); + } + } + + void select(String[] arguments) { + if (arguments.length == 0) { + PrintError.fewArguments(); + return; + } + for (Option option : this.options) { + if (option.option.equals(arguments[0])) { + option.func(Arrays.copyOfRange(arguments, 1, arguments.length)); + return; + } + } + System.out.printf("Unknown option %s.\n", arguments[0]); + help(); + } +} diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Password.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Password.java new file mode 100644 index 0000000..1930687 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Password.java @@ -0,0 +1,33 @@ +package org.LMS; + +import org.apache.commons.codec.digest.DigestUtils; + +public class Password { + private String hashedPassword; + + Password() { + } + + Password(String password) { + hashPassword(password); + } + + static Password passwordByHash(String hashedPassword) { + Password password = new Password(); + password.hashedPassword = hashedPassword; + return password; + } + + void hashPassword(String password) { + hashedPassword = DigestUtils.sha256Hex(password); + } + + String getHashedPassword() { + return hashedPassword; + } + + boolean verifyPassword(String password) { + return hashedPassword.equals(DigestUtils.sha256Hex(password)); + } + +} diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/PrintError.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/PrintError.java new file mode 100644 index 0000000..ad95889 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/PrintError.java @@ -0,0 +1,11 @@ +package org.LMS; + +public class PrintError { + static void fewArguments() { + System.out.println("too few arguments."); + } + + static void manyArguments() { + System.out.println("too many arguments."); + } +} diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Rent.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Rent.java new file mode 100644 index 0000000..532585b --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Rent.java @@ -0,0 +1,17 @@ +package org.LMS; + +import java.util.Date; + +public class Rent { + Integer id; + Book book; + User user; + Date date; + + public Rent(Integer id, Book book, User user, Date date) { + this.id = id; + this.book = book; + this.date = date; + this.user = user; + } +} diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/User.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/User.java new file mode 100644 index 0000000..fcae5e1 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/User.java @@ -0,0 +1,58 @@ +package org.LMS; + +import java.util.Date; + +public class User { + Integer id; + String username; + String fullName; + String phoneNumber; +} + +final class NormalUser extends User { + Date registrationDate; + + NormalUser(String username, String fullName, String phoneNumber) { + this.username = username; + this.fullName = fullName; + this.phoneNumber = phoneNumber; + } + + NormalUser(int id, String username, String fullName, String phoneNumber, Date registrationDate) { + this.id = id; + this.username = username; + this.fullName = fullName; + this.phoneNumber = phoneNumber; + this.registrationDate = registrationDate; + } + + @Override + public String toString() { + return "ID:" + id + "\tUsername: " + username + "\tFullName: " + fullName + "\tPhone Number: " + phoneNumber + "\tRegistration Date: " + registrationDate; + } +} + +final class AdminUser extends User { + Password password; + + AdminUser(int id, String username, String fullName, String phoneNumber, String hashedPassword) { + this.id = id; + this.username = username; + this.fullName = fullName; + this.phoneNumber = phoneNumber; + this.password = Password.passwordByHash(hashedPassword); + } + + AdminUser(String username, String fullName, String phoneNumber, Password password) { + this.username = username; + this.fullName = fullName; + this.phoneNumber = phoneNumber; + this.password = password; + } + + @Override + public String toString() { + return "ID:" + id + "\tFullName: " + fullName + "\tUsername: " + username + "\tPhone Number: " + phoneNumber; + } + +} \ No newline at end of file diff --git a/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/UserInput.java b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/UserInput.java new file mode 100644 index 0000000..11ce8da --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/UserInput.java @@ -0,0 +1,30 @@ +package org.LMS; + +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class UserInput { + public static String[] argumentsToArray(String input) { + Pattern pattern = Pattern.compile("(?>(?<bare>[^\\\"\\s](?:\\\\\\\\|\\\\ |[^ ])*?)(?> |$)|(?>\\\"(?<quo>(?:\\\\\\\\|\\\\\\\"|[^\\\"])*?)\\\"))"); + Matcher matcher = pattern.matcher(input); + ArrayList<String> result = new ArrayList<String>(); + while (matcher.find()) { + if (matcher.group("bare") != null) { + result.add(matcher.group("bare").replaceAll("\\\\\\\\", "\\\\").replaceAll("\\\\ ", " ")); + } else { + result.add(matcher.group("quo").replaceAll("\\\\\\\\", "\\\\").replaceAll("\\\\\"", "\"")); + } + } + return result.toArray(new String[0]); + } + + public static String sqlLikeRegex(String searchString) { + return searchString.replace("!", "\\!").replace("%", "\\%").replace("_", "\\_").replace("[", "\\["); + } + + public static boolean verifyPhoneNumber(String phoneNumber) { + Pattern pattern = Pattern.compile("09[0-9]{9}"); + return pattern.matcher(phoneNumber).find(); + } +} \ No newline at end of file