diff --git a/src/main/java/com/epam/izh/rd/online/entity/Author.java b/src/main/java/com/epam/izh/rd/online/entity/Author.java index 166be587..d4e1b0f1 100644 --- a/src/main/java/com/epam/izh/rd/online/entity/Author.java +++ b/src/main/java/com/epam/izh/rd/online/entity/Author.java @@ -19,5 +19,76 @@ * 6) Переопределить метод toString с выводом всех полей (не забывайте alt+inset) */ public class Author { + private String name; + private String lastName; + private LocalDate birthdate; + private String country; -} + public Author() { + } + + public Author(String name, String lastName, LocalDate birthdate, String country) { + this.name = name; + this.lastName = lastName; + this.birthdate = birthdate; + this.country = country; + } + + public String getName() { + return name; + } + + public String getLastName() { + return lastName; + } + + public LocalDate getBirthdate() { + return birthdate; + } + + public String getCountry() { + return country; + } + + public void setName(String name) { + this.name = name; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public void setBirthdate(LocalDate birthdate) { + this.birthdate = birthdate; + } + + public void setCountry(String country) { + this.country = country; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Author author = (Author) o; + return Objects.equals(name, author.name) && + Objects.equals(lastName, author.lastName) && + Objects.equals(birthdate, author.birthdate) && + Objects.equals(country, author.country); + } + + @Override + public int hashCode() { + return Objects.hash(name, lastName, birthdate, country); + } + + @Override + public String toString() { + return "Author{" + + "name='" + name + '\'' + + ", lastName='" + lastName + '\'' + + ", birthdate=" + birthdate + + ", country='" + country + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/epam/izh/rd/online/entity/Book.java b/src/main/java/com/epam/izh/rd/online/entity/Book.java index 08bdccb8..fb0d3209 100644 --- a/src/main/java/com/epam/izh/rd/online/entity/Book.java +++ b/src/main/java/com/epam/izh/rd/online/entity/Book.java @@ -17,4 +17,52 @@ */ public abstract class Book { + private int numberOfPages; + private String name; + + public Book() { + } + + public Book(int numberOfPages, String name) { + this.numberOfPages = numberOfPages; + this.name = name; + } + + public int getNumberOfPages() { + return numberOfPages; + } + + public String getName() { + return name; + } + + public void setNumberOfPages(int numberOfPages) { + this.numberOfPages = numberOfPages; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + return numberOfPages == book.numberOfPages && + name.equals(book.name); + } + + @Override + public int hashCode() { + return Objects.hash(numberOfPages, name); + } + + @Override + public String toString() { + return "Book{" + + "numberOfPages=" + numberOfPages + + ", name='" + name + '\'' + + '}'; + } } diff --git a/src/main/java/com/epam/izh/rd/online/entity/SchoolBook.java b/src/main/java/com/epam/izh/rd/online/entity/SchoolBook.java index a9834db4..b9a78e39 100644 --- a/src/main/java/com/epam/izh/rd/online/entity/SchoolBook.java +++ b/src/main/java/com/epam/izh/rd/online/entity/SchoolBook.java @@ -21,4 +21,72 @@ */ public class SchoolBook extends Book { + private String authorName; + private String authorLastName; + private LocalDate publishDate; + + public SchoolBook() { + } + + public SchoolBook(String authorName, String authorLastName, LocalDate publishDate) { + this.authorName = authorName; + this.authorLastName = authorLastName; + this.publishDate = publishDate; + } + + public SchoolBook(int numberOfPages, String name, String authorName, String authorLastName, LocalDate publishDate) { + super(numberOfPages, name); + this.authorName = authorName; + this.authorLastName = authorLastName; + this.publishDate = publishDate; + } + + public String getAuthorName() { + return authorName; + } + + public String getAuthorLastName() { + return authorLastName; + } + + public LocalDate getPublishDate() { + return publishDate; + } + + public void setAuthorName(String authorName) { + this.authorName = authorName; + } + + public void setAuthorLastName(String authorLastName) { + this.authorLastName = authorLastName; + } + + public void setPublishDate(LocalDate publishDate) { + this.publishDate = publishDate; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + SchoolBook that = (SchoolBook) o; + return Objects.equals(authorName, that.authorName) && + Objects.equals(authorLastName, that.authorLastName) && + Objects.equals(publishDate, that.publishDate); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), authorName, authorLastName, publishDate); + } + + @Override + public String toString() { + return "SchoolBook{" + + "authorName='" + authorName + '\'' + + ", authorLastName='" + authorLastName + '\'' + + ", publishDate=" + publishDate + + '}'; + } } diff --git a/src/main/java/com/epam/izh/rd/online/repository/SimpleAuthorRepository.java b/src/main/java/com/epam/izh/rd/online/repository/SimpleAuthorRepository.java new file mode 100644 index 00000000..32077792 --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/repository/SimpleAuthorRepository.java @@ -0,0 +1,77 @@ +package com.epam.izh.rd.online.repository; + +import com.epam.izh.rd.online.entity.Author; + + +public class SimpleAuthorRepository implements AuthorRepository{ + + private Author[] authors = new Author[]{}; + + /** + * Метод должен сохранять автора в массив authors. + * + * Если на вход для сохранения приходит автор, который уже есть в массиве (сохранен), то автор не сохраняется и + * метод возвращает false. + * + * Если сохранение прошло успешно, метод должен вернуть true. + */ + @Override + public boolean save(Author author) { + if (findByFullName(author.getName(), author.getLastName()) != null){ + return false; + } + Author[] authorsBuffer= new Author[authors.length+1]; + + System.arraycopy(authors,0,authorsBuffer,0,authors.length); + authorsBuffer[authors.length] = author; + authors = authorsBuffer; + return true; + } + + /** + * Метод должен находить в массиве authors автора по имени и фамилии + * + * Если автор с таким именем и фамилией найден - возвращаем его, если же не найден, метод должен вернуть null. + */ + @Override + public Author findByFullName(String name, String lastname) { + for (Author author: authors) { + if (author.getName().equals(name) && author.getLastName().equals(lastname)){ + return author; + } + } + return null; + } + + /** + * Метод должен удалять автора из массива authors, если он там имеется. + * + * Если автор был найден и удален, метод должен вернуть true, в противном случае, если автор не был найден, метод + * должен вернуть false. + */ + @Override + public boolean remove(Author author){ + if (findByFullName(author.getName(), author.getLastName()) == null) { + return false; + } + Author[] authorsBuffer = new Author[authors.length-1]; + for (int i = 0, authorCount = 0; i < authors.length; i++, authorCount++) { + if (authors[i].getName().equals(author.getName()) && authors[i].getLastName().equals(author.getLastName())) { + authorCount--; + continue; + } + authorsBuffer[authorCount] = authors[i]; + } + authors = authorsBuffer; + return true; + } + + + /** + * Метод возвращает количество сохраненных сущностей в массиве authors. + */ + @Override + public int count(){ + return authors.length; + } +} diff --git a/src/main/java/com/epam/izh/rd/online/repository/SimpleSchoolBookRepository.java b/src/main/java/com/epam/izh/rd/online/repository/SimpleSchoolBookRepository.java new file mode 100644 index 00000000..212f7c2f --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/repository/SimpleSchoolBookRepository.java @@ -0,0 +1,80 @@ +package com.epam.izh.rd.online.repository; + +import com.epam.izh.rd.online.entity.Book; +import com.epam.izh.rd.online.entity.SchoolBook; +import java.util.ArrayList; +import java.util.Arrays; + +public class SimpleSchoolBookRepository implements BookRepository{ + private SchoolBook[] schoolbooks = new SchoolBook[]{}; + /** + * Метод должен сохранять школьную книгу в массив schoolBooks. + * Массив при каждом сохранении должен увеличиваться в размере ровно на 1. + * То есть он ровно того размера, сколько сущностей мы в него сохранили. + *

+ * Одну и ту же книгу МОЖНО сохранить в массиве несколько раз, проверки на то, что такая книга уже сохранена, делать не нужно. + *

+ * Если сохранение прошло успешно, метод должен вернуть true. + */ + + @Override + public boolean save(Book book) { + SchoolBook[] booksBuffer = new SchoolBook[schoolbooks.length+1]; + for (int i = 0; i < schoolbooks.length; i++) { + booksBuffer[i] = schoolbooks[i]; + } + booksBuffer[schoolbooks.length] = (SchoolBook) book; + schoolbooks = booksBuffer; + return true; + } + + /** + * Метод должен находить в массиве schoolBooks все книги по имени. + *

+ * Если книги найдены - метод должен их вернуть. + * Если найденных по имени книг нет, должен вернуться пустой массив. + */ + @Override + public Book[] findByName(String name) { + ArrayList bookBuffer = new ArrayList<>(); + for (int i = 0; i < schoolbooks.length; i++) + if(schoolbooks[i].getName().equals(name)){ + bookBuffer.add(schoolbooks[i]); + } + SchoolBook[] books = new SchoolBook[bookBuffer.size()]; + for (int i = 0; i < bookBuffer.size(); i++) + books[i]=bookBuffer.get(i); + return books; + } + + /** + * Метод должен удалять книги из массива schoolBooks по названию. + * Если книг с одинаковым названием в массиве несколько, метод должен удалить их все. + *

+ * Важно: при удалении книги из массива размер массива должен уменьшиться! + * То есть, если мы сохранили 2 разные книги и вызвали count() (метод ниже), то он должен вернуть 2. + * Если после этого мы удалили 1 книгу, метод count() должен вернуть 1. + *

+ * Если хотя бы одна книга была найдена и удалена, метод должен вернуть true, в противном случае, + * если книга не была найдена, метод должен вернуть false. + */ + @Override + public boolean removeByName(String name) { + if(findByName(name).length==0) return false; + SchoolBook[] booksBuffer = new SchoolBook[count() - findByName(name).length]; + int count = 0; + for (SchoolBook schoolBook : schoolbooks) { + if (!schoolBook.getName().equals(name)) { + booksBuffer[count] = schoolBook; + count++; + } + } + schoolbooks = booksBuffer; + return true; + } + + @Override + public int count() { + return schoolbooks.length; + } +} \ No newline at end of file diff --git a/src/main/java/com/epam/izh/rd/online/service/SimpleAuthorService.java b/src/main/java/com/epam/izh/rd/online/service/SimpleAuthorService.java new file mode 100644 index 00000000..90c1e7c3 --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/service/SimpleAuthorService.java @@ -0,0 +1,55 @@ +package com.epam.izh.rd.online.service; + +import com.epam.izh.rd.online.entity.Author; +import com.epam.izh.rd.online.repository.AuthorRepository; + +public class SimpleAuthorService implements AuthorService{ + + + + + /** + * Метод должен сохранять автора. + * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат. + */ + @Override + public boolean save(Author author){ + return authorRepository.save(author); + } + + /** + * Метод должен находить автора по имени и фамилии. + * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат. + */ + @Override + public Author findByFullName(String name, String lastname){ + return authorRepository.findByFullName(name, lastname); + } + + /** + * Метод должен удалять автора. + * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат.. + */ + @Override + public boolean remove(Author author){ + return authorRepository.remove(author); + } + /** + * Метод считать количество сохраненных авторов на текущий момент. + * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат. + */ + @Override + public int count(){ + return authorRepository.count(); + } + + private AuthorRepository authorRepository; + + public SimpleAuthorService() { + } + + public SimpleAuthorService(AuthorRepository authorRepository) { + this.authorRepository = authorRepository; + } + +} diff --git a/src/main/java/com/epam/izh/rd/online/service/SimpleSchoolBookService.java b/src/main/java/com/epam/izh/rd/online/service/SimpleSchoolBookService.java new file mode 100644 index 00000000..55dfb5db --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/service/SimpleSchoolBookService.java @@ -0,0 +1,78 @@ +package com.epam.izh.rd.online.service; + +import com.epam.izh.rd.online.entity.Author; +import com.epam.izh.rd.online.entity.SchoolBook; +import com.epam.izh.rd.online.repository.BookRepository; + +public class SimpleSchoolBookService implements BookService { + + private BookRepository schoolBookRepository; + private AuthorService authorService; + + public SimpleSchoolBookService() { + } + + public SimpleSchoolBookService(BookRepository schoolBookRepository, AuthorService authorService) { + this.schoolBookRepository = schoolBookRepository; + this.authorService = authorService; + } + + /** + * Метод должен сохранять книгу. + * + * Соответственно, если книга была успешно сохранена - метод возвращает true, если же книга не была сохранена - метод возвращает false. + */ + @Override + public boolean save(SchoolBook book) { + if (authorService.findByFullName(book.getAuthorName(), book.getAuthorLastName()) == null) { + return false; + } else { + schoolBookRepository.save(book); + return true; + } + } + /** + * Метод должен находить книгу по имени. + *

+ * По факту, он просто обращается к репозиторию с книгами и вызывает аналогичный метод, псоле чего возвращает результат. + */ + @Override + public SchoolBook[] findByName(String name) { + return schoolBookRepository.findByName(name); + } + /** + * Метод должен находить количество сохраненных книг по конкретному имени книги. + */ + @Override + public int getNumberOfBooksByName(String name) { + return schoolBookRepository.findByName(name).length; + } + /** + * Метод должен удалять все книги по имени. + *

+ * По факту, он просто обращается к репозиторию с книгами и вызывает аналогичный метод, псоле чего возвращает результат. + */ + @Override + public boolean removeByName(String name) { + return schoolBookRepository.removeByName(name); + } + /** + * Метод должен возвращать количество всех книг. + *

+ * По факту, он просто обращается к репозиторию с книгами и вызывает аналогичный метод, псоле чего возвращает результат. + */ + @Override + public int count() { + return schoolBookRepository.count(); + } + /** + * Метод должен возвращать автора книги по названию книги. + * + * Если такой книги не найдено, метод должен вернуть null. + */ + @Override + public Author findAuthorByBookName(String name) { + SchoolBook book =schoolBookRepository.findByName(name)[0]; + return authorService.findByFullName(book.getAuthorName(),book.getAuthorLastName()); + } +}