From b916ce08ac3ae484f80d2a6823f061356924e0c1 Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 9 May 2024 14:06:14 +0330 Subject: [PATCH 01/51] Created project files. --- .../Library-Management-System/.gitignore | 38 +++++++++++++++++++ .../.idea/.gitignore | 3 ++ .../Library-Management-System/.idea/misc.xml | 14 +++++++ .../Library-Management-System/pom.xml | 17 +++++++++ 4 files changed, 72 insertions(+) create mode 100644 Answers/40230112037/Library-Management-System/.gitignore create mode 100644 Answers/40230112037/Library-Management-System/.idea/.gitignore create mode 100644 Answers/40230112037/Library-Management-System/.idea/misc.xml create mode 100644 Answers/40230112037/Library-Management-System/pom.xml 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/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/pom.xml b/Answers/40230112037/Library-Management-System/pom.xml new file mode 100644 index 0000000..d29a9f7 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + org.LMS + Library-Management-System + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + \ No newline at end of file From aa1cd146fb27786a9c1e108253ddc283f616ca69 Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 9 May 2024 14:07:13 +0330 Subject: [PATCH 02/51] Files added by IDE automatically. --- .../Library-Management-System/.idea/encodings.xml | 7 +++++++ .../40230112037/Library-Management-System/.idea/vcs.xml | 6 ++++++ 2 files changed, 13 insertions(+) create mode 100644 Answers/40230112037/Library-Management-System/.idea/encodings.xml create mode 100644 Answers/40230112037/Library-Management-System/.idea/vcs.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/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 From 4ef85f03a139a00673dbb9bc82308a7a04611cb4 Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 9 May 2024 14:32:08 +0330 Subject: [PATCH 03/51] Added Dependencies (mysql jdbc driver & apache commons-codec) --- .../Library-Management-System/pom.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Answers/40230112037/Library-Management-System/pom.xml b/Answers/40230112037/Library-Management-System/pom.xml index d29a9f7..d9fe00e 100644 --- a/Answers/40230112037/Library-Management-System/pom.xml +++ b/Answers/40230112037/Library-Management-System/pom.xml @@ -14,4 +14,22 @@ UTF-8 + + + + + com.mysql + mysql-connector-j + 8.4.0 + + + + + commons-codec + commons-codec + 1.17.0 + + + + \ No newline at end of file From cd622052c3a2100f8c1f64bdbbe1e606e2c9205f Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 13:33:32 +0330 Subject: [PATCH 04/51] Added Book class. --- .../src/main/java/org/LMS/Book.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Book.java 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..0fd4167 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Book.java @@ -0,0 +1,22 @@ +package org.LMS; + +public class Book { + int id; + String title, author, description; + Boolean isAvailable; + + public Book(int id, String title, String author, String description, Boolean isAvailable) { + this.id = id; + this.title = title; + this.author = author; + this.isAvailable = isAvailable; + this.description = description; + } + + public Book(String title, String author, String description) { + this.title = title; + this.author = author; + this.description = description; + this.isAvailable = true; + } +} From 3da5bdc49e69a84a06fc109781e88e54059a7a60 Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 13:34:23 +0330 Subject: [PATCH 05/51] Added Password class for storing hashed admin passwords. --- .../src/main/java/org/LMS/Password.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Password.java 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..1b45afe --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Password.java @@ -0,0 +1,29 @@ +package org.LMS; + +import org.apache.commons.codec.digest.DigestUtils; + +public class Password { + private String hashedPassword; + static Password passwordByHash(String hashedPassword){ + Password password = new Password(); + password.hashedPassword=hashedPassword; + return password; + } + Password() { + } + + Password(String password) { + hashPassword(password); + } + + void hashPassword(String password) { + hashedPassword = DigestUtils.sha256Hex(password); + } + String getHashedPassword(){ + return hashedPassword; + } + boolean verifyPassword(String password) { + return hashedPassword.equals(DigestUtils.sha256Hex(password)); + } + +} From bff9cf2708fe9cad140d5b3fc8153122eaab3253 Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 13:40:04 +0330 Subject: [PATCH 06/51] Added Users classes and two constructors for each(because database handles id for us and the password is stored hashed in database) --- .../src/main/java/org/LMS/User.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 Answers/40230112037/Library-Management-System/src/main/java/org/LMS/User.java 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..526a757 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/User.java @@ -0,0 +1,48 @@ +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; + } +} + +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; + } + +} \ No newline at end of file From a6265ffa8051d6515ae65d1d0437c1840040285d Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 13:40:40 +0330 Subject: [PATCH 07/51] created Rent class (maybe change in future) --- .../src/main/java/org/LMS/Rent.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Rent.java 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; + } +} From b7ece90bf4331b45019b6a22386218cb9863aa6e Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 15:18:49 +0330 Subject: [PATCH 08/51] created Library class based on database structure and created a getInstance function to only have one library. --- .../src/main/java/org/LMS/Library.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Library.java 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..bb367a6 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Library.java @@ -0,0 +1,34 @@ +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 Integer capacity, operatingHours; + 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); + } + +} From 1d3ee45a99e115f4a67fb1129265f241e706f721 Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 15:24:34 +0330 Subject: [PATCH 09/51] added resultSetToBookArrayList for future books handling --- .../src/main/java/org/LMS/Library.java | 7 +++++++ 1 file changed, 7 insertions(+) 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 index bb367a6..9caa5ee 100644 --- 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 @@ -31,4 +31,11 @@ public static Library getInstance(String name, String sqlUrl, String sqlUserName return new Library(name, connection); } + ArrayList resultSetToBookArrayList(ResultSet resultSet) throws SQLException { + ArrayList result = new ArrayList<>(); + while (resultSet.next()) { + result.add(new Book(resultSet.getInt(1), resultSet.getString(2), resultSet.getString(3), resultSet.getString(4), resultSet.getBoolean(5))); + } + return result; + } } From 2e58f36b33e81406ce50357da2354280cd050b2a Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 15:26:28 +0330 Subject: [PATCH 10/51] Added different listBooks methods with filters. --- .../src/main/java/org/LMS/Library.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) 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 index 9caa5ee..cef5f28 100644 --- 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 @@ -38,4 +38,35 @@ ArrayList resultSetToBookArrayList(ResultSet resultSet) throws SQLExceptio } return result; } + + ArrayList listBooks() throws SQLException { + resultSet = statement.executeQuery("SELECT * FROM Books"); + return resultSetToBookArrayList(resultSet); + } + + ArrayList listBooks(Boolean available) throws SQLException { + resultSet = statement.executeQuery("SELECT * FROM Books WHERE isAvailable=" + available); + return resultSetToBookArrayList(resultSet); + } + + ArrayList 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 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); + } + } From a818e2f52244dc47725555f2255abe0074d88ac7 Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 15:27:04 +0330 Subject: [PATCH 11/51] Added addBook method. --- .../src/main/java/org/LMS/Library.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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 index cef5f28..1551da5 100644 --- 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 @@ -69,4 +69,12 @@ ArrayList listBooks(String searchString, boolean isAvailable) throws SQLEx return resultSetToBookArrayList(resultSet); } + void addBook(Book book) throws SQLException { + preparedStatement = connection.prepareStatement("INSERT INTO Books (title,author,isAvailable,description) VALUES (?, ?, ?, ?)"); + preparedStatement.setString(1, book.title); + preparedStatement.setString(2, book.author); + preparedStatement.setBoolean(3, book.isAvailable); + preparedStatement.setString(4, book.description); + preparedStatement.executeUpdate(); + } } From 7d736632999c7b1208068206ddf0b176d2a24ffd Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 15:27:25 +0330 Subject: [PATCH 12/51] Added removeBook method. --- .../src/main/java/org/LMS/Library.java | 5 +++++ 1 file changed, 5 insertions(+) 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 index 1551da5..a126140 100644 --- 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 @@ -77,4 +77,9 @@ void addBook(Book book) throws SQLException { preparedStatement.setString(4, book.description); preparedStatement.executeUpdate(); } + + boolean removeBook(int id) throws SQLException { + preparedStatement = connection.prepareStatement("DELETE FROM Books WHERE id = " + id); + return preparedStatement.executeUpdate() != 0; + } } From bf4c4f13db86d254a730a20ecfad3abae7adab95 Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 15:28:11 +0330 Subject: [PATCH 13/51] Added getUser method. --- .../src/main/java/org/LMS/Library.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 index a126140..bdcd887 100644 --- 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 @@ -82,4 +82,19 @@ 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; + + } } From 910175ad02ac5d251eeafb8fd5202b8fc731344d Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 15:31:39 +0330 Subject: [PATCH 14/51] created first cli implementation and login logic. --- .../src/main/java/org/LMS/CLI.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 Answers/40230112037/Library-Management-System/src/main/java/org/LMS/CLI.java 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..5feec93 --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/CLI.java @@ -0,0 +1,56 @@ +package org.LMS; + +import java.sql.SQLException; +import java.util.Scanner; + +public class CLI { + private final Scanner scanner = new Scanner(System.in); + boolean loggedIn = false; + private Library library; + + 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; + } + + void loginAsAdminUser(AdminUser admin) { + library.currentUser = admin; + } +} From 30f65f92374eac46a2497c946612d60a863fe28b Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 15:38:07 +0330 Subject: [PATCH 15/51] added Option class for handling options that user selects and organizing them. --- .../src/main/java/org/LMS/Option.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Option.java 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..cfd487d --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/Option.java @@ -0,0 +1,24 @@ +package org.LMS; + + +@FunctionalInterface +interface Func { + void func(String[] arguments); +} + +public class Option implements Func { + final private Func function; + final public String option; + + Option(String option, Func function) { + this.function = function; + this.option = option; + } + + @Override + public void func(String[] arguments) { + if (this.function != null) { + this.function.func(arguments); + } + } +} From 50519f3f597cb169c150dade4b61e1ae58828fae Mon Sep 17 00:00:00 2001 From: HJavid010 Date: Thu, 16 May 2024 15:39:44 +0330 Subject: [PATCH 16/51] added OptionSelector class to check for argument and run the desired function. --- .../src/main/java/org/LMS/OptionSelector.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Answers/40230112037/Library-Management-System/src/main/java/org/LMS/OptionSelector.java 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..8740b7b --- /dev/null +++ b/Answers/40230112037/Library-Management-System/src/main/java/org/LMS/OptionSelector.java @@ -0,0 +1,30 @@ +package org.LMS; + +import java.util.ArrayList; +import java.util.Arrays; + +public class OptionSelector { + ArrayList