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::::::");
+ 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("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() + '\'' +
+ '}';
+ }
+
+}
+