From a9f1ab68b9e92049af637ef19e0470d43f31ce01 Mon Sep 17 00:00:00 2001 From: Alena Date: Sun, 14 Feb 2021 19:01:21 +0400 Subject: [PATCH 1/2] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B8=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epam/izh/rd/online/entity/Author.java | 77 ++++++++++++++++ .../com/epam/izh/rd/online/entity/Book.java | 51 +++++++++++ .../epam/izh/rd/online/entity/SchoolBook.java | 64 ++++++++++++++ .../repository/SimpleAuthorRepository.java | 88 +++++++++++++++++++ .../SimpleSchoolBookRepository.java | 4 + 5 files changed, 284 insertions(+) create mode 100644 src/main/java/com/epam/izh/rd/online/repository/SimpleAuthorRepository.java create mode 100644 src/main/java/com/epam/izh/rd/online/repository/SimpleSchoolBookRepository.java 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..d0ea8b41 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 @@ -18,6 +18,83 @@ * 5) Переопределить методы equals и hashCode - используйте генерацию (не забывайте alt+inset) * 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 void setName(String name) { + this.name = name; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public LocalDate getBirthdate() { + return birthdate; + } + + public void setBirthdate(LocalDate birthdate) { + this.birthdate = birthdate; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + // equals и hashCode + + + @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(getName(), author.getName()) && Objects.equals(getLastName(), author.getLastName()); + } + + @Override + public int hashCode() { + return Objects.hash(getName(), getLastName(), getBirthdate(), getCountry()); + } + // toString + @Override + public String toString() { + return "Author{" + + "name='" + name + '\'' + + ", lastName='" + lastName + '\'' + + ", birthdate=" + birthdate + + ", country='" + country + '\'' + + '}'; + } } 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..1724bff5 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 @@ -16,5 +16,56 @@ * 6) Переопределить метод toString с выводом всех полей (не забывайте alt+inset) */ 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 void setNumberOfPages(int numberOfPages) { + this.numberOfPages = numberOfPages; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + // equals и hashCode + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + return getNumberOfPages() == book.getNumberOfPages() && Objects.equals(getName(), book.getName()); + } + + @Override + public int hashCode() { + return Objects.hash(getNumberOfPages(), getName()); + } + + // toString + @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..24c8c963 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 @@ -20,5 +20,69 @@ * 6) Переопределить метод toString с выводом всех полей (не забывайте alt+inset) */ public class SchoolBook extends Book { + private String authorName; + private String authorLastName; + private LocalDate publishDate; + // Пустой конструктор. + public SchoolBook() { + } + + // Конструктор с со всеми + параметрами родительского класса. + 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 void setAuthorName(String authorName) { + this.authorName = authorName; + } + + public String getAuthorLastName() { + return authorLastName; + } + + public void setAuthorLastName(String authorLastName) { + this.authorLastName = authorLastName; + } + + public LocalDate getPublishDate() { + return publishDate; + } + + public void setPublishDate(LocalDate publishDate) { + this.publishDate = publishDate; + } + + // equals and hashCode + @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(getAuthorName(), that.getAuthorName()) && Objects.equals(getAuthorLastName(), that.getAuthorLastName()) && Objects.equals(getPublishDate(), that.getPublishDate()); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), getAuthorName(), getAuthorLastName(), getPublishDate()); + } + + // toString + @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..86921ff1 --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/repository/SimpleAuthorRepository.java @@ -0,0 +1,88 @@ +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[1]; + + /** + * Метод должен сохранять автора в массив authors. + * Массив при каждом сохранении должен увеличиваться в размере ровно на 1. + * То есть он ровно того размера, сколько сущностей мы в него сохранили. + *

+ * Если на вход для сохранения приходит автор, который уже есть в массиве (сохранен), то автор не сохраняется и + * метод возвращает false. + *

+ * Можно сравнивать только по полному имени (имя и фамилия), считаем, что двух авторов + * с одинаковыми именем и фамилией быть не может. + * Подсказка - можно использовать для проверки метод findByFullName. + *

+ * Если сохранение прошло успешно, метод должен вернуть true. + */ + @Override + public boolean save(Author author) { + for (int i = 0; i < authors.length; i++) { + if (authors[i].equals(author)) return false; + } + Author[] authors1 = new Author[authors.length + 1]; + java.lang.System.arraycopy(authors, 0, authors1, 0, authors.length); + authors1[authors1.length - 1] = author; + this.authors = authors1; + return true; + } + + /** + * Метод должен находить в массиве authors автора по имени и фамилии (считаем, что двух авторов + * с одинаковыми именем и фамилией быть не может.) + *

+ * Если автор с таким именем и фамилией найден - возвращаем его, если же не найден, метод должен вернуть null. + */ + @Override + public Author findByFullName(String name, String lastname) { + for (int i = 0; i < authors.length; i++) { + if (name.equals(authors[i].getName()) & lastname.equals(authors[i].getLastName())) + return authors[i]; + } + return null; + } + + /** + * Метод должен удалять автора из массива authors, если он там имеется. + * Автора опять же, можно определять только по совпадению имении и фамилии. + *

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

+ * Если автор был найден и удален, метод должен вернуть true, в противном случае, если автор не был найден, метод + * должен вернуть false. + */ + @Override + public boolean remove(Author author) { + for (int i = 0; i < authors.length; i++) { + if (author.equals(authors)) { + // authors[i] = null; + Author[] author2 = new Author[authors.length - 1]; + java.lang.System.arraycopy(authors, 0, author2, 0, authors.length - i); + java.lang.System.arraycopy(author, i + 1, author2, i, authors.length - (authors.length - i + 1)); + return true; + } + } + return false; + } + + /** + * Метод возвращает количество сохраненных сущностей в массиве authors. + */ + @Override + public int count() { + int counter = 0; + for (Author author : authors) { + if (author != null) + counter++; + } + return counter; + // 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..e8542b92 --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/repository/SimpleSchoolBookRepository.java @@ -0,0 +1,4 @@ +package com.epam.izh.rd.online.repository; + +public class SimpleSchoolBookRepository { +} From 5d64b7aa63abf11260efb73da1184120aed77588 Mon Sep 17 00:00:00 2001 From: Alena Date: Mon, 15 Feb 2021 21:25:38 +0400 Subject: [PATCH 2/2] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D1=8F=20=D0=B8=20=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/SimpleAuthorRepository.java | 13 +-- .../SimpleSchoolBookRepository.java | 91 +++++++++++++++++- .../izh/rd/online/service/AuthorService.java | 1 + .../online/service/SimpleAuthorService.java | 54 +++++++++++ .../service/SimpleSchoolBookService.java | 93 +++++++++++++++++++ 5 files changed, 245 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/epam/izh/rd/online/service/SimpleAuthorService.java create mode 100644 src/main/java/com/epam/izh/rd/online/service/SimpleSchoolBookService.java 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 index 86921ff1..a9877393 100644 --- a/src/main/java/com/epam/izh/rd/online/repository/SimpleAuthorRepository.java +++ b/src/main/java/com/epam/izh/rd/online/repository/SimpleAuthorRepository.java @@ -4,7 +4,7 @@ public class SimpleAuthorRepository implements AuthorRepository { - private Author[] authors = new Author[1]; + private Author[] authors = new Author[0]; /** * Метод должен сохранять автора в массив authors. @@ -60,12 +60,13 @@ public Author findByFullName(String name, String lastname) { */ @Override public boolean remove(Author author) { - for (int i = 0; i < authors.length; i++) { - if (author.equals(authors)) { - // authors[i] = null; + for (int i = authors.length - 1; i >= 0; i--) { + if (author.equals(authors[i])) { Author[] author2 = new Author[authors.length - 1]; - java.lang.System.arraycopy(authors, 0, author2, 0, authors.length - i); - java.lang.System.arraycopy(author, i + 1, author2, i, authors.length - (authors.length - i + 1)); + java.lang.System.arraycopy(authors, 0, author2, 0, authors.length - 1); + if (i != authors.length - 1) + java.lang.System.arraycopy(authors, i + 1, author2, i, authors.length - (authors.length - (i + 1))); + this.authors = author2; return true; } } 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 index e8542b92..0735bf5d 100644 --- a/src/main/java/com/epam/izh/rd/online/repository/SimpleSchoolBookRepository.java +++ b/src/main/java/com/epam/izh/rd/online/repository/SimpleSchoolBookRepository.java @@ -1,4 +1,93 @@ package com.epam.izh.rd.online.repository; -public class SimpleSchoolBookRepository { +import com.epam.izh.rd.online.entity.Book; +import com.epam.izh.rd.online.entity.SchoolBook; + +public class SimpleSchoolBookRepository implements BookRepository { + + private SchoolBook[] schoolBooks = new SchoolBook[0]; + + + /** + * Метод должен сохранять школьную книгу в массив schoolBooks. + * Массив при каждом сохранении должен увеличиваться в размере ровно на 1. + * То есть он ровно того размера, сколько сущностей мы в него сохранили. + *

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

+ * Если сохранение прошло успешно, метод должен вернуть true. + */ + + @Override + public boolean save(SchoolBook book) { + SchoolBook[] schoolBooks2 = new SchoolBook[schoolBooks.length + 1]; + java.lang.System.arraycopy(schoolBooks, 0, schoolBooks2, 0, schoolBooks.length); + schoolBooks2[schoolBooks2.length - 1] = (SchoolBook) book; + this.schoolBooks = schoolBooks2; + return true; + } + + /** + * Метод должен находить в массиве schoolBooks все книги по имени. + *

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

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

+ * Если хотя бы одна книга была найдена и удалена, метод должен вернуть true, в противном случае, + * если книга не была найдена, метод должен вернуть false. + */ + @Override + public boolean removeByName(String name) { + boolean flag = false; + for (int i = schoolBooks.length -1; i >= 0; i--) { + if (name.equals(schoolBooks[i].getName())) { + SchoolBook[] books = new SchoolBook[schoolBooks.length - 1]; + java.lang.System.arraycopy(schoolBooks, 0, books, 0, schoolBooks.length - 1); + if (i != schoolBooks.length - 1) { + java.lang.System.arraycopy(schoolBooks, i + 1, books, i, schoolBooks.length - (schoolBooks.length - (i + 1))); + } + this.schoolBooks = books; + flag = true; + } + } + return flag; + } + + + /** + * Метод возвращает количество сохраненных сущностей в массиве schoolBooks. + */ + @Override + public int count() { + int counter = 0; + for (SchoolBook schoolBook : schoolBooks) { + if (schoolBook != null) + counter++; + } + return counter; + } } diff --git a/src/main/java/com/epam/izh/rd/online/service/AuthorService.java b/src/main/java/com/epam/izh/rd/online/service/AuthorService.java index 25bfecd1..77902a9c 100644 --- a/src/main/java/com/epam/izh/rd/online/service/AuthorService.java +++ b/src/main/java/com/epam/izh/rd/online/service/AuthorService.java @@ -27,6 +27,7 @@ public interface AuthorService { /** * Метод должен находить автора по имени и фамилии. * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат. + * @return */ Author findByFullName(String name, String lastname); 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..e55ce108 --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/service/SimpleAuthorService.java @@ -0,0 +1,54 @@ +package com.epam.izh.rd.online.service; + +import com.epam.izh.rd.online.entity.Author; +import com.epam.izh.rd.online.repository.AuthorRepository; +import com.epam.izh.rd.online.repository.SimpleAuthorRepository; + +public class SimpleAuthorService implements AuthorService { + + private AuthorRepository authorRepository = new SimpleAuthorRepository(); + + public SimpleAuthorService() { + } + + public SimpleAuthorService(AuthorRepository authorRepository) { + this.authorRepository = authorRepository; + } + + /** + * Метод должен сохранять автора. + * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат. + */ + @Override + public boolean save(Author author) { + return authorRepository.save(author); + } + + /** + * Метод должен находить автора по имени и фамилии. + * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат. + * @return + */ + @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(); + } +} 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..27d1252e --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/service/SimpleSchoolBookService.java @@ -0,0 +1,93 @@ +package com.epam.izh.rd.online.service; + +import com.epam.izh.rd.online.entity.Author; +import com.epam.izh.rd.online.entity.Book; +import com.epam.izh.rd.online.entity.SchoolBook; +import com.epam.izh.rd.online.repository.BookRepository; +import com.epam.izh.rd.online.repository.SimpleSchoolBookRepository; + +public class SimpleSchoolBookService implements BookService { + private BookRepository schoolBookBookRepository = new SimpleSchoolBookRepository(); + private AuthorService authorService = new SimpleAuthorService(); + + public SimpleSchoolBookService() { + } + + public SimpleSchoolBookService(BookRepository schoolBookBookRepository, AuthorService authorService) { + this.schoolBookBookRepository = schoolBookBookRepository; + this.authorService = authorService; + } + + /** + * Метод должен сохранять книгу. + *

+ * Перед сохранением книги нужно проверить, сохранен ли такой автор в базе авторов. + * То есть вы должен взять имя и фамилию автора из книги и обратиться к сервису авторов и узнать о наличии такого автора. + * Напомню, что мы считаем, что двух авторов с одинаковыми именем и фамилией быть не может. + *

+ * Если такой автор сущесвует (сохранен) - значит можно сохранять и книгу. + * Если же такого автора в базе нет, значит книгу сохранять нельзя. + *

+ * Соответственно, если книга была успешно сохранена - метод возвращает true, если же книга не была сохранена - метод возвращает false. + */ + @Override + public boolean save(SchoolBook book) { + if (authorService.findByFullName(book.getAuthorName(), book.getAuthorLastName()) != null) { + schoolBookBookRepository.save(book); + return true; + } + return false; + } + + /** + * Метод должен находить книгу по имени. + *

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

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

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

+ * То есть приждется сходить и в репозиторий с книгами и в сервис авторов. + *

+ * Если такой книги не найдено, метод должен вернуть null. + */ + @Override + public Author findAuthorByBookName(String name) { + SchoolBook books = schoolBookBookRepository.findByName(name)[0]; + return authorService.findByFullName(books.getAuthorName(), books.getAuthorLastName()); + } +}