diff --git a/README.md b/README.md
new file mode 100644
index 000000000000..a33a78e3956d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,125 @@
+Java Enterprise Online Project
+===============================
+Наиболее востребованные технологии /инструменты / фреймворки Java Enterprise:
+Maven/ Spring/ Security/ JPA(Hibernate)/ REST(Jackson)/ Bootstrap(CSS)/ jQuery + plugins.
+
+ Когда вы слышите что-то, вы забываете это.
+ Когда вы видите что-то, вы запоминаете это.
+ Но только когда вы начинаете делать это,
+ вы начинаете понимать это
+
+ Старинная китайская поговорка
+
+## Описание и план проекта
+### Демо разрабатываемого приложения
+### Требования к участникам, Wiki
+### Составление резюме, подготовка к интервью, поиск работы
+
+Вводное занятие
+===============
+##  Системы управления версиями. Git.
+- **Wiki по ведению проекта в Git**
+- Система управления версиями. VCS/DVSC.
+- Ресурсы:
+ - Интерактивная Git обучалка
+ - Книга Git
+ - Working with remote repositories
+ - Видео по обучению Git
+ - Git Overview
+ - Видеокурс по Git
+
+##  Работа с проектом (выполнять инструкции)
+- **Prepare_ to_ HW0.patch (скачать и положить в каталог вашего проекта)**
+- Доступно о Java 8 Lambda
+
+## Инструкция по шагам (из видео):
+- Установить ПО (git, JDK8, IntelliJ IDEA, Maven)
+- Создать аккаунт на GitHub
+- Сделать Fork ЭТОГО проекта (https://github.com/JavaOPs/topjava)
+- Сделать локальный репозиторий проекта:
+
git clone https://github.com/[Ваш аккаунт]/topjava.git
+- Открыть и настроить проект в IDEA
+ - Выставить кодировку UTF-8 в консоли
+ - Поставить кодировку UTF-8
+ - Поменять фонт по умолчанию (DejaVu)
+- По ходу видео сделать Apply Patch... скаченного патча Prepare_ to_ HW0.patch
+- Закоммитить и запушить изменения (commit + push)
+- Сделать ветку домашнего задания
+- Выполнить задание и залить на GitHub (commit + push)
+- Переключиться в основную ветку проекта master.
+
+##  Домашнее задание HW0
+
+- Java 8 Date and Time API
+- Алгоритмы и структуры данных для начинающих: сложность алгоритмов
+- Time complexity
+- Временная сложность алгоритма
+- Вычислительная сложность
+```
+Реализовать метод UserMealsUtil.getFilteredWithExceeded:
+- должны возвращаться только записи между startTime и endTime
+- поле UserMealWithExceed.exceed должно показывать,
+ превышает ли сумма калорий за весь день параметра метода caloriesPerDay
+
+Т.е UserMealWithExceed - это запись одной еды, но поле exceeded будет одинаково для всех записей за этот день.
+
+- Проверте результат выполнения ДЗ (можно проверить логику в http://topjava.herokuapp.com , список еды)
+- Оцените Time complexity вашего алгоритма, если он O(N*N)- попробуйте сделать O(N).
+```
+Optional
+
+- Java 8: Lambda выражения
+- Java 8: Потоки
+- Pуководство по Java 8 Stream
+- Лямбда-выражения в Java 8
+- A Guide to Java 8
+- Шпаргалка Java Stream API
+- Алексея Владыкин: Элементы функционального программирования в Java
+- stream.map vs forEach
+
+```
+Сделать реализация через Java 8 Stream API. Заменяйте forEach оператором stream.map(..)
+```
+### Ресурсы для подготовки к проекту
+> ВНИМАНИЕ: основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия!
+
+Все остальное - опционально.
+
+#### HTML, JavaScript, CSS
+- Введение в программирование на JavaScript
+- Основы работы с HTML/CSS/JavaScript
+- JavaScript - Основы
+- Bootstrap 3 - Основы
+- jQuery для начинающих
+
+#### Java (базовые вещи)
+- Интуит. Программирование на Java
+- Основы Java garbage collection
+- Размер Java объектов
+- Блог о памяти, сборщике мусора, многопоточности и производительности в JAVA
+- Введение в Java Reflection API
+- Структуры данных в картинках
+- Обзор java.util.concurrent.*
+- Синхронизация потоков
+- String literal pool
+- Маленькие хитрости Java
+- Как создать Servlet? Полное руководство.
+- A Guide to Java 8
+- Java JUnit
+
+#### JDBC, SQL
+- Уроки по JDBC
+- Learn SQL
+- Try SQL
+
+#### Разное
+- Эффективная работа с кодом в IntelliJ IDEA
+- Quizful- тесты онлайн
+
+#### Книги
+- Джошуа Блох: Java. Эффективное программирование. Второе издание
+- Гамма, Хелм, Джонсон: Приемы объектно-ориентированного проектирования. Паттерны проектирования
+- Редмонд Э.: Семь баз данных за семь недель. Введение в современные базы данных и идеологию NoSQL
+- Brian Goetz: Java Concurrency in Practice
+- G.L. McDowell: Cracking the Coding Interview
diff --git a/config/setenv.bat b/config/setenv.bat
new file mode 100644
index 000000000000..d2ccfc564905
--- /dev/null
+++ b/config/setenv.bat
@@ -0,0 +1,4 @@
+rem run tomcat with JMX ability
+rem Run Tomcat as admin
+rem for remote connection add -Djava.rmi.server.hostname=TomcatServer_IP
+set CATALINA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
diff --git a/cv.md b/cv.md
new file mode 100644
index 000000000000..c7236867c665
--- /dev/null
+++ b/cv.md
@@ -0,0 +1,68 @@
+## Составление резюме, подготовка к интервью, поиск работы
+
+
+
+- Научиться программировать сложнее, чем кажется
+
+### Составление резюме:
+- ОФОРМЛЕНИЕ IT-РЕЗЮМЕ для USA
+- Идеальное резюме Junior’а
+- Как продать свое резюме в 2 раза дороже
+- Как правильно составить резюме
+- Резюме программистов. Часть 1 (плохие)
+- Резюме программистов. Часть 2 (хорошие)
+- Как составить резюме на английском
+
+### Наши истории (делимся опытом и успехом)
+
+### Тесты онлайн:
+- Codility lesson tests
+- Quizful- тесты онлайн
+
+### Интервью:
+- Михаил Портнов. Собеседование на работу: как продать себя грамотно
+- Михаил Портнов. Какие вопросы мы задаем на собеседовании?
+- Канал: Резюме, поиск работы, интервью
+- Яков Файн: Как стать профессиональным Java разработчиком
+- Список вопросов с ответами для собеседования по Java
+- Сборка по вопросам на интервью
+- Сборка вопросов-ответов от JavaStudy
+- Тест на знание SQL
+- Вопросы на собеседовании Java Junior Developer
+- Java вопросы с собеседований на Android
+- Сборка вопросов от JavaRush
+> про clone и finalize объязательно прочтите Джошуа Блох: Java. Эффективное программирование (второе издание)
+
+- Cracking the Coding Interview
+> Особенно обратите внимание на раздел: Часть VIII. Вопросы собеседования
+
+
+### От себя:
+- email, skype - очень желательно, чтобы по ним вы были узнаваемы. Заведите рабочие, если не так.
+- написать ВЕСЬ IT опыт (исключая опыт пользователя: Windows, MS Word, Photophop, Yandex disk, Google docs, ..): технологии, какие задачи решали (конкретные), какие инструменты использовали, VCS, DB, инструменты сборки, ... включая опыт в ВУЗе.
+- на English иметь желательно. Если вакансия опублинована на Englsih - шлите на нем. Часто могут на нем попросить, если работодатель иностранный.
+- удобно иметь резюме где то в инете (hh, linkedin, google doc, чтобы им было удобно делиться).
+
+### Позиционирование проекта Topjava:
+- После завершения проекта вы освоите все заявленные в нем технологии - вставьте в квалификацию (включая java 8 Stream and Time API)
+- Делайте упор не на обучение, а на *участие в проекте*. Выполнение домашних заданий - это полноценное участие с написанием функционала по всем этим технологиям. Например:
+
+ Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей
+ на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API:
+ - реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA
+ - реализация и тестирование REST и AJAX контроллеров
+ - реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
+ - отлично будет, если вы его еще как то сами доработаете
+
+- По поводу обучения на курсах- можно упомянуть в разделе образования. Но на собеседовании меньше смотрят на то, что вы заканчивали, больше - на ваш опыт и то что вы знаете.
+- Ссылку на организацию можно поставить: http://javaops.ru (или в linkedin: https://www.linkedin.com/company/java-online-projects)
+
+### В течении проекта заполните форму соискателя "Разработчик Java"
+Я ее рассылаю всем знакомым HR, уже есть пинги и трудоустройство.
+
+Ближе к концу курса я вышлю приглашение в нашу общую группу slack: общение на все темы IT, обсуждение вступительных заданий, вакансии, цены на рынке труда, события, помощь, интересные видео по теме и пр.
+
+### Основные сайты поиска работы:
+- HH
+- LinkedIn
+- djinni.co (более актуально для Украины)
diff --git a/description.md b/description.md
new file mode 100644
index 000000000000..cbb102fa72aa
--- /dev/null
+++ b/description.md
@@ -0,0 +1,67 @@
+#### Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
+- Основное внимание будет уделяться способам решения многочисленных проблем разработки в Spring/JPA, а также структурному (красивому и надежному) java кодированию и архитектуре приложения.
+- Каждая итерация проекта в закрепляется домашним заданием по реализации схожей функциональности. Следующее занятие начинается с разбора домашних заданий.
+- Большое внимание уделяется тестированию кода: в проекте 88 JUnit тестов.
+- Несмотря на относительно небольшой размер, приложение разрабатывается с нуля как большой проект (например мы используем кэш 2-го уровня Hibernate, настраиваем Jenkins для работы с ленивой загрузкой
+Hibernate, делаем конверторы для типов LocalDateTime (Java 8 time API), которые еще не поддерживаются ни JPA/Hibernate, ни Jackson/json).
+ Разбираются архитектурные паттерны: слои приложения и как правильно разбивать логику по слоям, когда нужно применять Data Transfer Object.
+ Т.е на выходе получается не учебный проект, а хорошо маштабируемый шаблон для большого проекта на всех пройденных технологиях.
+- Большое внимание уделяется деталям: популяция базы, использование транзакционности, тесты сервисов и REST
+ контроллеров, насторойка EntityManagerFactory,
+ выбор реализации пула коннектов. Особое внимание уделяется работе с базой: через Spring JDBC, Spring ORM и
+ Spring Data Jpa.
+- Используются самые востребованные на сегодняшний момент фреймворки: Maven, Spring Security 4
+ вместе с Spring Security Test, наиболее удобный для работы с базой проект Spring Data Jpa, библиотека логирования logback, реализующая SLF4J, повсеместно используемый Bootstrap и jQuery.
+
+#### Демо разрабатываемого приложения
+
+## План проекта (ссылки на некоторые темы открыты для просмотра)
+### Архитектура проекта. Персистентность.
+- Системы управления версиями
+- Java 8: Lambda, Stream API
+- Обзор используемых в проекте технологий и инструментов.
+- Инструмент сборки Maven.
+- WAR. Веб-контейнер Tomcat. Сервлеты.
+- Логирование.
+- Обзор стандартных библиотек. Apache Commons, Guava
+- Слои приложения. Создание каркаса приложения.
+- Обзор Spring Framework. Spring Context.
+- Тестирование через JUnit.
+- Spring Test
+- Базы данных. PostgreSQL. Обзор NoSQL и Java persistence solution без ORM.
+- Настройка Database в IDEA.
+- Скрипты инициализации базы. Spring Jdbc Template.
+- Spring: инициализация и популирование DB
+- ORM. Hibernate. JPA.
+- Поддержка HSQLDB
+- Транзакции
+- Профили Maven и Spring
+- Пул коннектов
+- Spring Data JPA
+- Кэш Hibernate
+
+### Разработка WEB
+- Spring кэш
+- Spring Web
+- JSP, JSTL, i18n
+- Tomcat maven plugin. JNDI
+- Spring Web MVC
+- Spring Internationalization
+- Тестирование Spring MVC
+- REST контроллеры
+- Тестирование REST контроллеров. Jackson.
+- jackson-datatype-hibernate. Тестирование через матчеры.
+- Тестирование через SoapUi. UTF-8
+- WebJars.
+- Bootstrap. Datatables.
+- AJAX. jQuery. Notifications.
+- Spring Security
+- Spring Binding/Validation
+- Работа с Datatables через Ajax.
+- Spring Security Test
+- Encoding password
+- CSRF (добавление в проект защиты от межсайтовой подделки запроса)
+- form-login. Spring Security Taglib
+- Handler interceptor
+- Spring Exception Handling
+- Деплой в Heroku
diff --git a/patchs/0_Prepare_to_HW0.patch b/patchs/0_Prepare_to_HW0.patch
new file mode 100644
index 000000000000..0801bfb789c4
--- /dev/null
+++ b/patchs/0_Prepare_to_HW0.patch
@@ -0,0 +1,137 @@
+Index: src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java (revision )
++++ src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java (revision )
+@@ -0,0 +1,35 @@
++package ru.javawebinar.topjava.util;
++
++import ru.javawebinar.topjava.model.UserMeal;
++import ru.javawebinar.topjava.model.UserMealWithExceed;
++
++import java.time.LocalDateTime;
++import java.time.LocalTime;
++import java.time.Month;
++import java.util.Arrays;
++import java.util.List;
++
++/**
++ * GKislin
++ * 31.05.2015.
++ */
++public class UserMealsUtil {
++ public static void main(String[] args) {
++ List mealList = Arrays.asList(
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 30,10,0), "Завтрак", 500),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 30,13,0), "Обед", 1000),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 30,20,0), "Ужин", 500),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 31,10,0), "Завтрак", 1000),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 31,13,0), "Обед", 500),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 31,20,0), "Ужин", 510)
++ );
++ getFilteredWithExceeded(mealList, LocalTime.of(7, 0), LocalTime.of(12,0), 2000);
++// .toLocalDate();
++// .toLocalTime();
++ }
++
++ public static List getFilteredWithExceeded(List mealList, LocalTime startTime, LocalTime endTime, int caloriesPerDay) {
++ // TODO return filtered list with correctly exceeded field
++ return null;
++ }
++}
+Index: src/main/java/ru/javawebinar/topjava/util/TimeUtil.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/util/TimeUtil.java (revision )
++++ src/main/java/ru/javawebinar/topjava/util/TimeUtil.java (revision )
+@@ -0,0 +1,13 @@
++package ru.javawebinar.topjava.util;
++
++import java.time.LocalTime;
++
++/**
++ * GKislin
++ * 07.01.2015.
++ */
++public class TimeUtil {
++ public static boolean isBetween(LocalTime lt, LocalTime startTime, LocalTime endTime) {
++ return lt.compareTo(startTime) >= 0 && lt.compareTo(endTime) <= 0;
++ }
++}
+Index: src/main/java/ru/javawebinar/topjava/model/UserMealWithExceed.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/model/UserMealWithExceed.java (revision )
++++ src/main/java/ru/javawebinar/topjava/model/UserMealWithExceed.java (revision )
+@@ -0,0 +1,24 @@
++package ru.javawebinar.topjava.model;
++
++import java.time.LocalDateTime;
++
++/**
++ * GKislin
++ * 11.01.2015.
++ */
++public class UserMealWithExceed {
++ private final LocalDateTime dateTime;
++
++ private final String description;
++
++ private final int calories;
++
++ private final boolean exceed;
++
++ public UserMealWithExceed(LocalDateTime dateTime, String description, int calories, boolean exceed) {
++ this.dateTime = dateTime;
++ this.description = description;
++ this.calories = calories;
++ this.exceed = exceed;
++ }
++}
+Index: src/main/java/ru/javawebinar/topjava/model/UserMeal.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/model/UserMeal.java (revision )
++++ src/main/java/ru/javawebinar/topjava/model/UserMeal.java (revision )
+@@ -0,0 +1,33 @@
++package ru.javawebinar.topjava.model;
++
++import java.time.LocalDateTime;
++
++/**
++ * GKislin
++ * 11.01.2015.
++ */
++public class UserMeal {
++ private final LocalDateTime dateTime;
++
++ private final String description;
++
++ private final int calories;
++
++ public UserMeal(LocalDateTime dateTime, String description, int calories) {
++ this.dateTime = dateTime;
++ this.description = description;
++ this.calories = calories;
++ }
++
++ public LocalDateTime getDateTime() {
++ return dateTime;
++ }
++
++ public String getDescription() {
++ return description;
++ }
++
++ public int getCalories() {
++ return calories;
++ }
++}
diff --git a/patchs/to_lesson01/1_1_HW0_stream.patch b/patchs/to_lesson01/1_1_HW0_stream.patch
new file mode 100644
index 000000000000..f0374f5dab2b
--- /dev/null
+++ b/patchs/to_lesson01/1_1_HW0_stream.patch
@@ -0,0 +1,104 @@
+Index: src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java (revision dbb6f02aa01015bf5dd7e976a74f22bb5bf3d6f3)
++++ src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java (revision )
+@@ -3,11 +3,14 @@
+ import ru.javawebinar.topjava.model.UserMeal;
+ import ru.javawebinar.topjava.model.UserMealWithExceed;
+
++import java.time.LocalDate;
+ import java.time.LocalDateTime;
+ import java.time.LocalTime;
+ import java.time.Month;
+ import java.util.Arrays;
+ import java.util.List;
++import java.util.Map;
++import java.util.stream.Collectors;
+
+ /**
+ * GKislin
+@@ -16,20 +19,29 @@
+ public class UserMealsUtil {
+ public static void main(String[] args) {
+ List mealList = Arrays.asList(
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 30,10,0), "Завтрак", 500),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 30, 10, 0), "Завтрак", 500),
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 30,13,0), "Обед", 1000),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 30, 13, 0), "Обед", 1000),
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 30,20,0), "Ужин", 500),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 30, 20, 0), "Ужин", 500),
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 31,10,0), "Завтрак", 1000),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 31, 10, 0), "Завтрак", 1000),
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 31,13,0), "Обед", 500),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 31, 13, 0), "Обед", 500),
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 31,20,0), "Ужин", 510)
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 31, 20, 0), "Ужин", 510)
+ );
+- getFilteredMealsWithExceeded(mealList, LocalTime.of(7, 0), LocalTime.of(12,0), 2000);
+-// .toLocalDate();
+-// .toLocalTime();
++ List filteredMealsWithExceeded = getFilteredWithExceeded(mealList, LocalTime.of(7, 0), LocalTime.of(12, 0), 2000);
++ filteredMealsWithExceeded.forEach(System.out::println);
+ }
+
+- public static List getFilteredMealsWithExceeded(List mealList, LocalTime startTime, LocalTime endTime, int caloriesPerDay) {
+- // TODO return filtered list with correctly exceeded field
+- return null;
++ public static List getFilteredWithExceeded(List mealList, LocalTime startTime, LocalTime endTime, int caloriesPerDay) {
++ Map caloriesSumByDate = mealList.stream()
++ .collect(
++ Collectors.groupingBy(um -> um.getDateTime().toLocalDate(),
++ Collectors.summingInt(UserMeal::getCalories))
++ );
++
++ return mealList.stream()
++ .filter(um -> TimeUtil.isBetween(um.getDateTime().toLocalTime(), startTime, endTime))
++ .map(um ->
++ new UserMealWithExceed(um.getDateTime(), um.getDescription(), um.getCalories(),
++ caloriesSumByDate.get(um.getDateTime().toLocalDate()) > caloriesPerDay))
++ .collect(Collectors.toList());
+ }
+ }
+Index: src/main/java/ru/javawebinar/topjava/model/UserMealWithExceed.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/model/UserMealWithExceed.java (revision dbb6f02aa01015bf5dd7e976a74f22bb5bf3d6f3)
++++ src/main/java/ru/javawebinar/topjava/model/UserMealWithExceed.java (revision )
+@@ -7,18 +7,28 @@
+ * 11.01.2015.
+ */
+ public class UserMealWithExceed {
+- protected final LocalDateTime dateTime;
++ private final LocalDateTime dateTime;
+
+- protected final String description;
++ private final String description;
+
+- protected final int calories;
++ private final int calories;
+
+- protected final boolean exceed;
++ private final boolean exceed;
+
+ public UserMealWithExceed(LocalDateTime dateTime, String description, int calories, boolean exceed) {
+ this.dateTime = dateTime;
+ this.description = description;
+ this.calories = calories;
+ this.exceed = exceed;
++ }
++
++ @Override
++ public String toString() {
++ return "UserMealWithExceed{" +
++ "dateTime=" + dateTime +
++ ", description='" + description + '\'' +
++ ", calories=" + calories +
++ ", exceed=" + exceed +
++ '}';
+ }
+ }
diff --git a/patchs/to_lesson01/1_2_HW0_cycle.patch b/patchs/to_lesson01/1_2_HW0_cycle.patch
new file mode 100644
index 000000000000..49f6b9c10c7e
--- /dev/null
+++ b/patchs/to_lesson01/1_2_HW0_cycle.patch
@@ -0,0 +1,59 @@
+Index: src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java (date 1464631839000)
++++ src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java (revision )
+@@ -7,9 +7,7 @@
+ import java.time.LocalDateTime;
+ import java.time.LocalTime;
+ import java.time.Month;
+-import java.util.Arrays;
+-import java.util.List;
+-import java.util.Map;
++import java.util.*;
+ import java.util.stream.Collectors;
+
+ /**
+@@ -28,6 +26,8 @@
+ );
+ List filteredMealsWithExceeded = getFilteredWithExceeded(mealList, LocalTime.of(7, 0), LocalTime.of(12, 0), 2000);
+ filteredMealsWithExceeded.forEach(System.out::println);
++
++ System.out.println(getFilteredWithExceededByCycle(mealList, LocalTime.of(7, 0), LocalTime.of(12, 0), 2000));
+ }
+
+ public static List getFilteredWithExceeded(List mealList, LocalTime startTime, LocalTime endTime, int caloriesPerDay) {
+@@ -39,9 +39,26 @@
+
+ return mealList.stream()
+ .filter(um -> TimeUtil.isBetween(um.getDateTime().toLocalTime(), startTime, endTime))
+- .map(um ->
+- new UserMealWithExceed(um.getDateTime(), um.getDescription(), um.getCalories(),
+- caloriesSumByDate.get(um.getDateTime().toLocalDate()) > caloriesPerDay))
++ .map(um -> createWithExceed(um, caloriesSumByDate.get(um.getDateTime().toLocalDate()) > caloriesPerDay))
+ .collect(Collectors.toList());
++ }
++
++ public static List getFilteredWithExceededByCycle(List mealList, LocalTime startTime, LocalTime endTime, int caloriesPerDay) {
++
++ final Map caloriesSumPerDate = new HashMap<>();
++ mealList.forEach(meal -> caloriesSumPerDate.merge(meal.getDateTime().toLocalDate(), meal.getCalories(), Integer::sum));
++
++ final List mealExceeded = new ArrayList<>();
++ mealList.forEach(meal -> {
++ final LocalDateTime dateTime = meal.getDateTime();
++ if (TimeUtil.isBetween(dateTime.toLocalTime(), startTime, endTime)) {
++ mealExceeded.add(createWithExceed(meal, caloriesSumPerDate.get(dateTime.toLocalDate()) > caloriesPerDay));
++ }
++ });
++ return mealExceeded;
++ }
++
++ public static UserMealWithExceed createWithExceed(UserMeal um, boolean exceeded) {
++ return new UserMealWithExceed(um.getDateTime(), um.getDescription(), um.getCalories(), exceeded);
+ }
+-}
++}
+\ No newline at end of file
diff --git a/patchs/to_lesson01/1_3_switch_to_war.patch b/patchs/to_lesson01/1_3_switch_to_war.patch
new file mode 100644
index 000000000000..cf803628690f
--- /dev/null
+++ b/patchs/to_lesson01/1_3_switch_to_war.patch
@@ -0,0 +1,82 @@
+Index: src/main/webapp/WEB-INF/web.xml
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/webapp/WEB-INF/web.xml (revision a0eaa0d54f3c47a9c7de73f872b42587918b5487)
++++ src/main/webapp/WEB-INF/web.xml (revision a0eaa0d54f3c47a9c7de73f872b42587918b5487)
+@@ -0,0 +1,18 @@
++
++
++ Topjava
++
++
++ userServlet
++ ru.javawebinar.topjava.web.UserServlet
++ 0
++
++
++ userServlet
++ /users
++
++
++
+Index: src/main/webapp/index.html
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/webapp/index.html (revision a0eaa0d54f3c47a9c7de73f872b42587918b5487)
++++ src/main/webapp/index.html (revision a0eaa0d54f3c47a9c7de73f872b42587918b5487)
+@@ -0,0 +1,14 @@
++
++
++
++
++ Java Enterprise (Topjava)
++
++
++
++
++
++
++
+Index: src/main/webapp/userList.jsp
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/webapp/userList.jsp (revision a0eaa0d54f3c47a9c7de73f872b42587918b5487)
++++ src/main/webapp/userList.jsp (revision a0eaa0d54f3c47a9c7de73f872b42587918b5487)
+@@ -0,0 +1,10 @@
++<%@ page contentType="text/html;charset=UTF-8" language="java" %>
++
++
++ User list
++
++
++
++User list
++
++
+Index: pom.xml
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- pom.xml (date 1464632045000)
++++ pom.xml (date 1464815793000)
+@@ -4,7 +4,7 @@
+
+ ru.javawebinar
+ topjava
+- jar
++ war
+
+ 1.0-SNAPSHOT
+
diff --git a/patchs/to_lesson01/1_4_add_servlet_api.patch b/patchs/to_lesson01/1_4_add_servlet_api.patch
new file mode 100644
index 000000000000..c24b59a6a66f
--- /dev/null
+++ b/patchs/to_lesson01/1_4_add_servlet_api.patch
@@ -0,0 +1,48 @@
+Index: src/main/java/ru/javawebinar/topjava/web/UserServlet.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/web/UserServlet.java (revision 543a5fca19c11a10a560a964587b61fa5f5134b6)
++++ src/main/java/ru/javawebinar/topjava/web/UserServlet.java (revision 543a5fca19c11a10a560a964587b61fa5f5134b6)
+@@ -0,0 +1,18 @@
++package ru.javawebinar.topjava.web;
++
++import javax.servlet.ServletException;
++import javax.servlet.http.HttpServlet;
++import javax.servlet.http.HttpServletRequest;
++import javax.servlet.http.HttpServletResponse;
++import java.io.IOException;
++
++/**
++ * User: gkislin
++ * Date: 19.08.2014
++ */
++public class UserServlet extends HttpServlet {
++
++ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
++ request.getRequestDispatcher("/userList.jsp").forward(request, response);
++ }
++}
+Index: pom.xml
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- pom.xml (date 1456909639000)
++++ pom.xml (date 1456909915000)
+@@ -34,6 +34,14 @@
+
+
+
++
++
++
++ javax.servlet
++ servlet-api
++ 2.5
++ provided
++
+
+
+
diff --git a/patchs/to_lesson01/1_5_forward_to_redirect.patch b/patchs/to_lesson01/1_5_forward_to_redirect.patch
new file mode 100644
index 000000000000..df841d096f83
--- /dev/null
+++ b/patchs/to_lesson01/1_5_forward_to_redirect.patch
@@ -0,0 +1,32 @@
+Index: pom.xml
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- pom.xml (date 1456909915000)
++++ pom.xml (revision )
+@@ -19,7 +19,7 @@
+
+
+ topjava
+- install
++ package
+
+
+ org.apache.maven.plugins
+Index: src/main/java/ru/javawebinar/topjava/web/UserServlet.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/web/UserServlet.java (date 1456909915000)
++++ src/main/java/ru/javawebinar/topjava/web/UserServlet.java (revision )
+@@ -13,6 +13,7 @@
+ public class UserServlet extends HttpServlet {
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+- request.getRequestDispatcher("/userList.jsp").forward(request, response);
++// request.getRequestDispatcher("/userList.jsp").forward(request, response);
++ response.sendRedirect("userList.jsp");
+ }
+ }
diff --git a/patchs/to_lesson01/1_6_logging.patch b/patchs/to_lesson01/1_6_logging.patch
new file mode 100644
index 000000000000..734cd292b080
--- /dev/null
+++ b/patchs/to_lesson01/1_6_logging.patch
@@ -0,0 +1,128 @@
+Index: src/main/resources/logback.xml
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/resources/logback.xml (revision )
++++ src/main/resources/logback.xml (revision )
+@@ -0,0 +1,33 @@
++
++
++
++
++ true
++
++
++
++
++
++
++ ${TOPJAVA_ROOT}/log/topjava.log
++
++
++ UTF-8
++ %date %-5level %logger{0} [%file:%line] %msg%n
++
++
++
++
++
++ UTF-8
++ %-5level %logger{0} [%file:%line] %msg%n
++
++
++
++
++
++
++
++
++
++
+Index: pom.xml
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- pom.xml (date 1464819221000)
++++ pom.xml (revision )
+@@ -15,6 +15,10 @@
+ 1.8
+ UTF-8
+ UTF-8
++
++
++ 1.1.7
++ 1.7.21
+
+
+
+@@ -34,6 +38,34 @@
+
+
+
++
++
++ org.slf4j
++ slf4j-api
++ ${slf4j.version}
++ compile
++
++
++
++ org.slf4j
++ jcl-over-slf4j
++ ${slf4j.version}
++ runtime
++
++
++
++ org.slf4j
++ jul-to-slf4j
++ ${slf4j.version}
++ runtime
++
++
++
++ ch.qos.logback
++ logback-classic
++ ${logback.version}
++ runtime
++
+
+
+
+Index: src/main/java/ru/javawebinar/topjava/web/UserServlet.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/web/UserServlet.java (date 1464819221000)
++++ src/main/java/ru/javawebinar/topjava/web/UserServlet.java (revision )
+@@ -1,18 +1,26 @@
+ package ru.javawebinar.topjava.web;
+
++import org.slf4j.Logger;
++import org.slf4j.LoggerFactory;
++
+ import javax.servlet.ServletException;
+ import javax.servlet.http.HttpServlet;
+ import javax.servlet.http.HttpServletRequest;
+ import javax.servlet.http.HttpServletResponse;
+ import java.io.IOException;
+
++import static org.slf4j.LoggerFactory.getLogger;
++
+ /**
+ * User: gkislin
+ * Date: 19.08.2014
+ */
+ public class UserServlet extends HttpServlet {
++ private static final Logger LOG = getLogger(UserServlet.class);
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
++ LOG.debug("redirect to userList");
++
+ // request.getRequestDispatcher("/userList.jsp").forward(request, response);
+ response.sendRedirect("userList.jsp");
+ }
diff --git a/patchs/to_lesson01/1_7_remote_jmx.patch b/patchs/to_lesson01/1_7_remote_jmx.patch
new file mode 100644
index 000000000000..7bd470faff3b
--- /dev/null
+++ b/patchs/to_lesson01/1_7_remote_jmx.patch
@@ -0,0 +1,12 @@
+Index: config/setenv.bat
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- config/setenv.bat (revision )
++++ config/setenv.bat (revision )
+@@ -0,0 +1,4 @@
++rem run tomcat with JMX ability
++rem Run Tomcat as admin
++rem for remote connection add -Djava.rmi.server.hostname=TomcatServer_IP
++set CATALINA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
diff --git a/patchs/to_lesson02/2_1_HW1.patch b/patchs/to_lesson02/2_1_HW1.patch
new file mode 100644
index 000000000000..dcb53080c11a
--- /dev/null
+++ b/patchs/to_lesson02/2_1_HW1.patch
@@ -0,0 +1,273 @@
+Index: src/main/java/ru/javawebinar/topjava/model/UserMealWithExceed.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/model/UserMealWithExceed.java (revision 2c8ba27e36b2266486b66b4594b4572c7b5a24c1)
++++ src/main/java/ru/javawebinar/topjava/model/UserMealWithExceed.java (revision 7dd935c232786b2c0ed22155f9556016d9ca168d)
+@@ -22,6 +22,22 @@
+ this.exceed = exceed;
+ }
+
++ public LocalDateTime getDateTime() {
++ return dateTime;
++ }
++
++ public String getDescription() {
++ return description;
++ }
++
++ public int getCalories() {
++ return calories;
++ }
++
++ public boolean isExceed() {
++ return exceed;
++ }
++
+ @Override
+ public String toString() {
+ return "UserMealWithExceed{" +
+Index: src/main/java/ru/javawebinar/topjava/util/TimeUtil.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/util/TimeUtil.java (revision 2c8ba27e36b2266486b66b4594b4572c7b5a24c1)
++++ src/main/java/ru/javawebinar/topjava/util/TimeUtil.java (revision 7dd935c232786b2c0ed22155f9556016d9ca168d)
+@@ -1,13 +1,21 @@
+ package ru.javawebinar.topjava.util;
+
++import java.time.LocalDateTime;
+ import java.time.LocalTime;
++import java.time.format.DateTimeFormatter;
+
+ /**
+ * GKislin
+ * 07.01.2015.
+ */
+ public class TimeUtil {
++ public static final DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
++
+ public static boolean isBetween(LocalTime lt, LocalTime startTime, LocalTime endTime) {
+ return lt.compareTo(startTime) >= 0 && lt.compareTo(endTime) <= 0;
++ }
++
++ public static String toString(LocalDateTime ldt) {
++ return ldt == null ? "" : ldt.format(DATE_TME_FORMATTER);
+ }
+ }
+Index: src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java (revision 2c8ba27e36b2266486b66b4594b4572c7b5a24c1)
++++ src/main/java/ru/javawebinar/topjava/util/UserMealsUtil.java (revision 7dd935c232786b2c0ed22155f9556016d9ca168d)
+@@ -15,19 +15,26 @@
+ * 31.05.2015.
+ */
+ public class UserMealsUtil {
+- public static void main(String[] args) {
+- List mealList = Arrays.asList(
++ public static final List MEAL_LIST = Arrays.asList(
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 30, 10, 0), "Завтрак", 500),
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 30, 13, 0), "Обед", 1000),
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 30, 20, 0), "Ужин", 500),
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 31, 10, 0), "Завтрак", 1000),
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 31, 13, 0), "Обед", 500),
+- new UserMeal(LocalDateTime.of(2015, Month.MAY, 31, 20, 0), "Ужин", 510)
+- );
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 30, 10, 0), "Завтрак", 500),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 30, 13, 0), "Обед", 1000),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 30, 20, 0), "Ужин", 500),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 31, 10, 0), "Завтрак", 1000),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 31, 13, 0), "Обед", 500),
++ new UserMeal(LocalDateTime.of(2015, Month.MAY, 31, 20, 0), "Ужин", 510)
++ );
+- List filteredMealsWithExceeded = getFilteredWithExceeded(mealList, LocalTime.of(7, 0), LocalTime.of(12, 0), 2000);
++
++ public static final int DEFAULT_CALORIES_PER_DAY = 2000;
++
++ public static void main(String[] args) {
++ List filteredMealsWithExceeded = getFilteredWithExceeded(MEAL_LIST, LocalTime.of(7, 0), LocalTime.of(12, 0), DEFAULT_CALORIES_PER_DAY);
+ filteredMealsWithExceeded.forEach(System.out::println);
+
+- System.out.println(getFilteredWithExceededByCycle(mealList, LocalTime.of(7, 0), LocalTime.of(12, 0), 2000));
++ System.out.println(getFilteredWithExceededByCycle(MEAL_LIST, LocalTime.of(7, 0), LocalTime.of(12, 0), DEFAULT_CALORIES_PER_DAY));
++ }
++
++ public static List getWithExceeded(List mealList, int caloriesPerDay) {
++ return getFilteredWithExceeded(mealList, LocalTime.MIN, LocalTime.MAX, caloriesPerDay);
+ }
+
+ public static List getFilteredWithExceeded(List mealList, LocalTime startTime, LocalTime endTime, int caloriesPerDay) {
+\ No newline at end of file
+Index: src/main/java/ru/javawebinar/topjava/web/MealServlet.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/java/ru/javawebinar/topjava/web/MealServlet.java (revision 7dd935c232786b2c0ed22155f9556016d9ca168d)
++++ src/main/java/ru/javawebinar/topjava/web/MealServlet.java (revision 7dd935c232786b2c0ed22155f9556016d9ca168d)
+@@ -0,0 +1,25 @@
++package ru.javawebinar.topjava.web;
++
++import org.slf4j.Logger;
++import org.slf4j.LoggerFactory;
++import ru.javawebinar.topjava.util.UserMealsUtil;
++
++import javax.servlet.ServletException;
++import javax.servlet.http.HttpServlet;
++import javax.servlet.http.HttpServletRequest;
++import javax.servlet.http.HttpServletResponse;
++import java.io.IOException;
++
++/**
++ * User: gkislin
++ * Date: 19.08.2014
++ */
++public class MealServlet extends HttpServlet {
++ private static final Logger LOG = LoggerFactory.getLogger(MealServlet.class);
++
++ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
++ LOG.info("getAll");
++ request.setAttribute("mealList", UserMealsUtil.getWithExceeded(UserMealsUtil.MEAL_LIST, UserMealsUtil.DEFAULT_CALORIES_PER_DAY));
++ request.getRequestDispatcher("/mealList.jsp").forward(request, response);
++ }
++}
+Index: src/main/webapp/WEB-INF/tld/functions.tld
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/webapp/WEB-INF/tld/functions.tld (revision 7dd935c232786b2c0ed22155f9556016d9ca168d)
++++ src/main/webapp/WEB-INF/tld/functions.tld (revision 7dd935c232786b2c0ed22155f9556016d9ca168d)
+@@ -0,0 +1,16 @@
++
++
++
++ 1.0
++ functions
++ http://topjava.javawebinar.ru/functions
++
++
++ formatDateTime
++ ru.javawebinar.topjava.util.TimeUtil
++ java.lang.String toString(java.time.LocalDateTime)
++
++
+Index: src/main/webapp/WEB-INF/web.xml
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/webapp/WEB-INF/web.xml (revision 2c8ba27e36b2266486b66b4594b4572c7b5a24c1)
++++ src/main/webapp/WEB-INF/web.xml (revision 7dd935c232786b2c0ed22155f9556016d9ca168d)
+@@ -15,4 +15,14 @@
+ /users
+
+
++
++ mealServlet
++ ru.javawebinar.topjava.web.MealServlet
++ 0
++
++
++ mealServlet
++ /meals
++
++
+
+Index: src/main/webapp/index.html
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- src/main/webapp/index.html (revision 2c8ba27e36b2266486b66b4594b4572c7b5a24c1)
++++ src/main/webapp/index.html (revision 7dd935c232786b2c0ed22155f9556016d9ca168d)
+@@ -9,6 +9,7 @@
+
+
+