diff --git a/Answers/Library/.gitignore b/Answers/Library/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/Answers/Library/.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/Library/.idea/.gitignore b/Answers/Library/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/Answers/Library/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/Answers/Library/.idea/.name b/Answers/Library/.idea/.name new file mode 100644 index 0000000..9cbb2bf --- /dev/null +++ b/Answers/Library/.idea/.name @@ -0,0 +1 @@ +Admin.java \ No newline at end of file diff --git a/Answers/Library/.idea/encodings.xml b/Answers/Library/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/Answers/Library/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Answers/Library/.idea/misc.xml b/Answers/Library/.idea/misc.xml new file mode 100644 index 0000000..fdc35ea --- /dev/null +++ b/Answers/Library/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Answers/Library/.idea/vcs.xml b/Answers/Library/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/Answers/Library/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Answers/Library/pom.xml b/Answers/Library/pom.xml new file mode 100644 index 0000000..7f9cd39 --- /dev/null +++ b/Answers/Library/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + org.example + Library + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + \ No newline at end of file diff --git a/Answers/Library/src/main/java/Admin.java b/Answers/Library/src/main/java/Admin.java new file mode 100644 index 0000000..d9f5be5 --- /dev/null +++ b/Answers/Library/src/main/java/Admin.java @@ -0,0 +1,33 @@ +import java.io.Serial; +import java.io.Serializable; +import java.util.UUID; + +public class Admin extends Person implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String password; + static int currentID = 0; + + public Admin(String fullName, String phoneNumber, String password) { + super(fullName, phoneNumber); + currentID ++; + this.ID = String.valueOf(currentID); + this.password = password; + } + public String getPassword(){ + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public String toString() { + return "Admin{" + + "fullName='" + getFullName() + '\'' + + ", ID='" + getID() + '\'' + + ", phoneNumber='" + getPhoneNumber() + '\'' + + '}'; + } +} diff --git a/Answers/Library/src/main/java/Book.java b/Answers/Library/src/main/java/Book.java new file mode 100644 index 0000000..155ea2a --- /dev/null +++ b/Answers/Library/src/main/java/Book.java @@ -0,0 +1,69 @@ +import java.io.Serial; +import java.util.UUID; +import java.io.Serializable; + +public class Book implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String bookID; + private String title; + private String author; + private boolean availability; + private String description; + static int currentID = 0; + + public Book(String title, String author, String description) { + currentID ++; + this.bookID = String.valueOf(currentID); + this.title = title; + this.author = author; + this.description = description; + this.availability = true; + } + + public String getBookID() { + return bookID; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public boolean isAvailability() { + return availability; + } + + public void setAvailability(boolean availability) { + this.availability = availability; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + @Override + public String toString() { + return "Book{" + + "bookID='" + getBookID() + '\'' + + ", title='" + getTitle() + '\'' + + ", author='" + getAuthor() + '\'' + + ", availability=" + isAvailability() + + ", description='" + getDescription() + '\'' + + '}'; + } +} diff --git a/Answers/Library/src/main/java/Library.java b/Answers/Library/src/main/java/Library.java new file mode 100644 index 0000000..257cf81 --- /dev/null +++ b/Answers/Library/src/main/java/Library.java @@ -0,0 +1,289 @@ +import java.io.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Scanner; + +public class Library { + private final List books = new ArrayList<>(); + private final List admins = new ArrayList<>(); + private final List users = new ArrayList<>(); + private final List rents = new ArrayList<>(); + + + private static final String Book_FILE_NAME = "Books.dat"; + private static final String Admin_FILE_NAME = "Admins.dat"; + private static final String User_FILE_NAME = "Users.dat"; + private static final String Rent_FILE_NAME = "Rents.dat"; + + + private String libName = "NIT"; + private static int capacity = 1250; + private String operatinghours = "NIT library is open from 8 AM to 6 PM"; + public String getOperatinghours() { + return operatinghours; + } + public String getLibName(){ + return libName; + } + public Library(){ + loadBooks(); + loadAdmins(); + loadUsers(); + loadRents(); + } + public boolean isAdminEmpty(){ + return admins.isEmpty(); + } + public void addBook(String title, String author, String description){ + if (capacity > 0){ + books.add(new Book(title,author,description)); + capacity --; + books.sort(Comparator.comparing(Book::getTitle)); + saveBooks(); + System.out.println("Book added to library successfully."); + }else { + System.out.println("There is no capacity to add books!"); + } + } + public void rentBook(String title){ + boolean found = false; + for (int i = 0; i < books.size(); i++) { + if (title.equalsIgnoreCase(books.get(i).getTitle()) && books.get(i).isAvailability()){ + books.get(i).setAvailability(false); + saveBooks(); + System.out.println(title + " book rented successfully."); + found = true; + break; + } + } if (!found){ + System.out.println(title + " book is not available now!"); + } + } + public void rentSpecificBook(String bookName,String memberName,String memberID){ + int x=0,y=0; + boolean bookFound =false; + boolean userFound =false; + for (int i = 0; i < books.size(); i++) { + if (books.get(i).getTitle().equalsIgnoreCase(bookName)){ + x = i; + bookFound = true; + } + + } + for (int i = 0; i < users.size(); i++) { + if (users.get(i).getID().equalsIgnoreCase(memberID)) { + y = i; + userFound = true; + } + } + if (bookFound && userFound){ + createRent(books.get(x),users.get(y)); + } else { + System.out.println("Error renting book!"); + } + } + public void returnBook(String title) { + boolean found = false; + for (int i = 0; i < books.size(); i++) { + if (books.get(i).getTitle().equalsIgnoreCase(title)){ + books.get(i).setAvailability(true); + saveBooks(); + System.out.println("Book returned successfully."); + deleteRent(title); + found = true; + break; + } + } + if (!found) { + System.out.println("error returning book!"); + } + } + + public void getAvailableBooks(){ + for (int i = 0; i < books.size(); i++) { + if (books.get(i).isAvailability()){ + System.out.println(books.get(i).toString()); + } + } + } + private void saveBooks() { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(Book_FILE_NAME))) { + oos.writeObject(books); + } catch (IOException e) { + System.out.println("Error saving books: " + e.getMessage()); + } + } + @SuppressWarnings("unchecked") + private void loadBooks(){ + File file = new File(Book_FILE_NAME); + if (file.exists()){ + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Book_FILE_NAME))){ + Object object = ois.readObject(); + if (object instanceof List) { + books.addAll((List) object); + } + } catch (IOException | ClassNotFoundException e) { + System.out.println("Error loading books: " + e.getMessage()); + } + } + } + //---------------------------------------------------------------------------------------------------------- + //User registries + public void addUser(String fullName,String phoneNumber){ + users.add(new User(fullName,phoneNumber)); + users.sort(Comparator.comparing(User::getFullName)); + saveUsers(); + System.out.println("User " + fullName + " added successfully."); + } + + public void removeUser(String ID){ + boolean found = false; + for (int i = 0; i < users.size(); i++) { + if (users.get(i).getID().equalsIgnoreCase(ID)){ + users.remove(users.get(i)); + saveUsers(); + System.out.println("User " + users.get(i).getFullName() + " removed successfully."); + found = true; + break; + } + } + if (!found){ + System.out.println("Error removing user!"); + } + } + public void showUsers(){ + for (int i = 0; i < users.size(); i++) { + System.out.println(users.get(i).toString()); + } + } + public boolean checkUser(String fullName,String ID){ + boolean found = false; + for (int i = 0; i < users.size(); i++) { + if (users.get(i).getFullName().equalsIgnoreCase(fullName) && users.get(i).getID().equalsIgnoreCase(ID)) + found = true; + } + return found; + } + private void saveUsers(){ + try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(User_FILE_NAME))){ + oos.writeObject(users); + } catch (IOException e) { + System.out.println("Error saving users: " + e.getMessage()); + } + } + @SuppressWarnings("unchecked") + private void loadUsers(){ + File file = new File(User_FILE_NAME); + if (file.exists()){ + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(User_FILE_NAME))){ + Object object = ois.readObject(); + if (object instanceof List) { + users.addAll((List) object); + } + } catch (IOException | ClassNotFoundException e) { + System.out.println("Error loading users: " + e.getMessage()); + } + } + } + //---------------------------------------------------------------------------------------------------------- + //Admin registries + public void addAdmin(String fullName,String phoneNumber,String password){ + admins.add(new Admin(fullName,phoneNumber,password)); + admins.sort(Comparator.comparing(Admin::getFullName)); + saveAdmins(); + System.out.println("Admin " + fullName + " added successfully."); + } + public void removeAdmin(String ID){ + boolean found = false; + for (int i = 0; i < admins.size(); i++) { + if (admins.get(i).getID().equalsIgnoreCase(ID)){ + admins.remove(admins.get(i)); + saveUsers(); + System.out.println("Admin " + admins.get(i).getFullName() + " removed successfully."); + found = true; + break; + } + } + if (!found){ + System.out.println("Error removing admin!"); + } + } + public boolean checkAdmin(String fullName,String ID,String Password){ + boolean found = false; + for (int i = 0; i < admins.size(); i++) { + if (admins.get(i).getFullName().equalsIgnoreCase(fullName) && admins.get(i).getID().equalsIgnoreCase(ID) && admins.get(i).getPassword().equalsIgnoreCase(Password)) + found = true; + } + return found; + } + + private void saveAdmins(){ + try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(Admin_FILE_NAME))){ + oos.writeObject(admins); + } catch (IOException e) { + System.out.println("Error saving admins: " + e.getMessage()); + } + } + @SuppressWarnings("unchecked") + private void loadAdmins(){ + File file = new File(Admin_FILE_NAME); + if (file.exists()){ + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Admin_FILE_NAME))){ + Object object = ois.readObject(); + if (object instanceof List) { + admins.addAll((List) object); + } + } catch (IOException | ClassNotFoundException e) { + System.out.println("Error loading admins: " + e.getMessage()); + } + } + } + + //---------------------------------------------------------------------------------------------------------- + //Rents registries + + public void createRent(Book book,User user){ + rents.add(new Rent(book,user)); + rentBook(book.getTitle()); + saveRents(); + } + public void deleteRent(String title){ + for (int i = 0; i < rents.size(); i++) { + if (rents.get(i).getBook().getTitle().equalsIgnoreCase(title)){ + rents.remove(rents.get(i)); + saveRents(); + break; + } + } + } + public void showRents(){ + for (int i = 0; i < rents.size(); i++) { + System.out.println(rents.get(i).toString()); + } + } + + private void saveRents(){ + try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(Rent_FILE_NAME))){ + oos.writeObject(rents); + } catch (IOException e) { + System.out.println("Error saving rents: " + e.getMessage()); + } + } + + @SuppressWarnings("unchecked") + private void loadRents(){ + File file = new File(Rent_FILE_NAME); + if (file.exists()){ + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Rent_FILE_NAME))){ + Object object = ois.readObject(); + if (object instanceof List) { + rents.addAll((List) object); + } + } catch (IOException | ClassNotFoundException e) { + System.out.println("Error loading rents: " + e.getMessage()); + } + } + } + +} \ No newline at end of file diff --git a/Answers/Library/src/main/java/Main.java b/Answers/Library/src/main/java/Main.java new file mode 100644 index 0000000..c58af28 --- /dev/null +++ b/Answers/Library/src/main/java/Main.java @@ -0,0 +1,6 @@ +public class Main { + public static void main(String[] args) { + MyApp myApp = new MyApp(); + myApp.start(); + } +} diff --git a/Answers/Library/src/main/java/MyApp.java b/Answers/Library/src/main/java/MyApp.java new file mode 100644 index 0000000..4eca9e8 --- /dev/null +++ b/Answers/Library/src/main/java/MyApp.java @@ -0,0 +1,154 @@ +import java.util.Scanner; +public class MyApp { + static Library library = new Library(); + static Scanner scanner = new Scanner(System.in); + public static void start(){ + if (library.isAdminEmpty()) + library.addAdmin("Arshia mohammadzade","09031241172","1384"); + getROLE(); + } + + public static void getROLE(){ + String role; + while (true){ + System.out.println("Please write your role:"); + System.out.println("lib::Admin::::::"); + System.out.println("lib::User::::"); + System.out.println("Exit"); + role =scanner.nextLine(); + if (role.equalsIgnoreCase("exit")){ + System.out.println("exiting program..."); + break; + } + roleCommand(role); + } + } + public static void roleCommand(String command){ + String[] parts = command.split("::"); + String operation = parts[1]; + switch (operation.toLowerCase()){ + case "admin" : + if (library.checkAdmin(parts[2],parts[3],parts[4])){ + AdminsMainMenu(); + }else { + System.out.println("wrong information!"); + } + break; + case "user" : + if (library.checkUser(parts[2],parts[3])) { + UsersMainMenu(); + }else { + System.out.println("wrong information!"); + } + break; + default: + System.out.println("invalid input! please try again."); + } + } + public static void UsersMainMenu(){ + System.out.println("Welcome to" + library.getLibName()); + String input; + while (true) { + System.out.println("Please write your operation:"); + System.out.println("lib::getHour"); + System.out.println("lib::rent::"); + System.out.println("lib::specificRent::::::"); + System.out.println("lib::getAvailableBooks"); + System.out.println("lib::return::"); + System.out.println("back"); + input = scanner.nextLine(); + if ("back".equalsIgnoreCase(input)) { + System.out.println("Good bye :("); + break; + } + UserprocessCommand(input); + } + } + public static void UserprocessCommand(String command){ + String[] parts = command.split("::"); + String operation = parts[1]; + switch (operation.toLowerCase()){ + case "gethour": + System.out.println(library.getOperatinghours()); + break; + case "rent": + library.rentBook(parts[2]); + break; + case "specificrent": + library.rentSpecificBook(parts[2],parts[3],parts[4]); + break; + case "getavailablebooks": + library.getAvailableBooks(); + break; + case "return": + library.returnBook(parts[2]); + break; + default: + System.out.println("Invalid input! Please try again."); + + } + } + public static void AdminsMainMenu(){ + System.out.println("Welcome to" + library.getLibName()); + String input; + while (true) { + System.out.println("Please write your operation:"); + System.out.println("lib::addBook::::::"); + System.out.println("lib::getHour"); + System.out.println("lib::rent::"); + System.out.println("lib::addMember::::"); + System.out.println("lib::specificRent::::::"); + System.out.println("lib::getAvailableBooks"); + System.out.println("lib::removeMember::"); + System.out.println("lib::return::"); + System.out.println("lib::showRents"); + System.out.println("lib::showUsers"); + System.out.println("back"); + input = scanner.nextLine(); + if ("back".equalsIgnoreCase(input)) { + System.out.println("Good bye :("); + break; + } + AdminsProcessCommand(input); + } + } + public static void AdminsProcessCommand(String command){ + String[] parts = command.split("::"); + String operation = parts[1]; + switch (operation.toLowerCase()){ + case "addbook": + library.addBook(parts[2],parts[3],parts[4]); + break; + case "gethour": + System.out.println(library.getOperatinghours()); + break; + case "rent": + library.rentBook(parts[2]); + break; + case "addmember": + library.addUser(parts[2],parts[3]); + break; + case "specificrent": + library.rentSpecificBook(parts[2],parts[3],parts[4]); + break; + case "getavailablebooks": + library.getAvailableBooks(); + break; + case "removemember": + library.removeUser(parts[2]); + break; + case "return": + library.returnBook(parts[2]); + break; + case "showrents": + library.showRents(); + break; + case "showusers": + library.showUsers(); + break; + default: + System.out.println("Invalid input! Please try again."); + + } + } +} diff --git a/Answers/Library/src/main/java/Person.java b/Answers/Library/src/main/java/Person.java new file mode 100644 index 0000000..862c4ef --- /dev/null +++ b/Answers/Library/src/main/java/Person.java @@ -0,0 +1,33 @@ +import java.io.Serializable; + +public abstract class Person { + protected String fullName; + protected String ID; + protected String phoneNumber; + + public Person(String fullName, String phoneNumber) { + this.fullName = fullName; + this.phoneNumber = phoneNumber; + } + + public String getFullName() { + return fullName; + } + + public String getID() { + return ID; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } +} + diff --git a/Answers/Library/src/main/java/Rent.java b/Answers/Library/src/main/java/Rent.java new file mode 100644 index 0000000..fcf0ef0 --- /dev/null +++ b/Answers/Library/src/main/java/Rent.java @@ -0,0 +1,67 @@ +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.Period; +import java.util.UUID; + +public class Rent implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Book book; + private User user; + private String rentalID; + private String rentalDate; + private String returnDate; + public Rent(Book book,User user){ + this.book = book; + this.user = user; + this.rentalID = UUID.randomUUID().toString(); + this.rentalDate = createRentalDate(); + this.returnDate = createReturnDate(); + } + + public String getRentalID() { + return rentalID; + } + public Book getBook(){ + return book; + } + public User getUser(){ + return user; + } + + public String getRentalDate() { + return rentalDate; + } + + public String getReturnDate() { + return returnDate; + } + + public static String createRentalDate() { + LocalDate date = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + return date.format(formatter); + } + public static String createReturnDate() { + LocalDate date = LocalDate.now(); + Period period = Period.ofDays(21); + LocalDate rentalDate = date.plus(period); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + return rentalDate.format(formatter); + } + + @Override + public String toString() { + return "Rent{" + + "BookName='" + book.getTitle() + '\'' + + ", UserName='" + user.getFullName() + '\'' + + ", userID='" + user.getID() + '\'' + + ", rentalDate=" + rentalDate + + ", returnDate=" + returnDate + + ", rentalID=" + rentalID + + '}'; + } + +} diff --git a/Answers/Library/src/main/java/User.java b/Answers/Library/src/main/java/User.java new file mode 100644 index 0000000..6fcf75a --- /dev/null +++ b/Answers/Library/src/main/java/User.java @@ -0,0 +1,39 @@ +import java.io.Serial; +import java.io.Serializable; +import java.util.UUID; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public class User extends Person implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String date_of_registration; + static int currentID = 0; + + public User(String fullName, String phoneNumber){ + super(fullName,phoneNumber); + currentID++; + this.ID = String.valueOf(currentID); + this.date_of_registration = getFormattedDate(); + } + public String getDate_of_registration() { + return date_of_registration; + } + + + public static String getFormattedDate() { + LocalDate date = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + return date.format(formatter); + } + @Override + public String toString() { + return "User{" + + "fullName='" + getFullName() + '\'' + + ", ID='" + getID() + '\'' + + ", phoneNumber='" + getPhoneNumber() + '\'' + + ", date_of_registration='" + getDate_of_registration() + '\'' + + '}'; + } + +} \ No newline at end of file diff --git a/Answers/Library3/.gitignore b/Answers/Library3/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/Answers/Library3/.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/Library3/.idea/.gitignore b/Answers/Library3/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/Answers/Library3/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/Answers/Library3/.idea/encodings.xml b/Answers/Library3/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/Answers/Library3/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Answers/Library3/.idea/misc.xml b/Answers/Library3/.idea/misc.xml new file mode 100644 index 0000000..fdc35ea --- /dev/null +++ b/Answers/Library3/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Answers/Library3/.idea/vcs.xml b/Answers/Library3/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/Answers/Library3/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Answers/Library3/Admins.dat b/Answers/Library3/Admins.dat new file mode 100644 index 0000000..5581b0d Binary files /dev/null and b/Answers/Library3/Admins.dat differ diff --git a/Answers/Library3/Books.dat b/Answers/Library3/Books.dat new file mode 100644 index 0000000..18aac1f Binary files /dev/null and b/Answers/Library3/Books.dat differ diff --git a/Answers/Library3/Rents.dat b/Answers/Library3/Rents.dat new file mode 100644 index 0000000..665a849 Binary files /dev/null and b/Answers/Library3/Rents.dat differ diff --git a/Answers/Library3/Users.dat b/Answers/Library3/Users.dat new file mode 100644 index 0000000..2437d26 Binary files /dev/null and b/Answers/Library3/Users.dat differ diff --git a/Answers/Library3/pom.xml b/Answers/Library3/pom.xml new file mode 100644 index 0000000..48be3cb --- /dev/null +++ b/Answers/Library3/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + org.example + Library3 + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + \ No newline at end of file diff --git a/Answers/Library3/src/main/java/Admin.java b/Answers/Library3/src/main/java/Admin.java new file mode 100644 index 0000000..795b4d5 --- /dev/null +++ b/Answers/Library3/src/main/java/Admin.java @@ -0,0 +1,57 @@ +import java.io.Serial; +import java.io.Serializable; +import java.util.UUID; + +public class Admin implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String fullName; + private String ID; + private String phoneNumber; + private String password; + static int currentID = 0; + public Admin(String fullName, String phoneNumber, String password){ + currentID ++; + this.fullName = fullName; + this.ID = String.valueOf(currentID); + this.phoneNumber = phoneNumber; + this.password = password; + } + + public String getFullName() { + return fullName; + } + + public String getID() { + return ID; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public String getPassword() { + return password; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public void setPassword(String password) { + this.password = password; + } + @Override + public String toString() { + return "Admin{" + + "fullName='" + getFullName() + '\'' + + ", ID='" + getID() + '\'' + + ", phoneNumber='" + getPhoneNumber() + '\'' + + ", password='" + getPassword() + '\'' + + '}'; + } +} diff --git a/Answers/Library3/src/main/java/Book.java b/Answers/Library3/src/main/java/Book.java new file mode 100644 index 0000000..4fec129 --- /dev/null +++ b/Answers/Library3/src/main/java/Book.java @@ -0,0 +1,70 @@ +import java.io.Serial; +import java.util.UUID; +import java.io.Serializable; + +public class Book implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String bookID; + private String title; + private String author; + private boolean availability; + private String description; + static int currentID = 0; + + public Book(String title, String author, String description) { + currentID ++; + this.bookID = String.valueOf(currentID); + this.title = title; + this.author = author; + this.description = description; + this.availability = true; + } + + public String getBookID() { + return bookID; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public boolean isAvailability() { + return availability; + } + + public void setAvailability(boolean availability) { + this.availability = availability; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + @Override + public String toString() { + return "Book{" + + "title='" + getTitle() + '\'' + + ", bookID='" + getBookID() + '\'' + + ", author='" + getAuthor() + '\'' + + ", availability=" + isAvailability() + + ", description='" + getDescription() + '\'' + + '}'; + } +} + diff --git a/Answers/Library3/src/main/java/Library.java b/Answers/Library3/src/main/java/Library.java new file mode 100644 index 0000000..0260814 --- /dev/null +++ b/Answers/Library3/src/main/java/Library.java @@ -0,0 +1,294 @@ +import java.io.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Scanner; + +public class Library { + private final List books = new ArrayList<>(); + private final List admins = new ArrayList<>(); + private final List users = new ArrayList<>(); + private final List rents = new ArrayList<>(); + + + private static final String Book_FILE_NAME = "Books.dat"; + private static final String Admin_FILE_NAME = "Admins.dat"; + private static final String User_FILE_NAME = "Users.dat"; + private static final String Rent_FILE_NAME = "Rents.dat"; + + + private String libName = "NIT"; + private static int capacity = 1250; + private String operatinghours = "NIT library is open from 8 AM to 6 PM"; + public String getOperatinghours() { + return operatinghours; + } + public String getLibName(){ + return libName; + } + public Library(){ + loadBooks(); + loadAdmins(); + loadUsers(); + loadRents(); + } + public boolean isAdminEmpty(){ + return admins.isEmpty(); + } + public void addBook(String title, String author, String description){ + if (capacity > 0){ + books.add(new Book(title,author,description)); + capacity --; + books.sort(Comparator.comparing(Book::getTitle)); + saveBooks(); + System.out.println("Book added to library successfully."); + }else { + System.out.println("There is no capacity to add books!"); + } + } + public void rentBook(String title){ + boolean found = false; + for (int i = 0; i < books.size(); i++) { + if (title.equalsIgnoreCase(books.get(i).getTitle()) && books.get(i).isAvailability()){ + books.get(i).setAvailability(false); + saveBooks(); + System.out.println(title + " book rented successfully."); + found = true; + break; + } + } if (!found){ + System.out.println(title + " book is not available now!"); + } + } + public void rentSpecificBook(String bookName,String memberName,String memberID){ + int x=0,y=0; + boolean bookFound =false; + boolean userFound =false; + for (int i = 0; i < books.size(); i++) { + if (books.get(i).getTitle().equalsIgnoreCase(bookName)){ + x = i; + bookFound = true; + } + + } + for (int i = 0; i < users.size(); i++) { + if (users.get(i).getID().equalsIgnoreCase(memberID)) { + y = i; + userFound = true; + } + } + if (bookFound && userFound){ + createRent(books.get(x),users.get(y)); + } else { + System.out.println("Error renting book!"); + } + } + public void returnBook(String title) { + boolean found = false; + for (int i = 0; i < books.size(); i++) { + if (books.get(i).getTitle().equalsIgnoreCase(title)){ + books.get(i).setAvailability(true); + saveBooks(); + System.out.println("Book returned successfully."); + deleteRent(title); + found = true; + break; + } + } + if (!found) { + System.out.println("error returning book!"); + } + } + + public void getAvailableBooks(){ + for (int i = 0; i < books.size(); i++) { + if (books.get(i).isAvailability()){ + System.out.println(books.get(i).toString()); + } + } + } + private void saveBooks() { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(Book_FILE_NAME))) { + oos.writeObject(books); + } catch (IOException e) { + System.out.println("Error saving books: " + e.getMessage()); + } + } + @SuppressWarnings("unchecked") + private void loadBooks(){ + File file = new File(Book_FILE_NAME); + if (file.exists()){ + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Book_FILE_NAME))){ + Object object = ois.readObject(); + if (object instanceof List) { + books.addAll((List) object); + } + } catch (IOException | ClassNotFoundException e) { + System.out.println("Error loading books: " + e.getMessage()); + } + } + } + //---------------------------------------------------------------------------------------------------------- + //User registries + public void addUser(String fullName,String phoneNumber){ + users.add(new User(fullName,phoneNumber)); + users.sort(Comparator.comparing(User::getFullName)); + saveUsers(); + System.out.println("User " + fullName + " added successfully."); + } + + public void removeUser(String ID){ + boolean found = false; + for (int i = 0; i < users.size(); i++) { + if (users.get(i).getID().equalsIgnoreCase(ID)){ + users.remove(users.get(i)); + saveUsers(); + System.out.println("User " + users.get(i).getFullName() + " removed successfully."); + found = true; + break; + } + } + if (!found){ + System.out.println("Error removing user!"); + } + } + public void showUsers(){ + for (int i = 0; i < users.size(); i++) { + System.out.println(users.get(i).toString()); + } + } + public boolean checkUser(String fullName,String ID){ + boolean found = false; + for (int i = 0; i < users.size(); i++) { + if (users.get(i).getFullName().equalsIgnoreCase(fullName) && users.get(i).getID().equalsIgnoreCase(ID)) + found = true; + } + return found; + } + private void saveUsers(){ + try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(User_FILE_NAME))){ + oos.writeObject(users); + } catch (IOException e) { + System.out.println("Error saving users: " + e.getMessage()); + } + } + @SuppressWarnings("unchecked") + private void loadUsers(){ + File file = new File(User_FILE_NAME); + if (file.exists()){ + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(User_FILE_NAME))){ + Object object = ois.readObject(); + if (object instanceof List) { + users.addAll((List) object); + } + } catch (IOException | ClassNotFoundException e) { + System.out.println("Error loading users: " + e.getMessage()); + } + } + } + //---------------------------------------------------------------------------------------------------------- + //Admin registries + public void addAdmin(String fullName,String phoneNumber,String password){ + admins.add(new Admin(fullName,phoneNumber,password)); + admins.sort(Comparator.comparing(Admin::getFullName)); + saveAdmins(); + System.out.println("Admin " + fullName + " added successfully."); + } + public void removeAdmin(String ID){ + boolean found = false; + for (int i = 0; i < admins.size(); i++) { + if (admins.get(i).getID().equalsIgnoreCase(ID)){ + admins.remove(admins.get(i)); + saveUsers(); + System.out.println("Admin " + admins.get(i).getFullName() + " removed successfully."); + found = true; + break; + } + } + if (!found){ + System.out.println("Error removing admin!"); + } + } + public boolean checkAdmin(String fullName,String ID,String Password){ + boolean found = false; + for (int i = 0; i < admins.size(); i++) { + if (admins.get(i).getFullName().equalsIgnoreCase(fullName) && admins.get(i).getID().equalsIgnoreCase(ID) && admins.get(i).getPassword().equalsIgnoreCase(Password)) + found = true; + } + return found; + } + public void showAdmins(){ + for (int i = 0; i < admins.size(); i++) { + System.out.println(admins.get(i).toString()); + } + } + + private void saveAdmins(){ + try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(Admin_FILE_NAME))){ + oos.writeObject(admins); + } catch (IOException e) { + System.out.println("Error saving admins: " + e.getMessage()); + } + } + @SuppressWarnings("unchecked") + private void loadAdmins(){ + File file = new File(Admin_FILE_NAME); + if (file.exists()){ + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Admin_FILE_NAME))){ + Object object = ois.readObject(); + if (object instanceof List) { + admins.addAll((List) object); + } + } catch (IOException | ClassNotFoundException e) { + System.out.println("Error loading admins: " + e.getMessage()); + } + } + } + + //---------------------------------------------------------------------------------------------------------- + //Rents registries + + public void createRent(Book book,User user){ + rents.add(new Rent(book,user)); + rentBook(book.getTitle()); + saveRents(); + } + public void deleteRent(String title){ + for (int i = 0; i < rents.size(); i++) { + if (rents.get(i).getBook().getTitle().equalsIgnoreCase(title)){ + rents.remove(rents.get(i)); + saveRents(); + break; + } + } + } + public void showRents(){ + for (int i = 0; i < rents.size(); i++) { + System.out.println(rents.get(i).toString()); + } + } + + private void saveRents(){ + try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(Rent_FILE_NAME))){ + oos.writeObject(rents); + } catch (IOException e) { + System.out.println("Error saving rents: " + e.getMessage()); + } + } + + @SuppressWarnings("unchecked") + private void loadRents(){ + File file = new File(Rent_FILE_NAME); + if (file.exists()){ + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Rent_FILE_NAME))){ + Object object = ois.readObject(); + if (object instanceof List) { + rents.addAll((List) object); + } + } catch (IOException | ClassNotFoundException e) { + System.out.println("Error loading rents: " + e.getMessage()); + } + } + } + +} diff --git a/Answers/Library3/src/main/java/Main.java b/Answers/Library3/src/main/java/Main.java new file mode 100644 index 0000000..c58af28 --- /dev/null +++ b/Answers/Library3/src/main/java/Main.java @@ -0,0 +1,6 @@ +public class Main { + public static void main(String[] args) { + MyApp myApp = new MyApp(); + myApp.start(); + } +} diff --git a/Answers/Library3/src/main/java/MyApp.java b/Answers/Library3/src/main/java/MyApp.java new file mode 100644 index 0000000..4e0d4ac --- /dev/null +++ b/Answers/Library3/src/main/java/MyApp.java @@ -0,0 +1,156 @@ +import java.util.Scanner; +public class MyApp { + static Library library = new Library(); + static Scanner scanner = new Scanner(System.in); + public static void start(){ + if (library.isAdminEmpty()) + library.addAdmin("Arshia mohammadzade","09031241172","1384"); + getROLE(); + } + + public static void getROLE(){ + String role; + while (true){ + System.out.println("Please write your role:"); + System.out.println("lib::Admin::::::"); + System.out.println("lib::User::::"); + System.out.println("Exit"); + role =scanner.nextLine(); + if (role.equalsIgnoreCase("exit")){ + System.out.println("exiting program..."); + break; + } + roleCommand(role); + } + } + public static void roleCommand(String command){ + String[] parts = command.split("::"); + String operation = parts[1]; + switch (operation.toLowerCase()){ + case "admin" : + if (library.checkAdmin(parts[2],parts[3],parts[4])){ + AdminsMainMenu(); + }else { + System.out.println("wrong information!"); + } + break; + case "user" : + if (library.checkUser(parts[2],parts[3])) { + UsersMainMenu(); + }else { + System.out.println("wrong information!"); + } + break; + default: + System.out.println("invalid input! please try again."); + } + } + public static void UsersMainMenu(){ + System.out.println("Welcome to" + library.getLibName()); + String input; + while (true) { + System.out.println("Please write your operation:"); + System.out.println("lib::getHour"); + System.out.println("lib::rent::"); + System.out.println("lib::specificRent::::::"); + System.out.println("lib::getAvailableBooks"); + System.out.println("lib::return::"); + System.out.println("back"); + input = scanner.nextLine(); + if ("back".equalsIgnoreCase(input)) { + break; + } + UserprocessCommand(input); + } + } + public static void UserprocessCommand(String command){ + String[] parts = command.split("::"); + String operation = parts[1]; + switch (operation.toLowerCase()){ + case "gethour": + System.out.println(library.getOperatinghours()); + break; + case "rent": + library.rentBook(parts[2]); + break; + case "specificrent": + library.rentSpecificBook(parts[2],parts[3],parts[4]); + break; + case "getavailablebooks": + library.getAvailableBooks(); + break; + case "return": + library.returnBook(parts[2]); + break; + default: + System.out.println("Invalid input! Please try again."); + + } + } + public static void AdminsMainMenu(){ + System.out.println("Welcome to" + library.getLibName()); + String input; + while (true) { + System.out.println("Please write your operation:"); + System.out.println("lib::addBook::::<Author>::<Description>"); + System.out.println("lib::getHour"); + System.out.println("lib::rent::<BookName>"); + System.out.println("lib::addMember::<fullName>::<phoneNumber>"); + System.out.println("lib::specificRent::<bookName>::<memberName>::<memberID>"); + System.out.println("lib::getAvailableBooks"); + System.out.println("lib::removeMember::<memberID>"); + System.out.println("lib::return::<bookName>"); + System.out.println("lib::showRents"); + System.out.println("lib::showUsers"); + System.out.println("lib::showAdmins"); + System.out.println("back"); + input = scanner.nextLine(); + if ("back".equalsIgnoreCase(input)) { + break; + } + AdminsProcessCommand(input); + } + } + public static void AdminsProcessCommand(String command){ + String[] parts = command.split("::"); + String operation = parts[1]; + switch (operation.toLowerCase()){ + case "addbook": + library.addBook(parts[2],parts[3],parts[4]); + break; + case "gethour": + System.out.println(library.getOperatinghours()); + break; + case "rent": + library.rentBook(parts[2]); + break; + case "addmember": + library.addUser(parts[2],parts[3]); + break; + case "specificrent": + library.rentSpecificBook(parts[2],parts[3],parts[4]); + break; + case "getavailablebooks": + library.getAvailableBooks(); + break; + case "removemember": + library.removeUser(parts[2]); + break; + case "return": + library.returnBook(parts[2]); + break; + case "showrents": + library.showRents(); + break; + case "showusers": + library.showUsers(); + break; + case "showAdmins": + library.showAdmins(); + break; + default: + System.out.println("Invalid input! Please try again."); + + } + } +} diff --git a/Answers/Library3/src/main/java/Rent.java b/Answers/Library3/src/main/java/Rent.java new file mode 100644 index 0000000..62acf25 --- /dev/null +++ b/Answers/Library3/src/main/java/Rent.java @@ -0,0 +1,67 @@ +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.Period; +import java.util.UUID; + +public class Rent implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Book book; + private User user; + private String rentalID; + private String rentalDate; + private String returnDate; + public Rent(Book book,User user){ + this.book = book; + this.user = user; + this.rentalID = UUID.randomUUID().toString(); + this.rentalDate = createRentalDate(); + this.returnDate = createReturnDate(); + } + + public String getRentalID() { + return rentalID; + } + public Book getBook(){ + return book; + } + public User getUser(){ + return user; + } + + public String getRentalDate() { + return rentalDate; + } + + public String getReturnDate() { + return returnDate; + } + + public static String createRentalDate() { + LocalDate date = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + return date.format(formatter); + } + public static String createReturnDate() { + LocalDate date = LocalDate.now(); + Period period = Period.ofDays(21); + LocalDate rentalDate = date.plus(period); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + return rentalDate.format(formatter); + } + + @Override + public String toString() { + return "Rent{" + + "BookName='" + book.getTitle() + '\'' + + ", UserName='" + user.getFullName() + '\'' + + ", userID='" + user.getID() + '\'' + + ", rentalDate=" + rentalDate + + ", returnDate=" + returnDate + + ", rentalID=" + rentalID + + '}'; + } + +} \ No newline at end of file diff --git a/Answers/Library3/src/main/java/User.java b/Answers/Library3/src/main/java/User.java new file mode 100644 index 0000000..33eb091 --- /dev/null +++ b/Answers/Library3/src/main/java/User.java @@ -0,0 +1,65 @@ +import java.io.Serial; +import java.io.Serializable; +import java.util.UUID; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public class User implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String fullName; + private String ID; + private String phoneNumber; + private String date_of_registration; + static int currentID = 0; + + + public User(String fullName, String phoneNumber){ + currentID++; + this.fullName = fullName; + this.ID = String.valueOf(currentID); + this.phoneNumber = phoneNumber; + this.date_of_registration = getFormattedDate(); + } + + public String getFullName() { + return fullName; + } + + public String getID() { + return ID; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public String getDate_of_registration() { + return date_of_registration; + } + + public void setFullName(String completeName) { + this.fullName = completeName; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public static String getFormattedDate() { + LocalDate date = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + return date.format(formatter); + } + @Override + public String toString() { + return "User{" + + "fullName='" + getFullName() + '\'' + + ", ID='" + getID() + '\'' + + ", phoneNumber='" + getPhoneNumber() + '\'' + + ", date_of_registration='" + getDate_of_registration() + '\'' + + '}'; + } + +} +