diff --git a/.codacy.yml b/.codacy.yml new file mode 100644 index 000000000000..311a8f4e0029 --- /dev/null +++ b/.codacy.yml @@ -0,0 +1,5 @@ +--- +exclude_paths: + - 'src/main/webapp/**' + - '**.md' + - '**.sql' \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000000..f5f58000338e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,26 @@ +# https://docs.travis-ci.com/user/languages/java/ +language: java +jdk: openjdk14 + +#https://dzone.com/articles/travis-ci-tutorial-java-projects +cache: + directories: + - $HOME/.m2 + +# https://docs.travis-ci.com/user/database-setup/#PostgreSQL +before_script: +- psql -c 'create database topjava' -U postgres +- psql -c 'create user "user"; grant all privileges on database topjava to "user"' -U postgres + +# https://docs.travis-ci.com/user/customizing-the-build#Building-Specific-Branches +branches: + only: + - master + +# https://stackoverflow.com/a/49852690/548473: +services: + - postgresql + +# https://docs.travis-ci.com/user/notifications#Configuring-email-notifications +#notifications: +# email: false \ No newline at end of file diff --git a/README.md b/README.md index 37200eff9508..beb9b576d87a 100644 --- a/README.md +++ b/README.md @@ -1,254 +1,143 @@ -[Java Enterprise Online Project](https://javaops.ru/view/topjava) +[](https://www.codacy.com/manual/javawebinar/topjava) +[](https://travis-ci.org/JavaWebinar/topjava) + +Java Enterprise Online Project =============================== -Разработка полнофункционального 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 и хранением в базах данных Postgresql и HSQLDB. - - - Когда вы слышите что-то, вы забываете это. - Когда вы видите что-то, вы запоминаете это. - Но только когда вы начинаете делать это, - вы начинаете понимать это - - Старинная китайская поговорка - -## Описание и план проекта -### Демо разрабатываемого приложения -### [Изменения проекта (Release Notes)](ReleaseNotes.md) -### Требования к участникам, Wiki -### Составление резюме, подготовка к интервью, поиск работы - -Обновленное вводное занятие (обязательно смотреть все видео) -=============== -##  1. [Вступление, история, команда, источники](doc/video1.md) - -## Обзор наиболее востребованных технологий, которые будут изучаться на курсе TopJava -##  2.1. [Часть 1: инфраструктура](doc/video2.1.md) - -##  2.2. [Часть 2: frameworks Spring, ORM](doc/video2.2.md) - -##  2.3. [Часть 3: тренды](doc/video2.3.md) - -##  2.3. [Часть 4: обзор разрабатываемого приложения](doc/video2.4.md) - -##  3. [Рекомендуемые подходы к обучению на курсе](doc/video3.md) - -##  4. [Структура приложения (многоуровневая архитектура)](doc/video4.md) -### [Демо приложения](http://javaops-demo.ru/topjava) - -##  5. [Системы управления версиями. Git](doc/video5-vcs-git.md) - -##  6. Работа с проектом (выполнять инструкции) -- **ВНИМАНИЕ: выбирайте для проекта простой путь без пробелов и русских букв, например, `c:\projects\topjava\` (Windows). Иначе впоследствии будут проблемы** -- **Плагин Git Intergation уже не требуется, а вкладку `Version control` в IDEA переименовали в `Git`** -- **C Ultimate IDEA сейчас сложности**, надеемся что временные. - - Скачать IDEA и установливать плагины [можно по инструкции](https://github.com/JavaOPs/topjava/wiki/IDEA#download) - - После Trial 30 дней [способы продлить использование](https://github.com/JavaOPs/topjava/wiki/IDEA#licence) - -Для переключения режима отображения изменений из вкладки `Commit` в `Git: Local Changes` нужно переключить `Settings/Preferences | Version Control | Commit | Use non-modal commit interface` или в контекстном меню вкладки `Commit`: - -  - -### Патч [prepare_to_HW0.patch](https://drive.google.com/file/d/1LNPpu9OkuCpfpD8ZJHO-o0vwu49p2i5M) (скачать и положить в каталог вашего проекта) - -> Проект постоянно улучшается, поэтому видео иногда отличается от кода проекта. Изменения указываю после видео: -> - переименовал класс `UserMealWithExceed` и его поле `exceed` в `UserMealWithExcess.excess` -> - в `UserMeals/UserMealWithExcess` поля изменились на `private` -> - обновил данные `UserMealsUtil.meals` и переименовал некоторые переменные, поля и методы -> - добавил `UserMealWithExcess.toString()` и метод для выполнения _Optional домашнего задания_ -> - метод фильтрации в `TimeUtil` переименовал в `isBetweenHalfOpen` (также изменилась логика сравнения: `startTime` включается в интервал, а `endTime` - не включается) - -### GitHub поменял политику: теперь пушить нужно через токен. IDEA предложит его сгенерировать при пуше, или можно [создать токен в настройках](https://www.jetbrains.com/help/idea/github.html#register-account) -- [Способы авторизации в GitHub](https://topjava.ru/blog/vvedeniye-v-git-github-ustanovka-i-nastroyka#6) - -## Инструкция по шагам (из видео): -- Установить ПО (Git, JDK8, IntelliJ IDEA, Maven) -- Создать аккаунт на GitHub -- Сделать Fork **ЭТОГО** проекта (https://github.com/JavaOPs/topjava) -- Сделать локальный репозиторий проекта: -
git clone https://github.com/[Ваш аккаунт]/topjava.git- -> Вместо Fork можно сделать [клонирование проекта](https://github.com/JavaOPs/topjava//Git#user-content-Клонирование-проекта): он не будет привязан к исходному https://github.com/JavaOPs/topjava и у него не будет истории. - -- Открыть и настроить проект в IDEA - - Выставить кодировку UTF-8 в консоли - - Поставить кодировку UTF-8 - - Опционально: поменять шрифт по умолчанию на DejaVu или на **новый [JetBrains Mono](https://habr.com/ru/company/jugru/news/t/484134/)** -- По ходу видео сделать `Apply Patch...` скачанного патча `Prepare_to_HW0.patch` -- Закоммитить и запушить изменения (`commit` + `push`) -- Сделать ветку домашнего задания -- Выполнить задание и залить на GitHub (`commit` + `push`) -- Переключиться в основную ветку проекта `master`. - -##  7. [Maven](https://drive.google.com/file/d/1qEJTwv9FNUQjx-y9MSydH01xaAne0-hu) -- [Как установить Maven 3 на Ubuntu или Windows](https://devcolibri.com/как-установить-maven-3-на-ubuntu-или-windows/) -- [Руководство по Maven](https://topjava.ru/blog/apache-maven-osnovy-1) -- Wiki: [Apache Maven](https://ru.wikipedia.org/wiki/Apache_Maven) -- [The Central Repository](http://search.maven.org) -- Дополнительно: - - [Мой Wiki по Maven](https://github.com/JavaOPs/topjava/wiki/Maven) - - [Основы Maven](https://www.youtube.com/watch?v=0uwMKktzixU) - - JavaRush: [Основы Maven](https://javarush.ru/groups/posts/2523-chastjh-4osnovih-maven) - - Инструмент сборки проектов [Maven](https://www.examclouds.com/ru/java/java-core-russian/lesson20) - - [Maven Getting Started Guide](https://maven.apache.org/guides/getting-started/index.html) - - [Видео: Maven vs Gradle vs SBT (Архипов, Борисов, Садогурский)](https://www.youtube.com/watch?v=21qdRgFsTy0) - - [Build Lifecycle](http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html) - - [Dependency Mechanism](http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html) - -##  8. [Как правильно относиться к техзаданию (ТЗ). Полуоткрытый интервал.](https://drive.google.com/file/d/1BpTzjNFjS0TSekCyt_xvt6YoLvuw5KTZ) -- [Типы промежутков](https://ru.wikipedia.org/wiki/Промежуток_(математика)) - -##  Домашнее задание HW0 - -### ВНИМАНИЕ: НЕ НАДО в репозиторий делать Pull Request со своими решениями! См. видео выше ("Работа с проектом") - -Реализовать метод `UserMealsUtil.filteredByCycles` через циклы (`forEach`): -- должны возвращаться только записи между `startTime` и `endTime` -- поле `UserMealWithExcess.excess` должно показывать, превышает ли сумма калорий за весь день значение `caloriesPerDay` - -Т. е. `UserMealWithExcess` - это запись одной еды, но поле `excess` будет одинаково для всех записей за этот день. - -> - Проверьте результат выполнения ДЗ (можно проверить логику в [http://javaops-demo.ru/topjava](http://javaops-demo.ru/topjava), список еды) -> - Оцените Time complexity алгоритма. Если она больше O(N), например O(N*N) или N*log(N), сделайте O(N). -> **Внимание: внимательно прочитайте про O(N). O - это любой коэффициент, 2*N это тоже O(N).** - -- Java 8 Date and Time API -- Алгоритмы и структуры данных для начинающих: сложность алгоритмов -- [Сложность алгоритмов и Big O Notation](https://threadreaderapp.com/thread/1470666237286010881) -- [Головач: сложность алгоритмов в теме коллекций](https://www.youtube.com/watch?v=Ek9ijOiplNE&feature=youtu.be&t=778) -- Time complexity -- Временная сложность алгоритма -- Вычислительная сложность - -#### ВНИМАНИЕ: варианты Optional делайте в одной ветке в разных методах `UserMealsUtil`. Проще делать, проще проверять - -### Optional (Java 8 Stream API) -``` -Реализовать метод `UserMealsUtil.filteredByStreams` через Java 8 Stream API. -``` -- Видео: Доступно о Java 8 Lambda -- Java 8: Lambda выражения -- Java 8: Потоки -- Pуководство по Java 8 Stream -- [Полное руководство по Java 8 Stream API в картинках и примерах](https://annimon.com/article/2778) -- [7 способов использовать groupingBy в Stream API](https://habrahabr.ru/post/348536) -- Лямбда-выражения в Java 8 -- A Guide to Java 8 -- Шпаргалка Java Stream API -- Алексей Владыкин: Элементы функционального программирования в Java -- Yakov Fain о новом в Java 8 -- stream.map vs forEach` - - без циклов по другим коллекциям/массивам (к ним также относим методы коллекций `addAll()/removeAll()`) -- через Stream API за 1 проход по исходному списку `meals.stream()` - - нельзя использовать внешние коллекции, не являющиеся частью коллектора - - возможно дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Те например нельзя разбить список на 2 подсписка с четными и нечетными датами и затем их объединить, с подсчетом превышения для каждого элемента. - -Временная сложность реализации должна быть O(N) (обратите внимание на п. 13 замечаний) -Решение должно быть рабочим в общем случае (должно работать в приложении с многими пользователями, не только при запуске `main`) -Нельзя 2 раза проходить по исходному списку (в том числе по его отфильтрованной или преобразованной копии) - -Ресурсы: -- [Baeldung: Custom Collectors](https://www.baeldung.com/java-8-collectors#Custom) -- [Руководство по Java 8 Stream API: Collector](https://annimon.com/article/2778#collector) -- [Хватит писать циклы! Топ-10 лучших методов для работы с коллекциями из Java 8](https://javarush.ru/groups/posts/524-khvatit-pisatjh-ciklih-top-10-luchshikh-metodov-dlja-rabotih-s-kollekcijami-iz-java8) -- [Понять Java Stream API](https://vc.ru/u/604567-yerlan-akzhanov/194409-ponyat-java-stream-api) - -### Замечания по использованию Stream API: -- Когда встречаешь что-то непривычное, приходится перестраивать мозги. Например, переход с процедурного на ООП-программирование дается непросто. Те, кто не знает шаблонов (и не хотят учить), также их встречают плохо. Хорошая новость в том, что если это принять и начать использовать, то начинаешь получать от этого удовольствие. И тут главное не впасть в другую крайность: - - [Используйте Stream API проще (или не используйте вообще)](https://habrahabr.ru/post/337350/) -- Если вас беспокоит производительность стримов, обязательно прочитайте про оптимизацию - - ["Что? Где? Когда?"](http://optimization.guide/intro.html) - - [Перформанс: что в имени тебе моём?](https://habrahabr.ru/company/jugru/blog/338732/) - - [Performance это праздник](https://habrahabr.ru/post/326242/) - -При использовании Stream API производительность улучшится только на больших задачах, где возможно распараллеливание. -Еще: просто так запустить и померить скорость JVM нельзя (как минимум надо дать прогреться и запустить очень большое число раз). Лучше использовать какие-нибудь бенчмарки, например [JMH](http://tutorials.jenkov.com/java-performance/jmh.html), который мы используем на другом проекте (Mastejava). - -##  Замечания к HW0 -- 1: Код проекта менять можно! Одна из распространенных ошибок как в тестовых заданиях на собеседовании, так и при работе на проекте, что ничего нельзя менять. Конечно, при правках в рабочем проекте обязательно нужно проконсультироваться/проревьюироваться у авторов кода (находятся по истории VCS) -- 2: Наследовать `UserMealWithExcess` от `UserMeal` нельзя, т. к. это разные сущности: Transfer Object и Entity. Мы будем их проходить на 2-м уроке. Это относится и к их зависимости друг от друга. -- 3: Правильная реализация должна быть простой и красивой, можно сделать 2-мя способами: через стримы и через циклы. Сложность должна быть O(N), т. е. без вложенных стримов и циклов. -- 4: При реализации через циклы посмотрите в `Map` на методы `getOrDefault` или `merge` -- 5: **При реализации через `Stream` заменяйте `forEach` оператором `stream.map(..)`** -- 6: Объявляйте переменные непосредственно перед использованием (если возможно - сразу с инициализацией). При объявлении коллекций в качестве типа переменной используйте интерфейс (Map, List, ..) -- 7: Если IDEA предлагает оптимизацию (желтым подчеркивает), например, заменить лямбду на ссылку на метод (method reference), соглашайтесь (Alt+Enter) -- 8: Пользуйтесь форматированием кода в IDEA: `Alt+Ctrl+L` -- 9: Перед check-in (отправкой изменений на GitHub) просматривайте внесенные изменения (Git -> [Log](https://www.jetbrains.com/help/idea/log-tab.html) -> курсор на файл и Ctrl+D): не оставляйте в коде ничего лишнего (закомментированный код, TODO и пр.). Если файл не меняется (например только пробелы или переводы строк), не надо его чекинить, делайте ему `revert` (Git -> Revert / `Ctrl+Alt+Z`). -- 10: `System.out.println` нельзя использовать нигде, кроме как в `main`. Позже введем логирование. -- 11: Результаты, возвращаемые `UserMealsUtil.filteredByStreams`, мы будем использовать [в нашем приложении](http://javaops-demo.ru/topjava) для фильтрации по времени и отображения еды правильным цветом. -- 12: Обращайте внимание на комментарии к вашим коммитам в Git. Они должны быть короткие и информативные (лучше на english) -- 13: Не полагайтесь в решении на то, что список еды будет подаваться отсортированным. Такого условия нет. ------ - -> - ДЗ первого урока будет связано с созданием небольшого [CRUD](https://ru.wikipedia.org/wiki/CRUD)-приложения (в памяти, без базы данных) на JSP и сервлетах -> - основы JavaScript необходимы для понимания проекта, начиная с 8-го занятия - -### Полезные ресурсы -#### HTML, JavaScript, CSS -- [Basic HTML and HTML5](https://learn.freecodecamp.org/responsive-web-design/basic-html-and-html5/say-hello-to-html-elements/) -- [Справочник по WEB](https://developer.mozilla.org/ru/) -- [Видео по WEB-технологиям](https://www.youtube.com/user/WebMagistersRu/playlists) -- [Изучение JavaScript в одном видеоуроке за час](https://www.youtube.com/watch?v=QBWWplFkdzw) -- HTML, CSS, JAVASCRIPT, SQL, JQUERY, BOOTSTRAP -- Введение в программирование на JavaScript -- Стандарты кодирования для HTML, CSS и JavaScript’a -- Основы работы с HTML/CSS/JavaScript -- JavaScript - Основы -- Основы JavaScript -- Bootstrap 3 - Основы -- jQuery для начинающих - -#### Java (базовые вещи) -- [Сборник видео "Изучаем Java"](https://www.youtube.com/playlist?list=PLyxk-1FCKqockmP-fXZmHQ7UlYP3qvZRa) -- 1-й урок MasterJava: Многопоточность -- [Основы Java garbage collection](http://web.archive.org/web/20180831013112/https://ggenikus.github.io/blog/2014/05/04/gc) -- Размер Java объектов -- Введение в Java Reflection API -- Структуры данных в картинках -- Обзор java.util.concurrent.* -- Синхронизация потоков -- String literal pool -- Маленькие хитрости Java -- A Guide to Java 8 - -### Туториалы, разное -- [Открытый курс: Spring Boot + HATEOAS](https://javaops.ru/view/bootjava) -- [Что нужно знать о бэкенде новичку в веб-разработке](https://tproger.ru/translations/backend-web-development) -- [Туториалы: Spring Framework, Hibernate, Java Core, JDBC](http://proselyte.net/tutorials/) - -#### Сервлеты -- Как создать Servlet? Полное руководство. -- [Сервлеты](https://metanit.com/java/javaee/4.1.php) - -#### Туториалы по Spring -- [Юрий Ткач: Spring Framework - The Basics](https://www.youtube.com/playlist?list=PL6jg6AGdCNaWF-sUH2QDudBRXo54zuN1t) -- [Java Brains: Spring Framework](https://www.youtube.com/playlist?list=PLC97BDEFDCDD169D7) -- [Тимур Батыршинов: Spring Core - основы фреймворка, ядро](https://www.youtube.com/watch?v=CfHDr-19WWY&list=PL8X2nqRlWfaYYP1-qXjdPKE7bXYkl6aL4) -- [alishev: Spring Framework](https://www.youtube.com/playlist?list=PLAma_mKffTOR5o0WNHnY0mTjKxnCgSXrZ) - -#### JDBC, SQL -- Основы SQL на примере задачи -- Уроки по JDBC -- Learn SQL -- Интуит. Основы SQL -- Try SQL -- Курс "Введение в базы данных" - -#### Разное -- Вопросы по собеседованию, ресурсы для подготовки -- Эффективная работа с кодом в IntelliJ IDEA -- Quizful- тесты онлайн -- Введение в Linux - -#### Книги -- Джошуа Блох: Java. Эффективное программирование. Второе издание -- Гамма, Хелм, Джонсон: Приемы объектно-ориентированного проектирования. Паттерны проектирования -- Редмонд Э.: Семь баз данных за семь недель. Введение в современные базы данных и идеологию NoSQL -- Brian Goetz: Java Concurrency in Practice -- G.L. McDowell: Cracking the Coding Interview +Наиболее востребованные технологии /инструменты / фреймворки Java Enterprise: +Maven/ Spring/ Security/ JPA(Hibernate)/ REST(Jackson)/ Bootstrap(CSS)/ jQuery + plugins. + +- [Вступительное занятие](https://github.com/JavaOPs/topjava) +- [Описание и план проекта](https://github.com/JavaOPs/topjava/blob/master/description.md) +- [Wiki](https://github.com/JavaOPs/topjava/wiki) +- [Wiki Git](https://github.com/JavaOPs/topjava/wiki/Git) +- [Wiki IDEA](https://github.com/JavaOPs/topjava/wiki/IDEA) +- [Демо разрабатываемого приложения](http://topjava.herokuapp.com/) + +#### 28.05: Старт проекта +- Начало проверки [вступительного задания](https://github.com/JavaOPs/topjava#-Домашнее-задание-hw0) + +#### 04.06: 1-е занятие +- Разбор домашнего задания вступительного занятия (вместе с Optional) +- Обзор используемых в проекте технологий. Интеграция ПО +- Maven +- WAR. Веб-контейнер Tomcat. Сервлеты +- Логирование +- Уровни и зависимости логгирования. JMX +- Домашнее задание 1-го занятия (HW1 + Optional) + +### 07.06: Дедлайн подачи заявки на [дипломную программу](https://javaops.ru/view/register/diploma) + +#### 11.06: 2-е занятие +- Разбор домашнего задания HW1 + Optional +- Библиотека vs Фреймворк. Стандартные библиотеки Apache Commons, Guava +- Слои приложения. Создание каркаса приложения +- Обзор Spring Framework. Spring Context +- Пояснения к HW2. Обработка Autowired +- Домашнее задание (HW2 + Optional) + +#### 18.06: 3-е занятие +- Разбор домашнего задания HW2 + Optional +- Жизненный цикл Spring контекста +- Тестирование через JUnit +- Spring Test +- Базы данных. Обзор NoSQL и Java persistence solution без ORM +- Настройка Database в IDEA +- Скрипты инициализации базы. Spring Jdbc Template +- Тестирование UserService через AssertJ +- Логирование тестов +- Домашнее задание (HW3 + Optional) + +#### 25.06: 4-е занятие +- Разбор домашнего задания HW3 + Optional +- Методы улучшения качества кода +- Spring: инициализация и популирование DB +- Подмена контекста при тестировании +- ORM. Hibernate. JPA +- Поддержка HSQLDB +- Домашнее задание (HW4 + Optional) +#### Начало выполнения [выпускного проекта](https://github.com/JavaOPs/topjava/blob/master/graduation.md) + +#### 02.07: 5-е занятие +- Обзор JDK 9/11. Миграция Topjava с 1.8 на 11 +- Разбор вопросов +- Разбор домашнего задания HW4 + Optional +- Транзакции +- Профили Maven и Spring +- Пул коннектов +- Spring Data JPA +- Spring кэш +- Домашнее задание (HW5 + Optional) + +#### 09.07: 6-е занятие +- Разбор домашнего задания HW5 + Optional +- Кэш Hibernate +- Spring Web +- JPS, JSTL, internationalization +- Динамическое изменение профиля при запуске +- Конфигурирование Tomcat через maven plugin. Jndi-lookup +- Spring Web MVC +- Spring Internationalization +- Домашнее задание (HW6 + Optional) + +#### Большое ДЗ + выпускной проект + подтягиваем "хвосты". + +#### 23.07: 7-е занятие +- Разбор домашнего задания HW6 + Optional +- Автогенерация DDL по модели +- Тестирование Spring MVC +- Миграция на JUnit 5 +- Принципы REST. REST контроллеры +- Тестирование REST контроллеров. Jackson +- jackson-datatype-hibernate. Тестирование через матчеры +- Тестирование через SoapUi. UTF-8 +- Домашнее задание (HW7 + Optional) + +#### 30.07: 8-е занятие +- Разбор домашнего задания HW7 + Optional +- WebJars. jQuery и JavaScript frameworks +- Bootstrap +- AJAX. Datatables. jQuery +- jQuery notifications plugin +- Добавление Spring Security +- Домашнее задание (HW8 + Optional) + +#### 06.08: 9-е занятие +- Разбор домашнего задания HW8 + Optional +- Spring Binding +- Spring Validation +- Перевод DataTables на Ajax +- Форма login / logout +- Реализация собственного провайдера авторицазии +- Принцип работы Spring Security. Проксирование +- Spring Security Test +- Cookie. Session +- Домашнее задание (HW9 + Optional) + +#### 13.08: 10-е занятие +- Разбор домашнего задания HW10 + Optional +- Кастомизация JSON (@JsonView) и валидации (groups) +- Рефакторинг: jQuery конверторы и группы валидации по умолчанию +- Spring Security Taglib. Method Security Expressions +- Интерсепторы. Редактирование профиля. JSP tag files +- Форма регистрации +- Обработка исключений в Spring +- Encoding password +- Миграция на Spring 5 +- Защита от межсайтовой подделки запросов (CSRF) +- Домашнее задание (HW10) + +#### 20.08: 11-е занятие +- Разбор домашнего задания HW10 + Optional +- Локализация datatables, ошибок валидации +- Защита от XSS (Cross Site Scripting) +- Обработка ошибок 404 (NotFound) +- Доступ к AuthorizedUser +- Ограничение модификации пользователей +- Деплой [приложения в Heroku](http://topjava.herokuapp.com) +- Собеседование. Разработка ПО +- Возможные доработки приложения +- Домашнее задание по проекту: составление резюме + +### 10.09: Дедлайн на сдачу [выпускного проекта](https://github.com/JavaOPs/topjava/blob/master/graduation.md) +### 23.09: Получение дипломов для участников [Дипломной программы](https://javaops.ru/view/register/diploma) diff --git a/ReleaseNotes.md b/ReleaseNotes.md deleted file mode 100644 index 40fef33ddfb3..000000000000 --- a/ReleaseNotes.md +++ /dev/null @@ -1,285 +0,0 @@ -# TopJava Release Notes - -### TopJava 26 -- починили шаблоны запросов на создание в Swagger через [ApiModelProperty](https://www.baeldung.com/spring-swagger-hide-field) -- в новой версии Data JPA `getById`->`getReferenceById` -- мелкие правки - -### TopJava 25 -- поправил `NoHtmlValidator`: `Jsoup.clean().equals` -> `Jsoup.isValid` -- починил `role VARCHAR NOT NULL` -- добавил нового тестового пользователя `guest` - -### TopJava 24 -- migrate to LTS JDK 17 -- add `AbstractBaseEntity.id()` -- fix for `User.registered`: `@Column(..., updatable = false)` -- add `@QueryHints` in `CrudUserRepository` -- add loggin in `RootController` -- fix `@Sql(.., , executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)` for controller tests after service tests -- rename `MATCHER` to `USER_MATCHER/MEAL_MATCHER` -- treat in `ActiveDbProfileResolver` attribute `profiles` - -### TopJava 23 -- migrate to JDK 16 -- в новой spring-data-jpa `getOne` заменили на `getById` -- в UserUtil#prepareToSave убрал проверку пароля на `hasText`. На UI поле проверяется на `@NotBlank` -- `ProfileRestController#register` делаю по правилам REST (POST без "/register") -- css стили `data-...` сделал [low-case через дефисы](https://stackoverflow.com/questions/36176474/548473) -- `TestMatcher` переименовал в `MatcherFactory` -- Для Swagger UI пометил `AuthorizedUser` аннотацией `@ApiIgnore` - -### TopJava 22 - - очистка пароля `AuthorizedUser#userTo` - - заменил `@SafeHtml`, который удалили из `hibernate.validator` на [Jsoup.clean](https://stackoverflow.com/a/68888601/548473) - - перенес запрет на обновление admin/user в `UserService` - - проверку email на уникальность для update с `id=null` в теле запроса сделал на основе анализа `HttpServletRequest.getRequestURI()` - - проверку класса в `classpath` в `Profiles#getActiveDbProfile` делаю на `org.springframework.util.ClassUtils#isPresent` - - удалил `type="text/javascript"` - -### TopJava 21 -- **добавили документирование REST API: Swagger** -- мигрировали на JDK 15 и используем текстовые блоки -- Вынес `produces = MediaType.APPLICATION_JSON_VALUE` на уровень контроллеров -- Правильно используем [глабальные переменные в js](https://stackoverflow.com/a/5064235/548473) -- Зарефакторил `inputField.tag` -- Тестовые переменные переименовал из UPPERCASE в camelCase -- Из тестов сервисов убрал `throws Exception` (в IDEA больше не генерятся по умолчанию) -- **Мигрировали на Spring Boot 2.4.1** - -### TopJava 20 -- мигрировали на JDK 14 -- в `@SafeHtml` запрещаем весь html (`whitelistType = NONE`) -- в `topjava.common.js` в `makeEditable()` вместо объекта контекст передаю 3 параметра -- в UI контроллерах убрал префикс `ajax` -- из тестов сервисов убрал `repository`. При проверке через `assertThrows` он не требуется -- в `TestMatcher` сценарии сравнения сделал параметризируемыми (паттерн стратегия) -- в API добавили `/users/{id}/with-meals` (см. [двунаправленные отношения](https://www.codeflow.site/ru/article/jackson-bidirectional-relationships-and-infinite-recursion)) -- добавил `UserTestData.USER_WITH_MEALS_MATCHER` (проверки пользователя сразу с едой) и константу id `NOT_FOUND` - -### TopJava 19 -- Изменилась логика для интервалов времени (исключаем `endTime`) -- Заменил собственный `MessageUtil` велосипед на спринговый `MessageSourceAccessor` -- В ролях убрал префиксы `ROLE_` ([Role and GrantedAuthority](https://stackoverflow.com/a/19542316/548473)) -- Добавился удобный метод `int AbstractBaseEntity.id()` -- Фикс `Location` в `ProfileRestController.register` -- Фикс валидации `UniqueMailValidator` для REST update без `user.id` -- Заменил `jdbc.initLocation` на полный путь - IDEA не ругается -- В конфигурации `cargo-maven2-plugin` сделал [индивидуальный контекст приложения](https://stackoverflow.com/a/60797999/548473) -- Тесты - - Обновил даты еды на 2020г. - - Зарефакторил тесты сервисов на удаление - `NotFoundException` может бросаться при `delete()` - - В тестах контроллеров вернулся к реализации без обертки над `MockMvcRequestBuilders` - - Для `InMemory` тестов подключаю только `inmemory.xml` (добавил туда необходимую конфигурацию из `spring-app.xml`) - - -### TopJava 18 - -- В `ErrorType` добавил `HttpStatus status` -- В PostgreSQL обнаружилась бага: граничное значение `0:00` из-за ошибок округления попадает в предыдущий интервал. -Мораль: всегда в тестах проверяйте граничные значения. Добавил этот случай в тестовые данные. -- Изменил `MealRepository.getBetween` (принимаю `@Nullable LocalDate`). Изменились реализации. -- Выделил метод `UserService.prepareAndSave` -- В TO поля сделал `final`, используем `@ConstructorProperties` -- Наконец локализировал описание приложения на страничке входа -- Для полей ввода дат добавил `autocomplete="off"` -- При закрытии модального окна закрываю окно ошибок -- Тесты: - - **Вместо очистки кэшей перед каждым тестом отключаем кэши для всех тестов** - - **Вынес общий код тестирования контроллеров в `AbstractControllerTest`. Код тестов значительно сократился** - - **Сделал типизированный `TestMatchers
-
-
-Я хочу подчеркнуть этот момент.
-
->Когда вы смотрите видео, вам может казаться, что вы все понимаете, но, поверьте, когда вы попытаетесь повторить это самостоятельно, у вас возникнет множество вопросов и сложностей. Практика - это важнейшая часть обучения, не пропускайте ее.
-
-На нашем курсе мы:
-- обсуждаем занятия с коллегами и преподавателями в Slack - эффективность 50%
-- выполняем практические домашние задания по каждой пройденной теме - 75%
-- помогаем коллегам и разрабатываем собственный выпускной проект - 90%
-
-### О проверке домашних заданий
-Также очень важная часть обучения - проверка
-ваших домашних заданий и ревью выпускного
-проекта нашими кураторами.
-
->**Это самый эффективный способ научиться программировать!**
-
-При устройстве на работу, на собеседовании обязательно
-задавай вопрос про ревью кода.
-Если его нет, фирма занимается разработкой
-непрофессионально? и рост там будет достаточно
-медленным и ограниченным.
-
-В ревью укажут именно твои ошибки
-в стиле, структурах данных, алгоритмах и кодировании.
-До вечера вторника участники шлют ссылку
-на свой GitHub-репозиторий с домашним
-заданием занятия, проверка делается
-ассистентами, результат пишется в Slack.
-Получается эффективно и оперативно.
-
-После проверки можно исправить замечания
-и пройти ее еще раз.
-
-В конце стажировки делается ревью вашего выпускного проекта.
-
-
-### Участие на стажировке: ожидания и реальность
-
-Давайте кратко обсудим, чем курс TopJava является
-и чем он не является, что следует от него ожидать
-и чего не следует.
-
-#### 1-й тип ложного представления о стажировке:
-
->Я увижу, как с нуля строится web-приложение A с использованием технологий B, просмотрю видео по темам, этого будет достаточно
-
-
-
-Почему такой подход не верный:
-TopJava - это стажировка, поэтому НЕ рассчитывайте
-пройти ее на диване с пакетом поп-корна.
-Тебе придется на ней РАБОТАТЬ (выполнять ДЗ,
-самостоятельно решать какие-то задачи, читать логи,
-дебажить, ходить на StackOverflow и даже думать
-об этом, засыпая)
-
-#### 2-й тип ложного представления о стажировке:
->Меня научат шаблонам работы с технологией А, и я
-> смогу их применять в любой ситуации
-
-Почему это тоже не вполне верный подход:
-Используемые на стажировке технологии представляют
-собой инструменты, которые позволяет сделать
-что-то проще. Мы поделимся практикой их использования,
-неочевидными особенностями и т. п., покажем
-"грабли", на которые вы рано или поздно наступите.
-Нет гарантии, что, устроившись на работу, вы
-увидите точно такие же подходы.
-Все проекты и команды индивидуальны: используются
-различные инструменты и различные решения.
-Столкновение с технологиями, с которыми
-ты ранее не был знаком, - это нормальная
-часть жизни любого программиста. Нужно быть к этому готовым.
-
-Хорошее представление о решении проблем
-дает поиск на StackOverflow, где почти
-на любую проблему дается большое количество
-вариантов решения. Поиск решений и выбор
-лучшего - это основная работа Java-разработчика,
-и мы максимально постараемся этому научить:
-каждый раз в конкретной ситуации вы должны
-будете САМИ думать, что применять и как.
-Выполняя домашние задания, вы должны приложить
-все усилия, чтобы самостоятельно найти решение.
-Далее в начале следующего занятия вы также
-посмотрите разбор решения, подготовленного
-Григорием Кислиным.
-
-#### 3-й вариант ошибочного представления о стажировке TopJava связан с неверным представлением о том зачем нужна проверка домашних заданий. Например, человек может ошибочно рассуждать так:
-
->я хочу проходить стажировку с проверкой ДЗ,
-> чтобы мне рассказали, как нужно правильно выполнять задания
-
-Задача проверки не в том, чтобы общими усилиями
-написать код, который ты и так увидишь в разборе.
-Если у тебя что-то не получается, наша
-задача - не найти ошибку/подебажить за тебя/почитать
-логи и т. п., а подсказать способ самостоятельно
-найти решение (хотя для этого мы сначала сами
-ищем/дебажим/читаем)
-Вторая важная задача, которую решает
-проверяющий, - увидеть то, что не увидел ты.
-Когда ты сдаешь задание на ревью, тебе
-может казаться, что все почти идеально. Проверяющий
-подскажет тебе, где ты что-то пропустил из-за
-недостатка опыта, что позволит тебе улучшить код.
-
----
-
->Любое знание стоит воспринимать как подобие семантического дерева: убедитесь в том, что понимаете фундаментальные принципы, то есть ствол и крупные ветки, прежде чем лезть в мелкие листья-детали. Иначе последним не на чем будет держаться
-— Илон Маск
-
-Обычно в занятии дается много дополнительного
-материала и ссылок. Не стоит стремиться прочитать
-все ссылки урока, их можно использовать как
-справочник. Гораздо важнее пройти основной
-материал урока и сделать домашнее
-задание - этого достаточно для усвоения
-материала и получения той самой
-основы - ствола и крупных веток, на
-которых впоследствии можно наращивать листву.
-
-
-Как правило, подбираются участники разного
-уровня. Поэтому главное – не стеснятся
-задавать вопросы (после самостоятельного
-гугления и поиска решения). Всегда есть
-поддержка группы (в том числе от пришедших
-на бесплатный повтор участников), моя и ассистентов.
-
----
-### Основные навыки программиста, которые необходимо развить на курсе
-Давайте перечислим набор навыков, которые
-вам необходимо развивать в ходе курса
-и которые необходимы любому программисту:
-
-- умение и привычка искать
-информацию, чтобы иметь больший выбор из
-доступных вариантов технологий и подходов
-к решению задачи, умение пользоваться StackOverflow;
-- умение пользоваться дебаггером в Intellij Idea;
-- умение пользоваться DevTools в браузере;
-- определенный кругозор и опыт для того, чтобы придумывать поисковые запросы.
diff --git a/doc/video4.md b/doc/video4.md
deleted file mode 100644
index 7d9b00716dca..000000000000
--- a/doc/video4.md
+++ /dev/null
@@ -1,110 +0,0 @@
-## Структура приложения (многоуровневая архитектура)
-##  [Видео](https://drive.google.com/file/d/1UHzSy9i-uonmTMFoR5v69Y-vyWLCLQWd)
-
-Приложение, которое мы будем разрабатывать, это [программа для подсчета калорий](http://javaops-demo.ru/topjava).
-
-В этом видео обсудим структуру этого приложения.
-
----
-Ссылки на отчеты, которые будут использоваться в этом уроке:
-
-- [Многоуровневая архитектура (русскоязыная статья в Wikipedia)](https://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B2%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0)
-- [Multitier architecture (англоязычная статья в Wikipedia)](https://en.wikipedia.org/wiki/Multitier_architecture)
-
----
-
-
-
-На структурной схеме приложения вы видите, что оно условно разделено на 4 части: **Views**,
-**Controller**, **Service** и **Repository**.
-
-Такой подход является реализацией многоуровневой архитектуры в программировании.
-По-английски этот подход называется **_Multitier architecture_**.
-
-Его суть заключается в разделении приложения на несколько слоев,
-каждый из которых ответственен за конкретную задачу.
-
-### Слой отображения (View)
-Views соответствует слою отображения (или presentation layer). Это user interface (UI) или
-фронтенд - все то, что мы видим и с чем взаимодействуем в браузере.
-В качестве View могут быть HTML-страницы, созданные с использованием специальных
-движков шаблонов, например, JSP (встроен в Tomcat), или
-Thymeleaf (шаблоны по умолчанию в Spring Boot), или отдельное frontend-приложение,
-написанное на одном из JavaScript-фреймворков.
-
-В случае с движками шаблонов HTML-страницы будут располагаться в одном проекте
-с основным кодом приложения. Для приложений с "небогатым" UI используются именно шаблоны.
-Этот подход отличается от так называемых RIA - rich internet application - приложений со сложным UI.
-
-Главное отличие rich internet application от приложений с фронтендом
-на движках шаблонов заключается в том, что фронтенд, созданный на движке
-шаблонов, работает на сервере, и это что-то простое.
-В случае с rich internet application фронтенд-приложение загружается
-через Интернет к вам на компьютер и запускается в браузере.
-Оно может быть максимально сложным и выполнять функции традиционных
-десктоп-приложений.
-Иногда в одном приложении смешиваются оба способа: например, страница
-логина-пароля в RIA делаются на шаблонах.
-
-Создание простого фронтенда на движке шаблонов проще, поэтому
-в курсе мы будем использовать этот способ.
-
-### Слой контроллеров (Controller)
-Следующий слой, который мы видим - это **Controller**.
-
-В многоуровневой архитектуре он соответствует слою, который
-называется "**_Слой приложения_**" или "**_Application layer_**").
-В GRASP (General Responsibility Assignment Software Patterns)
-он так и называется - Controller layer.
-
-Это слой приложения, который ответственен за обработку HTTP-запросов и проверку корректности входных данных. Если мы открываем главную страницу на сайте или отправляем заполненную на сайте форму, фронтенд-приложение отправляет HTTP-запрос серверу (в нашем случае контейнеру сервлетов), который принимает запрос и перенаправляет его в контроллер, соответствующий введенному в браузере URL или адресу, который вызывается при отправке формы через сайт.
-Также контроллеры могут принимать запросы не только от фронтенда, но и от других приложений.
-
-Слой контроллеров не имеет доступа к базе данных. Контроллеры общаются только с сервисами.
-
-### Слой сервисов (Service layer)
-Слой **Service** на схеме приложения соответствует слою
-бизнес-логики (или **_Business layer_**) в многоуровневой архитектуре.
-В слое Service инкапсулирована вся бизнес-логика нашего приложения.
-Если коммуникация с фронтендом или другими приложениями - это ответственность контроллеров,
-то обработка данных - это ответственность сервисов.
-
-### Слой доступа к данным (Data layer)
-Слой сервисов общается со слоем, ответственным за работу с базами данных.
-Этот слой называют **Data layer** (также можно встретить
-названия **Persistence Layer** или **Data access layer**), и он
-представлен в виде **_Data Access Object_** классов
-(коротко - **_DAO-классы_**) или классов, реализующих паттерн "репозиторий".
-С обоими видами классов вы попрактикуетесь в ходе курса.
-[Репозиторий - это также один из архитектурных паттернов](https://martinfowler.com/eaaCatalog/repository.html)
-
-Подобное разделение приложения на слои дает гибкость
-и существенно упрощает доработку и переиспользование приложения.
-Например, создав по такому принципу приложение,
-содержащее слои репозиториев, сервисов и контроллеров,
-мы в дальнейшем можем легко использовать это приложение
-с различными фронтенд-приложениями или мобильными приложениями.
-Если мы решим перейти на другую базу данных, мы можем
-переписать только слой репозиториев, и нам не требуется
-вносить изменения в слои сервисов и контроллеров.
-
->Для маленького приложение такой подход может показаться
->избыточно сложным, но по мере расширения это является спасением.
-
-Подавляющее большинство реальных приложений построено с использованием именно этой архитектуры.
-
-### Краткие итоги
-В этом видео мы познакомились с концепцией многоуровневой архитектуры,
-которую мы применим при создании приложения на курсе.
-Многоуровневая архитектура предполагает разделение приложения на слои:
-- Views - слой отображения является фронтендом;
-- Controller - слой приложения ответственен за прием и валидацию входных данных;
-- слой Service включает в себя весь код, отражающий бизнес логику;
-- Repository или Data layer отвечает за взаимодействие с базой данных.
-
-Также мы обсудили какие преимущества дает такой подход.
-Среди преимуществ в первую очередь возможность повторного
-использования различных слоев и упрощение их доработки и изменения.
-
-
-
diff --git a/doc/video5-vcs-git.md b/doc/video5-vcs-git.md
deleted file mode 100644
index 7a172e517bc8..000000000000
--- a/doc/video5-vcs-git.md
+++ /dev/null
@@ -1,180 +0,0 @@
-## Системы управления версиями, Git
-##  [Видео](https://drive.google.com/file/d/1uFjIsxsaSAXxFSwSpjJIGK7Ug2VXf6yH)
-
-video5-vcs-git.md
-
-В этом уроке мы рассмотрим системы управления версиями
-и самую популярную из них - Git.
-
----
-* [StackOverflow 2021 survey](https://insights.stackoverflow.com/survey/2021#technology-most-popular-technologies)
-* [Введение в Git и GitHub: установка и настройка](https://topjava.ru/blog/vvedeniye-v-git-github-ustanovka-i-nastroyka)
-* [Введение в Git и GitHub: базовые команды](https://topjava.ru/blog/vvedeniye-v-git-github-bazovyye-komandy)
-* [Введение в Git и GitHub: ошибки использования](https://topjava.ru/blog/vvedeniye-v-git-oshibki-ispolzovaniya-ch-9)
-* [Бесплатная русскоязычная книга Pro Git](https://git-scm.com/book/ru/v2/)
----
-
-Git является де-факто стандартом среди систем управления версиями.
-Опрос, проведенный StackOverflow в 2021 году показывает,
-что Git используют почти 95% опрошенных разработчиков.
-
-Когда-то популярная централизованная система контроля
-версий SVN (Subversion) практически полностью заменена Git.
-Но некоторые большие проекты все еще используют SVN.
-Примером такого проекта является WordPress.
-Я также все еще иногда встречаю SVN в вакансиях российских компаний.
-
-### Что такое Git и GitHub
-В ходе курса мы будем использовать Git.
-Git - это распределенная система управления версиями.
-Это означает, что код, над которым работает команда,
-и ранее сохраненные (закоммиченные) версии проекта
-хранится на компьютерах каждого члена команды,
-а также в удаленном репозитории, который можно
-сравнить с облачным хранилищем.
-
-Некоторые путают Git и GitHub, но это не одно и то же.
-
-**Git** — это утилита, которую
-программист устанавливает у себя на компьютере для
-сохранения состояний проектов и контроля версий проекта.
-
-**GitHub** — это провайдер удаленных репозиториев,
-сайт (хостинг) для хранения кода проекта и его изменений,
-для обмена файлами с членами команды проекта.
-Программисты могут создавать на GitHub публичные репозитории,
-в которых код доступен всем. Компании могут приобрести платный
-аккаунт на GitHub и вести свои проекты в закрытых репозиториях,
-доступ к которым имеют только члены команды проекта.
-Существуют и другие подобные сайты - провайдеры удаленных
-репозиториев, например, BitBucket, SourceForge, GitLab и т. д.
-
-
-### Как работают Git и GitHub
-
+ * Handling Hibernate lazy-loading
+ *
+ * @link https://github.com/FasterXML/jackson
+ * @link https://github.com/FasterXML/jackson-datatype-hibernate
+ * @link https://github.com/FasterXML/jackson-docs/wiki/JacksonHowToCustomSerializers
+ */
+public class JacksonObjectMapper extends ObjectMapper {
+
+ private static final ObjectMapper MAPPER = new JacksonObjectMapper();
+
+ private JacksonObjectMapper() {
+ registerModule(new Hibernate5Module());
+
+ registerModule(new JavaTimeModule());
+ configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+
+ setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
+ setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
+ setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ }
+
+ public static ObjectMapper getMapper() {
+ return MAPPER;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/ru/javawebinar/topjava/web/json/JsonUtil.java b/src/main/java/ru/javawebinar/topjava/web/json/JsonUtil.java
new file mode 100644
index 000000000000..eb7f05b2eeb8
--- /dev/null
+++ b/src/main/java/ru/javawebinar/topjava/web/json/JsonUtil.java
@@ -0,0 +1,49 @@
+package ru.javawebinar.topjava.web.json;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectReader;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import static ru.javawebinar.topjava.web.json.JacksonObjectMapper.getMapper;
+
+public class JsonUtil {
+
+ public static