diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 188fae8..0000000 --- a/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.idea -out -*.iml -log - - - diff --git a/.idea/basejava.iml b/.idea/basejava.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/.idea/basejava.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..08b78fd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..611d3d7 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/qaplug_profiles.xml b/.idea/qaplug_profiles.xml new file mode 100644 index 0000000..1750b18 --- /dev/null +++ b/.idea/qaplug_profiles.xml @@ -0,0 +1,941 @@ + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 197623f..0000000 --- a/README.md +++ /dev/null @@ -1,208 +0,0 @@ -# Курс BaseJava (обновленный и переработанный) - -## Разработка Web приложения "База данных резюме" - - используем: Java 8, IntelliJ IDEA, - GitHib/Git, Сервлеты, JSP, JSTL, Tomcat, JUnit, PostgreSQL, GSON, JAXB - - хранение резюме - - в памяти на основе массива, отсортированного массива, списка и ассоциированного массива (Map) - - в файловой системе (File API и Java 7 NIO File API) - - в стандартной и кастомной сериализации Java - - в формате JSON (Google Gson) - - в формате XML (JAXB) - - в реляционной базе PostgreSQL - - деплой веб приложения - - в контейнер сервлетов Tomcat - - в облачный сервис Heroku - -Приложение будет разрабатываться начиная со первого занятия, основываясь на базовых темах курса: -**объектная модель, коллекции, система ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, SQL, персистентность в базу данных (PostgreSQL), сервлеты, HTML/JSP/JSTL, веб-контейнер Tomcat, модульные тесты JUnit, java.util.Logging, система контроля версий Git.** - -> Любое знание стоит воспринимать как подобие семантического дерева: убедитесь в том, что понимаете фундаментальные принципы, то есть ствол и крупные ветки, прежде чем лезть в мелкие листья-детали. Иначе последним не на чем будет держаться. - -[*— Илон Маск](https://ru.wikipedia.org/wiki/Маск,_Илон) - -# Изучайте [первое открытое занятие](lesson/lesson1.md). -### Внизу урока есть первое домашнее задание, по которому можно оценить свой уровень готовности к проекту. - -## Программа -### [Регистрация](http://javaops.ru/reg/basejava) -### Открытое занятие 1 - - Обзор курса и методики обучения - - Подготовка и настройка рабочего окружения - - Подходы, применяемые при разработке ПО - - Обзор инструментов и технологий, используемых Java-разработчиками - - Введение в язык Java: история создания, JVM, JIT-компиляция - - Системы управления версиями. Git - - Домашнее задание - -### Занятие 2 - - Введение в объектно-ориентированное программирование - - Принципы ООП - - Модификаторы доступа - - Классы-обертки - - Классы и объекты - - Структура памяти java-программы: Heap (куча), Stack (стек) - - Типы данных - - Пакетная организация файлов - - Домашнее задание - -### Занятие 3 - - Разбор домашнего задания - - Обзор суперкласса Object - - Связь между equals() и hashCode() - - Статические методы и переменные - - Программирование с помощью интерфейсов - - Абстрактные классы - - Сложность алгоритмов - - Паттерн проектирования Шаблонный метод - - Домашнее задание - -### Занятие 4 - - Разбор домашнего задания - - Работа со строками: String, StringBuilder, StringBuffer - - String literal pool - - Исключения (Exceptions) - - Конструктор - - Ключевые слова: this, super - - Reflection - - Аннотации в Java 8 - - Введение в модульное тестирование. JUnit - - Домашнее задание - -### Занятие 5 - - Разбор домашнего задания - - Иерархия классов Коллекций - - Списки (List) - - Множества (Set) - - Ассоциативные массивы (Map) - - Введение в Iterator - - Тестирование коллекций - - Домашнее задание - -### Занятие 6 - - Разбор домашнего задания - - Autoboxing and Unboxing - - Паттерн проектирования Итератор - - Вложенные классы - - Внутренние классы - - Локальные классы - - Анонимные классы - - Введение в лямбды - - Функциональный интерфейс - - Домашнее задание - -### Занятие 7 - - Разбор домашнего задания - - Дженерики (Generic) - - Введение в логирование. Log4J - - Стандартный логер - Java Logging API - - Паттерн проектирования - Синглтон - - Перечисляемые типы (Enum) - - Объектная модель - - Домашнее задание - -### Занятие 8 - - Разбор домашнего задания - - Классы работы с датами: Date, Calendar, TimeZone - - Дата и время в Java 8 - - Внешние библиотеки: Joda Time library - - Работа с файловой системой: класс File - - try-with-resources - - Домашнее задание - -### Занятие 9 - - Разбор домашнего задания - - Обзор пакета java.io - - Классы чтения/записи потоков: InputStream/OutputStream - - Паттерн проектирования Декоратор - - Работа с классами чтения/записи символов: Reader и Writer - - Сериализация - - Обзор пакета java.nio - - Введение в Java 8 Stream API - - Домашнее задание - -### Занятие 10 - - Разбор домашнего задания - - Паттерн проектирования Стратегия - - Работа с XML - - Работа с JSON: Google GSON и Jackson - - Введение в REST - - DataInputStream/DataOutputStream - - Домашнее задание - -### Занятие 11 - - Процессы и потоки - - Синхронизация методов и блоков - - Закон Мура - - Закон Амдала - - Обзор методов класса Object - - Ленивая инициализация - - Java Memory Model - - Взаимная блокировка - - Домашнее задание - -### Занятие 12 - - Разбор домашнего задания - - Обзор java.util.concurrent - - Синхронизаторы - - ThreadLocal переменные - - Сравнение с обменом (Compare-and-swap) - - Домашнее задание - -### Занятие 13 - - Разбор домашнего задания - - Введение в реляционные базы данных - - Язык SQL - - Обзор NoSQL баз данных - - Установка и настройка СУБД PostgreSQL - - Работа с базами данных из IDEA - - Конфигурирование базы данных и каталога хранения - - Подключение базы данных к проекту - - Обзор JDBC-архитектуры - - Домашнее задание - -### Занятие 14 - - Разбор домашнего задания - - Операции соединения таблиц. JOIN - - Транзакции - - Требования к транзакциям. ACID - - Уровни изоляции транзакций в SQL - - Установка и настройка контейнера сервлетов Tomcat - - Домашнее задание - -### Занятие 15 - - Разбор домашнего задания - - Введение в HTML - - Основы протокола HTTP - - Настройка web.xml - - Развертывание (деплой) web-приложения в Tomcat - - Сервлеты - - Домашнее задание - -### Занятие 16 - - Разбор домашнего задания - - Жизненный цикл сервлета - - Создание динамических страниц. JSP - - Расширенные возможности JSP: JSTL - - Redirect и Forward - - CRUD - - Домашнее задание - -### Занятие 17 - - Разбор домашнего задания - - Деплой приложения в облачный сервис Heroku - - Загрузка классов в Java. Classloader - - Домашнее задание - -## Рекомендуемые книги -- YAKOV FAIN: Программирование на Java для начинающих -- Книги по Java: от новичка до профессионала -- Джошуа Блох: Java. Эффективное программирование, 2-е издание -- Гамма, Хелм, Джонсон: Приемы объектно-ориентированного проектирования. Паттерны проектирования -- Редмонд Э.: Семь баз данных за семь недель. Введение в современные базы данных и идеологию NoSQL. - -## Ресуры в сети -- [Руководство по Java Core](http://proselyte.net/tutorials/java-core/) -- [Java. Базовый курс](https://stepik.org/course/Java-Базовый-курс-187) -- intuit: Программирование на Java -- Основы программирования на Java: учебное пособие diff --git a/lesson/lesson1.md b/lesson/lesson1.md deleted file mode 100644 index a1b848e..0000000 --- a/lesson/lesson1.md +++ /dev/null @@ -1,126 +0,0 @@ -# Первое занятие - -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Видеообзор проекта Basejava](https://www.youtube.com/watch?v=0ydTRfKS9yY) - -### Подготовка рабочего окружения -- Установите [JDK8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) (выбрать Accept License Agreement) -- Установите систему управления версиями [Git](http://git-scm.com/downloads) (опции по умолчанию) -- Создайте аккаунт на [GitHub](https://github.com/). Для удобной навигации по файлам на GitHub можно установить расширение для браузера [Octotree](https://habrahabr.ru/post/223527/) -- Установите [IntelliJ IDEA](http://www.jetbrains.com/idea/download/index.html). **Пока нет базы данных и веб, можно работать с версией Community**. На версию Ultimate дается 30 дней пробного бесплатного использования (trial). На проектах каждый участник проектов получает единоразовый личный купон на бесплатную версию Ultimate на 6 месяцев. - -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Разработка ПО](https://drive.google.com/open?id=0B_4NpoQW1xfpVjZUTEpvVUN1TTA) -- [Мифический человеко-месяц](https://ru.wikipedia.org/wiki/Мифический_человеко-месяц) (wiki) -- [Размеры проектов в количестве строк кода [eng]](https://medium.freecodecamp.com/the-biggest-codebases-in-history-a128bb3eea73) -- [Соглашения по оформлению кода [eng]](https://google.github.io/styleguide/javaguide.html) -- [Методологии разработки ПО](https://dou.ua/forums/topic/14015/) -- [Ещё раз про семь основных методологий разработки](https://habrahabr.ru/company/edison/blog/269789/) - -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Обзор инструментов и технологий](https://drive.google.com/file/d/0B_4NpoQW1xfpTXJYU2xZbjN2d2M) -- [Bash — шпаргалка для начинающих](https://tproger.ru/translations/bash-cheatsheet) -- **Обновление!!* - - [The State of Java in 2018](http://www.baeldung.com/java-in-2018) - - [Что и почему используют Java-разработчики: опрос RebelLabs](https://jug.ru/2017/12/rebellabs-report/) - - [Java Tools and Technologies Landscape Report 2016](https://zeroturnaround.com/rebellabs/java-tools-and-technologies-landscape-2016/) - - [Java Tools and Technologies Landscape for 2014](http://zeroturnaround.com/rebellabs/java-tools-and-technologies-landscape-for-2014) -- **Дополнительно:** - - [Типичный тест SQL на собеседованиях](https://habrahabr.ru/post/181033/) - -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Обзор языка Java](https://drive.google.com/open?id=0B_4NpoQW1xfpTU5SSElhUjlGNnc) -- [Java](http://ru.wikipedia.org/wiki/Java), [JVM](http://ru.wikipedia.org/wiki/Виртуальная_машина_Java), [JIT-компиляция](http://ru.wikipedia.org/wiki/JIT) (wiki) -- [Что такое JDK? Введение в средства разработки Java](https://topjava.ru/blog/what-is-the-jdk) -- [Что такое JRE? Введение в среду выполнения Java](https://topjava.ru/blog/what-is-the-jre) -- [Что такое Java? История создания](http://www.intuit.ru/studies/courses/16/16/lecture/27105) -- [Programming languages TIOBE Index](http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html) - -![jvm](https://cloud.githubusercontent.com/assets/18701152/15219296/e6c67e86-186b-11e6-986f-651a87deec6c.png) - -- [ME](http://ru.wikipedia.org/wiki/Java_Platform,_Micro_Edition), [SE](https://ru.wikipedia.org/wiki/Java_Platform,_Standard_Edition), [EE](http://ru.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition) (wiki) -- [Java Microbenchmark JMH](http://openjdk.java.net/projects/code-tools/jmh/) (используем на курсе [MasterJava](https://github.com/JavaWebinar/masterjava#Занятие-2)) -- [Oracle Java8 Home](http://docs.oracle.com/javase/8/docs/index.html) -- **Дополнительно:** - - [Java version and vendor data analyzed 2017](https://plumbr.io/blog/java/java-version-and-vendor-data-analyzed-2017-edition) - - [Most popular Java application servers: 2017 edition](https://plumbr.io/blog/java/most-popular-java-application-servers-2017-edition) - - [Понимаем основы Java garbage collection](https://ggenikus.github.io/blog/2014/05/04/gc) - -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Системы управления версиями. Git](https://drive.google.com/file/d/0B9Ye2auQ_NsFSUNrdVc0bDZuX2s) - -![image](https://cloud.githubusercontent.com/assets/18701152/15219746/9295a2fe-186d-11e6-876b-c61cc9be71e4.png) - - - [Система управления версиями](https://ru.wikipedia.org/wiki/Система_управления_версиями) (wiki) - - [Сравнение разных VCS](https://biz30.timedoctor.com/ru/cистема-контроля-версий/) - - [Git обучалка](https://githowto.com/ru) - - [Интерактивная Git обучалка (в настройках выберите русский язык)](http://learngitbranching.js.org) - - [Официальная книга про Git](https://git-scm.com/book/ru/v2) - - [Working with remote repositories](https://illustrated-git.readthedocs.org/en/latest/#working-with-remote-repositories) - - [Базовый курс по обучению Git](https://www.youtube.com/playlist?list=PLIU76b8Cjem5B3sufBJ_KFTpKkMEvaTQR) (youtube) - - [Git. Быстрый старт](https://www.youtube.com/watch?v=4-NX17Ip-xQ&list=PLmRNNqEA7JoM77hOJkPrLOfJQGizCLR3P) (youtube) - - [Подробное введение в работу с Git](https://tproger.ru/translations/beginner-git-cheatsheet/) - -### Настройка проекта -- Создайте на GitHub репозиторий с названием `basejava` -- Откройте консоль (терминал) у себя на компьютере -- Наберите и запустите: `git` (по умолчанию при установке git заносится в PATH. Если он не находится, [занесите](https://www.java.com/ru/download/help/path.xml) git в переменную окружения PATH и перезапустите консоль) -- Создайте локальную копию проекта: `git clone https://github.com/JavaOps/basejava.git` -- Перейдите в каталог проекта: `cd basejava` -- Настройте git в локальном проекте на свой проект в GitHub: - - `git remote -v` - - `git remote set-url origin url_на_твой_basejava-репозиторий.git` - настройка pull - - `git remote set-url --push origin url_на_твой_basejava-репозиторий.git` - настройка push - - `git push -u origin master` - -## Домашнее задание HW1 -- Создайте в IntelliJ IDEA новый проект, выбрав каталог `basejava`, который вы клонировали ранее к себе на компьютер: - -![newproject](https://user-images.githubusercontent.com/29703461/38273513-d1f7ce52-3794-11e8-829c-305212c25be7.png) - -![next](https://user-images.githubusercontent.com/29703461/38273546-e712a6fe-3794-11e8-9850-29287b46a8a0.png) - -![next1](https://user-images.githubusercontent.com/29703461/38273584-00e07dc2-3795-11e8-9006-3109f949cf33.png) - -![finish](https://user-images.githubusercontent.com/29703461/38275669-3e621614-379b-11e8-8b3a-8e0a3ad4c65c.png) - -- Реализуйте класс `ArrayStorage`, организовав хранение резюме на основе массива с методами `save, get, delete, size, clear, getAll` -- Храните все резюме в начале `storage` (без дырок в виде `null`), чтобы не перебирать каждый раз все 10000 элементов -``` -Схема хранения резюме в массиве storage (в элементах от 0 до size-1 отсутствуют null): - -r1, r2, r3,..., rn, null, null,..., null -<----- size -----> -<------- storage.length (10000) -------> -``` -- Протестируйте вашу реализацию с помощью классов `MainArray.main()` и `MainTestArrayStorage.main()` -- Изучите дополнительные материалы по IntelliJ IDEA: - - [Idea Wiki](https://github.com/JavaOPs/topjava/wiki/IDEA) ([поставьте кодировку UTF-8](https://github.com/JavaOPs/topjava/wiki/IDEA#Поставить-кодировку-utf-8), [поменяйте шрифт по умолчанию на DejaVu](https://github.com/JavaOPs/topjava/wiki/IDEA#Поменять-фонт-по-умолчанию-dejavu)) - - [Руководство пользователя IntelliJ IDEA. Отладчик](http://info.javarush.ru/idea_help/2014/01/22/Руководство-пользователя-IntelliJ-IDEA-Отладчик-.html) - - [Эффективная работа с кодом в IntelliJ IDEA](https://www.youtube.com/watch?v=tpv5n2jWHlw) (youtube) - - [Эффективная работа в IDEA](https://www.youtube.com/watch?v=_rj7dx6c5R8) (youtube) - -### Вопросы по HW1 - > Не могу запустить программу, да и рядом с классами появился какой-то значок - ![badsrc](https://user-images.githubusercontent.com/29703461/38277015-9cd9155e-379f-11e8-9cd4-a9182a005e9a.png) - - Проблема в том, что IDEA неправильно "воспринимает" папку `src`. Для ее решения необходимо нажать `ПКМ на папке src -> выбрать Mark Directory as -> Sources Root` - - > Что такое `null`? - -[Что такое null в Java?](http://qaru.site/questions/1960/what-is-null-in-java) (оригинал: [What is null in Java? -](https://stackoverflow.com/questions/2707322/what-is-null-in-java)) - -### Замечания по выполнению HW1 -1. Все резюме в хранилище имеют уникальный `uuid`, что исключает повторы. Cортировка по `uuid` не требуется -2. Давайте осмысленные комментарии коммитам -3. Перед каждым коммитом не забывайте пользоваться сочетанием клавиш `Ctrl + Alt + L` (автоматическое форматирование кода) -4. Не злоупотребляйте пустыми строками. Они используются нечасто для логического отделения больших кусков кода. -5. Удаляйте неиспользуемые импорты (`Ctrl + Alt + O`) -5. Не игнорируй подсказки IDEA (подсвечивает) -6. `Resume r` — давай переменным осмысленные имена, например `resume`. `r` допустимо в коротких циклах и лямбдах. -7. В методе `clear()` обнуление массива предполагает именно обнуление (null), а не создание нового - -# Дополнительно (как учиться программированию) -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. [Вебинар "Быть программистом: от детства к зрелости"](https://www.youtube.com/watch?v=D5Hej0TyLaU) - - [Слайды вебинара](https://docs.google.com/presentation/d/1YwtCCZsaGMdl-V15kTDHiJxiS52IAl-qqheNPpiNr54/) -## Советы по обучению - - Учись грамотно формулировать проблему. Проблема "у меня не работает" может иметь тысячи причин. В процессе формулирования очень часто приходит ее решение. - - Учись инвестигировать проблему. Внимательное чтение логов и умение дебажить - основные навыки разработчика. В логах надо читать верх самого нижнего эксепшена - там причина всей портянки. - - Грамотно уделяй время каждой проблеме. Две крайности - сразу бросаться за помощью и бится нам ней часами. Пробуй решить ее сам и в зависимости от проблемы выделяй на это разумное время. - - Получай в процессе решения обратную связь - в том ли направлении ты идешь. - - [Советы новичкам](http://blog.csssr.ru/2016/09/19/how-to-be-a-beginner-developer) diff --git a/src/ArrayStorage.java b/src/ArrayStorage.java deleted file mode 100644 index cefa261..0000000 --- a/src/ArrayStorage.java +++ /dev/null @@ -1,85 +0,0 @@ -import java.util.Arrays; -import java.util.Objects; - -/** - * Array based storage for Resumes - */ -public class ArrayStorage { - private Resume[] storage = new Resume[10_000]; - - private int size; - - public void clear() { - Arrays.fill(storage, 0, size, null); - size = 0; - } - - public void update(Resume resume) { - int index = getIndex(resume.getUuid()); - - if (index >= 0) { - storage[index] = resume; - } else { - System.out.println("ERROR in method 'update' :" + resume.getUuid()); - } - } - - public void save(Resume resume) { - int index = getIndex(resume.getUuid()); - - if (index >= 0) { - System.out.println("ERROR in method 'save' :" + resume.getUuid()); - } else { - if (size < storage.length) { - storage[size] = resume; - size++; - } else { - System.out.println("ERROR in method 'save' :" + resume.getUuid() + " (storage backing array boundary has been reached)"); - } - } - } - - public Resume get(String uuid) { - int index = getIndex(uuid); - - if (index >= 0) { - return storage[index]; - } else { - System.out.println("Invalid uuid in method 'get': " + uuid); - return null; - } - } - - - public void delete(String uuid) { - int index = getIndex(uuid); - - if (index >= 0) { - storage[index] = storage[size - 1]; - storage[size - 1] = null; - size--; - } else { - System.out.println("Invalid uuid in method 'delete': " + uuid); - } - } - - /** - * @return array, contains only Resumes in storage (without null) - */ - public Resume[] getAll() { - return Arrays.copyOf(storage, size); - } - - public int size() { - return size; - } - - private int getIndex(String uuid) { - for (int i = 0; i < size; i++) { - if (Objects.equals(storage[i].getUuid(), uuid)) { - return i; - } - } - return -1; - } -} diff --git a/src/Resume.java b/src/Resume.java deleted file mode 100644 index ef673e6..0000000 --- a/src/Resume.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Initial resume class - */ -public class Resume { - - // Unique identifier - private String uuid; - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - @Override - public String toString() { - return uuid; - } -} diff --git a/src/MainArray.java b/src/ru/javawebinar/basejava/MainArray.java similarity index 80% rename from src/MainArray.java rename to src/ru/javawebinar/basejava/MainArray.java index cc060cf..9fb74ec 100644 --- a/src/MainArray.java +++ b/src/ru/javawebinar/basejava/MainArray.java @@ -1,19 +1,24 @@ +package ru.javawebinar.basejava; + +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.Storage; +import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** - * Interactive test for ArrayStorage implementation - * (just run, no need to understand) + * Test for ru.javawebinar.basejava.storage.impl.ArrayStorage */ public class MainArray { - private final static ArrayStorage ARRAY_STORAGE = new ArrayStorage(); + private final static Storage ARRAY_STORAGE = new SortedArrayStorage(); public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); Resume r; while (true) { - System.out.print("Введите одну из команд - (list | save uuid | update uuid | delete uuid | get uuid | clear | exit): "); + System.out.print("Введите одну из команд - (list | save uuid | delete uuid | get uuid | update uuid | clear | exit): "); String[] params = reader.readLine().trim().toLowerCase().split(" "); if (params.length < 1 || params.length > 2) { System.out.println("Неверная команда."); @@ -37,9 +42,10 @@ public static void main(String[] args) throws IOException { printAll(); break; case "update": - Resume rNew = new Resume(); - rNew.setUuid(uuid); - ARRAY_STORAGE.update(rNew); + r = new Resume(); + r.setUuid(uuid); + ARRAY_STORAGE.update(r); + printAll(); break; case "delete": ARRAY_STORAGE.delete(uuid); diff --git a/src/MainTestArrayStorage.java b/src/ru/javawebinar/basejava/MainTestArrayStorage.java similarity index 53% rename from src/MainTestArrayStorage.java rename to src/ru/javawebinar/basejava/MainTestArrayStorage.java index 7683807..7e76081 100644 --- a/src/MainTestArrayStorage.java +++ b/src/ru/javawebinar/basejava/MainTestArrayStorage.java @@ -1,9 +1,19 @@ +package ru.javawebinar.basejava; + +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.Storage; +import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; + +/** + * Test ru.javawebinar.basejava.storage.impl.ArrayStorage + */ + /** * Test for your ArrayStorage implementation */ public class MainTestArrayStorage { - static final ArrayStorage ARRAY_STORAGE = new ArrayStorage(); - static int ARRAY_STORAGE_LIMIT = 10_000; + static final Storage ARRAY_STORAGE = new SortedArrayStorage(); + static int ARRAY_STORAGE_LIMIT = 3; //10_000; public static void main(String[] args) { Resume r1 = new Resume(); @@ -12,6 +22,8 @@ public static void main(String[] args) { r2.setUuid("uuid2"); Resume r3 = new Resume(); r3.setUuid("uuid3"); + + Resume r2new = new Resume(); r2new.setUuid("uuid2"); @@ -28,6 +40,9 @@ public static void main(String[] args) { ARRAY_STORAGE.update(r2new); System.out.println("Get r2new: " + ARRAY_STORAGE.get(r2new.getUuid())); + printAll(); + + ARRAY_STORAGE.delete("uuid3"); ARRAY_STORAGE.get("uuid111"); ARRAY_STORAGE.delete("uuid111"); @@ -40,13 +55,25 @@ public static void main(String[] args) { System.out.println("Size: " + ARRAY_STORAGE.size()); - for (int i = 0; i <= ARRAY_STORAGE_LIMIT; i++) { - Resume r = new Resume(); - r.setUuid("uuid" + i); - ARRAY_STORAGE.save(r); - } +// try { +// for (int i = 0; i <= ARRAY_STORAGE_LIMIT - 1; i++) { +// Resume r = new Resume(); +// r.setUuid("uuid" + i); +// ARRAY_STORAGE.save(r); +// } +// } catch (NullPointerException ex) { +// System.out.println("<--NPE at size: " + ARRAY_STORAGE.size()); +// } +// +// Resume r = new Resume(); +// try { +// r.setUuid("uuid" + ARRAY_STORAGE_LIMIT); +// } catch (IllegalStateException ex) { +// System.out.println(ex.getMessage()); +// } - System.out.println("Size: " + ARRAY_STORAGE.size()); + // почему не печатает для ArrayStorage??? +// System.out.println("Size: " + ARRAY_STORAGE.size()); } static void printAll() { @@ -55,4 +82,4 @@ static void printAll() { System.out.println(r); } } -} +} \ No newline at end of file diff --git a/src/ru/javawebinar/basejava/model/Resume.java b/src/ru/javawebinar/basejava/model/Resume.java new file mode 100644 index 0000000..e78c859 --- /dev/null +++ b/src/ru/javawebinar/basejava/model/Resume.java @@ -0,0 +1,43 @@ +package ru.javawebinar.basejava.model; + +/** + * ru.javawebinar.basejava.model.Resume class + */ +public class Resume implements Comparable{ + + // Unique identifier + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Resume resume = (Resume) o; + + return uuid.equals(resume.uuid); + } + + @Override + public int hashCode() { + return uuid.hashCode(); + } + + @Override + public String toString() { + return uuid; + } + + @Override + public int compareTo(Resume o) { + return uuid.compareTo(o.uuid); + } +} \ No newline at end of file diff --git a/src/ru/javawebinar/basejava/storage/AbstractArrayStorage.java b/src/ru/javawebinar/basejava/storage/AbstractArrayStorage.java new file mode 100644 index 0000000..fd67211 --- /dev/null +++ b/src/ru/javawebinar/basejava/storage/AbstractArrayStorage.java @@ -0,0 +1,78 @@ +package ru.javawebinar.basejava.storage; + +import ru.javawebinar.basejava.model.Resume; + +import java.util.Arrays; + +/** + * Array based storage for Resumes + */ +public abstract class AbstractArrayStorage implements Storage { + protected static final int STORAGE_LIMIT = 10_000; + + protected final Resume[] storage = new Resume[STORAGE_LIMIT]; + protected int size = 0; + + public int size() { + return size; + } + + public void clear() { + Arrays.fill(storage, 0, size, null); + size = 0; + } + + public Resume[] getAll() { + return Arrays.copyOfRange(storage, 0, size); + } + + public void save(Resume resume) { + int index = getIndex(resume.getUuid()); + if (index < 0) { + if (size >= STORAGE_LIMIT) { + System.out.println("Storage overflow at :" + size); + } else { + doSave(resume, index); + size++; + } + } else { + System.out.println("Resume already exists with id :" + resume.getUuid()); + } + } + + public Resume get(String uuid) { + int index = getIndex(uuid); + if (index < 0) { + System.out.println("No such Resume with id : " + uuid); + return null; + } else { + return storage[index]; + } + } + + public void update(Resume resume) { + int index = getIndex(resume.getUuid()); + if (index < 0) { + System.out.println("No such Resume with id : " + resume.getUuid()); + } else { + storage[index] = resume; + } + } + + public void delete(String uuid) { + int index = getIndex(uuid); + if (index < 0) { + System.out.println("No such Resume with id : " + uuid); + } else { + doDelete(index); + storage[size-1]=null; + size--; + } + } + + protected abstract void doSave(Resume resume, int index); + + protected abstract void doDelete(int index); + + protected abstract int getIndex(String uuid); +} \ No newline at end of file diff --git a/src/ru/javawebinar/basejava/storage/Storage.java b/src/ru/javawebinar/basejava/storage/Storage.java new file mode 100644 index 0000000..2f7a1d9 --- /dev/null +++ b/src/ru/javawebinar/basejava/storage/Storage.java @@ -0,0 +1,20 @@ +package ru.javawebinar.basejava.storage; + +import ru.javawebinar.basejava.model.Resume; + +public interface Storage { + + void clear(); + + void update(Resume r); + + void save(Resume r); + + Resume get(String uuid); + + void delete(String uuid); + + Resume[] getAll(); + + int size(); +} \ No newline at end of file diff --git a/src/ru/javawebinar/basejava/storage/impl/ArrayStorage.java b/src/ru/javawebinar/basejava/storage/impl/ArrayStorage.java new file mode 100644 index 0000000..ed9014b --- /dev/null +++ b/src/ru/javawebinar/basejava/storage/impl/ArrayStorage.java @@ -0,0 +1,29 @@ +package ru.javawebinar.basejava.storage.impl; + +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.AbstractArrayStorage; + +/** + * Array based storage for Resumes + */ +public class ArrayStorage extends AbstractArrayStorage { + @Override + protected void doSave(Resume resume, int index) { + storage[size] = resume; + } + + @Override + protected void doDelete(int index) { + storage[index] = storage[size - 1]; + } + + @Override + protected int getIndex(String uuid) { + for (int i = 0; i < size; i++) { + if (uuid.equals(storage[i].getUuid())) { + return i; + } + } + return -1; + } +} \ No newline at end of file diff --git a/src/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java b/src/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java new file mode 100644 index 0000000..77e738d --- /dev/null +++ b/src/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java @@ -0,0 +1,28 @@ +package ru.javawebinar.basejava.storage.impl; + +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.AbstractArrayStorage; + +import java.util.Arrays; + +public class SortedArrayStorage extends AbstractArrayStorage { + + @Override + protected void doSave(Resume resume, int found) { + int index = -found - 1; + System.arraycopy(storage, index, storage, index + 1, size - index); + storage[index] = resume; + } + + @Override + protected void doDelete(int index) { + System.arraycopy(storage, index + 1, storage, index, size - index - 1); + } + + @Override + protected int getIndex(String uuid) { + Resume resume = new Resume(); + resume.setUuid(uuid); + return Arrays.binarySearch(storage, 0, size, resume); + } +} \ No newline at end of file