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 @@
-# Первое занятие
-
-##  [Видеообзор проекта 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 месяцев.
-
-##  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/)
-
-##  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/)
-
-##  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)
-
-
-
-- [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)
-
-##  4. [Системы управления версиями. Git](https://drive.google.com/file/d/0B9Ye2auQ_NsFSUNrdVc0bDZuX2s)
-
-
-
- - [Система управления версиями](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`, который вы клонировали ранее к себе на компьютер:
-
-
-
-
-
-
-
-
-
-- Реализуйте класс `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
- > Не могу запустить программу, да и рядом с классами появился какой-то значок
- 
- - Проблема в том, что 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), а не создание нового
-
-# Дополнительно (как учиться программированию)
-##  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