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..56928ea4 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 @@ -3,21 +3,74 @@ import java.time.LocalDate; import java.util.Objects; -/** - * Класс содержащий информацию об авторе. - * - * Необходимо: - * 1) Создать список полей с указанными типами ровно в этом порядке: - * - name с типом String и приватным модификатором доступа - * - lastName с типом String и приватным модификатором доступа - * - birthdate с типом LocalDate и приватным модификатором доступа - * - country с типом String и приватным модификатором доступа - * 2) Создать дефолтный конструктор (без параметров) (не забывайте alt+inset) - * 3) Создать конструктор со всеми параметрами (в том порядке в котором перечислены) (не забывайте alt+inset) - * 4) Создать геттеры и сеттеры (не забывайте alt+inset) - * 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; + } + + @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 + '\'' + + '}'; + } } 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..37fbb464 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 @@ -2,19 +2,52 @@ import java.util.Objects; -/** - * Базовая сущность для книги. Содержит базовые поля. - * - * Необходимо: - * 1) Создать список полей с указанными типами ровно в этом порядке: - * - numberOfPages с типом int и приватным модификатором доступа - * - name с типом String и приватным модификатором доступа - * 2) Создать дефолтный конструктор (без параметров) (не забывайте alt+inset) - * 3) Создать конструктор со всеми параметрами (в том порядке в котором перечислены) (не забывайте alt+inset) - * 4) Создать геттеры и сеттеры (не забывайте alt+inset) - * 5) Переопределить методы equals и hashCode - используйте генерацию (не забывайте alt+inset) - * 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; + } + + @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 && Objects.equals(name, 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..80621e14 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 @@ -3,22 +3,65 @@ import java.time.LocalDate; import java.util.Objects; -/** - * Сущность учебника. Он должен быть унаследован от сущности Book - * - * Необходимо: - * 1) Унаследовать данный класс от класса Book - * 2) Создать список полей с указанными типами ровно в этом порядке: - * - authorName с типом String и приватным модификатором доступа - * - authorLastName с типом String и приватным модификатором доступа - * - publishDate с типом LocalDate и приватным модификатором доступа - * 2) Создать дефолтный конструктор (без параметров) (не забывайте alt+inset) - * 3) Создать конструктор со всеми параметрами (важно - не только с полями данного класса, но и с полями родителя Book) - * (создавать в том порядке в котором перечислены). Сначала нужно создать аналогичный конструтор для Book. Используйте alt+inset. - * 4) Создать геттеры и сеттеры (не забывайте alt+inset) - * 5) Переопределить методы equals и hashCode - используйте генерацию (не забывайте alt+inset) - * 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; + } + + @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/AuthorRepository.java b/src/main/java/com/epam/izh/rd/online/repository/AuthorRepository.java index c62bd4e9..da346a4f 100644 --- a/src/main/java/com/epam/izh/rd/online/repository/AuthorRepository.java +++ b/src/main/java/com/epam/izh/rd/online/repository/AuthorRepository.java @@ -2,58 +2,12 @@ import com.epam.izh.rd.online.entity.Author; -/** - * Интерфейс репозитория для хранения данных об авторах. - *
- * Необходимо: - * 1) Создать в этом же пакете класс SimpleAuthorRepository - * 2) Имплементировать им данный интерфейс - * 3) Добавить все методы (пока можно не писать реализацию) - * 4) Добавить в SimpleAuthorRepository приватное поле "Author[] authors" для хранения авторов - * 5) Инициалазировать его пустым массивом - * 6) Написать в классе SimpleAuthorRepository реализацию для всех методов (коллекции не используем, работаем только с массивами) - */ public interface AuthorRepository { - /** - * Метод должен сохранять автора в массив authors. - * Массив при каждом сохранении должен увеличиваться в размере ровно на 1. - * То есть он ровно того размера, сколько сущностей мы в него сохранили. - *
- * Если на вход для сохранения приходит автор, который уже есть в массиве (сохранен), то автор не сохраняется и - * метод возвращает false. - *
- * Можно сравнивать только по полному имени (имя и фамилия), считаем, что двух авторов - * с одинаковыми именем и фамилией быть не может. - * Подсказка - можно использовать для проверки метод findByFullName. - *
- * Если сохранение прошло успешно, метод должен вернуть true. - */ boolean save(Author author); - - /** - * Метод должен находить в массиве authors автора по имени и фамилии (считаем, что двух авторов - * с одинаковыми именем и фамилией быть не может.) - *
- * Если автор с таким именем и фамилией найден - возвращаем его, если же не найден, метод должен вернуть null. - */ Author findByFullName(String name, String lastname); - - /** - * Метод должен удалять автора из массива authors, если он там имеется. - * Автора опять же, можно определять только по совпадению имении и фамилии. - *
- * Важно: при удалении автора из массива размер массива должен уменьшиться! - * То есть, если мы сохранили 2 авторов и вызвали count() (метод ниже), то он должен вернуть 2. - * Если после этого мы удалили 1 автора, метод count() должен вернуть 1. - *
- * Если автор был найден и удален, метод должен вернуть true, в противном случае, если автор не был найден, метод - * должен вернуть false. - */ boolean remove(Author author); - - /** - * Метод возвращает количество сохраненных сущностей в массиве authors. - */ int count(); } + + diff --git a/src/main/java/com/epam/izh/rd/online/repository/BookRepository.java b/src/main/java/com/epam/izh/rd/online/repository/BookRepository.java index 7358e99b..27a2fe05 100644 --- a/src/main/java/com/epam/izh/rd/online/repository/BookRepository.java +++ b/src/main/java/com/epam/izh/rd/online/repository/BookRepository.java @@ -2,53 +2,11 @@ import com.epam.izh.rd.online.entity.Book; -/** - * Интерфейс репозитория для хранения данных о книгах - *
- * Необходимо:
- * 1) Создать в этом же пакете класс SimpleSchoolBookRepository
- * 2) Имплементировать им данный интерфейс (имплементировать "BookRepository
- * Одну и ту же книгу МОЖНО сохранить в массиве несколько раз, проверки на то, что такая книга уже сохранена, делать не нужно.
- *
- * Если сохранение прошло успешно, метод должен вернуть true.
- */
boolean save(T book);
-
- /**
- * Метод должен находить в массиве schoolBooks все книги по имени.
- *
- * Если книги найдены - метод должен их вернуть.
- * Если найденных по имени книг нет, должен вернуться пустой массив.
- */
T[] findByName(String name);
-
- /**
- * Метод должен удалять книги из массива schoolBooks по названию.
- * Если книг с одинаковым названием в массиве несколько, метод должен удалить их все.
- *
- * Важно: при удалении книги из массива размер массива должен уменьшиться!
- * То есть, если мы сохранили 2 разные книги и вызвали count() (метод ниже), то он должен вернуть 2.
- * Если после этого мы удалили 1 книгу, метод count() должен вернуть 1.
- *
- * Если хотя бы одна книга была найдена и удалена, метод должен вернуть true, в противном случае,
- * если книга не была найдена, метод должен вернуть false.
- */
boolean removeByName(String name);
-
- /**
- * Метод возвращает количество сохраненных сущностей в массиве schoolBooks.
- */
int count();
}
+
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..833dd9ce
--- /dev/null
+++ b/src/main/java/com/epam/izh/rd/online/repository/SimpleAuthorRepository.java
@@ -0,0 +1,75 @@
+package com.epam.izh.rd.online.repository;
+
+import com.epam.izh.rd.online.entity.Author;
+import org.apache.commons.lang3.ArrayUtils;
+
+import java.util.Arrays;
+
+public class SimpleAuthorRepository implements AuthorRepository {
+ private Author[] authors = new Author[] {};
+ private Author[] authorsCopy = new Author[] {};
+ int counter;
+ int removing = 0;
+
+
+ public SimpleAuthorRepository() {
+ }
+
+ @Override
+ public boolean save(Author author) {
+ if (count() == 0) {
+ authors = new Author[1];
+ authors[0] = author;
+ return true;
+ }
+ else {
+ if (findByFullName(author.getName(), author.getLastName()) == null) {
+ counter = count() + 1;
+ authorsCopy = authors;
+ authors = new Author[counter];
+ authors = Arrays.copyOf(authorsCopy,counter);
+ authors[counter - 1] = author;
+
+ return true;
+ }
+ else return false;
+ }
+ }
+
+ @Override
+ public Author findByFullName(String name, String lastname) {
+ for (int i = 0; i < counter; i++) {
+ if ((authors[i].getName().equals(name)) && (authors[i].getLastName().equals(lastname))) {
+ return authors[i];
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean remove(Author author) {
+ for (int i = 0; i < counter; i++) {
+ if (findByFullName(author.getName(), author.getLastName()) != null) {
+ authors = ArrayUtils.remove(authors, i);
+ removing++;
+ counter--;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int count() {
+ if (removing != 0) {
+ return counter;
+ }
+ if (authors.length == 0) {
+ counter = 0;
+ }
+ else {
+ counter = authors.length;
+ }
+ return counter;
+ }
+}
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..7de13ed4
--- /dev/null
+++ b/src/main/java/com/epam/izh/rd/online/repository/SimpleSchoolBookRepository.java
@@ -0,0 +1,83 @@
+package com.epam.izh.rd.online.repository;
+
+import com.epam.izh.rd.online.entity.SchoolBook;
+import org.apache.commons.lang3.ArrayUtils;
+
+import java.util.Arrays;
+
+public class SimpleSchoolBookRepository implements BookRepository
- * Необходимо:
- * 1) Создать в этом же пакете класс SimpleAuthorService
- * 2) Имплементировать им данный интерфейс
- * 3) Добавить все методы (пока можно не писать реализацию)
- * 4) Добавить в SimpleAuthorService приватное поле "AuthorRepository authorRepository" - это репозиторий к котормоу
- * вы будете обращаться в методах
- * 5) Создать дефолтный конструтор (без параметров)
- * 6) Создать конструтор с параметром AuthorRepository authorRepository (который будет устанвливать в поле authorRepository значение)
- * 7) Написать в классе SimpleAuthorService реализацию для всех методов
- */
public interface AuthorService {
- /**
- * Метод должен сохранять автора.
- * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат.
- */
boolean save(Author author);
-
- /**
- * Метод должен находить автора по имени и фамилии.
- * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат.
- */
Author findByFullName(String name, String lastname);
-
- /**
- * Метод должен удалять автора.
- * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат..
- */
boolean remove(Author author);
-
- /**
- * Метод считать количество сохраненных авторов на текущий момент.
- * По факту, он просто обращается к репозиторию с авторами и вызывает аналогичный метод, псоле чего возвращает результат.
- */
int count();
}
+
diff --git a/src/main/java/com/epam/izh/rd/online/service/BookService.java b/src/main/java/com/epam/izh/rd/online/service/BookService.java
index e221033b..4218cf28 100644
--- a/src/main/java/com/epam/izh/rd/online/service/BookService.java
+++ b/src/main/java/com/epam/izh/rd/online/service/BookService.java
@@ -3,71 +3,13 @@
import com.epam.izh.rd.online.entity.Author;
import com.epam.izh.rd.online.entity.Book;
-/**
- * Интерфейс сервиса для выполнения бизнес логики при работе с книга и авторами и взаимодействием с
- * репозиторием для книг BookRepository и сервисом для авторов AuthorService.
- *
- * Необходимо:
- * 1) Создать в этом же пакете класс SimpleSchoolBookService
- * 2) Имплементировать им данный интерфейс
- * 3) Добавить все методы (пока можно не писать реализацию)
- * 4) Добавить в SimpleSchoolBookService приватное поле "BookRepository
- * По факту, он просто обращается к репозиторию с книгами и вызывает аналогичный метод, псоле чего возвращает результат.
- */
T[] findByName(String name);
-
- /**
- * Метод должен находить количество сохраненных книг по конкретному имени книги.
- */
int getNumberOfBooksByName(String name);
-
- /**
- * Метод должен удалять все книги по имени.
- *
- * По факту, он просто обращается к репозиторию с книгами и вызывает аналогичный метод, псоле чего возвращает результат.
- */
boolean removeByName(String name);
-
- /**
- * Метод должен возвращать количество всех книг.
- *
- * По факту, он просто обращается к репозиторию с книгами и вызывает аналогичный метод, псоле чего возвращает результат.
- */
int count();
-
- /**
- * Метод должен возвращать автора книги по названию книги.
- *
- * То есть приждется сходить и в репозиторий с книгами и в сервис авторов.
- *
- * Если такой книги не найдено, метод должен вернуть null.
- */
Author findAuthorByBookName(String name);
}
+
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..5dca37df
--- /dev/null
+++ b/src/main/java/com/epam/izh/rd/online/service/SimpleAuthorService.java
@@ -0,0 +1,37 @@
+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 {
+ private AuthorRepository authorRepository;
+
+ public SimpleAuthorService() {
+ }
+
+ public SimpleAuthorService(AuthorRepository authorRepository) {
+ this.authorRepository = authorRepository;
+ }
+
+ @Override
+ public boolean save(Author author) {
+ boolean s = authorRepository.save(author);
+ return s;
+ }
+
+ @Override
+ public Author findByFullName(String name, String lastname) {
+ Author byFullName = authorRepository.findByFullName(name, lastname);
+ return byFullName;
+ }
+
+ @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..8fd4141e
--- /dev/null
+++ b/src/main/java/com/epam/izh/rd/online/service/SimpleSchoolBookService.java
@@ -0,0 +1,62 @@
+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