From 555e6c91e6fec1b76c008d390e4f6c9d50c15609 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 21 Feb 2017 17:32:43 +0300 Subject: [PATCH 01/92] Prepare to Matrix implementation --- .gitignore | 5 + README.md | 236 ++++++++++++------ pom.xml | 44 ++++ src/main/java/ru/javaops/masterjava/Main.java | 14 ++ .../javaops/masterjava/matrix/MainMatrix.java | 52 ++++ .../javaops/masterjava/matrix/MatrixUtil.java | 61 +++++ .../masterjava/service/MailService.java | 75 ++++++ 7 files changed, 409 insertions(+), 78 deletions(-) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/ru/javaops/masterjava/Main.java create mode 100644 src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java create mode 100644 src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java create mode 100644 src/main/java/ru/javaops/masterjava/service/MailService.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..ad02a2599 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea +out +target +*.iml +log \ No newline at end of file diff --git a/README.md b/README.md index ed139bed8..553a75943 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,161 @@ -#### Написание с нуля полнофункционального многомодульного Maven проекта: -веб приложения (Tomcat, JSP, jQuery), -многопоточного почтового сервиса (JavaMail, java.util.concurrent.*) и вспомогательных модулей связанных по Веб и REST сервисам (SOAP, JAX-WS, Axis, JAX-RS) -c сохранением данных в RMDBS и динамическим конфигурирование модулей по JMX. - -## Сервис-ориентированная архитектура, Микросервисы -- JMS, альтернативы -- Варианты разворачивания сервисов. Работа с базой. Связывание сервисов. - -## Maven. Многомодульный Maven проект -- Build Lifecycle -- Dependency Mechanism -- Зависимости, профили, написание плагина -- The Reactor. Snapshots - -## Создание/тестирование веб-приложения. -- Сборка, запуск, локальный и удаленный debug проекта, способы деплоя в Tomcat -- tomcat7-maven-plugin - -### Веб-сервисы -- Веб-сервисы. SOAP. Преимущества/недостатки веб-сервисов. Расширения. -- Реализация веб-сервисов в Java. JAX-RPC, JAX-WS, CFX, Axis. Стили WSDL -- Создание API и реализации веб-сервиса MailService. -- Деплой и тестирование через SoapUI. - -## Доработка веб-сервиса. Кастомизация WSDL. -- Работа с JAXB. -- Передача по SOAP Exception -- Включение wsdl в сервис для публикации. -- Генерация java кода по WSDL - -## Реализация клиент веб-сервиса. -- Публикация веб сервиса из main(). Дабавление wsdl -- Выделение из wsdl общей части -- Создание клиента почтового сервиса. -- Тестирование с помощью JUnit 4 -- Интеграционное тестирование, maven-failsafe-plugin - -## JAX-WS Handlers -- Logical/protocol handlers. -- Логирование SOAP на стороне клиента. -- Логирование и статистика трафика опубликованного веб-сервиса. -- wsimport binding. -- SoapHandler аутентификация. -Добавляем файлы вложения. Mail-Service. - -## Создаем вложения почты -- Генерация обновленного WSDL через wsgen -- Веб-сервисы: JAX-WS attachment with MTOM -- Тестирование вложений через SoapUi. - -## Загрузка файлов. -- Стандарт MIME. Обрабатываем вложения на форме: commons-fileupload -- Загрузка файла вместе в полями формы. -- Вызов клиента с вложениями. - -## Персистентность. -- NoSQL or RDBMS. Обзор NoSQL систем. CAP -- Обзор Java persistence solution: commons-dbutils, Spring JdbcTemplate, MyBatis, JOOQ, ORM (Hibernate, TopLink, ElipseLink, EBean used in Playframework). JPA. JPA Performance Benchmark -- Работа с базой: создание базы, настройка IDEA Database. -- Работа с DB через DataSource, настройка tomcat. HikariCP -- Настройка работы с DataSource из JUnit. - -## REST веб сервис. -- JAX-RS. Интеграция с Jersey -- Поддержка Json. Jackson - -## Асинхронность. -- @OneWay vs Java Execution framework -- Добавление в клиенте асинхронных вызовов. -- Асинхронные сервлеты 3.x в Tomcat +# Многомодульный maven. Многопоточность. XML. Веб сервисы. Удаленное взаимодействие +## Регистрация +## [Программа проекта](#Программа-проекта) + +### _Разработка полнофункционального многомодульного Maven проекта_ +- веб приложение (Tomcat, Thymleaf, jQuery) +- модуль экспорта из XML (JAXB, StAX) +- многопоточный почтовый сервис (JavaMail, java.util.concurrent.*) +- связь модулей через веб-сервисы (SOAP, JAX-WS) и по REST (JAX-RS) +- сохранение данных в RMDBS (postgresql) +- библиотеки Guava, StreamEx, Lombook, Typesafe config, jDBI + +### Требование к участникам +Опыт программирования на Java. Базовые знания Maven. + +### Необходимое ПО +- JDK8 +- Git +- IntelliJ IDEA + +> Выбирать Ultimate, 30 days trial (работа с JavaScript, Tomcat, JSP). Персональный ключ к Ultimate (на 6 месяцев) выдается на первом занятии. + +# Первое занятие: многопоточность. + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Вступление. Многопоточность и параллельность. +![Concurrent vs Parallel](https://joearms.github.io/images/con_and_par.jpg) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Структура памяти Java. Ленивая инициализация. +> В видео в `LazySingleton` ошибка: должно быть как в коде проекта `instance == null` + +### Структура памяти: куча, стек, permanent/metaspace + - JVM изнутри - оптимизация и профилирование. + - Stack and Heap + - Дополнительно: + - Из каких частей состоит память java процесса. + - Permanent область памяти + - Java thread stack + - Размер Java объектов + +### Ленивая инициализация +- Реализация Singleton в JAVA +- Double checked locking +- Initialization-on-demand holder idiom +- Подводные камни Singleton + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Реализация многопоточности в Java +- Параллелизм в Java +- Монитор (синхронизация) +- Compare-and-swap +- Java Memory Model +- Синхронизация потоков +- Обзор java.util.concurrent.* +- Как работает ConcurrentHashMap +- Справочник по синхронизаторам java.util.concurrent.* +- Использование ThreadLocal переменных +- Николай Алименков — Прикладная многопоточность +- Can thread switching happen in the synchronized block? + +#### Tproger: Многопоточное программирование в Java 8 +- 1. Параллельное выполнение кода с помощью потоков +- 2. Синхронизация доступа к изменяемым объектам +- 3. Атомарные переменные и конкурентные таблицы + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Реализация многопоточной отправки писем. Execution Framework +> правка к видео: `22: completionService.submit(..)` -## Динамическое конфигурирование. JMX -- Maven Groovy cкрптинг. groovy-maven-plugin -- Настройка Tomcat на удаленное администрирование по JMX +### ![](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Все изменения в проекте будут делаться на основе патчей: скачайте [1_1_MailService.patch](https://drive.google.com/open?id=0B9Ye2auQ_NsFTE5ZV3pzWElxTWM), положите его в проект, правой мышкой на нем сделайте Apply Patch ... -## Отправка email в многопоточном приложении -- Initialization on demand holder / Double-checked locking -- java.util.concurrent.*: Executors , Synchronizers, Concurrent Collections, Lock +---------------------------- -## Проблема MemoryLeak. Поиск утечки памяти. +### Ресурсы (основы) +- Intuit, Потоки выполнения. Синхронизация +- Алексей Владыкин, Основы многопоточность в Java +- Виталий Чибриков, Java. Многопоточность +- Computer Science Center, курс Параллельное программирование +- Юрий Ткач, курс Advanced Java - Concurrency +- Головач, курс Java Multithreading + +--- +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Задание первого занятия + +Вычекать этот проект: +```git clone https://github.com/JavaOPs/masterjava.git``` + +- Применить оптимизацию к MatrixUtil.singleThreadMultiply +- Реализовать метод `MatrixUtil.concurrentMultiply`, позволяющий многопоточно перемножать квадратные матрицы N*N. +- Количество дочерних потоков ограничено `MainMatrix.THREAD_NUMBER`. +- Добиться того, чтобы на матрице 1000*1000 многопоточная реализация была быстрее однопоточной + +----- +# Программа проекта + +## Занятие 2 +- Разбор ДЗ (многопоточная реализация умножения матриц) +- Java Microbenchmark JMH (от Алексея Шипилева) +- Обзор Guava +- Формат XML. Создание схемы XSD. +- Работа с XML в Java + - JAXB, JAXP + - StAX + - XPath + - XSLT + +## Занятие 3 +- Разбор ДЗ (работа с XML) +- Обзор StreamEx (от Тагира Валеева) +- Монады. flatMap +- SOA и Микросервисы +- Многомодульный Maven проект + +## Занятие 4 +- Разбор ДЗ (реализация структуры проекта, загрузка и разбор xml) +- Thymleaf +- Maven. Поиск и разрешение конфликтов зависимостей +- Логирование +- Выбор lightweight JDBC helper library. JDBI +- Tomcat Class Loader. Memory Leeks + +## Занятие 5 +- Разбор ДЗ (реализуем модули persist, export и web) +- Конфигурирование приложения (Typesafe config) +- Lombook + +## Занятие 6 +- Разбор ДЗ (доработка модели и модуля export) +- Миграция DB +- Веб-сервисы (REST/SOAP) + - Java реализации SOAP + - Имплементируем Mail Service + +## Занятие 7 +- Разбор ДЗ (реализация MailSender, сохранение результатов отправки) +- Стили WSDL. Кастомизация WSDL +- Публикация кастомизированного WSDL. Автогенерация. +- Деплой в Tomcat +- Создание клиента почтового сервиса + +## Занятие 8 +- Разбор ДЗ (отправка почты через Executor из модуля web) +- Доступ к переменным maven в приложении +- SOAP Exception. Выделение общей части схемы +- Передача двоичных данных в веб-сервисах. MTOM + +## Занятие 9 +- Разбор ДЗ (реализация загрузки и отправки вложений по почте) +- JAX-WS Message Context +- JAX-WS Handlers (логирование SOAP) + +## Занятие 10 +- Разбор ДЗ (реализация авторизации и статистики) +- JavaEE + - CDI + - JAX-RS. Интеграция с Jersey + - EJB + - JMS + +## Занятие 11 (предварительно) +- Асинхронные сервлеты 3.x в Tomcat +- Maven Groovy cкрптинг (groovy-maven-plugin) +- AKKA +- Redis diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..39e811e08 --- /dev/null +++ b/pom.xml @@ -0,0 +1,44 @@ + + 4.0.0 + + ru.javaops + masterjava + jar + + 1.0-SNAPSHOT + + Master Java + https://github.com/JavaOPs/masterjava + + + 1.8 + UTF-8 + UTF-8 + + + + masterjava + install + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + + + + + + + + + + + + + + diff --git a/src/main/java/ru/javaops/masterjava/Main.java b/src/main/java/ru/javaops/masterjava/Main.java new file mode 100644 index 000000000..a849258c4 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/Main.java @@ -0,0 +1,14 @@ +package ru.javaops.masterjava; + +/** + * User: gkislin + * Date: 05.08.2015 + * + * @link http://caloriesmng.herokuapp.com/ + * @link https://github.com/JavaOPs/topjava + */ +public class Main { + public static void main(String[] args) { + System.out.format("Hello MasterJava!"); + } +} diff --git a/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java b/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java new file mode 100644 index 000000000..ec1c8a691 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java @@ -0,0 +1,52 @@ +package ru.javaops.masterjava.matrix; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * gkislin + * 03.07.2016 + */ +public class MainMatrix { + private static final int MATRIX_SIZE = 1000; + private static final int THREAD_NUMBER = 10; + + private final static ExecutorService executor = Executors.newFixedThreadPool(MainMatrix.THREAD_NUMBER); + + public static void main(String[] args) throws ExecutionException, InterruptedException { + final int[][] matrixA = MatrixUtil.create(MATRIX_SIZE); + final int[][] matrixB = MatrixUtil.create(MATRIX_SIZE); + + double singleThreadSum = 0.; + double concurrentThreadSum = 0.; + int count = 1; + while (count < 6) { + System.out.println("Pass " + count); + long start = System.currentTimeMillis(); + final int[][] matrixC = MatrixUtil.singleThreadMultiply(matrixA, matrixB); + double duration = (System.currentTimeMillis() - start) / 1000.; + out("Single thread time, sec: %.3f", duration); + singleThreadSum += duration; + + start = System.currentTimeMillis(); + final int[][] concurrentMatrixC = MatrixUtil.concurrentMultiply(matrixA, matrixB, executor); + duration = (System.currentTimeMillis() - start) / 1000.; + out("Concurrent thread time, sec: %.3f", duration); + concurrentThreadSum += duration; + + if (!MatrixUtil.compare(matrixC, concurrentMatrixC)) { + System.err.println("Comparison failed"); + break; + } + count++; + } + executor.shutdown(); + out("\nAverage single thread time, sec: %.3f", singleThreadSum / 5.); + out("Average concurrent thread time, sec: %.3f", concurrentThreadSum / 5.); + } + + private static void out(String format, double ms) { + System.out.println(String.format(format, ms)); + } +} diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java new file mode 100644 index 000000000..80a344ac2 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java @@ -0,0 +1,61 @@ +package ru.javaops.masterjava.matrix; + +import java.util.Random; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; + +/** + * gkislin + * 03.07.2016 + */ +public class MatrixUtil { + + // TODO implement parallel multiplication matrixA*matrixB + public static int[][] concurrentMultiply(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException { + final int matrixSize = matrixA.length; + final int[][] matrixC = new int[matrixSize][matrixSize]; + + return matrixC; + } + + // TODO optimize by https://habrahabr.ru/post/114797/ + public static int[][] singleThreadMultiply(int[][] matrixA, int[][] matrixB) { + final int matrixSize = matrixA.length; + final int[][] matrixC = new int[matrixSize][matrixSize]; + + for (int i = 0; i < matrixSize; i++) { + for (int j = 0; j < matrixSize; j++) { + int sum = 0; + for (int k = 0; k < matrixSize; k++) { + sum += matrixA[i][k] * matrixB[k][j]; + } + matrixC[i][j] = sum; + } + } + return matrixC; + } + + public static int[][] create(int size) { + int[][] matrix = new int[size][size]; + Random rn = new Random(); + + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + matrix[i][j] = rn.nextInt(10); + } + } + return matrix; + } + + public static boolean compare(int[][] matrixA, int[][] matrixB) { + final int matrixSize = matrixA.length; + for (int i = 0; i < matrixSize; i++) { + for (int j = 0; j < matrixSize; j++) { + if (matrixA[i][j] != matrixB[i][j]) { + return false; + } + } + } + return true; + } +} diff --git a/src/main/java/ru/javaops/masterjava/service/MailService.java b/src/main/java/ru/javaops/masterjava/service/MailService.java new file mode 100644 index 000000000..2b6aeb294 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/service/MailService.java @@ -0,0 +1,75 @@ +package ru.javaops.masterjava.service; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public class MailService { + private static final String OK = "OK"; + + private static final String INTERRUPTED_BY_FAULTS_NUMBER = "+++ Interrupted by faults number"; + private static final String INTERRUPTED_BY_TIMEOUT = "+++ Interrupted by timeout"; + private static final String INTERRUPTED_EXCEPTION = "+++ InterruptedException"; + + public GroupResult sendToList(final String template, final Set emails) throws Exception { + return new GroupResult(0, Collections.emptyList(), null); + } + + + // dummy realization + public MailResult sendToUser(String template, String email) throws Exception { + try { + Thread.sleep(500); //delay + } catch (InterruptedException e) { + // log cancel; + return null; + } + return Math.random() < 0.7 ? MailResult.ok(email) : MailResult.error(email, "Error"); + } + + public static class MailResult { + private final String email; + private final String result; + + private static MailResult ok(String email) { + return new MailResult(email, OK); + } + + private static MailResult error(String email, String error) { + return new MailResult(email, error); + } + + public boolean isOk() { + return OK.equals(result); + } + + private MailResult(String email, String cause) { + this.email = email; + this.result = cause; + } + + @Override + public String toString() { + return '(' + email + ',' + result + ')'; + } + } + + public static class GroupResult { + private final int success; // number of successfully sent email + private final List failed; // failed emails with causes + private final String failedCause; // global fail cause + + public GroupResult(int success, List failed, String failedCause) { + this.success = success; + this.failed = failed; + this.failedCause = failedCause; + } + + @Override + public String toString() { + return "Success: " + success + '\n' + + "Failed: " + failed.toString() + '\n' + + (failedCause == null ? "" : "Failed cause" + failedCause); + } + } +} \ No newline at end of file From a7e872dcfd556758d75487529501d3046c7478ed Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 23 Feb 2017 00:45:35 +0300 Subject: [PATCH 02/92] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 553a75943..c22265384 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ - Maven. Поиск и разрешение конфликтов зависимостей - Логирование - Выбор lightweight JDBC helper library. JDBI -- Tomcat Class Loader. Memory Leeks +- Tomcat Class Loader. Memory Leaks ## Занятие 5 - Разбор ДЗ (реализуем модули persist, export и web) From f769412e77a9d873057b3f5e741d54cdc1a9c376 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 6 Mar 2017 13:00:07 +0300 Subject: [PATCH 03/92] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index c22265384..4d889899d 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,17 @@ - Количество дочерних потоков ограничено `MainMatrix.THREAD_NUMBER`. - Добиться того, чтобы на матрице 1000*1000 многопоточная реализация была быстрее однопоточной +----- +## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Подсказки по HW0 +- не делайте 1000 000 тасок, лучше их сделать крупнее +- у меня разница между 4 и 1000 тасками по времени незаметна, поэтому делайте просто и не делайте сложно +- наконец: можно не считать значение элемента результирующей матрицы C за раз, а накапливать (`concurrentMultiply2`). Мои результаты: +``` +Benchmark (matrixSize) Mode Cnt Score Error Units +MatrixBenchmark.singleThreadMultiplyOpt 1000 ss 100 837,867 ± 25,530 ms/op +MatrixBenchmark.concurrentMultiply 1000 ss 100 394,294 ± 21,657 ms/op +MatrixBenchmark.concurrentMultiply2 1000 ss 100 186,827 ± 11,882 ms/op +``` ----- # Программа проекта From 448df867f52f7b113196e46e746b51a2790ae6de Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 6 Mar 2017 13:09:28 +0300 Subject: [PATCH 04/92] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d889899d..4adb55bfd 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ - Добиться того, чтобы на матрице 1000*1000 многопоточная реализация была быстрее однопоточной ----- -## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Подсказки по HW0 +## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Подсказки по HW1 - не делайте 1000 000 тасок, лучше их сделать крупнее - у меня разница между 4 и 1000 тасками по времени незаметна, поэтому делайте просто и не делайте сложно - наконец: можно не считать значение элемента результирующей матрицы C за раз, а накапливать (`concurrentMultiply2`). Мои результаты: From 7a21ed257c40df5ec6f3cd87d37f3b8084cef5a9 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 6 Mar 2017 20:11:10 +0300 Subject: [PATCH 05/92] Initial --- .gitignore | 5 ++ README.md | 8 ++ pom.xml | 44 +++++++++++ src/main/java/ru/javaops/masterjava/Main.java | 14 ++++ .../javaops/masterjava/matrix/MainMatrix.java | 52 +++++++++++++ .../javaops/masterjava/matrix/MatrixUtil.java | 61 +++++++++++++++ .../masterjava/service/MailService.java | 75 +++++++++++++++++++ 7 files changed, 259 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 pom.xml create mode 100644 src/main/java/ru/javaops/masterjava/Main.java create mode 100644 src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java create mode 100644 src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java create mode 100644 src/main/java/ru/javaops/masterjava/service/MailService.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..ad02a2599 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea +out +target +*.iml +log \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..da20d2301 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +## Разработка полнофункционального многомодульного Maven проекта + +- веб приложение (Tomcat, JSP, jQuery), +- многопоточный почтовый сервиса (JavaMail, java.util.concurrent.*) +- вспомогательные модули, связанных по веб-сервисам (SOAP, JAX-WS, Axis) и по REST (JAX-RS) +- сохранение данных в RMDBS и динамическое конфигурирование модулей по JMX. + +## Описание проекта diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..39e811e08 --- /dev/null +++ b/pom.xml @@ -0,0 +1,44 @@ + + 4.0.0 + + ru.javaops + masterjava + jar + + 1.0-SNAPSHOT + + Master Java + https://github.com/JavaOPs/masterjava + + + 1.8 + UTF-8 + UTF-8 + + + + masterjava + install + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + + + + + + + + + + + + + + diff --git a/src/main/java/ru/javaops/masterjava/Main.java b/src/main/java/ru/javaops/masterjava/Main.java new file mode 100644 index 000000000..a849258c4 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/Main.java @@ -0,0 +1,14 @@ +package ru.javaops.masterjava; + +/** + * User: gkislin + * Date: 05.08.2015 + * + * @link http://caloriesmng.herokuapp.com/ + * @link https://github.com/JavaOPs/topjava + */ +public class Main { + public static void main(String[] args) { + System.out.format("Hello MasterJava!"); + } +} diff --git a/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java b/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java new file mode 100644 index 000000000..ec1c8a691 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java @@ -0,0 +1,52 @@ +package ru.javaops.masterjava.matrix; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * gkislin + * 03.07.2016 + */ +public class MainMatrix { + private static final int MATRIX_SIZE = 1000; + private static final int THREAD_NUMBER = 10; + + private final static ExecutorService executor = Executors.newFixedThreadPool(MainMatrix.THREAD_NUMBER); + + public static void main(String[] args) throws ExecutionException, InterruptedException { + final int[][] matrixA = MatrixUtil.create(MATRIX_SIZE); + final int[][] matrixB = MatrixUtil.create(MATRIX_SIZE); + + double singleThreadSum = 0.; + double concurrentThreadSum = 0.; + int count = 1; + while (count < 6) { + System.out.println("Pass " + count); + long start = System.currentTimeMillis(); + final int[][] matrixC = MatrixUtil.singleThreadMultiply(matrixA, matrixB); + double duration = (System.currentTimeMillis() - start) / 1000.; + out("Single thread time, sec: %.3f", duration); + singleThreadSum += duration; + + start = System.currentTimeMillis(); + final int[][] concurrentMatrixC = MatrixUtil.concurrentMultiply(matrixA, matrixB, executor); + duration = (System.currentTimeMillis() - start) / 1000.; + out("Concurrent thread time, sec: %.3f", duration); + concurrentThreadSum += duration; + + if (!MatrixUtil.compare(matrixC, concurrentMatrixC)) { + System.err.println("Comparison failed"); + break; + } + count++; + } + executor.shutdown(); + out("\nAverage single thread time, sec: %.3f", singleThreadSum / 5.); + out("Average concurrent thread time, sec: %.3f", concurrentThreadSum / 5.); + } + + private static void out(String format, double ms) { + System.out.println(String.format(format, ms)); + } +} diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java new file mode 100644 index 000000000..80a344ac2 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java @@ -0,0 +1,61 @@ +package ru.javaops.masterjava.matrix; + +import java.util.Random; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; + +/** + * gkislin + * 03.07.2016 + */ +public class MatrixUtil { + + // TODO implement parallel multiplication matrixA*matrixB + public static int[][] concurrentMultiply(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException { + final int matrixSize = matrixA.length; + final int[][] matrixC = new int[matrixSize][matrixSize]; + + return matrixC; + } + + // TODO optimize by https://habrahabr.ru/post/114797/ + public static int[][] singleThreadMultiply(int[][] matrixA, int[][] matrixB) { + final int matrixSize = matrixA.length; + final int[][] matrixC = new int[matrixSize][matrixSize]; + + for (int i = 0; i < matrixSize; i++) { + for (int j = 0; j < matrixSize; j++) { + int sum = 0; + for (int k = 0; k < matrixSize; k++) { + sum += matrixA[i][k] * matrixB[k][j]; + } + matrixC[i][j] = sum; + } + } + return matrixC; + } + + public static int[][] create(int size) { + int[][] matrix = new int[size][size]; + Random rn = new Random(); + + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + matrix[i][j] = rn.nextInt(10); + } + } + return matrix; + } + + public static boolean compare(int[][] matrixA, int[][] matrixB) { + final int matrixSize = matrixA.length; + for (int i = 0; i < matrixSize; i++) { + for (int j = 0; j < matrixSize; j++) { + if (matrixA[i][j] != matrixB[i][j]) { + return false; + } + } + } + return true; + } +} diff --git a/src/main/java/ru/javaops/masterjava/service/MailService.java b/src/main/java/ru/javaops/masterjava/service/MailService.java new file mode 100644 index 000000000..2b6aeb294 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/service/MailService.java @@ -0,0 +1,75 @@ +package ru.javaops.masterjava.service; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public class MailService { + private static final String OK = "OK"; + + private static final String INTERRUPTED_BY_FAULTS_NUMBER = "+++ Interrupted by faults number"; + private static final String INTERRUPTED_BY_TIMEOUT = "+++ Interrupted by timeout"; + private static final String INTERRUPTED_EXCEPTION = "+++ InterruptedException"; + + public GroupResult sendToList(final String template, final Set emails) throws Exception { + return new GroupResult(0, Collections.emptyList(), null); + } + + + // dummy realization + public MailResult sendToUser(String template, String email) throws Exception { + try { + Thread.sleep(500); //delay + } catch (InterruptedException e) { + // log cancel; + return null; + } + return Math.random() < 0.7 ? MailResult.ok(email) : MailResult.error(email, "Error"); + } + + public static class MailResult { + private final String email; + private final String result; + + private static MailResult ok(String email) { + return new MailResult(email, OK); + } + + private static MailResult error(String email, String error) { + return new MailResult(email, error); + } + + public boolean isOk() { + return OK.equals(result); + } + + private MailResult(String email, String cause) { + this.email = email; + this.result = cause; + } + + @Override + public String toString() { + return '(' + email + ',' + result + ')'; + } + } + + public static class GroupResult { + private final int success; // number of successfully sent email + private final List failed; // failed emails with causes + private final String failedCause; // global fail cause + + public GroupResult(int success, List failed, String failedCause) { + this.success = success; + this.failed = failed; + this.failedCause = failedCause; + } + + @Override + public String toString() { + return "Success: " + success + '\n' + + "Failed: " + failed.toString() + '\n' + + (failedCause == null ? "" : "Failed cause" + failedCause); + } + } +} \ No newline at end of file From 2306fbe9700d2df86b864a80a1a97f92f61d8324 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 6 Mar 2017 20:12:45 +0300 Subject: [PATCH 06/92] 1_1_MailService --- .../masterjava/service/MailService.java | 72 ++++++++++++++++++- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/javaops/masterjava/service/MailService.java b/src/main/java/ru/javaops/masterjava/service/MailService.java index 2b6aeb294..cef46e55e 100644 --- a/src/main/java/ru/javaops/masterjava/service/MailService.java +++ b/src/main/java/ru/javaops/masterjava/service/MailService.java @@ -1,8 +1,10 @@ package ru.javaops.masterjava.service; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.concurrent.*; +import java.util.stream.Collectors; public class MailService { private static final String OK = "OK"; @@ -11,10 +13,74 @@ public class MailService { private static final String INTERRUPTED_BY_TIMEOUT = "+++ Interrupted by timeout"; private static final String INTERRUPTED_EXCEPTION = "+++ InterruptedException"; + private final ExecutorService mailExecutor = Executors.newFixedThreadPool(8); + public GroupResult sendToList(final String template, final Set emails) throws Exception { - return new GroupResult(0, Collections.emptyList(), null); - } + final CompletionService completionService = new ExecutorCompletionService<>(mailExecutor); + + List> futures = emails.stream() + .map(email -> completionService.submit(() -> sendToUser(template, email))) + .collect(Collectors.toList()); + return new Callable() { + private int success = 0; + private List failed = new ArrayList<>(); + + @Override + public GroupResult call() { + while (!futures.isEmpty()) { + try { + Future future = completionService.poll(10, TimeUnit.SECONDS); + if (future == null) { + return cancelWithFail(INTERRUPTED_BY_TIMEOUT); + } + futures.remove(future); + MailResult mailResult = future.get(); + if (mailResult.isOk()) { + success++; + } else { + failed.add(mailResult); + if (failed.size() >= 5) { + return cancelWithFail(INTERRUPTED_BY_FAULTS_NUMBER); + } + } + } catch (ExecutionException e) { + return cancelWithFail(e.getCause().toString()); + } catch (InterruptedException e) { + return cancelWithFail(INTERRUPTED_EXCEPTION); + } + } +/* + for (Future future : futures) { + MailResult mailResult; + try { + mailResult = future.get(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + return cancelWithFail(INTERRUPTED_EXCEPTION); + } catch (ExecutionException e) { + return cancelWithFail(e.getCause().toString()); + } catch (TimeoutException e) { + return cancelWithFail(INTERRUPTED_BY_TIMEOUT); + } + if (mailResult.isOk()) { + success++; + } else { + failed.add(mailResult); + if (failed.size() >= 5) { + return cancelWithFail(INTERRUPTED_BY_FAULTS_NUMBER); + } + } + } +*/ + return new GroupResult(success, failed, null); + } + + private GroupResult cancelWithFail(String cause) { + futures.forEach(f -> f.cancel(true)); + return new GroupResult(success, failed, cause); + } + }.call(); + } // dummy realization public MailResult sendToUser(String template, String email) throws Exception { From f915f4e0ad37c3bf89ffb92fbd30ca8d68f620a0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 6 Mar 2017 23:41:32 +0300 Subject: [PATCH 07/92] 2_1_HW1_singleThreadMultiplyOpt --- .../javaops/masterjava/matrix/MainMatrix.java | 2 +- .../javaops/masterjava/matrix/MatrixUtil.java | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java b/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java index ec1c8a691..0695132ef 100644 --- a/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java +++ b/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java @@ -24,7 +24,7 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc while (count < 6) { System.out.println("Pass " + count); long start = System.currentTimeMillis(); - final int[][] matrixC = MatrixUtil.singleThreadMultiply(matrixA, matrixB); + final int[][] matrixC = MatrixUtil.singleThreadMultiplyOpt(matrixA, matrixB); double duration = (System.currentTimeMillis() - start) / 1000.; out("Single thread time, sec: %.3f", duration); singleThreadSum += duration; diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java index 80a344ac2..64cfdbe81 100644 --- a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java +++ b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java @@ -18,18 +18,24 @@ public static int[][] concurrentMultiply(int[][] matrixA, int[][] matrixB, Execu return matrixC; } - // TODO optimize by https://habrahabr.ru/post/114797/ - public static int[][] singleThreadMultiply(int[][] matrixA, int[][] matrixB) { + // Optimized by https://habrahabr.ru/post/114797/ + public static int[][] singleThreadMultiplyOpt(int[][] matrixA, int[][] matrixB) { final int matrixSize = matrixA.length; final int[][] matrixC = new int[matrixSize][matrixSize]; - for (int i = 0; i < matrixSize; i++) { - for (int j = 0; j < matrixSize; j++) { + for (int col = 0; col < matrixSize; col++) { + final int[] columnB = new int[matrixSize]; + for (int k = 0; k < matrixSize; k++) { + columnB[k] = matrixB[k][col]; + } + + for (int row = 0; row < matrixSize; row++) { int sum = 0; + final int[] rowA = matrixA[row]; for (int k = 0; k < matrixSize; k++) { - sum += matrixA[i][k] * matrixB[k][j]; + sum += rowA[k] * columnB[k]; } - matrixC[i][j] = sum; + matrixC[row][col] = sum; } } return matrixC; From eec4d43d042db2f1ef313d9cacb2c5d7d566a1e4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 6 Mar 2017 23:49:27 +0300 Subject: [PATCH 08/92] 2_2_HW1_concurrentMultiply --- .../javaops/masterjava/matrix/MatrixUtil.java | 153 +++++++++++++++++- 1 file changed, 148 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java index 64cfdbe81..46fd00ede 100644 --- a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java +++ b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java @@ -1,8 +1,9 @@ package ru.javaops.masterjava.matrix; -import java.util.Random; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * gkislin @@ -10,11 +11,153 @@ */ public class MatrixUtil { - // TODO implement parallel multiplication matrixA*matrixB public static int[][] concurrentMultiply(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException { final int matrixSize = matrixA.length; final int[][] matrixC = new int[matrixSize][matrixSize]; + class ColumnMultipleResult { + private final int col; + private final int[] columnC; + + private ColumnMultipleResult(int col, int[] columnC) { + this.col = col; + this.columnC = columnC; + } + } + + final CompletionService completionService = new ExecutorCompletionService<>(executor); + + for (int j = 0; j < matrixSize; j++) { + final int col = j; + final int[] columnB = new int[matrixSize]; + for (int k = 0; k < matrixSize; k++) { + columnB[k] = matrixB[k][col]; + } + completionService.submit(() -> { + final int[] columnC = new int[matrixSize]; + + for (int row = 0; row < matrixSize; row++) { + final int[] rowA = matrixA[row]; + int sum = 0; + for (int k = 0; k < matrixSize; k++) { + sum += rowA[k] * columnB[k]; + } + columnC[row] = sum; + } + return new ColumnMultipleResult(col, columnC); + }); + } + + for (int i = 0; i < matrixSize; i++) { + ColumnMultipleResult res = completionService.take().get(); + for (int k = 0; k < matrixSize; k++) { + matrixC[k][res.col] = res.columnC[k]; + } + } + return matrixC; + } + + public static int[][] concurrentMultiplyCayman(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException { + final int matrixSize = matrixA.length; + final int[][] matrixResult = new int[matrixSize][matrixSize]; + final int threadCount = Runtime.getRuntime().availableProcessors(); + final int maxIndex = matrixSize * matrixSize; + final int cellsInThread = maxIndex / threadCount; + final int[][] matrixBFinal = new int[matrixSize][matrixSize]; + + for (int i = 0; i < matrixSize; i++) { + for (int j = 0; j < matrixSize; j++) { + matrixBFinal[i][j] = matrixB[j][i]; + } + } + + Set> threads = new HashSet<>(); + int fromIndex = 0; + for (int i = 1; i <= threadCount; i++) { + final int toIndex = i == threadCount ? maxIndex : fromIndex + cellsInThread; + final int firstIndexFinal = fromIndex; + threads.add(() -> { + for (int j = firstIndexFinal; j < toIndex; j++) { + final int row = j / matrixSize; + final int col = j % matrixSize; + + int sum = 0; + for (int k = 0; k < matrixSize; k++) { + sum += matrixA[row][k] * matrixBFinal[col][k]; + } + matrixResult[row][col] = sum; + } + return true; + }); + fromIndex = toIndex; + } + executor.invokeAll(threads); + return matrixResult; + } + + public static int[][] concurrentMultiplyDarthVader(int[][] matrixA, int[][] matrixB, ExecutorService executor) + throws InterruptedException, ExecutionException { + + final int matrixSize = matrixA.length; + final int[][] matrixC = new int[matrixSize][matrixSize]; + + List> tasks = IntStream.range(0, matrixSize) + .parallel() + .mapToObj(i -> new Callable() { + private final int[] tempColumn = new int[matrixSize]; + + @Override + public Void call() throws Exception { + for (int c = 0; c < matrixSize; c++) { + tempColumn[c] = matrixB[c][i]; + } + for (int j = 0; j < matrixSize; j++) { + int row[] = matrixA[j]; + int sum = 0; + for (int k = 0; k < matrixSize; k++) { + sum += tempColumn[k] * row[k]; + } + matrixC[j][i] = sum; + } + return null; + } + }) + .collect(Collectors.toList()); + + executor.invokeAll(tasks); + return matrixC; + } + + public static int[][] concurrentMultiply2(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException { + final int matrixSize = matrixA.length; + final int[][] matrixC = new int[matrixSize][]; + + final int[][] matrixBT = new int[matrixSize][matrixSize]; + for (int i = 0; i < matrixSize; i++) { + for (int j = 0; j < matrixSize; j++) { + matrixBT[i][j] = matrixB[j][i]; + } + } + + List> tasks = new ArrayList<>(matrixSize); + for (int j = 0; j < matrixSize; j++) { + final int row = j; + tasks.add(() -> { + final int[] rowC = new int[matrixSize]; + for (int col = 0; col < matrixSize; col++) { + final int[] rowA = matrixA[row]; + final int[] columnB = matrixBT[col]; + int sum = 0; + for (int k = 0; k < matrixSize; k++) { + sum += rowA[k] * columnB[k]; + } + rowC[col] = sum; + } + matrixC[row] = rowC; + return null; + }); + } + executor.invokeAll(tasks); return matrixC; } @@ -64,4 +207,4 @@ public static boolean compare(int[][] matrixA, int[][] matrixB) { } return true; } -} +} \ No newline at end of file From 71e338fe77986d52eb4c8ed5f39b375dbefd3ec3 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 6 Mar 2017 23:58:36 +0300 Subject: [PATCH 09/92] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4adb55bfd..de162e88f 100644 --- a/README.md +++ b/README.md @@ -91,12 +91,12 @@ ## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Подсказки по HW1 - не делайте 1000 000 тасок, лучше их сделать крупнее - у меня разница между 4 и 1000 тасками по времени незаметна, поэтому делайте просто и не делайте сложно -- наконец: можно не считать значение элемента результирующей матрицы C за раз, а накапливать (`concurrentMultiply2`). Мои результаты: +- наконец: можно не считать значение элемента результирующей матрицы C за раз, а накапливать (`concurrentMultiply3`). Мои результаты: ``` Benchmark (matrixSize) Mode Cnt Score Error Units MatrixBenchmark.singleThreadMultiplyOpt 1000 ss 100 837,867 ± 25,530 ms/op -MatrixBenchmark.concurrentMultiply 1000 ss 100 394,294 ± 21,657 ms/op -MatrixBenchmark.concurrentMultiply2 1000 ss 100 186,827 ± 11,882 ms/op +MatrixBenchmark.concurrentMultiply2 1000 ss 100 394,294 ± 21,657 ms/op +MatrixBenchmark.concurrentMultiply3 1000 ss 100 186,827 ± 11,882 ms/op ``` ----- # Программа проекта From 8ab15a29bbc63d616962a4b168c3b94d4e97e673 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 7 Mar 2017 00:15:16 +0300 Subject: [PATCH 10/92] 2_3_HW1_concurrentMultiply3 --- .../javaops/masterjava/matrix/MainMatrix.java | 2 +- .../javaops/masterjava/matrix/MatrixUtil.java | 120 +++++------------- 2 files changed, 33 insertions(+), 89 deletions(-) diff --git a/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java b/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java index 0695132ef..4f30e499a 100644 --- a/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java +++ b/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java @@ -30,7 +30,7 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc singleThreadSum += duration; start = System.currentTimeMillis(); - final int[][] concurrentMatrixC = MatrixUtil.concurrentMultiply(matrixA, matrixB, executor); + final int[][] concurrentMatrixC = MatrixUtil.concurrentMultiply2(matrixA, matrixB, executor); duration = (System.currentTimeMillis() - start) / 1000.; out("Concurrent thread time, sec: %.3f", duration); concurrentThreadSum += duration; diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java index 46fd00ede..39f077898 100644 --- a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java +++ b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java @@ -1,7 +1,12 @@ package ru.javaops.masterjava.matrix; -import java.util.*; -import java.util.concurrent.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -11,91 +16,7 @@ */ public class MatrixUtil { - public static int[][] concurrentMultiply(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException { - final int matrixSize = matrixA.length; - final int[][] matrixC = new int[matrixSize][matrixSize]; - - class ColumnMultipleResult { - private final int col; - private final int[] columnC; - - private ColumnMultipleResult(int col, int[] columnC) { - this.col = col; - this.columnC = columnC; - } - } - - final CompletionService completionService = new ExecutorCompletionService<>(executor); - - for (int j = 0; j < matrixSize; j++) { - final int col = j; - final int[] columnB = new int[matrixSize]; - for (int k = 0; k < matrixSize; k++) { - columnB[k] = matrixB[k][col]; - } - completionService.submit(() -> { - final int[] columnC = new int[matrixSize]; - - for (int row = 0; row < matrixSize; row++) { - final int[] rowA = matrixA[row]; - int sum = 0; - for (int k = 0; k < matrixSize; k++) { - sum += rowA[k] * columnB[k]; - } - columnC[row] = sum; - } - return new ColumnMultipleResult(col, columnC); - }); - } - - for (int i = 0; i < matrixSize; i++) { - ColumnMultipleResult res = completionService.take().get(); - for (int k = 0; k < matrixSize; k++) { - matrixC[k][res.col] = res.columnC[k]; - } - } - return matrixC; - } - - public static int[][] concurrentMultiplyCayman(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException { - final int matrixSize = matrixA.length; - final int[][] matrixResult = new int[matrixSize][matrixSize]; - final int threadCount = Runtime.getRuntime().availableProcessors(); - final int maxIndex = matrixSize * matrixSize; - final int cellsInThread = maxIndex / threadCount; - final int[][] matrixBFinal = new int[matrixSize][matrixSize]; - - for (int i = 0; i < matrixSize; i++) { - for (int j = 0; j < matrixSize; j++) { - matrixBFinal[i][j] = matrixB[j][i]; - } - } - - Set> threads = new HashSet<>(); - int fromIndex = 0; - for (int i = 1; i <= threadCount; i++) { - final int toIndex = i == threadCount ? maxIndex : fromIndex + cellsInThread; - final int firstIndexFinal = fromIndex; - threads.add(() -> { - for (int j = firstIndexFinal; j < toIndex; j++) { - final int row = j / matrixSize; - final int col = j % matrixSize; - - int sum = 0; - for (int k = 0; k < matrixSize; k++) { - sum += matrixA[row][k] * matrixBFinal[col][k]; - } - matrixResult[row][col] = sum; - } - return true; - }); - fromIndex = toIndex; - } - executor.invokeAll(threads); - return matrixResult; - } - - public static int[][] concurrentMultiplyDarthVader(int[][] matrixA, int[][] matrixB, ExecutorService executor) + public static int[][] concurrentMultiplyStreams(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException { final int matrixSize = matrixA.length; @@ -161,7 +82,30 @@ public static int[][] concurrentMultiply2(int[][] matrixA, int[][] matrixB, Exec return matrixC; } - // Optimized by https://habrahabr.ru/post/114797/ + public static int[][] concurrentMultiply3(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException { + final int matrixSize = matrixA.length; + final int[][] matrixC = new int[matrixSize][matrixSize]; + final CountDownLatch latch = new CountDownLatch(matrixSize); + + for (int row = 0; row < matrixSize; row++) { + final int[] rowA = matrixA[row]; + final int[] rowC = matrixC[row]; + + executor.submit(() -> { + for (int idx = 0; idx < matrixSize; idx++) { + final int elA = rowA[idx]; + final int[] rowB = matrixB[idx]; + for (int col = 0; col < matrixSize; col++) { + rowC[col] += elA * rowB[col]; + } + } + latch.countDown(); + }); + } + latch.await(); + return matrixC; + } + public static int[][] singleThreadMultiplyOpt(int[][] matrixA, int[][] matrixB) { final int matrixSize = matrixA.length; final int[][] matrixC = new int[matrixSize][matrixSize]; From 7276143ff7659291d5564372eb9ecc7e8025ce56 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 7 Mar 2017 00:26:48 +0300 Subject: [PATCH 11/92] 2_4_JMH_Benchmark --- pom.xml | 11 ++++ .../masterjava/matrix/MatrixBenchmark.java | 62 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java diff --git a/pom.xml b/pom.xml index 39e811e08..a3cb2d7b2 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,17 @@ + + org.openjdk.jmh + jmh-core + RELEASE + + + org.openjdk.jmh + jmh-generator-annprocess + RELEASE + provided + diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java b/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java new file mode 100644 index 000000000..6c056aacc --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java @@ -0,0 +1,62 @@ +package ru.javaops.masterjava.matrix; + +import org.openjdk.jmh.annotations.*; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +/** + * gkislin + * 23.09.2016 + */ +@Warmup(iterations = 10) +@Measurement(iterations = 10) +@BenchmarkMode({Mode.SingleShotTime}) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +@Threads(1) +@Fork(1) +@Timeout(time = 5, timeUnit = TimeUnit.MINUTES) +public class MatrixBenchmark { + // Matrix size + @Param({"100", "1000"}) + private int matrixSize; + + private static final int THREAD_NUMBER = 10; + private final static ExecutorService executor = Executors.newFixedThreadPool(THREAD_NUMBER); + + private static int[][] matrixA; + private static int[][] matrixB; + + @Setup + public void setUp() { + matrixA = MatrixUtil.create(matrixSize); + matrixB = MatrixUtil.create(matrixSize); + } + + @Benchmark + public int[][] singleThreadMultiplyOpt() throws Exception { + return MatrixUtil.singleThreadMultiplyOpt(matrixA, matrixB); + } + + @Benchmark + public int[][] concurrentMultiplyStreams() throws Exception { + return MatrixUtil.concurrentMultiplyStreams(matrixA, matrixB, executor); + } + + @Benchmark + public int[][] concurrentMultiply2() throws Exception { + return MatrixUtil.concurrentMultiply2(matrixA, matrixB, executor); + } + + @Benchmark + public int[][] concurrentMultiply3() throws Exception { + return MatrixUtil.concurrentMultiply3(matrixA, matrixB, executor); + } + + @TearDown + public void tearDown() { + executor.shutdown(); + } +} From d84552761acfb7689b4ee00e39b3844676a1c9bd Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 7 Mar 2017 00:50:34 +0300 Subject: [PATCH 12/92] 2_5_JMH_main_jar --- pom.xml | 35 +++++++++++++++++++ .../masterjava/matrix/MatrixBenchmark.java | 23 +++++++++--- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index a3cb2d7b2..2dbccb332 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,41 @@ ${java.version} + + org.apache.maven.plugins + maven-shade-plugin + 2.2 + + + package + + shade + + + benchmarks + + + org.openjdk.jmh.Main + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java b/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java index 6c056aacc..80f1558ea 100644 --- a/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java +++ b/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java @@ -1,6 +1,11 @@ package ru.javaops.masterjava.matrix; import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; +import org.openjdk.jmh.runner.options.TimeValue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -16,11 +21,11 @@ @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @Threads(1) -@Fork(1) +@Fork(10) @Timeout(time = 5, timeUnit = TimeUnit.MINUTES) public class MatrixBenchmark { // Matrix size - @Param({"100", "1000"}) + @Param({"1000"}) private int matrixSize; private static final int THREAD_NUMBER = 10; @@ -35,12 +40,22 @@ public void setUp() { matrixB = MatrixUtil.create(matrixSize); } - @Benchmark + public static void main(String[] args) throws RunnerException { + Options options = new OptionsBuilder() + .include(MatrixBenchmark.class.getSimpleName()) + .threads(1) + .forks(10) + .timeout(TimeValue.minutes(5)) + .build(); + new Runner(options).run(); + } + +// @Benchmark public int[][] singleThreadMultiplyOpt() throws Exception { return MatrixUtil.singleThreadMultiplyOpt(matrixA, matrixB); } - @Benchmark +// @Benchmark public int[][] concurrentMultiplyStreams() throws Exception { return MatrixUtil.concurrentMultiplyStreams(matrixA, matrixB, executor); } From a17de954da09fcc2c8968846571238e87499ec25 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 7 Mar 2017 00:51:55 +0300 Subject: [PATCH 13/92] 2_6_xml_scheme --- .../masterjava/xml/schema/CityType.java | 94 +++++++ .../masterjava/xml/schema/FlagType.java | 54 ++++ .../masterjava/xml/schema/ObjectFactory.java | 85 +++++++ .../masterjava/xml/schema/Payload.java | 233 ++++++++++++++++++ .../javaops/masterjava/xml/schema/User.java | 151 ++++++++++++ src/main/resources/payload.xsd | 56 +++++ src/test/resources/payload.xml | 23 ++ 7 files changed, 696 insertions(+) create mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/CityType.java create mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java create mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java create mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/Payload.java create mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/User.java create mode 100644 src/main/resources/payload.xsd create mode 100644 src/test/resources/payload.xml diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java b/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java new file mode 100644 index 000000000..029e352cb --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java @@ -0,0 +1,94 @@ + +package ru.javaops.masterjava.xml.schema; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.XmlValue; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for cityType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="cityType">
+ *   <simpleContent>
+ *     <extension base="<http://www.w3.org/2001/XMLSchema>string">
+ *       <attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *     </extension>
+ *   </simpleContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "cityType", namespace = "http://javaops.ru", propOrder = { + "value" +}) +public class CityType { + + @XmlValue + protected String value; + @XmlAttribute(name = "id", required = true) + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the value property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getValue() { + return value; + } + + /** + * Sets the value of the value property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setValue(String value) { + this.value = value; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java b/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java new file mode 100644 index 000000000..eda39fa9a --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java @@ -0,0 +1,54 @@ + +package ru.javaops.masterjava.xml.schema; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for flagType. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="flagType">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}string">
+ *     <enumeration value="active"/>
+ *     <enumeration value="deleted"/>
+ *     <enumeration value="superuser"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "flagType", namespace = "http://javaops.ru") +@XmlEnum +public enum FlagType { + + @XmlEnumValue("active") + ACTIVE("active"), + @XmlEnumValue("deleted") + DELETED("deleted"), + @XmlEnumValue("superuser") + SUPERUSER("superuser"); + private final String value; + + FlagType(String v) { + value = v; + } + + public String value() { + return value; + } + + public static FlagType fromValue(String v) { + for (FlagType c: FlagType.values()) { + if (c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } + +} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java b/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java new file mode 100644 index 000000000..e8f105e2a --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java @@ -0,0 +1,85 @@ + +package ru.javaops.masterjava.xml.schema; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlElementDecl; +import javax.xml.bind.annotation.XmlRegistry; +import javax.xml.namespace.QName; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the ru.javaops.masterjava.xml.schema package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + private final static QName _City_QNAME = new QName("http://javaops.ru", "City"); + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: ru.javaops.masterjava.xml.schema + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link Payload } + * + */ + public Payload createPayload() { + return new Payload(); + } + + /** + * Create an instance of {@link User } + * + */ + public User createUser() { + return new User(); + } + + /** + * Create an instance of {@link Payload.Cities } + * + */ + public Payload.Cities createPayloadCities() { + return new Payload.Cities(); + } + + /** + * Create an instance of {@link Payload.Users } + * + */ + public Payload.Users createPayloadUsers() { + return new Payload.Users(); + } + + /** + * Create an instance of {@link CityType } + * + */ + public CityType createCityType() { + return new CityType(); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CityType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://javaops.ru", name = "City") + public JAXBElement createCity(CityType value) { + return new JAXBElement(_City_QNAME, CityType.class, null, value); + } + +} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java b/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java new file mode 100644 index 000000000..2a6276490 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java @@ -0,0 +1,233 @@ + +package ru.javaops.masterjava.xml.schema; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <all>
+ *         <element name="Cities">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <sequence maxOccurs="unbounded">
+ *                   <element ref="{http://javaops.ru}City"/>
+ *                 </sequence>
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *         <element name="Users">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <sequence maxOccurs="unbounded" minOccurs="0">
+ *                   <element ref="{http://javaops.ru}User"/>
+ *                 </sequence>
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *       </all>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + +}) +@XmlRootElement(name = "Payload", namespace = "http://javaops.ru") +public class Payload { + + @XmlElement(name = "Cities", namespace = "http://javaops.ru", required = true) + protected Payload.Cities cities; + @XmlElement(name = "Users", namespace = "http://javaops.ru", required = true) + protected Payload.Users users; + + /** + * Gets the value of the cities property. + * + * @return + * possible object is + * {@link Payload.Cities } + * + */ + public Payload.Cities getCities() { + return cities; + } + + /** + * Sets the value of the cities property. + * + * @param value + * allowed object is + * {@link Payload.Cities } + * + */ + public void setCities(Payload.Cities value) { + this.cities = value; + } + + /** + * Gets the value of the users property. + * + * @return + * possible object is + * {@link Payload.Users } + * + */ + public Payload.Users getUsers() { + return users; + } + + /** + * Sets the value of the users property. + * + * @param value + * allowed object is + * {@link Payload.Users } + * + */ + public void setUsers(Payload.Users value) { + this.users = value; + } + + + /** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+     * <complexType>
+     *   <complexContent>
+     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *       <sequence maxOccurs="unbounded">
+     *         <element ref="{http://javaops.ru}City"/>
+     *       </sequence>
+     *     </restriction>
+     *   </complexContent>
+     * </complexType>
+     * 
+ * + * + */ + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "", propOrder = { + "city" + }) + public static class Cities { + + @XmlElement(name = "City", namespace = "http://javaops.ru", required = true) + protected List city; + + /** + * Gets the value of the city property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the city property. + * + *

+ * For example, to add a new item, do as follows: + *

+         *    getCity().add(newItem);
+         * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link CityType } + * + * + */ + public List getCity() { + if (city == null) { + city = new ArrayList(); + } + return this.city; + } + + } + + + /** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+     * <complexType>
+     *   <complexContent>
+     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *       <sequence maxOccurs="unbounded" minOccurs="0">
+     *         <element ref="{http://javaops.ru}User"/>
+     *       </sequence>
+     *     </restriction>
+     *   </complexContent>
+     * </complexType>
+     * 
+ * + * + */ + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "", propOrder = { + "user" + }) + public static class Users { + + @XmlElement(name = "User", namespace = "http://javaops.ru") + protected List user; + + /** + * Gets the value of the user property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the user property. + * + *

+ * For example, to add a new item, do as follows: + *

+         *    getUser().add(newItem);
+         * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link User } + * + * + */ + public List getUser() { + if (user == null) { + user = new ArrayList(); + } + return this.user; + } + + } + +} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/User.java b/src/main/java/ru/javaops/masterjava/xml/schema/User.java new file mode 100644 index 000000000..b3430ce71 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/schema/User.java @@ -0,0 +1,151 @@ + +package ru.javaops.masterjava.xml.schema; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlIDREF; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="email" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="fullName" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *       </sequence>
+ *       <attribute name="flag" use="required" type="{http://javaops.ru}flagType" />
+ *       <attribute name="city" use="required" type="{http://www.w3.org/2001/XMLSchema}IDREF" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "email", + "fullName" +}) +@XmlRootElement(name = "User", namespace = "http://javaops.ru") +public class User { + + @XmlElement(namespace = "http://javaops.ru", required = true) + protected String email; + @XmlElement(namespace = "http://javaops.ru", required = true) + protected String fullName; + @XmlAttribute(name = "flag", required = true) + protected FlagType flag; + @XmlAttribute(name = "city", required = true) + @XmlIDREF + @XmlSchemaType(name = "IDREF") + protected Object city; + + /** + * Gets the value of the email property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getEmail() { + return email; + } + + /** + * Sets the value of the email property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setEmail(String value) { + this.email = value; + } + + /** + * Gets the value of the fullName property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getFullName() { + return fullName; + } + + /** + * Sets the value of the fullName property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setFullName(String value) { + this.fullName = value; + } + + /** + * Gets the value of the flag property. + * + * @return + * possible object is + * {@link FlagType } + * + */ + public FlagType getFlag() { + return flag; + } + + /** + * Sets the value of the flag property. + * + * @param value + * allowed object is + * {@link FlagType } + * + */ + public void setFlag(FlagType value) { + this.flag = value; + } + + /** + * Gets the value of the city property. + * + * @return + * possible object is + * {@link Object } + * + */ + public Object getCity() { + return city; + } + + /** + * Sets the value of the city property. + * + * @param value + * allowed object is + * {@link Object } + * + */ + public void setCity(Object value) { + this.city = value; + } + +} diff --git a/src/main/resources/payload.xsd b/src/main/resources/payload.xsd new file mode 100644 index 000000000..9ef1e46eb --- /dev/null +++ b/src/main/resources/payload.xsd @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/payload.xml b/src/test/resources/payload.xml new file mode 100644 index 000000000..796e99cb3 --- /dev/null +++ b/src/test/resources/payload.xml @@ -0,0 +1,23 @@ + + + + gmail@gmail.com + Full Name + + + admin@javaops.ru + Admin + + + mail@yandex.ru + Deleted + + + + Санкт-Петербург + Киев + Минск + + \ No newline at end of file From 363e43cec69dae2f1b2eea23dbbf1e65aa8a6785 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 7 Mar 2017 01:04:31 +0300 Subject: [PATCH 14/92] 2_7_JAXB --- pom.xml | 19 ++++ .../masterjava/xml/util/JaxbMarshaller.java | 43 +++++++++ .../masterjava/xml/util/JaxbParser.java | 89 +++++++++++++++++++ .../masterjava/xml/util/JaxbUnmarshaller.java | 37 ++++++++ .../javaops/masterjava/xml/util/Schemas.java | 51 +++++++++++ .../masterjava/xml/util/JaxbParserTest.java | 44 +++++++++ src/test/resources/city.xml | 4 + 7 files changed, 287 insertions(+) create mode 100644 src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java create mode 100644 src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java create mode 100644 src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java create mode 100644 src/main/java/ru/javaops/masterjava/xml/util/Schemas.java create mode 100644 src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java create mode 100644 src/test/resources/city.xml diff --git a/pom.xml b/pom.xml index 2dbccb332..c02f4e349 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,14 @@ ${java.version} + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + -Dfile.encoding=UTF-8 + + org.apache.maven.plugins maven-shade-plugin @@ -80,6 +88,17 @@ RELEASE provided + + com.google.guava + guava + 21.0 + + + junit + junit + 4.12 + test + diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java b/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java new file mode 100644 index 000000000..7401011e9 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java @@ -0,0 +1,43 @@ +package ru.javaops.masterjava.xml.util; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.PropertyException; +import javax.xml.validation.Schema; +import java.io.StringWriter; +import java.io.Writer; + +/** + * @author GKislin + * Date: 18.11.2008 + */ +public class JaxbMarshaller { + private Marshaller marshaller; + + public JaxbMarshaller(JAXBContext ctx) throws JAXBException { + marshaller = ctx.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); + marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); + } + + public void setProperty(String prop, Object value) throws PropertyException { + marshaller.setProperty(prop, value); + } + + public synchronized void setSchema(Schema schema) { + marshaller.setSchema(schema); + } + + public String marshal(Object instance) throws JAXBException { + StringWriter sw = new StringWriter(); + marshal(instance, sw); + return sw.toString(); + } + + public synchronized void marshal(Object instance, Writer writer) throws JAXBException { + marshaller.marshal(instance, writer); + } + +} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java b/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java new file mode 100644 index 000000000..56fc888f4 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java @@ -0,0 +1,89 @@ +package ru.javaops.masterjava.xml.util; + +import org.xml.sax.SAXException; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.PropertyException; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import java.io.*; + + +/** + * Marshalling/Unmarshalling JAXB helper + * XML Facade + * @author Grigory Kislin + */ +public class JaxbParser { + + protected JaxbMarshaller jaxbMarshaller; + protected JaxbUnmarshaller jaxbUnmarshaller; + protected Schema schema; + + public JaxbParser(Class... classesToBeBound) { + try { + init(JAXBContext.newInstance(classesToBeBound)); + } catch (JAXBException e) { + throw new IllegalArgumentException(e); + } + } + + // http://stackoverflow.com/questions/30643802/what-is-jaxbcontext-newinstancestring-contextpath + public JaxbParser(String context) { + try { + init(JAXBContext.newInstance(context)); + } catch (JAXBException e) { + throw new IllegalArgumentException(e); + } + } + + private void init(JAXBContext ctx) throws JAXBException { + jaxbMarshaller = new JaxbMarshaller(ctx); + jaxbUnmarshaller = new JaxbUnmarshaller(ctx); + } + + // Unmarshaller + public T unmarshal(InputStream is) throws JAXBException { + return (T) jaxbUnmarshaller.unmarshal(is); + } + + public T unmarshal(Reader reader) throws JAXBException { + return (T) jaxbUnmarshaller.unmarshal(reader); + } + + public T unmarshal(String str) throws JAXBException { + return (T) jaxbUnmarshaller.unmarshal(str); + } + + // Marshaller + public void setMarshallerProperty(String prop, Object value) { + try { + jaxbMarshaller.setProperty(prop, value); + } catch (PropertyException e) { + throw new IllegalArgumentException(e); + } + } + + public synchronized String marshal(Object instance) throws JAXBException { + return jaxbMarshaller.marshal(instance); + } + + public void marshal(Object instance, Writer writer) throws JAXBException { + jaxbMarshaller.marshal(instance, writer); + } + + public void setSchema(Schema schema) { + this.schema = schema; + jaxbUnmarshaller.setSchema(schema); + jaxbMarshaller.setSchema(schema); + } + + public void validate(String str) throws IOException, SAXException { + validate(new StringReader(str)); + } + + public void validate(Reader reader) throws IOException, SAXException { + schema.newValidator().validate(new StreamSource(reader)); + } +} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java b/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java new file mode 100644 index 000000000..afc34a6e4 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java @@ -0,0 +1,37 @@ +package ru.javaops.masterjava.xml.util; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.validation.Schema; +import java.io.InputStream; +import java.io.Reader; +import java.io.StringReader; + +/** + * @author GKislin + * Date: 18.11.2008 + */ +public class JaxbUnmarshaller { + private Unmarshaller unmarshaller; + + public JaxbUnmarshaller(JAXBContext ctx) throws JAXBException { + unmarshaller = ctx.createUnmarshaller(); + } + + public synchronized void setSchema(Schema schema) { + unmarshaller.setSchema(schema); + } + + public synchronized Object unmarshal(InputStream is) throws JAXBException { + return unmarshaller.unmarshal(is); + } + + public synchronized Object unmarshal(Reader reader) throws JAXBException { + return unmarshaller.unmarshal(reader); + } + + public Object unmarshal(String str) throws JAXBException { + return unmarshal(new StringReader(str)); + } +} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java b/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java new file mode 100644 index 000000000..711e9eabe --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java @@ -0,0 +1,51 @@ +package ru.javaops.masterjava.xml.util; + +import com.google.common.io.Resources; +import org.xml.sax.SAXException; + +import javax.xml.XMLConstants; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import java.io.File; +import java.io.StringReader; +import java.net.URL; + + +/** + * @author Grigory Kislin + */ +public class Schemas { + + // SchemaFactory is not thread-safe + private static final SchemaFactory SCHEMA_FACTORY = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + + public static synchronized Schema ofString(String xsd) { + try { + return SCHEMA_FACTORY.newSchema(new StreamSource(new StringReader(xsd))); + } catch (SAXException e) { + throw new IllegalArgumentException(e); + } + } + + public static synchronized Schema ofClasspath(String resource) { + // http://digitalsanctum.com/2012/11/30/how-to-read-file-contents-in-java-the-easy-way-with-guava/ + return ofURL(Resources.getResource(resource)); + } + + public static synchronized Schema ofURL(URL url) { + try { + return SCHEMA_FACTORY.newSchema(url); + } catch (SAXException e) { + throw new IllegalArgumentException(e); + } + } + + public static synchronized Schema ofFile(File file) { + try { + return SCHEMA_FACTORY.newSchema(file); + } catch (SAXException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java b/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java new file mode 100644 index 000000000..ab1e365e5 --- /dev/null +++ b/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java @@ -0,0 +1,44 @@ +package ru.javaops.masterjava.xml.util; + +import com.google.common.io.Resources; +import org.junit.Test; +import ru.javaops.masterjava.xml.schema.CityType; +import ru.javaops.masterjava.xml.schema.ObjectFactory; +import ru.javaops.masterjava.xml.schema.Payload; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; + +/** + * gkislin + * 23.09.2016 + */ +public class JaxbParserTest { + private static final JaxbParser JAXB_PARSER = new JaxbParser(ObjectFactory.class); + + static { + JAXB_PARSER.setSchema(Schemas.ofClasspath("payload.xsd")); + } + + @Test + public void testPayload() throws Exception { +// JaxbParserTest.class.getResourceAsStream("/city.xml") + Payload payload = JAXB_PARSER.unmarshal( + Resources.getResource("payload.xml").openStream()); + String strPayload = JAXB_PARSER.marshal(payload); + JAXB_PARSER.validate(strPayload); + System.out.println(strPayload); + } + + @Test + public void testCity() throws Exception { + JAXBElement cityElement = JAXB_PARSER.unmarshal( + Resources.getResource("city.xml").openStream()); + CityType city = cityElement.getValue(); + JAXBElement cityElement2 = + new JAXBElement<>(new QName("http://javaops.ru", "City"), CityType.class, city); + String strCity = JAXB_PARSER.marshal(cityElement2); + JAXB_PARSER.validate(strCity); + System.out.println(strCity); + } +} \ No newline at end of file diff --git a/src/test/resources/city.xml b/src/test/resources/city.xml new file mode 100644 index 000000000..8b0abcf8a --- /dev/null +++ b/src/test/resources/city.xml @@ -0,0 +1,4 @@ +Санкт-Петербург + \ No newline at end of file From 0e1c047bb39d29407d9b663fb4e1d4e0924c3c00 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 7 Mar 2017 01:05:40 +0300 Subject: [PATCH 15/92] 2_8_StAX --- .../xml/util/StaxStreamProcessor.java | 60 +++++++++++++++++++ .../xml/util/StaxStreamProcessorTest.java | 40 +++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java create mode 100644 src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java new file mode 100644 index 000000000..81b759e1d --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java @@ -0,0 +1,60 @@ +package ru.javaops.masterjava.xml.util; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.events.XMLEvent; +import java.io.InputStream; + +/** + * gkislin + * 23.09.2016 + */ +public class StaxStreamProcessor implements AutoCloseable { + private static final XMLInputFactory FACTORY = XMLInputFactory.newInstance(); + + private final XMLStreamReader reader; + + public StaxStreamProcessor(InputStream is) throws XMLStreamException { + reader = FACTORY.createXMLStreamReader(is); + } + + public XMLStreamReader getReader() { + return reader; + } + + public boolean doUntil(int stopEvent, String value) throws XMLStreamException { + while (reader.hasNext()) { + int event = reader.next(); + if (event == stopEvent) { + if (value.equals(getValue(event))) { + return true; + } + } + } + return false; + } + + public String getValue(int event) throws XMLStreamException { + return (event == XMLEvent.CHARACTERS) ? reader.getText() : reader.getLocalName(); + } + + public String getElementValue(String element) throws XMLStreamException { + return doUntil(XMLEvent.START_ELEMENT, element) ? reader.getElementText() : null; + } + + public String getText() throws XMLStreamException { + return reader.getElementText(); + } + + @Override + public void close() { + if (reader != null) { + try { + reader.close(); + } catch (XMLStreamException e) { + // empty + } + } + } +} diff --git a/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java b/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java new file mode 100644 index 000000000..229e2da64 --- /dev/null +++ b/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java @@ -0,0 +1,40 @@ +package ru.javaops.masterjava.xml.util; + +import com.google.common.io.Resources; +import org.junit.Test; + +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.events.XMLEvent; + +/** + * gkislin + * 23.09.2016 + */ +public class StaxStreamProcessorTest { + @Test + public void readCities() throws Exception { + try (StaxStreamProcessor processor = + new StaxStreamProcessor(Resources.getResource("payload.xml").openStream())) { + XMLStreamReader reader = processor.getReader(); + while (reader.hasNext()) { + int event = reader.next(); + if (event == XMLEvent.START_ELEMENT) { + if ("City".equals(reader.getLocalName())) { + System.out.println(reader.getElementText()); + } + } + } + } + } + + @Test + public void readCities2() throws Exception { + try (StaxStreamProcessor processor = + new StaxStreamProcessor(Resources.getResource("payload.xml").openStream())) { + String city; + while ((city = processor.getElementValue("City")) != null) { + System.out.println(city); + } + } + } +} \ No newline at end of file From 3ee45085427990865247b4e88f578b4af5a0b624 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 7 Mar 2017 01:13:45 +0300 Subject: [PATCH 16/92] 2_9_XPath --- .../masterjava/xml/util/XPathProcessor.java | 62 +++++++++++++++++++ .../xml/util/XPathProcessorTest.java | 30 +++++++++ 2 files changed, 92 insertions(+) create mode 100644 src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java create mode 100644 src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java new file mode 100644 index 000000000..d6456a5de --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java @@ -0,0 +1,62 @@ +package ru.javaops.masterjava.xml.util; + +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; +import java.io.IOException; +import java.io.InputStream; + +/** + * gkislin + * 23.09.2016 + */ +public class XPathProcessor { + private static final DocumentBuilderFactory DOCUMENT_FACTORY = DocumentBuilderFactory.newInstance(); + private static final DocumentBuilder DOCUMENT_BUILDER; + + private static final XPathFactory XPATH_FACTORY = XPathFactory.newInstance(); + private static final XPath XPATH = XPATH_FACTORY.newXPath(); + + static { + DOCUMENT_FACTORY.setNamespaceAware(true); + try { + DOCUMENT_BUILDER = DOCUMENT_FACTORY.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException(e); + } + } + + private final Document doc; + + public XPathProcessor(InputStream is) { + try { + doc = DOCUMENT_BUILDER.parse(is); + } catch (SAXException | IOException e) { + throw new IllegalArgumentException(e); + } + } + + public static synchronized XPathExpression getExpression(String exp) { + try { + return XPATH.compile(exp); + } catch (XPathExpressionException e) { + throw new IllegalArgumentException(e); + } + } + + public T evaluate(XPathExpression expression, QName type) { + try { + return (T) expression.evaluate(doc, type); + } catch (XPathExpressionException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java b/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java new file mode 100644 index 000000000..18b6efdc2 --- /dev/null +++ b/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java @@ -0,0 +1,30 @@ +package ru.javaops.masterjava.xml.util; + +import com.google.common.io.Resources; +import org.junit.Test; +import org.w3c.dom.NodeList; + +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import java.io.InputStream; +import java.util.stream.IntStream; + +/** + * gkislin + * 23.09.2016 + */ +public class XPathProcessorTest { + @Test + public void getCities() throws Exception { + try (InputStream is = + Resources.getResource("payload.xml").openStream()) { + XPathProcessor processor = new XPathProcessor(is); + XPathExpression expression = + XPathProcessor.getExpression("/*[name()='Payload']/*[name()='Cities']/*[name()='City']/text()"); + NodeList nodes = processor.evaluate(expression, XPathConstants.NODESET); + IntStream.range(0, nodes.getLength()).forEach( + i -> System.out.println(nodes.item(i).getNodeValue()) + ); + } + } +} \ No newline at end of file From 78baa61bd953eda6b18fb8d08f54646375549d66 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 7 Mar 2017 01:16:08 +0300 Subject: [PATCH 17/92] 2_10_Xslt --- .../masterjava/xml/util/XsltProcessor.java | 48 +++++++++++++++++++ src/main/resources/cities.xsl | 9 ++++ .../xml/util/XsltProcessorTest.java | 22 +++++++++ 3 files changed, 79 insertions(+) create mode 100644 src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java create mode 100644 src/main/resources/cities.xsl create mode 100644 src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java new file mode 100644 index 000000000..359a379ea --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java @@ -0,0 +1,48 @@ +package ru.javaops.masterjava.xml.util; + +import javax.xml.transform.*; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.io.*; +import java.nio.charset.StandardCharsets; + +/** + * User: GKislin + * Date: 18.05.2009 + */ + +public class XsltProcessor { + private static TransformerFactory FACTORY = TransformerFactory.newInstance(); + private final Transformer xformer; + + public XsltProcessor(InputStream xslInputStream) { + this(new BufferedReader(new InputStreamReader(xslInputStream, StandardCharsets.UTF_8))); + } + + public XsltProcessor(Reader xslReader) { + try { + Templates template = FACTORY.newTemplates(new StreamSource(xslReader)); + xformer = template.newTransformer(); + } catch (TransformerConfigurationException e) { + throw new IllegalStateException("XSLT transformer creation failed: " + e.toString(), e); + } + } + + public String transform(InputStream xmlInputStream) throws TransformerException { + StringWriter out = new StringWriter(); + transform(xmlInputStream, out); + return out.getBuffer().toString(); + } + + public void transform(InputStream xmlInputStream, Writer result) throws TransformerException { + transform(new BufferedReader(new InputStreamReader(xmlInputStream, StandardCharsets.UTF_8)), result); + } + + public void transform(Reader sourceReader, Writer result) throws TransformerException { + xformer.transform(new StreamSource(sourceReader), new StreamResult(result)); + } + + public static String getXsltHeader(String xslt) { + return "\n"; + } +} diff --git a/src/main/resources/cities.xsl b/src/main/resources/cities.xsl new file mode 100644 index 000000000..1c509124b --- /dev/null +++ b/src/main/resources/cities.xsl @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java b/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java new file mode 100644 index 000000000..403a14c87 --- /dev/null +++ b/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java @@ -0,0 +1,22 @@ +package ru.javaops.masterjava.xml.util; + +import com.google.common.io.Resources; +import org.junit.Test; + +import java.io.InputStream; + +/** + * gkislin + * 23.09.2016 + */ +public class XsltProcessorTest { + @Test + public void transform() throws Exception { + try (InputStream xslInputStream = Resources.getResource("cities.xsl").openStream(); + InputStream xmlInputStream = Resources.getResource("payload.xml").openStream()) { + + XsltProcessor processor = new XsltProcessor(xslInputStream); + System.out.println(processor.transform(xmlInputStream)); + } + } +} From 42eb99b4602367a9a8c1168b5ae31e6c41c0e30d Mon Sep 17 00:00:00 2001 From: pinky83 Date: Sun, 12 Mar 2017 11:55:19 +0200 Subject: [PATCH 18/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Overwrite=20remote=20https?= =?UTF-8?q?://github.com/pinky83/masterjava=20to=20local?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 - README.md | 8 - pom.xml | 109 -------- src/main/java/ru/javaops/masterjava/Main.java | 14 -- .../javaops/masterjava/matrix/MainMatrix.java | 52 ---- .../masterjava/matrix/MatrixBenchmark.java | 77 ------ .../javaops/masterjava/matrix/MatrixUtil.java | 154 ------------ .../masterjava/service/MailService.java | 141 ----------- .../masterjava/xml/schema/CityType.java | 94 ------- .../masterjava/xml/schema/FlagType.java | 54 ---- .../masterjava/xml/schema/ObjectFactory.java | 85 ------- .../masterjava/xml/schema/Payload.java | 233 ------------------ .../javaops/masterjava/xml/schema/User.java | 151 ------------ .../masterjava/xml/util/JaxbMarshaller.java | 43 ---- .../masterjava/xml/util/JaxbParser.java | 89 ------- .../masterjava/xml/util/JaxbUnmarshaller.java | 37 --- .../javaops/masterjava/xml/util/Schemas.java | 51 ---- .../xml/util/StaxStreamProcessor.java | 60 ----- .../masterjava/xml/util/XPathProcessor.java | 62 ----- .../masterjava/xml/util/XsltProcessor.java | 48 ---- src/main/resources/cities.xsl | 9 - src/main/resources/payload.xsd | 56 ----- .../masterjava/xml/util/JaxbParserTest.java | 44 ---- .../xml/util/StaxStreamProcessorTest.java | 40 --- .../xml/util/XPathProcessorTest.java | 30 --- .../xml/util/XsltProcessorTest.java | 22 -- src/test/resources/city.xml | 4 - src/test/resources/payload.xml | 23 -- 28 files changed, 1795 deletions(-) delete mode 100644 .gitignore delete mode 100644 README.md delete mode 100644 pom.xml delete mode 100644 src/main/java/ru/javaops/masterjava/Main.java delete mode 100644 src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java delete mode 100644 src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java delete mode 100644 src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java delete mode 100644 src/main/java/ru/javaops/masterjava/service/MailService.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/CityType.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/Payload.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/User.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/util/Schemas.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java delete mode 100644 src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java delete mode 100644 src/main/resources/cities.xsl delete mode 100644 src/main/resources/payload.xsd delete mode 100644 src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java delete mode 100644 src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java delete mode 100644 src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java delete mode 100644 src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java delete mode 100644 src/test/resources/city.xml delete mode 100644 src/test/resources/payload.xml diff --git a/.gitignore b/.gitignore deleted file mode 100644 index ad02a2599..000000000 --- a/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.idea -out -target -*.iml -log \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index da20d2301..000000000 --- a/README.md +++ /dev/null @@ -1,8 +0,0 @@ -## Разработка полнофункционального многомодульного Maven проекта - -- веб приложение (Tomcat, JSP, jQuery), -- многопоточный почтовый сервиса (JavaMail, java.util.concurrent.*) -- вспомогательные модули, связанных по веб-сервисам (SOAP, JAX-WS, Axis) и по REST (JAX-RS) -- сохранение данных в RMDBS и динамическое конфигурирование модулей по JMX. - -## Описание проекта diff --git a/pom.xml b/pom.xml deleted file mode 100644 index c02f4e349..000000000 --- a/pom.xml +++ /dev/null @@ -1,109 +0,0 @@ - - 4.0.0 - - ru.javaops - masterjava - jar - - 1.0-SNAPSHOT - - Master Java - https://github.com/JavaOPs/masterjava - - - 1.8 - UTF-8 - UTF-8 - - - - masterjava - install - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - ${java.version} - ${java.version} - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - -Dfile.encoding=UTF-8 - - - - org.apache.maven.plugins - maven-shade-plugin - 2.2 - - - package - - shade - - - benchmarks - - - org.openjdk.jmh.Main - - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - - - - - - - org.openjdk.jmh - jmh-core - RELEASE - - - org.openjdk.jmh - jmh-generator-annprocess - RELEASE - provided - - - com.google.guava - guava - 21.0 - - - junit - junit - 4.12 - test - - - - - - - - - diff --git a/src/main/java/ru/javaops/masterjava/Main.java b/src/main/java/ru/javaops/masterjava/Main.java deleted file mode 100644 index a849258c4..000000000 --- a/src/main/java/ru/javaops/masterjava/Main.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.javaops.masterjava; - -/** - * User: gkislin - * Date: 05.08.2015 - * - * @link http://caloriesmng.herokuapp.com/ - * @link https://github.com/JavaOPs/topjava - */ -public class Main { - public static void main(String[] args) { - System.out.format("Hello MasterJava!"); - } -} diff --git a/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java b/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java deleted file mode 100644 index 4f30e499a..000000000 --- a/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.javaops.masterjava.matrix; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * gkislin - * 03.07.2016 - */ -public class MainMatrix { - private static final int MATRIX_SIZE = 1000; - private static final int THREAD_NUMBER = 10; - - private final static ExecutorService executor = Executors.newFixedThreadPool(MainMatrix.THREAD_NUMBER); - - public static void main(String[] args) throws ExecutionException, InterruptedException { - final int[][] matrixA = MatrixUtil.create(MATRIX_SIZE); - final int[][] matrixB = MatrixUtil.create(MATRIX_SIZE); - - double singleThreadSum = 0.; - double concurrentThreadSum = 0.; - int count = 1; - while (count < 6) { - System.out.println("Pass " + count); - long start = System.currentTimeMillis(); - final int[][] matrixC = MatrixUtil.singleThreadMultiplyOpt(matrixA, matrixB); - double duration = (System.currentTimeMillis() - start) / 1000.; - out("Single thread time, sec: %.3f", duration); - singleThreadSum += duration; - - start = System.currentTimeMillis(); - final int[][] concurrentMatrixC = MatrixUtil.concurrentMultiply2(matrixA, matrixB, executor); - duration = (System.currentTimeMillis() - start) / 1000.; - out("Concurrent thread time, sec: %.3f", duration); - concurrentThreadSum += duration; - - if (!MatrixUtil.compare(matrixC, concurrentMatrixC)) { - System.err.println("Comparison failed"); - break; - } - count++; - } - executor.shutdown(); - out("\nAverage single thread time, sec: %.3f", singleThreadSum / 5.); - out("Average concurrent thread time, sec: %.3f", concurrentThreadSum / 5.); - } - - private static void out(String format, double ms) { - System.out.println(String.format(format, ms)); - } -} diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java b/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java deleted file mode 100644 index 80f1558ea..000000000 --- a/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java +++ /dev/null @@ -1,77 +0,0 @@ -package ru.javaops.masterjava.matrix; - -import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.runner.Runner; -import org.openjdk.jmh.runner.RunnerException; -import org.openjdk.jmh.runner.options.Options; -import org.openjdk.jmh.runner.options.OptionsBuilder; -import org.openjdk.jmh.runner.options.TimeValue; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -/** - * gkislin - * 23.09.2016 - */ -@Warmup(iterations = 10) -@Measurement(iterations = 10) -@BenchmarkMode({Mode.SingleShotTime}) -@OutputTimeUnit(TimeUnit.MILLISECONDS) -@State(Scope.Benchmark) -@Threads(1) -@Fork(10) -@Timeout(time = 5, timeUnit = TimeUnit.MINUTES) -public class MatrixBenchmark { - // Matrix size - @Param({"1000"}) - private int matrixSize; - - private static final int THREAD_NUMBER = 10; - private final static ExecutorService executor = Executors.newFixedThreadPool(THREAD_NUMBER); - - private static int[][] matrixA; - private static int[][] matrixB; - - @Setup - public void setUp() { - matrixA = MatrixUtil.create(matrixSize); - matrixB = MatrixUtil.create(matrixSize); - } - - public static void main(String[] args) throws RunnerException { - Options options = new OptionsBuilder() - .include(MatrixBenchmark.class.getSimpleName()) - .threads(1) - .forks(10) - .timeout(TimeValue.minutes(5)) - .build(); - new Runner(options).run(); - } - -// @Benchmark - public int[][] singleThreadMultiplyOpt() throws Exception { - return MatrixUtil.singleThreadMultiplyOpt(matrixA, matrixB); - } - -// @Benchmark - public int[][] concurrentMultiplyStreams() throws Exception { - return MatrixUtil.concurrentMultiplyStreams(matrixA, matrixB, executor); - } - - @Benchmark - public int[][] concurrentMultiply2() throws Exception { - return MatrixUtil.concurrentMultiply2(matrixA, matrixB, executor); - } - - @Benchmark - public int[][] concurrentMultiply3() throws Exception { - return MatrixUtil.concurrentMultiply3(matrixA, matrixB, executor); - } - - @TearDown - public void tearDown() { - executor.shutdown(); - } -} diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java deleted file mode 100644 index 39f077898..000000000 --- a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java +++ /dev/null @@ -1,154 +0,0 @@ -package ru.javaops.masterjava.matrix; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.concurrent.Callable; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -/** - * gkislin - * 03.07.2016 - */ -public class MatrixUtil { - - public static int[][] concurrentMultiplyStreams(int[][] matrixA, int[][] matrixB, ExecutorService executor) - throws InterruptedException, ExecutionException { - - final int matrixSize = matrixA.length; - final int[][] matrixC = new int[matrixSize][matrixSize]; - - List> tasks = IntStream.range(0, matrixSize) - .parallel() - .mapToObj(i -> new Callable() { - private final int[] tempColumn = new int[matrixSize]; - - @Override - public Void call() throws Exception { - for (int c = 0; c < matrixSize; c++) { - tempColumn[c] = matrixB[c][i]; - } - for (int j = 0; j < matrixSize; j++) { - int row[] = matrixA[j]; - int sum = 0; - for (int k = 0; k < matrixSize; k++) { - sum += tempColumn[k] * row[k]; - } - matrixC[j][i] = sum; - } - return null; - } - }) - .collect(Collectors.toList()); - - executor.invokeAll(tasks); - return matrixC; - } - - public static int[][] concurrentMultiply2(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException { - final int matrixSize = matrixA.length; - final int[][] matrixC = new int[matrixSize][]; - - final int[][] matrixBT = new int[matrixSize][matrixSize]; - for (int i = 0; i < matrixSize; i++) { - for (int j = 0; j < matrixSize; j++) { - matrixBT[i][j] = matrixB[j][i]; - } - } - - List> tasks = new ArrayList<>(matrixSize); - for (int j = 0; j < matrixSize; j++) { - final int row = j; - tasks.add(() -> { - final int[] rowC = new int[matrixSize]; - for (int col = 0; col < matrixSize; col++) { - final int[] rowA = matrixA[row]; - final int[] columnB = matrixBT[col]; - int sum = 0; - for (int k = 0; k < matrixSize; k++) { - sum += rowA[k] * columnB[k]; - } - rowC[col] = sum; - } - matrixC[row] = rowC; - return null; - }); - } - executor.invokeAll(tasks); - return matrixC; - } - - public static int[][] concurrentMultiply3(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException { - final int matrixSize = matrixA.length; - final int[][] matrixC = new int[matrixSize][matrixSize]; - final CountDownLatch latch = new CountDownLatch(matrixSize); - - for (int row = 0; row < matrixSize; row++) { - final int[] rowA = matrixA[row]; - final int[] rowC = matrixC[row]; - - executor.submit(() -> { - for (int idx = 0; idx < matrixSize; idx++) { - final int elA = rowA[idx]; - final int[] rowB = matrixB[idx]; - for (int col = 0; col < matrixSize; col++) { - rowC[col] += elA * rowB[col]; - } - } - latch.countDown(); - }); - } - latch.await(); - return matrixC; - } - - public static int[][] singleThreadMultiplyOpt(int[][] matrixA, int[][] matrixB) { - final int matrixSize = matrixA.length; - final int[][] matrixC = new int[matrixSize][matrixSize]; - - for (int col = 0; col < matrixSize; col++) { - final int[] columnB = new int[matrixSize]; - for (int k = 0; k < matrixSize; k++) { - columnB[k] = matrixB[k][col]; - } - - for (int row = 0; row < matrixSize; row++) { - int sum = 0; - final int[] rowA = matrixA[row]; - for (int k = 0; k < matrixSize; k++) { - sum += rowA[k] * columnB[k]; - } - matrixC[row][col] = sum; - } - } - return matrixC; - } - - public static int[][] create(int size) { - int[][] matrix = new int[size][size]; - Random rn = new Random(); - - for (int i = 0; i < size; i++) { - for (int j = 0; j < size; j++) { - matrix[i][j] = rn.nextInt(10); - } - } - return matrix; - } - - public static boolean compare(int[][] matrixA, int[][] matrixB) { - final int matrixSize = matrixA.length; - for (int i = 0; i < matrixSize; i++) { - for (int j = 0; j < matrixSize; j++) { - if (matrixA[i][j] != matrixB[i][j]) { - return false; - } - } - } - return true; - } -} \ No newline at end of file diff --git a/src/main/java/ru/javaops/masterjava/service/MailService.java b/src/main/java/ru/javaops/masterjava/service/MailService.java deleted file mode 100644 index cef46e55e..000000000 --- a/src/main/java/ru/javaops/masterjava/service/MailService.java +++ /dev/null @@ -1,141 +0,0 @@ -package ru.javaops.masterjava.service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.concurrent.*; -import java.util.stream.Collectors; - -public class MailService { - private static final String OK = "OK"; - - private static final String INTERRUPTED_BY_FAULTS_NUMBER = "+++ Interrupted by faults number"; - private static final String INTERRUPTED_BY_TIMEOUT = "+++ Interrupted by timeout"; - private static final String INTERRUPTED_EXCEPTION = "+++ InterruptedException"; - - private final ExecutorService mailExecutor = Executors.newFixedThreadPool(8); - - public GroupResult sendToList(final String template, final Set emails) throws Exception { - final CompletionService completionService = new ExecutorCompletionService<>(mailExecutor); - - List> futures = emails.stream() - .map(email -> completionService.submit(() -> sendToUser(template, email))) - .collect(Collectors.toList()); - - return new Callable() { - private int success = 0; - private List failed = new ArrayList<>(); - - @Override - public GroupResult call() { - while (!futures.isEmpty()) { - try { - Future future = completionService.poll(10, TimeUnit.SECONDS); - if (future == null) { - return cancelWithFail(INTERRUPTED_BY_TIMEOUT); - } - futures.remove(future); - MailResult mailResult = future.get(); - if (mailResult.isOk()) { - success++; - } else { - failed.add(mailResult); - if (failed.size() >= 5) { - return cancelWithFail(INTERRUPTED_BY_FAULTS_NUMBER); - } - } - } catch (ExecutionException e) { - return cancelWithFail(e.getCause().toString()); - } catch (InterruptedException e) { - return cancelWithFail(INTERRUPTED_EXCEPTION); - } - } -/* - for (Future future : futures) { - MailResult mailResult; - try { - mailResult = future.get(10, TimeUnit.SECONDS); - } catch (InterruptedException e) { - return cancelWithFail(INTERRUPTED_EXCEPTION); - } catch (ExecutionException e) { - return cancelWithFail(e.getCause().toString()); - } catch (TimeoutException e) { - return cancelWithFail(INTERRUPTED_BY_TIMEOUT); - } - if (mailResult.isOk()) { - success++; - } else { - failed.add(mailResult); - if (failed.size() >= 5) { - return cancelWithFail(INTERRUPTED_BY_FAULTS_NUMBER); - } - } - } -*/ - return new GroupResult(success, failed, null); - } - - private GroupResult cancelWithFail(String cause) { - futures.forEach(f -> f.cancel(true)); - return new GroupResult(success, failed, cause); - } - }.call(); - } - - // dummy realization - public MailResult sendToUser(String template, String email) throws Exception { - try { - Thread.sleep(500); //delay - } catch (InterruptedException e) { - // log cancel; - return null; - } - return Math.random() < 0.7 ? MailResult.ok(email) : MailResult.error(email, "Error"); - } - - public static class MailResult { - private final String email; - private final String result; - - private static MailResult ok(String email) { - return new MailResult(email, OK); - } - - private static MailResult error(String email, String error) { - return new MailResult(email, error); - } - - public boolean isOk() { - return OK.equals(result); - } - - private MailResult(String email, String cause) { - this.email = email; - this.result = cause; - } - - @Override - public String toString() { - return '(' + email + ',' + result + ')'; - } - } - - public static class GroupResult { - private final int success; // number of successfully sent email - private final List failed; // failed emails with causes - private final String failedCause; // global fail cause - - public GroupResult(int success, List failed, String failedCause) { - this.success = success; - this.failed = failed; - this.failedCause = failedCause; - } - - @Override - public String toString() { - return "Success: " + success + '\n' + - "Failed: " + failed.toString() + '\n' + - (failedCause == null ? "" : "Failed cause" + failedCause); - } - } -} \ No newline at end of file diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java b/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java deleted file mode 100644 index 029e352cb..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java +++ /dev/null @@ -1,94 +0,0 @@ - -package ru.javaops.masterjava.xml.schema; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlID; -import javax.xml.bind.annotation.XmlSchemaType; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; - - -/** - *

Java class for cityType complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="cityType">
- *   <simpleContent>
- *     <extension base="<http://www.w3.org/2001/XMLSchema>string">
- *       <attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}ID" />
- *     </extension>
- *   </simpleContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "cityType", namespace = "http://javaops.ru", propOrder = { - "value" -}) -public class CityType { - - @XmlValue - protected String value; - @XmlAttribute(name = "id", required = true) - @XmlJavaTypeAdapter(CollapsedStringAdapter.class) - @XmlID - @XmlSchemaType(name = "ID") - protected String id; - - /** - * Gets the value of the value property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getValue() { - return value; - } - - /** - * Sets the value of the value property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setValue(String value) { - this.value = value; - } - - /** - * Gets the value of the id property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getId() { - return id; - } - - /** - * Sets the value of the id property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setId(String value) { - this.id = value; - } - -} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java b/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java deleted file mode 100644 index eda39fa9a..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java +++ /dev/null @@ -1,54 +0,0 @@ - -package ru.javaops.masterjava.xml.schema; - -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for flagType. - * - *

The following schema fragment specifies the expected content contained within this class. - *

- *

- * <simpleType name="flagType">
- *   <restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *     <enumeration value="active"/>
- *     <enumeration value="deleted"/>
- *     <enumeration value="superuser"/>
- *   </restriction>
- * </simpleType>
- * 
- * - */ -@XmlType(name = "flagType", namespace = "http://javaops.ru") -@XmlEnum -public enum FlagType { - - @XmlEnumValue("active") - ACTIVE("active"), - @XmlEnumValue("deleted") - DELETED("deleted"), - @XmlEnumValue("superuser") - SUPERUSER("superuser"); - private final String value; - - FlagType(String v) { - value = v; - } - - public String value() { - return value; - } - - public static FlagType fromValue(String v) { - for (FlagType c: FlagType.values()) { - if (c.value.equals(v)) { - return c; - } - } - throw new IllegalArgumentException(v); - } - -} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java b/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java deleted file mode 100644 index e8f105e2a..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java +++ /dev/null @@ -1,85 +0,0 @@ - -package ru.javaops.masterjava.xml.schema; - -import javax.xml.bind.JAXBElement; -import javax.xml.bind.annotation.XmlElementDecl; -import javax.xml.bind.annotation.XmlRegistry; -import javax.xml.namespace.QName; - - -/** - * This object contains factory methods for each - * Java content interface and Java element interface - * generated in the ru.javaops.masterjava.xml.schema package. - *

An ObjectFactory allows you to programatically - * construct new instances of the Java representation - * for XML content. The Java representation of XML - * content can consist of schema derived interfaces - * and classes representing the binding of schema - * type definitions, element declarations and model - * groups. Factory methods for each of these are - * provided in this class. - * - */ -@XmlRegistry -public class ObjectFactory { - - private final static QName _City_QNAME = new QName("http://javaops.ru", "City"); - - /** - * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: ru.javaops.masterjava.xml.schema - * - */ - public ObjectFactory() { - } - - /** - * Create an instance of {@link Payload } - * - */ - public Payload createPayload() { - return new Payload(); - } - - /** - * Create an instance of {@link User } - * - */ - public User createUser() { - return new User(); - } - - /** - * Create an instance of {@link Payload.Cities } - * - */ - public Payload.Cities createPayloadCities() { - return new Payload.Cities(); - } - - /** - * Create an instance of {@link Payload.Users } - * - */ - public Payload.Users createPayloadUsers() { - return new Payload.Users(); - } - - /** - * Create an instance of {@link CityType } - * - */ - public CityType createCityType() { - return new CityType(); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link CityType }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://javaops.ru", name = "City") - public JAXBElement createCity(CityType value) { - return new JAXBElement(_City_QNAME, CityType.class, null, value); - } - -} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java b/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java deleted file mode 100644 index 2a6276490..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java +++ /dev/null @@ -1,233 +0,0 @@ - -package ru.javaops.masterjava.xml.schema; - -import java.util.ArrayList; -import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for anonymous complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType>
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <all>
- *         <element name="Cities">
- *           <complexType>
- *             <complexContent>
- *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                 <sequence maxOccurs="unbounded">
- *                   <element ref="{http://javaops.ru}City"/>
- *                 </sequence>
- *               </restriction>
- *             </complexContent>
- *           </complexType>
- *         </element>
- *         <element name="Users">
- *           <complexType>
- *             <complexContent>
- *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                 <sequence maxOccurs="unbounded" minOccurs="0">
- *                   <element ref="{http://javaops.ru}User"/>
- *                 </sequence>
- *               </restriction>
- *             </complexContent>
- *           </complexType>
- *         </element>
- *       </all>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - -}) -@XmlRootElement(name = "Payload", namespace = "http://javaops.ru") -public class Payload { - - @XmlElement(name = "Cities", namespace = "http://javaops.ru", required = true) - protected Payload.Cities cities; - @XmlElement(name = "Users", namespace = "http://javaops.ru", required = true) - protected Payload.Users users; - - /** - * Gets the value of the cities property. - * - * @return - * possible object is - * {@link Payload.Cities } - * - */ - public Payload.Cities getCities() { - return cities; - } - - /** - * Sets the value of the cities property. - * - * @param value - * allowed object is - * {@link Payload.Cities } - * - */ - public void setCities(Payload.Cities value) { - this.cities = value; - } - - /** - * Gets the value of the users property. - * - * @return - * possible object is - * {@link Payload.Users } - * - */ - public Payload.Users getUsers() { - return users; - } - - /** - * Sets the value of the users property. - * - * @param value - * allowed object is - * {@link Payload.Users } - * - */ - public void setUsers(Payload.Users value) { - this.users = value; - } - - - /** - *

Java class for anonymous complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

-     * <complexType>
-     *   <complexContent>
-     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *       <sequence maxOccurs="unbounded">
-     *         <element ref="{http://javaops.ru}City"/>
-     *       </sequence>
-     *     </restriction>
-     *   </complexContent>
-     * </complexType>
-     * 
- * - * - */ - @XmlAccessorType(XmlAccessType.FIELD) - @XmlType(name = "", propOrder = { - "city" - }) - public static class Cities { - - @XmlElement(name = "City", namespace = "http://javaops.ru", required = true) - protected List city; - - /** - * Gets the value of the city property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the city property. - * - *

- * For example, to add a new item, do as follows: - *

-         *    getCity().add(newItem);
-         * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link CityType } - * - * - */ - public List getCity() { - if (city == null) { - city = new ArrayList(); - } - return this.city; - } - - } - - - /** - *

Java class for anonymous complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

-     * <complexType>
-     *   <complexContent>
-     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *       <sequence maxOccurs="unbounded" minOccurs="0">
-     *         <element ref="{http://javaops.ru}User"/>
-     *       </sequence>
-     *     </restriction>
-     *   </complexContent>
-     * </complexType>
-     * 
- * - * - */ - @XmlAccessorType(XmlAccessType.FIELD) - @XmlType(name = "", propOrder = { - "user" - }) - public static class Users { - - @XmlElement(name = "User", namespace = "http://javaops.ru") - protected List user; - - /** - * Gets the value of the user property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the user property. - * - *

- * For example, to add a new item, do as follows: - *

-         *    getUser().add(newItem);
-         * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link User } - * - * - */ - public List getUser() { - if (user == null) { - user = new ArrayList(); - } - return this.user; - } - - } - -} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/User.java b/src/main/java/ru/javaops/masterjava/xml/schema/User.java deleted file mode 100644 index b3430ce71..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/schema/User.java +++ /dev/null @@ -1,151 +0,0 @@ - -package ru.javaops.masterjava.xml.schema; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlIDREF; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlSchemaType; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for anonymous complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType>
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="email" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="fullName" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *       </sequence>
- *       <attribute name="flag" use="required" type="{http://javaops.ru}flagType" />
- *       <attribute name="city" use="required" type="{http://www.w3.org/2001/XMLSchema}IDREF" />
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "email", - "fullName" -}) -@XmlRootElement(name = "User", namespace = "http://javaops.ru") -public class User { - - @XmlElement(namespace = "http://javaops.ru", required = true) - protected String email; - @XmlElement(namespace = "http://javaops.ru", required = true) - protected String fullName; - @XmlAttribute(name = "flag", required = true) - protected FlagType flag; - @XmlAttribute(name = "city", required = true) - @XmlIDREF - @XmlSchemaType(name = "IDREF") - protected Object city; - - /** - * Gets the value of the email property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getEmail() { - return email; - } - - /** - * Sets the value of the email property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setEmail(String value) { - this.email = value; - } - - /** - * Gets the value of the fullName property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getFullName() { - return fullName; - } - - /** - * Sets the value of the fullName property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setFullName(String value) { - this.fullName = value; - } - - /** - * Gets the value of the flag property. - * - * @return - * possible object is - * {@link FlagType } - * - */ - public FlagType getFlag() { - return flag; - } - - /** - * Sets the value of the flag property. - * - * @param value - * allowed object is - * {@link FlagType } - * - */ - public void setFlag(FlagType value) { - this.flag = value; - } - - /** - * Gets the value of the city property. - * - * @return - * possible object is - * {@link Object } - * - */ - public Object getCity() { - return city; - } - - /** - * Sets the value of the city property. - * - * @param value - * allowed object is - * {@link Object } - * - */ - public void setCity(Object value) { - this.city = value; - } - -} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java b/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java deleted file mode 100644 index 7401011e9..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java +++ /dev/null @@ -1,43 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.PropertyException; -import javax.xml.validation.Schema; -import java.io.StringWriter; -import java.io.Writer; - -/** - * @author GKislin - * Date: 18.11.2008 - */ -public class JaxbMarshaller { - private Marshaller marshaller; - - public JaxbMarshaller(JAXBContext ctx) throws JAXBException { - marshaller = ctx.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); - marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); - marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); - } - - public void setProperty(String prop, Object value) throws PropertyException { - marshaller.setProperty(prop, value); - } - - public synchronized void setSchema(Schema schema) { - marshaller.setSchema(schema); - } - - public String marshal(Object instance) throws JAXBException { - StringWriter sw = new StringWriter(); - marshal(instance, sw); - return sw.toString(); - } - - public synchronized void marshal(Object instance, Writer writer) throws JAXBException { - marshaller.marshal(instance, writer); - } - -} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java b/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java deleted file mode 100644 index 56fc888f4..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java +++ /dev/null @@ -1,89 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import org.xml.sax.SAXException; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.PropertyException; -import javax.xml.transform.stream.StreamSource; -import javax.xml.validation.Schema; -import java.io.*; - - -/** - * Marshalling/Unmarshalling JAXB helper - * XML Facade - * @author Grigory Kislin - */ -public class JaxbParser { - - protected JaxbMarshaller jaxbMarshaller; - protected JaxbUnmarshaller jaxbUnmarshaller; - protected Schema schema; - - public JaxbParser(Class... classesToBeBound) { - try { - init(JAXBContext.newInstance(classesToBeBound)); - } catch (JAXBException e) { - throw new IllegalArgumentException(e); - } - } - - // http://stackoverflow.com/questions/30643802/what-is-jaxbcontext-newinstancestring-contextpath - public JaxbParser(String context) { - try { - init(JAXBContext.newInstance(context)); - } catch (JAXBException e) { - throw new IllegalArgumentException(e); - } - } - - private void init(JAXBContext ctx) throws JAXBException { - jaxbMarshaller = new JaxbMarshaller(ctx); - jaxbUnmarshaller = new JaxbUnmarshaller(ctx); - } - - // Unmarshaller - public T unmarshal(InputStream is) throws JAXBException { - return (T) jaxbUnmarshaller.unmarshal(is); - } - - public T unmarshal(Reader reader) throws JAXBException { - return (T) jaxbUnmarshaller.unmarshal(reader); - } - - public T unmarshal(String str) throws JAXBException { - return (T) jaxbUnmarshaller.unmarshal(str); - } - - // Marshaller - public void setMarshallerProperty(String prop, Object value) { - try { - jaxbMarshaller.setProperty(prop, value); - } catch (PropertyException e) { - throw new IllegalArgumentException(e); - } - } - - public synchronized String marshal(Object instance) throws JAXBException { - return jaxbMarshaller.marshal(instance); - } - - public void marshal(Object instance, Writer writer) throws JAXBException { - jaxbMarshaller.marshal(instance, writer); - } - - public void setSchema(Schema schema) { - this.schema = schema; - jaxbUnmarshaller.setSchema(schema); - jaxbMarshaller.setSchema(schema); - } - - public void validate(String str) throws IOException, SAXException { - validate(new StringReader(str)); - } - - public void validate(Reader reader) throws IOException, SAXException { - schema.newValidator().validate(new StreamSource(reader)); - } -} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java b/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java deleted file mode 100644 index afc34a6e4..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java +++ /dev/null @@ -1,37 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; -import javax.xml.validation.Schema; -import java.io.InputStream; -import java.io.Reader; -import java.io.StringReader; - -/** - * @author GKislin - * Date: 18.11.2008 - */ -public class JaxbUnmarshaller { - private Unmarshaller unmarshaller; - - public JaxbUnmarshaller(JAXBContext ctx) throws JAXBException { - unmarshaller = ctx.createUnmarshaller(); - } - - public synchronized void setSchema(Schema schema) { - unmarshaller.setSchema(schema); - } - - public synchronized Object unmarshal(InputStream is) throws JAXBException { - return unmarshaller.unmarshal(is); - } - - public synchronized Object unmarshal(Reader reader) throws JAXBException { - return unmarshaller.unmarshal(reader); - } - - public Object unmarshal(String str) throws JAXBException { - return unmarshal(new StringReader(str)); - } -} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java b/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java deleted file mode 100644 index 711e9eabe..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java +++ /dev/null @@ -1,51 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import com.google.common.io.Resources; -import org.xml.sax.SAXException; - -import javax.xml.XMLConstants; -import javax.xml.transform.stream.StreamSource; -import javax.xml.validation.Schema; -import javax.xml.validation.SchemaFactory; -import java.io.File; -import java.io.StringReader; -import java.net.URL; - - -/** - * @author Grigory Kislin - */ -public class Schemas { - - // SchemaFactory is not thread-safe - private static final SchemaFactory SCHEMA_FACTORY = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - - public static synchronized Schema ofString(String xsd) { - try { - return SCHEMA_FACTORY.newSchema(new StreamSource(new StringReader(xsd))); - } catch (SAXException e) { - throw new IllegalArgumentException(e); - } - } - - public static synchronized Schema ofClasspath(String resource) { - // http://digitalsanctum.com/2012/11/30/how-to-read-file-contents-in-java-the-easy-way-with-guava/ - return ofURL(Resources.getResource(resource)); - } - - public static synchronized Schema ofURL(URL url) { - try { - return SCHEMA_FACTORY.newSchema(url); - } catch (SAXException e) { - throw new IllegalArgumentException(e); - } - } - - public static synchronized Schema ofFile(File file) { - try { - return SCHEMA_FACTORY.newSchema(file); - } catch (SAXException e) { - throw new IllegalArgumentException(e); - } - } -} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java deleted file mode 100644 index 81b759e1d..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java +++ /dev/null @@ -1,60 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.events.XMLEvent; -import java.io.InputStream; - -/** - * gkislin - * 23.09.2016 - */ -public class StaxStreamProcessor implements AutoCloseable { - private static final XMLInputFactory FACTORY = XMLInputFactory.newInstance(); - - private final XMLStreamReader reader; - - public StaxStreamProcessor(InputStream is) throws XMLStreamException { - reader = FACTORY.createXMLStreamReader(is); - } - - public XMLStreamReader getReader() { - return reader; - } - - public boolean doUntil(int stopEvent, String value) throws XMLStreamException { - while (reader.hasNext()) { - int event = reader.next(); - if (event == stopEvent) { - if (value.equals(getValue(event))) { - return true; - } - } - } - return false; - } - - public String getValue(int event) throws XMLStreamException { - return (event == XMLEvent.CHARACTERS) ? reader.getText() : reader.getLocalName(); - } - - public String getElementValue(String element) throws XMLStreamException { - return doUntil(XMLEvent.START_ELEMENT, element) ? reader.getElementText() : null; - } - - public String getText() throws XMLStreamException { - return reader.getElementText(); - } - - @Override - public void close() { - if (reader != null) { - try { - reader.close(); - } catch (XMLStreamException e) { - // empty - } - } - } -} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java deleted file mode 100644 index d6456a5de..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java +++ /dev/null @@ -1,62 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -import javax.xml.namespace.QName; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; -import java.io.IOException; -import java.io.InputStream; - -/** - * gkislin - * 23.09.2016 - */ -public class XPathProcessor { - private static final DocumentBuilderFactory DOCUMENT_FACTORY = DocumentBuilderFactory.newInstance(); - private static final DocumentBuilder DOCUMENT_BUILDER; - - private static final XPathFactory XPATH_FACTORY = XPathFactory.newInstance(); - private static final XPath XPATH = XPATH_FACTORY.newXPath(); - - static { - DOCUMENT_FACTORY.setNamespaceAware(true); - try { - DOCUMENT_BUILDER = DOCUMENT_FACTORY.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - throw new IllegalStateException(e); - } - } - - private final Document doc; - - public XPathProcessor(InputStream is) { - try { - doc = DOCUMENT_BUILDER.parse(is); - } catch (SAXException | IOException e) { - throw new IllegalArgumentException(e); - } - } - - public static synchronized XPathExpression getExpression(String exp) { - try { - return XPATH.compile(exp); - } catch (XPathExpressionException e) { - throw new IllegalArgumentException(e); - } - } - - public T evaluate(XPathExpression expression, QName type) { - try { - return (T) expression.evaluate(doc, type); - } catch (XPathExpressionException e) { - throw new IllegalArgumentException(e); - } - } -} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java deleted file mode 100644 index 359a379ea..000000000 --- a/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java +++ /dev/null @@ -1,48 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import javax.xml.transform.*; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; -import java.io.*; -import java.nio.charset.StandardCharsets; - -/** - * User: GKislin - * Date: 18.05.2009 - */ - -public class XsltProcessor { - private static TransformerFactory FACTORY = TransformerFactory.newInstance(); - private final Transformer xformer; - - public XsltProcessor(InputStream xslInputStream) { - this(new BufferedReader(new InputStreamReader(xslInputStream, StandardCharsets.UTF_8))); - } - - public XsltProcessor(Reader xslReader) { - try { - Templates template = FACTORY.newTemplates(new StreamSource(xslReader)); - xformer = template.newTransformer(); - } catch (TransformerConfigurationException e) { - throw new IllegalStateException("XSLT transformer creation failed: " + e.toString(), e); - } - } - - public String transform(InputStream xmlInputStream) throws TransformerException { - StringWriter out = new StringWriter(); - transform(xmlInputStream, out); - return out.getBuffer().toString(); - } - - public void transform(InputStream xmlInputStream, Writer result) throws TransformerException { - transform(new BufferedReader(new InputStreamReader(xmlInputStream, StandardCharsets.UTF_8)), result); - } - - public void transform(Reader sourceReader, Writer result) throws TransformerException { - xformer.transform(new StreamSource(sourceReader), new StreamResult(result)); - } - - public static String getXsltHeader(String xslt) { - return "\n"; - } -} diff --git a/src/main/resources/cities.xsl b/src/main/resources/cities.xsl deleted file mode 100644 index 1c509124b..000000000 --- a/src/main/resources/cities.xsl +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/payload.xsd b/src/main/resources/payload.xsd deleted file mode 100644 index 9ef1e46eb..000000000 --- a/src/main/resources/payload.xsd +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java b/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java deleted file mode 100644 index ab1e365e5..000000000 --- a/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import com.google.common.io.Resources; -import org.junit.Test; -import ru.javaops.masterjava.xml.schema.CityType; -import ru.javaops.masterjava.xml.schema.ObjectFactory; -import ru.javaops.masterjava.xml.schema.Payload; - -import javax.xml.bind.JAXBElement; -import javax.xml.namespace.QName; - -/** - * gkislin - * 23.09.2016 - */ -public class JaxbParserTest { - private static final JaxbParser JAXB_PARSER = new JaxbParser(ObjectFactory.class); - - static { - JAXB_PARSER.setSchema(Schemas.ofClasspath("payload.xsd")); - } - - @Test - public void testPayload() throws Exception { -// JaxbParserTest.class.getResourceAsStream("/city.xml") - Payload payload = JAXB_PARSER.unmarshal( - Resources.getResource("payload.xml").openStream()); - String strPayload = JAXB_PARSER.marshal(payload); - JAXB_PARSER.validate(strPayload); - System.out.println(strPayload); - } - - @Test - public void testCity() throws Exception { - JAXBElement cityElement = JAXB_PARSER.unmarshal( - Resources.getResource("city.xml").openStream()); - CityType city = cityElement.getValue(); - JAXBElement cityElement2 = - new JAXBElement<>(new QName("http://javaops.ru", "City"), CityType.class, city); - String strCity = JAXB_PARSER.marshal(cityElement2); - JAXB_PARSER.validate(strCity); - System.out.println(strCity); - } -} \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java b/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java deleted file mode 100644 index 229e2da64..000000000 --- a/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import com.google.common.io.Resources; -import org.junit.Test; - -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.events.XMLEvent; - -/** - * gkislin - * 23.09.2016 - */ -public class StaxStreamProcessorTest { - @Test - public void readCities() throws Exception { - try (StaxStreamProcessor processor = - new StaxStreamProcessor(Resources.getResource("payload.xml").openStream())) { - XMLStreamReader reader = processor.getReader(); - while (reader.hasNext()) { - int event = reader.next(); - if (event == XMLEvent.START_ELEMENT) { - if ("City".equals(reader.getLocalName())) { - System.out.println(reader.getElementText()); - } - } - } - } - } - - @Test - public void readCities2() throws Exception { - try (StaxStreamProcessor processor = - new StaxStreamProcessor(Resources.getResource("payload.xml").openStream())) { - String city; - while ((city = processor.getElementValue("City")) != null) { - System.out.println(city); - } - } - } -} \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java b/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java deleted file mode 100644 index 18b6efdc2..000000000 --- a/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import com.google.common.io.Resources; -import org.junit.Test; -import org.w3c.dom.NodeList; - -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import java.io.InputStream; -import java.util.stream.IntStream; - -/** - * gkislin - * 23.09.2016 - */ -public class XPathProcessorTest { - @Test - public void getCities() throws Exception { - try (InputStream is = - Resources.getResource("payload.xml").openStream()) { - XPathProcessor processor = new XPathProcessor(is); - XPathExpression expression = - XPathProcessor.getExpression("/*[name()='Payload']/*[name()='Cities']/*[name()='City']/text()"); - NodeList nodes = processor.evaluate(expression, XPathConstants.NODESET); - IntStream.range(0, nodes.getLength()).forEach( - i -> System.out.println(nodes.item(i).getNodeValue()) - ); - } - } -} \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java b/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java deleted file mode 100644 index 403a14c87..000000000 --- a/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.javaops.masterjava.xml.util; - -import com.google.common.io.Resources; -import org.junit.Test; - -import java.io.InputStream; - -/** - * gkislin - * 23.09.2016 - */ -public class XsltProcessorTest { - @Test - public void transform() throws Exception { - try (InputStream xslInputStream = Resources.getResource("cities.xsl").openStream(); - InputStream xmlInputStream = Resources.getResource("payload.xml").openStream()) { - - XsltProcessor processor = new XsltProcessor(xslInputStream); - System.out.println(processor.transform(xmlInputStream)); - } - } -} diff --git a/src/test/resources/city.xml b/src/test/resources/city.xml deleted file mode 100644 index 8b0abcf8a..000000000 --- a/src/test/resources/city.xml +++ /dev/null @@ -1,4 +0,0 @@ -Санкт-Петербург - \ No newline at end of file diff --git a/src/test/resources/payload.xml b/src/test/resources/payload.xml deleted file mode 100644 index 796e99cb3..000000000 --- a/src/test/resources/payload.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - gmail@gmail.com - Full Name - - - admin@javaops.ru - Admin - - - mail@yandex.ru - Deleted - - - - Санкт-Петербург - Киев - Минск - - \ No newline at end of file From ce181cd357beb0cf17e6f07b386b4f27eafdd806 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Sun, 12 Mar 2017 11:55:21 +0200 Subject: [PATCH 19/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20IntelliLang.xml,?= =?UTF-8?q?=20ide.general.xml,=20other.xml,=20git.xml,=20project.default.x?= =?UTF-8?q?ml,=20diff.xml,=20other.xml,=20ignore.xml,=20find.xml,=20ui.lnf?= =?UTF-8?q?.xml,=20filetypes.xml,=20keymap.xml,=20gradle.run.settings.xml,?= =?UTF-8?q?=20colors.scheme.xml,=20databaseDrivers.xml,=20github=5Fsetting?= =?UTF-8?q?s.xml,=20mavenVersion.xml,=20templates.xml,=20Default.xml,=20la?= =?UTF-8?q?f.xml,=20jdk.table.xml,=20debugger.renderers.xml,=20path.macros?= =?UTF-8?q?.xml,=20web-browsers.xml,=20vcs.xml,=20databaseSettings.xml,=20?= =?UTF-8?q?toStringTemplates.xml,=20multimarkdown.shared.xml,=20markdown?= =?UTF-8?q?=5Fnavigator.shared.xml,=20debugger.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntelliLang.xml | 13 ++ _windows/git.xml | 6 + _windows/keymap.xml | 5 + _windows/laf.xml | 5 + _windows/path.macros.xml | 6 + colors.scheme.xml | 5 + databaseDrivers.xml | 93 ++++++++++ databaseSettings.xml | 26 +++ debugger.renderers.xml | 34 ++++ debugger.xml | 86 +++++++++ diff.xml | 44 +++++ filetypes.xml | 7 + find.xml | 7 + github_settings.xml | 6 + gradle.run.settings.xml | 5 + ide.general.xml | 5 + ignore.xml | 35 ++++ inspection/Default.xml | 3 + jdk.table.xml | 54 ++++++ markdown_navigator.shared.xml | 62 +++++++ mavenVersion.xml | 3 + multimarkdown.shared.xml | 3 + other.xml | 5 + project.default.xml | 146 +++++++++++++++ templates.xml | 328 ++++++++++++++++++++++++++++++++++ templates/other.xml | 8 + toStringTemplates.xml | 5 + ui.lnf.xml | 6 + vcs.xml | 20 +++ web-browsers.xml | 10 ++ 30 files changed, 1041 insertions(+) create mode 100644 IntelliLang.xml create mode 100644 _windows/git.xml create mode 100644 _windows/keymap.xml create mode 100644 _windows/laf.xml create mode 100644 _windows/path.macros.xml create mode 100644 colors.scheme.xml create mode 100644 databaseDrivers.xml create mode 100644 databaseSettings.xml create mode 100644 debugger.renderers.xml create mode 100644 debugger.xml create mode 100644 diff.xml create mode 100644 filetypes.xml create mode 100644 find.xml create mode 100644 github_settings.xml create mode 100644 gradle.run.settings.xml create mode 100644 ide.general.xml create mode 100644 ignore.xml create mode 100644 inspection/Default.xml create mode 100644 jdk.table.xml create mode 100644 markdown_navigator.shared.xml create mode 100644 mavenVersion.xml create mode 100644 multimarkdown.shared.xml create mode 100644 other.xml create mode 100644 project.default.xml create mode 100644 templates.xml create mode 100644 templates/other.xml create mode 100644 toStringTemplates.xml create mode 100644 ui.lnf.xml create mode 100644 vcs.xml create mode 100644 web-browsers.xml diff --git a/IntelliLang.xml b/IntelliLang.xml new file mode 100644 index 000000000..4556cef6d --- /dev/null +++ b/IntelliLang.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/_windows/git.xml b/_windows/git.xml new file mode 100644 index 000000000..5ad849d59 --- /dev/null +++ b/_windows/git.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/_windows/keymap.xml b/_windows/keymap.xml new file mode 100644 index 000000000..743029a4b --- /dev/null +++ b/_windows/keymap.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/_windows/laf.xml b/_windows/laf.xml new file mode 100644 index 000000000..c1f98d951 --- /dev/null +++ b/_windows/laf.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/_windows/path.macros.xml b/_windows/path.macros.xml new file mode 100644 index 000000000..5de6318a8 --- /dev/null +++ b/_windows/path.macros.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml new file mode 100644 index 000000000..39308cdb1 --- /dev/null +++ b/colors.scheme.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/databaseDrivers.xml b/databaseDrivers.xml new file mode 100644 index 000000000..d766e0831 --- /dev/null +++ b/databaseDrivers.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/databaseSettings.xml b/databaseSettings.xml new file mode 100644 index 000000000..8691bf5ca --- /dev/null +++ b/databaseSettings.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/debugger.renderers.xml b/debugger.renderers.xml new file mode 100644 index 000000000..cad6048ab --- /dev/null +++ b/debugger.renderers.xml @@ -0,0 +1,34 @@ + + + + \ No newline at end of file diff --git a/debugger.xml b/debugger.xml new file mode 100644 index 000000000..cf9fde70a --- /dev/null +++ b/debugger.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/diff.xml b/diff.xml new file mode 100644 index 000000000..67ed99abc --- /dev/null +++ b/diff.xml @@ -0,0 +1,44 @@ + + + + + + + + \ No newline at end of file diff --git a/filetypes.xml b/filetypes.xml new file mode 100644 index 000000000..52e2946eb --- /dev/null +++ b/filetypes.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/find.xml b/find.xml new file mode 100644 index 000000000..f9570672e --- /dev/null +++ b/find.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/github_settings.xml b/github_settings.xml new file mode 100644 index 000000000..27fd4e7f7 --- /dev/null +++ b/github_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/gradle.run.settings.xml b/gradle.run.settings.xml new file mode 100644 index 000000000..98883fd09 --- /dev/null +++ b/gradle.run.settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/ide.general.xml b/ide.general.xml new file mode 100644 index 000000000..f21bf9d3e --- /dev/null +++ b/ide.general.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ignore.xml b/ignore.xml new file mode 100644 index 000000000..7bb7b63b4 --- /dev/null +++ b/ignore.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inspection/Default.xml b/inspection/Default.xml new file mode 100644 index 000000000..60121f310 --- /dev/null +++ b/inspection/Default.xml @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/jdk.table.xml b/jdk.table.xml new file mode 100644 index 000000000..6ff6a4ae2 --- /dev/null +++ b/jdk.table.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/markdown_navigator.shared.xml b/markdown_navigator.shared.xml new file mode 100644 index 000000000..2b2887fcc --- /dev/null +++ b/markdown_navigator.shared.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mavenVersion.xml b/mavenVersion.xml new file mode 100644 index 000000000..553070bb8 --- /dev/null +++ b/mavenVersion.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/multimarkdown.shared.xml b/multimarkdown.shared.xml new file mode 100644 index 000000000..b4323c8d0 --- /dev/null +++ b/multimarkdown.shared.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/other.xml b/other.xml new file mode 100644 index 000000000..a75c19d85 --- /dev/null +++ b/other.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/project.default.xml b/project.default.xml new file mode 100644 index 000000000..86e1388e3 --- /dev/null +++ b/project.default.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.8 + + + + + + + + + + \ No newline at end of file diff --git a/templates.xml b/templates.xml new file mode 100644 index 000000000..33fac6afe --- /dev/null +++ b/templates.xml @@ -0,0 +1,328 @@ + + + + + \ No newline at end of file diff --git a/templates/other.xml b/templates/other.xml new file mode 100644 index 000000000..75660b06a --- /dev/null +++ b/templates/other.xml @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/toStringTemplates.xml b/toStringTemplates.xml new file mode 100644 index 000000000..dd12a8ae0 --- /dev/null +++ b/toStringTemplates.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/ui.lnf.xml b/ui.lnf.xml new file mode 100644 index 000000000..d680ca9b0 --- /dev/null +++ b/ui.lnf.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/vcs.xml b/vcs.xml new file mode 100644 index 000000000..bde9a3cf5 --- /dev/null +++ b/vcs.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/web-browsers.xml b/web-browsers.xml new file mode 100644 index 000000000..10814a3f0 --- /dev/null +++ b/web-browsers.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file From 199792e1b0b66d3e97b6f80ecfabf3b5062cf2cc Mon Sep 17 00:00:00 2001 From: pinky83 Date: Sun, 12 Mar 2017 12:06:30 +0200 Subject: [PATCH 20/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Delete=20other.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/other.xml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 templates/other.xml diff --git a/templates/other.xml b/templates/other.xml deleted file mode 100644 index 75660b06a..000000000 --- a/templates/other.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - \ No newline at end of file From 7ed3096bec999e48289dbe8645cd9d15f60839f7 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Sun, 12 Mar 2017 12:40:15 +0200 Subject: [PATCH 21/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Delete=20other.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- other.xml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 other.xml diff --git a/other.xml b/other.xml deleted file mode 100644 index a75c19d85..000000000 --- a/other.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file From 26703b329eecea120b187100ea6c703988595ac9 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Sun, 12 Mar 2017 12:44:38 +0200 Subject: [PATCH 22/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Update=20vcs.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vcs.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vcs.xml b/vcs.xml index bde9a3cf5..02ee10e7f 100644 --- a/vcs.xml +++ b/vcs.xml @@ -10,6 +10,10 @@
- - org.apache.maven.plugins -+ maven-surefire-plugin -+ 2.19.1 -+ -+ -Dfile.encoding=UTF-8 -+ -+ -+ -+ org.apache.maven.plugins - maven-shade-plugin - 2.2 - -@@ -79,6 +87,17 @@ - jmh-generator-annprocess - RELEASE - provided -+ -+ -+ com.google.guava -+ guava -+ 21.0 -+ -+ -+ junit -+ junit -+ 4.12 -+ test - - - diff --git a/2_08_StAX.patch b/2_08_StAX.patch deleted file mode 100644 index 26a9fc3ab..000000000 --- a/2_08_StAX.patch +++ /dev/null @@ -1,117 +0,0 @@ -Index: src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java (revision ) -+++ src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java (revision ) -@@ -0,0 +1,60 @@ -+package ru.javaops.masterjava.xml.util; -+ -+import javax.xml.stream.XMLInputFactory; -+import javax.xml.stream.XMLStreamException; -+import javax.xml.stream.XMLStreamReader; -+import javax.xml.stream.events.XMLEvent; -+import java.io.InputStream; -+ -+/** -+ * gkislin -+ * 23.09.2016 -+ */ -+public class StaxStreamProcessor implements AutoCloseable { -+ private static final XMLInputFactory FACTORY = XMLInputFactory.newInstance(); -+ -+ private final XMLStreamReader reader; -+ -+ public StaxStreamProcessor(InputStream is) throws XMLStreamException { -+ reader = FACTORY.createXMLStreamReader(is); -+ } -+ -+ public XMLStreamReader getReader() { -+ return reader; -+ } -+ -+ public boolean doUntil(int stopEvent, String value) throws XMLStreamException { -+ while (reader.hasNext()) { -+ int event = reader.next(); -+ if (event == stopEvent) { -+ if (value.equals(getValue(event))) { -+ return true; -+ } -+ } -+ } -+ return false; -+ } -+ -+ public String getValue(int event) throws XMLStreamException { -+ return (event == XMLEvent.CHARACTERS) ? reader.getText() : reader.getLocalName(); -+ } -+ -+ public String getElementValue(String element) throws XMLStreamException { -+ return doUntil(XMLEvent.START_ELEMENT, element) ? reader.getElementText() : null; -+ } -+ -+ public String getText() throws XMLStreamException { -+ return reader.getElementText(); -+ } -+ -+ @Override -+ public void close() { -+ if (reader != null) { -+ try { -+ reader.close(); -+ } catch (XMLStreamException e) { -+ // empty -+ } -+ } -+ } -+} -Index: src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java (revision ) -+++ src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java (revision ) -@@ -0,0 +1,40 @@ -+package ru.javaops.masterjava.xml.util; -+ -+import com.google.common.io.Resources; -+import org.junit.Test; -+ -+import javax.xml.stream.XMLStreamReader; -+import javax.xml.stream.events.XMLEvent; -+ -+/** -+ * gkislin -+ * 23.09.2016 -+ */ -+public class StaxStreamProcessorTest { -+ @Test -+ public void readCities() throws Exception { -+ try (StaxStreamProcessor processor = -+ new StaxStreamProcessor(Resources.getResource("payload.xml").openStream())) { -+ XMLStreamReader reader = processor.getReader(); -+ while (reader.hasNext()) { -+ int event = reader.next(); -+ if (event == XMLEvent.START_ELEMENT) { -+ if ("City".equals(reader.getLocalName())) { -+ System.out.println(reader.getElementText()); -+ } -+ } -+ } -+ } -+ } -+ -+ @Test -+ public void readCities2() throws Exception { -+ try (StaxStreamProcessor processor = -+ new StaxStreamProcessor(Resources.getResource("payload.xml").openStream())) { -+ String city; -+ while ((city = processor.getElementValue("City")) != null) { -+ System.out.println(city); -+ } -+ } -+ } -+} -\ No newline at end of file diff --git a/2_09_XPath.patch b/2_09_XPath.patch deleted file mode 100644 index 675cac038..000000000 --- a/2_09_XPath.patch +++ /dev/null @@ -1,109 +0,0 @@ -Index: src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java (revision ) -+++ src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java (revision ) -@@ -0,0 +1,62 @@ -+package ru.javaops.masterjava.xml.util; -+ -+import org.w3c.dom.Document; -+import org.xml.sax.SAXException; -+ -+import javax.xml.namespace.QName; -+import javax.xml.parsers.DocumentBuilder; -+import javax.xml.parsers.DocumentBuilderFactory; -+import javax.xml.parsers.ParserConfigurationException; -+import javax.xml.xpath.XPath; -+import javax.xml.xpath.XPathExpression; -+import javax.xml.xpath.XPathExpressionException; -+import javax.xml.xpath.XPathFactory; -+import java.io.IOException; -+import java.io.InputStream; -+ -+/** -+ * gkislin -+ * 23.09.2016 -+ */ -+public class XPathProcessor { -+ private static final DocumentBuilderFactory DOCUMENT_FACTORY = DocumentBuilderFactory.newInstance(); -+ private static final DocumentBuilder DOCUMENT_BUILDER; -+ -+ private static final XPathFactory XPATH_FACTORY = XPathFactory.newInstance(); -+ private static final XPath XPATH = XPATH_FACTORY.newXPath(); -+ -+ static { -+ DOCUMENT_FACTORY.setNamespaceAware(true); -+ try { -+ DOCUMENT_BUILDER = DOCUMENT_FACTORY.newDocumentBuilder(); -+ } catch (ParserConfigurationException e) { -+ throw new IllegalStateException(e); -+ } -+ } -+ -+ private final Document doc; -+ -+ public XPathProcessor(InputStream is) { -+ try { -+ doc = DOCUMENT_BUILDER.parse(is); -+ } catch (SAXException | IOException e) { -+ throw new IllegalArgumentException(e); -+ } -+ } -+ -+ public static synchronized XPathExpression getExpression(String exp) { -+ try { -+ return XPATH.compile(exp); -+ } catch (XPathExpressionException e) { -+ throw new IllegalArgumentException(e); -+ } -+ } -+ -+ public T evaluate(XPathExpression expression, QName type) { -+ try { -+ return (T) expression.evaluate(doc, type); -+ } catch (XPathExpressionException e) { -+ throw new IllegalArgumentException(e); -+ } -+ } -+} -Index: src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java (revision ) -+++ src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java (revision ) -@@ -0,0 +1,30 @@ -+package ru.javaops.masterjava.xml.util; -+ -+import com.google.common.io.Resources; -+import org.junit.Test; -+import org.w3c.dom.NodeList; -+ -+import javax.xml.xpath.XPathConstants; -+import javax.xml.xpath.XPathExpression; -+import java.io.InputStream; -+import java.util.stream.IntStream; -+ -+/** -+ * gkislin -+ * 23.09.2016 -+ */ -+public class XPathProcessorTest { -+ @Test -+ public void getCities() throws Exception { -+ try (InputStream is = -+ Resources.getResource("payload.xml").openStream()) { -+ XPathProcessor processor = new XPathProcessor(is); -+ XPathExpression expression = -+ XPathProcessor.getExpression("/*[name()='Payload']/*[name()='Cities']/*[name()='City']/text()"); -+ NodeList nodes = processor.evaluate(expression, XPathConstants.NODESET); -+ IntStream.range(0, nodes.getLength()).forEach( -+ i -> System.out.println(nodes.item(i).getNodeValue()) -+ ); -+ } -+ } -+} -\ No newline at end of file diff --git a/2_10_Xslt.patch b/2_10_Xslt.patch deleted file mode 100644 index cc3a067ca..000000000 --- a/2_10_Xslt.patch +++ /dev/null @@ -1,104 +0,0 @@ -Index: src/main/resources/cities.xsl -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- src/main/resources/cities.xsl (revision 78baa61bd953eda6b18fb8d08f54646375549d66) -+++ src/main/resources/cities.xsl (revision 78baa61bd953eda6b18fb8d08f54646375549d66) -@@ -0,0 +1,9 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -\ No newline at end of file -Index: src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java (revision 78baa61bd953eda6b18fb8d08f54646375549d66) -+++ src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java (revision 78baa61bd953eda6b18fb8d08f54646375549d66) -@@ -0,0 +1,48 @@ -+package ru.javaops.masterjava.xml.util; -+ -+import javax.xml.transform.*; -+import javax.xml.transform.stream.StreamResult; -+import javax.xml.transform.stream.StreamSource; -+import java.io.*; -+import java.nio.charset.StandardCharsets; -+ -+/** -+ * User: GKislin -+ * Date: 18.05.2009 -+ */ -+ -+public class XsltProcessor { -+ private static TransformerFactory FACTORY = TransformerFactory.newInstance(); -+ private final Transformer xformer; -+ -+ public XsltProcessor(InputStream xslInputStream) { -+ this(new BufferedReader(new InputStreamReader(xslInputStream, StandardCharsets.UTF_8))); -+ } -+ -+ public XsltProcessor(Reader xslReader) { -+ try { -+ Templates template = FACTORY.newTemplates(new StreamSource(xslReader)); -+ xformer = template.newTransformer(); -+ } catch (TransformerConfigurationException e) { -+ throw new IllegalStateException("XSLT transformer creation failed: " + e.toString(), e); -+ } -+ } -+ -+ public String transform(InputStream xmlInputStream) throws TransformerException { -+ StringWriter out = new StringWriter(); -+ transform(xmlInputStream, out); -+ return out.getBuffer().toString(); -+ } -+ -+ public void transform(InputStream xmlInputStream, Writer result) throws TransformerException { -+ transform(new BufferedReader(new InputStreamReader(xmlInputStream, StandardCharsets.UTF_8)), result); -+ } -+ -+ public void transform(Reader sourceReader, Writer result) throws TransformerException { -+ xformer.transform(new StreamSource(sourceReader), new StreamResult(result)); -+ } -+ -+ public static String getXsltHeader(String xslt) { -+ return "\n"; -+ } -+} -Index: src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java (revision 78baa61bd953eda6b18fb8d08f54646375549d66) -+++ src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java (revision 78baa61bd953eda6b18fb8d08f54646375549d66) -@@ -0,0 +1,22 @@ -+package ru.javaops.masterjava.xml.util; -+ -+import com.google.common.io.Resources; -+import org.junit.Test; -+ -+import java.io.InputStream; -+ -+/** -+ * gkislin -+ * 23.09.2016 -+ */ -+public class XsltProcessorTest { -+ @Test -+ public void transform() throws Exception { -+ try (InputStream xslInputStream = Resources.getResource("cities.xsl").openStream(); -+ InputStream xmlInputStream = Resources.getResource("payload.xml").openStream()) { -+ -+ XsltProcessor processor = new XsltProcessor(xslInputStream); -+ System.out.println(processor.transform(xmlInputStream)); -+ } -+ } -+} diff --git a/pom.xml b/pom.xml index 2dbccb332..c02f4e349 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,14 @@ ${java.version} + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + -Dfile.encoding=UTF-8 + + org.apache.maven.plugins maven-shade-plugin @@ -80,6 +88,17 @@ RELEASE provided + + com.google.guava + guava + 21.0 + + + junit + junit + 4.12 + test + diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java b/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java new file mode 100644 index 000000000..7401011e9 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java @@ -0,0 +1,43 @@ +package ru.javaops.masterjava.xml.util; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.PropertyException; +import javax.xml.validation.Schema; +import java.io.StringWriter; +import java.io.Writer; + +/** + * @author GKislin + * Date: 18.11.2008 + */ +public class JaxbMarshaller { + private Marshaller marshaller; + + public JaxbMarshaller(JAXBContext ctx) throws JAXBException { + marshaller = ctx.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); + marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); + } + + public void setProperty(String prop, Object value) throws PropertyException { + marshaller.setProperty(prop, value); + } + + public synchronized void setSchema(Schema schema) { + marshaller.setSchema(schema); + } + + public String marshal(Object instance) throws JAXBException { + StringWriter sw = new StringWriter(); + marshal(instance, sw); + return sw.toString(); + } + + public synchronized void marshal(Object instance, Writer writer) throws JAXBException { + marshaller.marshal(instance, writer); + } + +} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java b/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java new file mode 100644 index 000000000..56fc888f4 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java @@ -0,0 +1,89 @@ +package ru.javaops.masterjava.xml.util; + +import org.xml.sax.SAXException; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.PropertyException; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import java.io.*; + + +/** + * Marshalling/Unmarshalling JAXB helper + * XML Facade + * @author Grigory Kislin + */ +public class JaxbParser { + + protected JaxbMarshaller jaxbMarshaller; + protected JaxbUnmarshaller jaxbUnmarshaller; + protected Schema schema; + + public JaxbParser(Class... classesToBeBound) { + try { + init(JAXBContext.newInstance(classesToBeBound)); + } catch (JAXBException e) { + throw new IllegalArgumentException(e); + } + } + + // http://stackoverflow.com/questions/30643802/what-is-jaxbcontext-newinstancestring-contextpath + public JaxbParser(String context) { + try { + init(JAXBContext.newInstance(context)); + } catch (JAXBException e) { + throw new IllegalArgumentException(e); + } + } + + private void init(JAXBContext ctx) throws JAXBException { + jaxbMarshaller = new JaxbMarshaller(ctx); + jaxbUnmarshaller = new JaxbUnmarshaller(ctx); + } + + // Unmarshaller + public T unmarshal(InputStream is) throws JAXBException { + return (T) jaxbUnmarshaller.unmarshal(is); + } + + public T unmarshal(Reader reader) throws JAXBException { + return (T) jaxbUnmarshaller.unmarshal(reader); + } + + public T unmarshal(String str) throws JAXBException { + return (T) jaxbUnmarshaller.unmarshal(str); + } + + // Marshaller + public void setMarshallerProperty(String prop, Object value) { + try { + jaxbMarshaller.setProperty(prop, value); + } catch (PropertyException e) { + throw new IllegalArgumentException(e); + } + } + + public synchronized String marshal(Object instance) throws JAXBException { + return jaxbMarshaller.marshal(instance); + } + + public void marshal(Object instance, Writer writer) throws JAXBException { + jaxbMarshaller.marshal(instance, writer); + } + + public void setSchema(Schema schema) { + this.schema = schema; + jaxbUnmarshaller.setSchema(schema); + jaxbMarshaller.setSchema(schema); + } + + public void validate(String str) throws IOException, SAXException { + validate(new StringReader(str)); + } + + public void validate(Reader reader) throws IOException, SAXException { + schema.newValidator().validate(new StreamSource(reader)); + } +} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java b/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java new file mode 100644 index 000000000..afc34a6e4 --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java @@ -0,0 +1,37 @@ +package ru.javaops.masterjava.xml.util; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.validation.Schema; +import java.io.InputStream; +import java.io.Reader; +import java.io.StringReader; + +/** + * @author GKislin + * Date: 18.11.2008 + */ +public class JaxbUnmarshaller { + private Unmarshaller unmarshaller; + + public JaxbUnmarshaller(JAXBContext ctx) throws JAXBException { + unmarshaller = ctx.createUnmarshaller(); + } + + public synchronized void setSchema(Schema schema) { + unmarshaller.setSchema(schema); + } + + public synchronized Object unmarshal(InputStream is) throws JAXBException { + return unmarshaller.unmarshal(is); + } + + public synchronized Object unmarshal(Reader reader) throws JAXBException { + return unmarshaller.unmarshal(reader); + } + + public Object unmarshal(String str) throws JAXBException { + return unmarshal(new StringReader(str)); + } +} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java b/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java new file mode 100644 index 000000000..711e9eabe --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java @@ -0,0 +1,51 @@ +package ru.javaops.masterjava.xml.util; + +import com.google.common.io.Resources; +import org.xml.sax.SAXException; + +import javax.xml.XMLConstants; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import java.io.File; +import java.io.StringReader; +import java.net.URL; + + +/** + * @author Grigory Kislin + */ +public class Schemas { + + // SchemaFactory is not thread-safe + private static final SchemaFactory SCHEMA_FACTORY = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + + public static synchronized Schema ofString(String xsd) { + try { + return SCHEMA_FACTORY.newSchema(new StreamSource(new StringReader(xsd))); + } catch (SAXException e) { + throw new IllegalArgumentException(e); + } + } + + public static synchronized Schema ofClasspath(String resource) { + // http://digitalsanctum.com/2012/11/30/how-to-read-file-contents-in-java-the-easy-way-with-guava/ + return ofURL(Resources.getResource(resource)); + } + + public static synchronized Schema ofURL(URL url) { + try { + return SCHEMA_FACTORY.newSchema(url); + } catch (SAXException e) { + throw new IllegalArgumentException(e); + } + } + + public static synchronized Schema ofFile(File file) { + try { + return SCHEMA_FACTORY.newSchema(file); + } catch (SAXException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java new file mode 100644 index 000000000..81b759e1d --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java @@ -0,0 +1,60 @@ +package ru.javaops.masterjava.xml.util; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.events.XMLEvent; +import java.io.InputStream; + +/** + * gkislin + * 23.09.2016 + */ +public class StaxStreamProcessor implements AutoCloseable { + private static final XMLInputFactory FACTORY = XMLInputFactory.newInstance(); + + private final XMLStreamReader reader; + + public StaxStreamProcessor(InputStream is) throws XMLStreamException { + reader = FACTORY.createXMLStreamReader(is); + } + + public XMLStreamReader getReader() { + return reader; + } + + public boolean doUntil(int stopEvent, String value) throws XMLStreamException { + while (reader.hasNext()) { + int event = reader.next(); + if (event == stopEvent) { + if (value.equals(getValue(event))) { + return true; + } + } + } + return false; + } + + public String getValue(int event) throws XMLStreamException { + return (event == XMLEvent.CHARACTERS) ? reader.getText() : reader.getLocalName(); + } + + public String getElementValue(String element) throws XMLStreamException { + return doUntil(XMLEvent.START_ELEMENT, element) ? reader.getElementText() : null; + } + + public String getText() throws XMLStreamException { + return reader.getElementText(); + } + + @Override + public void close() { + if (reader != null) { + try { + reader.close(); + } catch (XMLStreamException e) { + // empty + } + } + } +} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java new file mode 100644 index 000000000..d6456a5de --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java @@ -0,0 +1,62 @@ +package ru.javaops.masterjava.xml.util; + +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; +import java.io.IOException; +import java.io.InputStream; + +/** + * gkislin + * 23.09.2016 + */ +public class XPathProcessor { + private static final DocumentBuilderFactory DOCUMENT_FACTORY = DocumentBuilderFactory.newInstance(); + private static final DocumentBuilder DOCUMENT_BUILDER; + + private static final XPathFactory XPATH_FACTORY = XPathFactory.newInstance(); + private static final XPath XPATH = XPATH_FACTORY.newXPath(); + + static { + DOCUMENT_FACTORY.setNamespaceAware(true); + try { + DOCUMENT_BUILDER = DOCUMENT_FACTORY.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException(e); + } + } + + private final Document doc; + + public XPathProcessor(InputStream is) { + try { + doc = DOCUMENT_BUILDER.parse(is); + } catch (SAXException | IOException e) { + throw new IllegalArgumentException(e); + } + } + + public static synchronized XPathExpression getExpression(String exp) { + try { + return XPATH.compile(exp); + } catch (XPathExpressionException e) { + throw new IllegalArgumentException(e); + } + } + + public T evaluate(XPathExpression expression, QName type) { + try { + return (T) expression.evaluate(doc, type); + } catch (XPathExpressionException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java new file mode 100644 index 000000000..359a379ea --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java @@ -0,0 +1,48 @@ +package ru.javaops.masterjava.xml.util; + +import javax.xml.transform.*; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.io.*; +import java.nio.charset.StandardCharsets; + +/** + * User: GKislin + * Date: 18.05.2009 + */ + +public class XsltProcessor { + private static TransformerFactory FACTORY = TransformerFactory.newInstance(); + private final Transformer xformer; + + public XsltProcessor(InputStream xslInputStream) { + this(new BufferedReader(new InputStreamReader(xslInputStream, StandardCharsets.UTF_8))); + } + + public XsltProcessor(Reader xslReader) { + try { + Templates template = FACTORY.newTemplates(new StreamSource(xslReader)); + xformer = template.newTransformer(); + } catch (TransformerConfigurationException e) { + throw new IllegalStateException("XSLT transformer creation failed: " + e.toString(), e); + } + } + + public String transform(InputStream xmlInputStream) throws TransformerException { + StringWriter out = new StringWriter(); + transform(xmlInputStream, out); + return out.getBuffer().toString(); + } + + public void transform(InputStream xmlInputStream, Writer result) throws TransformerException { + transform(new BufferedReader(new InputStreamReader(xmlInputStream, StandardCharsets.UTF_8)), result); + } + + public void transform(Reader sourceReader, Writer result) throws TransformerException { + xformer.transform(new StreamSource(sourceReader), new StreamResult(result)); + } + + public static String getXsltHeader(String xslt) { + return "\n"; + } +} diff --git a/src/main/resources/cities.xsl b/src/main/resources/cities.xsl new file mode 100644 index 000000000..1c509124b --- /dev/null +++ b/src/main/resources/cities.xsl @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java b/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java new file mode 100644 index 000000000..ab1e365e5 --- /dev/null +++ b/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java @@ -0,0 +1,44 @@ +package ru.javaops.masterjava.xml.util; + +import com.google.common.io.Resources; +import org.junit.Test; +import ru.javaops.masterjava.xml.schema.CityType; +import ru.javaops.masterjava.xml.schema.ObjectFactory; +import ru.javaops.masterjava.xml.schema.Payload; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; + +/** + * gkislin + * 23.09.2016 + */ +public class JaxbParserTest { + private static final JaxbParser JAXB_PARSER = new JaxbParser(ObjectFactory.class); + + static { + JAXB_PARSER.setSchema(Schemas.ofClasspath("payload.xsd")); + } + + @Test + public void testPayload() throws Exception { +// JaxbParserTest.class.getResourceAsStream("/city.xml") + Payload payload = JAXB_PARSER.unmarshal( + Resources.getResource("payload.xml").openStream()); + String strPayload = JAXB_PARSER.marshal(payload); + JAXB_PARSER.validate(strPayload); + System.out.println(strPayload); + } + + @Test + public void testCity() throws Exception { + JAXBElement cityElement = JAXB_PARSER.unmarshal( + Resources.getResource("city.xml").openStream()); + CityType city = cityElement.getValue(); + JAXBElement cityElement2 = + new JAXBElement<>(new QName("http://javaops.ru", "City"), CityType.class, city); + String strCity = JAXB_PARSER.marshal(cityElement2); + JAXB_PARSER.validate(strCity); + System.out.println(strCity); + } +} \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java b/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java new file mode 100644 index 000000000..229e2da64 --- /dev/null +++ b/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java @@ -0,0 +1,40 @@ +package ru.javaops.masterjava.xml.util; + +import com.google.common.io.Resources; +import org.junit.Test; + +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.events.XMLEvent; + +/** + * gkislin + * 23.09.2016 + */ +public class StaxStreamProcessorTest { + @Test + public void readCities() throws Exception { + try (StaxStreamProcessor processor = + new StaxStreamProcessor(Resources.getResource("payload.xml").openStream())) { + XMLStreamReader reader = processor.getReader(); + while (reader.hasNext()) { + int event = reader.next(); + if (event == XMLEvent.START_ELEMENT) { + if ("City".equals(reader.getLocalName())) { + System.out.println(reader.getElementText()); + } + } + } + } + } + + @Test + public void readCities2() throws Exception { + try (StaxStreamProcessor processor = + new StaxStreamProcessor(Resources.getResource("payload.xml").openStream())) { + String city; + while ((city = processor.getElementValue("City")) != null) { + System.out.println(city); + } + } + } +} \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java b/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java new file mode 100644 index 000000000..18b6efdc2 --- /dev/null +++ b/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java @@ -0,0 +1,30 @@ +package ru.javaops.masterjava.xml.util; + +import com.google.common.io.Resources; +import org.junit.Test; +import org.w3c.dom.NodeList; + +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import java.io.InputStream; +import java.util.stream.IntStream; + +/** + * gkislin + * 23.09.2016 + */ +public class XPathProcessorTest { + @Test + public void getCities() throws Exception { + try (InputStream is = + Resources.getResource("payload.xml").openStream()) { + XPathProcessor processor = new XPathProcessor(is); + XPathExpression expression = + XPathProcessor.getExpression("/*[name()='Payload']/*[name()='Cities']/*[name()='City']/text()"); + NodeList nodes = processor.evaluate(expression, XPathConstants.NODESET); + IntStream.range(0, nodes.getLength()).forEach( + i -> System.out.println(nodes.item(i).getNodeValue()) + ); + } + } +} \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java b/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java new file mode 100644 index 000000000..403a14c87 --- /dev/null +++ b/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java @@ -0,0 +1,22 @@ +package ru.javaops.masterjava.xml.util; + +import com.google.common.io.Resources; +import org.junit.Test; + +import java.io.InputStream; + +/** + * gkislin + * 23.09.2016 + */ +public class XsltProcessorTest { + @Test + public void transform() throws Exception { + try (InputStream xslInputStream = Resources.getResource("cities.xsl").openStream(); + InputStream xmlInputStream = Resources.getResource("payload.xml").openStream()) { + + XsltProcessor processor = new XsltProcessor(xslInputStream); + System.out.println(processor.transform(xmlInputStream)); + } + } +} diff --git a/src/test/resources/city.xml b/src/test/resources/city.xml new file mode 100644 index 000000000..8b0abcf8a --- /dev/null +++ b/src/test/resources/city.xml @@ -0,0 +1,4 @@ +Санкт-Петербург + \ No newline at end of file From 8b9e91be915e4cc9ac540088178ab7ebee8028c5 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Sun, 12 Mar 2017 21:26:45 +0200 Subject: [PATCH 32/92] clean trash --- IntelliLang.xml | 9 - colors.scheme.xml | 5 - databaseSettings.xml | 26 --- debugger.xml | 82 --------- diff.xml | 26 --- filetypes.xml | 7 - ignore.xml | 27 --- markdown_navigator.shared.xml | 62 ------- mavenVersion.xml | 3 - multimarkdown.shared.xml | 3 - templates.xml | 328 ---------------------------------- ui.lnf.xml | 6 - vcs.xml | 28 --- web-browsers.xml | 10 -- 14 files changed, 622 deletions(-) delete mode 100644 IntelliLang.xml delete mode 100644 colors.scheme.xml delete mode 100644 databaseSettings.xml delete mode 100644 debugger.xml delete mode 100644 diff.xml delete mode 100644 filetypes.xml delete mode 100644 ignore.xml delete mode 100644 markdown_navigator.shared.xml delete mode 100644 mavenVersion.xml delete mode 100644 multimarkdown.shared.xml delete mode 100644 templates.xml delete mode 100644 ui.lnf.xml delete mode 100644 vcs.xml delete mode 100644 web-browsers.xml diff --git a/IntelliLang.xml b/IntelliLang.xml deleted file mode 100644 index 621d5ba9f..000000000 --- a/IntelliLang.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml deleted file mode 100644 index 39308cdb1..000000000 --- a/colors.scheme.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/databaseSettings.xml b/databaseSettings.xml deleted file mode 100644 index 8691bf5ca..000000000 --- a/databaseSettings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/debugger.xml b/debugger.xml deleted file mode 100644 index 49914986e..000000000 --- a/debugger.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/diff.xml b/diff.xml deleted file mode 100644 index ec0397eb5..000000000 --- a/diff.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/filetypes.xml b/filetypes.xml deleted file mode 100644 index 52e2946eb..000000000 --- a/filetypes.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/ignore.xml b/ignore.xml deleted file mode 100644 index bf6ce1a74..000000000 --- a/ignore.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/markdown_navigator.shared.xml b/markdown_navigator.shared.xml deleted file mode 100644 index 2b2887fcc..000000000 --- a/markdown_navigator.shared.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mavenVersion.xml b/mavenVersion.xml deleted file mode 100644 index 553070bb8..000000000 --- a/mavenVersion.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/multimarkdown.shared.xml b/multimarkdown.shared.xml deleted file mode 100644 index b4323c8d0..000000000 --- a/multimarkdown.shared.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/templates.xml b/templates.xml deleted file mode 100644 index 33fac6afe..000000000 --- a/templates.xml +++ /dev/null @@ -1,328 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ui.lnf.xml b/ui.lnf.xml deleted file mode 100644 index d680ca9b0..000000000 --- a/ui.lnf.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/vcs.xml b/vcs.xml deleted file mode 100644 index b0a08502d..000000000 --- a/vcs.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/web-browsers.xml b/web-browsers.xml deleted file mode 100644 index 10814a3f0..000000000 --- a/web-browsers.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file From 37ba5aeba10bcf418b03133ded04a2e82917c54e Mon Sep 17 00:00:00 2001 From: pinky83 Date: Sun, 12 Mar 2017 21:26:55 +0200 Subject: [PATCH 33/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Update=20git.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _windows/git.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/_windows/git.xml b/_windows/git.xml index c4ae9e38b..63bbfa263 100644 --- a/_windows/git.xml +++ b/_windows/git.xml @@ -1,5 +1,6 @@ \ No newline at end of file From 619e36259d5397b8b075868c74d71d3350cd1aa2 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Sun, 12 Mar 2017 21:27:57 +0200 Subject: [PATCH 34/92] clean trash1 --- _windows/git.xml | 5 ----- _windows/keymap.xml | 5 ----- _windows/laf.xml | 5 ----- _windows/path.macros.xml | 6 ------ 4 files changed, 21 deletions(-) delete mode 100644 _windows/git.xml delete mode 100644 _windows/keymap.xml delete mode 100644 _windows/laf.xml delete mode 100644 _windows/path.macros.xml diff --git a/_windows/git.xml b/_windows/git.xml deleted file mode 100644 index c4ae9e38b..000000000 --- a/_windows/git.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/_windows/keymap.xml b/_windows/keymap.xml deleted file mode 100644 index 743029a4b..000000000 --- a/_windows/keymap.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/_windows/laf.xml b/_windows/laf.xml deleted file mode 100644 index dbf49b40f..000000000 --- a/_windows/laf.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/_windows/path.macros.xml b/_windows/path.macros.xml deleted file mode 100644 index 5de6318a8..000000000 --- a/_windows/path.macros.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 010b5e0656c2d627f566839a793e27ad8057bbde Mon Sep 17 00:00:00 2001 From: pinky83 Date: Sun, 12 Mar 2017 21:37:52 +0200 Subject: [PATCH 35/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20ignore.xml,=20ui.?= =?UTF-8?q?lnf.xml,=20IntelliLang.xml,=20web-browsers.xml,=20filetypes.xml?= =?UTF-8?q?,=20colors.scheme.xml,=20multimarkdown.shared.xml,=20markdown?= =?UTF-8?q?=5Fnavigator.shared.xml,=20mavenVersion.xml,=20templates.xml,?= =?UTF-8?q?=20debugger.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntelliLang.xml | 9 + colors.scheme.xml | 5 + debugger.xml | 82 +++++++++ filetypes.xml | 7 + ignore.xml | 27 +++ markdown_navigator.shared.xml | 62 +++++++ mavenVersion.xml | 3 + multimarkdown.shared.xml | 3 + templates.xml | 328 ++++++++++++++++++++++++++++++++++ ui.lnf.xml | 6 + web-browsers.xml | 10 ++ 11 files changed, 542 insertions(+) create mode 100644 IntelliLang.xml create mode 100644 colors.scheme.xml create mode 100644 debugger.xml create mode 100644 filetypes.xml create mode 100644 ignore.xml create mode 100644 markdown_navigator.shared.xml create mode 100644 mavenVersion.xml create mode 100644 multimarkdown.shared.xml create mode 100644 templates.xml create mode 100644 ui.lnf.xml create mode 100644 web-browsers.xml diff --git a/IntelliLang.xml b/IntelliLang.xml new file mode 100644 index 000000000..621d5ba9f --- /dev/null +++ b/IntelliLang.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml new file mode 100644 index 000000000..39308cdb1 --- /dev/null +++ b/colors.scheme.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/debugger.xml b/debugger.xml new file mode 100644 index 000000000..49914986e --- /dev/null +++ b/debugger.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/filetypes.xml b/filetypes.xml new file mode 100644 index 000000000..52e2946eb --- /dev/null +++ b/filetypes.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ignore.xml b/ignore.xml new file mode 100644 index 000000000..bf6ce1a74 --- /dev/null +++ b/ignore.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/markdown_navigator.shared.xml b/markdown_navigator.shared.xml new file mode 100644 index 000000000..2b2887fcc --- /dev/null +++ b/markdown_navigator.shared.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mavenVersion.xml b/mavenVersion.xml new file mode 100644 index 000000000..553070bb8 --- /dev/null +++ b/mavenVersion.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/multimarkdown.shared.xml b/multimarkdown.shared.xml new file mode 100644 index 000000000..b4323c8d0 --- /dev/null +++ b/multimarkdown.shared.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/templates.xml b/templates.xml new file mode 100644 index 000000000..33fac6afe --- /dev/null +++ b/templates.xml @@ -0,0 +1,328 @@ + + + + + \ No newline at end of file diff --git a/ui.lnf.xml b/ui.lnf.xml new file mode 100644 index 000000000..d680ca9b0 --- /dev/null +++ b/ui.lnf.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/web-browsers.xml b/web-browsers.xml new file mode 100644 index 000000000..10814a3f0 --- /dev/null +++ b/web-browsers.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file From 584fa58b0c6b10c470acd98ab6b52398eb8591dd Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 13 Mar 2017 16:38:51 +0200 Subject: [PATCH 36/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20keymap.xml,=20pat?= =?UTF-8?q?h.macros.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _windows/keymap.xml | 5 +++++ _windows/path.macros.xml | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 _windows/keymap.xml create mode 100644 _windows/path.macros.xml diff --git a/_windows/keymap.xml b/_windows/keymap.xml new file mode 100644 index 000000000..743029a4b --- /dev/null +++ b/_windows/keymap.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/_windows/path.macros.xml b/_windows/path.macros.xml new file mode 100644 index 000000000..5de6318a8 --- /dev/null +++ b/_windows/path.macros.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From 09598661b0ffdf86401482d2d788081ba0f8caba Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 13 Mar 2017 18:54:58 +0200 Subject: [PATCH 37/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20find.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- find.xml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 find.xml diff --git a/find.xml b/find.xml new file mode 100644 index 000000000..b0f46e403 --- /dev/null +++ b/find.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file From f6c8e2444f254f60a5243432b89a7ea45938a9e2 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 13 Mar 2017 19:13:25 +0200 Subject: [PATCH 38/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20databaseSettings.?= =?UTF-8?q?xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- databaseSettings.xml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 databaseSettings.xml diff --git a/databaseSettings.xml b/databaseSettings.xml new file mode 100644 index 000000000..8691bf5ca --- /dev/null +++ b/databaseSettings.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 7b8d720008dc58e203fcb06264b38bc7395a940d Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 13 Mar 2017 21:06:41 +0200 Subject: [PATCH 39/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20debugger.renderer?= =?UTF-8?q?s.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debugger.renderers.xml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 debugger.renderers.xml diff --git a/debugger.renderers.xml b/debugger.renderers.xml new file mode 100644 index 000000000..cad6048ab --- /dev/null +++ b/debugger.renderers.xml @@ -0,0 +1,34 @@ + + + + \ No newline at end of file From 8638efdc5336ff432d6f14a8f55847dc6c0d5847 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 13 Mar 2017 21:29:58 +0200 Subject: [PATCH 40/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20toStringTemplates?= =?UTF-8?q?.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- toStringTemplates.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 toStringTemplates.xml diff --git a/toStringTemplates.xml b/toStringTemplates.xml new file mode 100644 index 000000000..dd12a8ae0 --- /dev/null +++ b/toStringTemplates.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file From f0ef32e1b8392dc8d7a0f0146312a90c06eb8535 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Thu, 16 Mar 2017 11:33:09 +0200 Subject: [PATCH 41/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Update=20filetypes.xml,=20?= =?UTF-8?q?diff.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diff.xml | 3 +++ filetypes.xml | 1 + 2 files changed, 4 insertions(+) diff --git a/diff.xml b/diff.xml index 74a3af3a2..ae07d4cb0 100644 --- a/diff.xml +++ b/diff.xml @@ -7,6 +7,9 @@ + + + diff --git a/filetypes.xml b/filetypes.xml index 52e2946eb..27b003d9c 100644 --- a/filetypes.xml +++ b/filetypes.xml @@ -1,6 +1,7 @@ + From 489912f87d3d1814d2d26d82ec96ce7065f6c880 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Thu, 16 Mar 2017 11:37:40 +0200 Subject: [PATCH 42/92] xml parsing patches applied --- 3_5_multimodule.patch | 294 ++++++++++++++++++ pom.xml | 13 + src/main/java/ru/javaops/masterjava/Main.java | 14 - .../masterjava/xml/schema/GroupType.java | 40 +++ .../masterjava/xml/schema/ObjectFactory.java | 24 ++ .../masterjava/xml/schema/Payload.java | 105 ++++++- .../masterjava/xml/schema/Project.java | 223 +++++++++++++ .../javaops/masterjava/xml/schema/User.java | 97 ++++-- .../xml/util/StaxStreamProcessor.java | 17 +- .../masterjava/xml/util/XsltProcessor.java | 4 + src/main/resources/groups.xsl | 36 +++ src/main/resources/payload.xsd | 57 +++- .../java/ru/javaops/masterjava/MainXml.java | 144 +++++++++ src/test/resources/payload.xml | 36 ++- 14 files changed, 1029 insertions(+), 75 deletions(-) create mode 100644 3_5_multimodule.patch delete mode 100644 src/main/java/ru/javaops/masterjava/Main.java create mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java create mode 100644 src/main/java/ru/javaops/masterjava/xml/schema/Project.java create mode 100644 src/main/resources/groups.xsl create mode 100644 src/test/java/ru/javaops/masterjava/MainXml.java diff --git a/3_5_multimodule.patch b/3_5_multimodule.patch new file mode 100644 index 000000000..78fbe1823 --- /dev/null +++ b/3_5_multimodule.patch @@ -0,0 +1,294 @@ +Index: export/pom.xml +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +--- export/pom.xml (revision ) ++++ export/pom.xml (revision ) +@@ -0,0 +1,39 @@ ++ ++ ++ 4.0.0 ++ ++ ++ ru.javaops ++ parent ++ ../parent/pom.xml ++ 1.0-SNAPSHOT ++ ++ ++ export ++ 1.0-SNAPSHOT ++ war ++ Export ++ ++ ++ ++ ++ org.apache.maven.plugins ++ maven-war-plugin ++ 3.0.0 ++ ++ false ++ ++ ++ ++ ++ ++ ++ ++ ru.javaops ++ common ++ ${project.version} ++ ++ ++ +\ No newline at end of file +Index: parent/pom.xml +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +--- parent/pom.xml (revision ) ++++ parent/pom.xml (revision ) +@@ -0,0 +1,69 @@ ++ ++ ++ 4.0.0 ++ ++ ru.javaops ++ parent ++ pom ++ 1.0-SNAPSHOT ++ Parent ++ ++ ++ 1.8 ++ UTF-8 ++ UTF-8 ++ ++ ++ ++ install ++ ++ ++ org.apache.maven.plugins ++ maven-compiler-plugin ++ 3.1 ++ ++ ${java.version} ++ ${java.version} ++ ++ ++ ++ org.apache.maven.plugins ++ maven-surefire-plugin ++ 2.19.1 ++ ++ -Dfile.encoding=UTF-8 ++ ++ ++ ++ ++ ++ ++ ++ com.google.guava ++ guava ++ 21.0 ++ ++ ++ one.util ++ streamex ++ RELEASE ++ ++ ++ ++ ++ junit ++ junit ++ 4.12 ++ test ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +Index: common/pom.xml +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +--- common/pom.xml (revision ) ++++ common/pom.xml (revision ) +@@ -0,0 +1,21 @@ ++ ++ ++ 4.0.0 ++ ++ ++ ru.javaops ++ parent ++ ../parent/pom.xml ++ 1.0-SNAPSHOT ++ ++ ++ common ++ 1.0-SNAPSHOT ++ jar ++ Common ++ ++ ++ ++ +\ No newline at end of file +Index: pom.xml +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +--- pom.xml (date 1489432214000) ++++ pom.xml (revision ) +@@ -4,119 +4,22 @@ + + ru.javaops + masterjava +- jar ++ pom + + 1.0-SNAPSHOT + + Master Java + https://github.com/JavaOPs/masterjava + +- +- 1.8 +- UTF-8 +- UTF-8 +- ++ ++ export ++ common + +- +- masterjava +- install +- +- +- org.apache.maven.plugins +- maven-compiler-plugin +- 3.1 +- +- ${java.version} +- ${java.version} +- +- +- +- org.apache.maven.plugins +- maven-surefire-plugin +- 2.19.1 +- +- -Dfile.encoding=UTF-8 +- +- +- +- org.apache.maven.plugins +- maven-shade-plugin +- 2.2 +- +- +- package +- +- shade +- +- +- benchmarks +- +- +- org.openjdk.jmh.Main +- +- +- +- +- +- *:* +- +- META-INF/*.SF +- META-INF/*.DSA +- META-INF/*.RSA +- +- +- +- +- +- +- +- +- +- +- +- +- org.openjdk.jmh +- jmh-core +- RELEASE +- +- +- org.openjdk.jmh +- jmh-generator-annprocess +- RELEASE +- provided +- +- +- com.google.guava +- guava +- 21.0 +- +- +- one.util +- streamex +- RELEASE +- +- +- +- com.j2html +- j2html +- RELEASE +- +- +- +- +- junit +- junit +- 4.12 +- test +- +- +- +- +- +- +- +- ++ ++ + diff --git a/pom.xml b/pom.xml index c02f4e349..85411116f 100644 --- a/pom.xml +++ b/pom.xml @@ -93,6 +93,19 @@ guava 21.0 + + one.util + streamex + RELEASE + + + + com.j2html + j2html + RELEASE + + + junit junit diff --git a/src/main/java/ru/javaops/masterjava/Main.java b/src/main/java/ru/javaops/masterjava/Main.java deleted file mode 100644 index a849258c4..000000000 --- a/src/main/java/ru/javaops/masterjava/Main.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.javaops.masterjava; - -/** - * User: gkislin - * Date: 05.08.2015 - * - * @link http://caloriesmng.herokuapp.com/ - * @link https://github.com/JavaOPs/topjava - */ -public class Main { - public static void main(String[] args) { - System.out.format("Hello MasterJava!"); - } -} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java b/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java new file mode 100644 index 000000000..d5041640b --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java @@ -0,0 +1,40 @@ + +package ru.javaops.masterjava.xml.schema; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for groupType. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="groupType">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}string">
+ *     <enumeration value="REGISTERING"/>
+ *     <enumeration value="CURRENT"/>
+ *     <enumeration value="FINISHED"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "groupType", namespace = "http://javaops.ru") +@XmlEnum +public enum GroupType { + + REGISTERING, + CURRENT, + FINISHED; + + public String value() { + return name(); + } + + public static GroupType fromValue(String v) { + return valueOf(v); + } + +} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java b/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java index e8f105e2a..bfb393299 100644 --- a/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java +++ b/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java @@ -33,6 +33,14 @@ public class ObjectFactory { public ObjectFactory() { } + /** + * Create an instance of {@link Project } + * + */ + public Project createProject() { + return new Project(); + } + /** * Create an instance of {@link Payload } * @@ -41,6 +49,14 @@ public Payload createPayload() { return new Payload(); } + /** + * Create an instance of {@link Project.Group } + * + */ + public Project.Group createProjectGroup() { + return new Project.Group(); + } + /** * Create an instance of {@link User } * @@ -49,6 +65,14 @@ public User createUser() { return new User(); } + /** + * Create an instance of {@link Payload.Projects } + * + */ + public Payload.Projects createPayloadProjects() { + return new Payload.Projects(); + } + /** * Create an instance of {@link Payload.Cities } * diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java b/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java index 2a6276490..f4a8070e9 100644 --- a/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java +++ b/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java @@ -19,7 +19,18 @@ * <complexType> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> - * <all> + * <sequence> + * <element name="Projects"> + * <complexType> + * <complexContent> + * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> + * <sequence maxOccurs="unbounded"> + * <element ref="{http://javaops.ru}Project"/> + * </sequence> + * </restriction> + * </complexContent> + * </complexType> + * </element> * <element name="Cities"> * <complexType> * <complexContent> @@ -42,7 +53,7 @@ * </complexContent> * </complexType> * </element> - * </all> + * </sequence> * </restriction> * </complexContent> * </complexType> @@ -52,16 +63,44 @@ */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { - + "projects", + "cities", + "users" }) @XmlRootElement(name = "Payload", namespace = "http://javaops.ru") public class Payload { + @XmlElement(name = "Projects", namespace = "http://javaops.ru", required = true) + protected Payload.Projects projects; @XmlElement(name = "Cities", namespace = "http://javaops.ru", required = true) protected Payload.Cities cities; @XmlElement(name = "Users", namespace = "http://javaops.ru", required = true) protected Payload.Users users; + /** + * Gets the value of the projects property. + * + * @return + * possible object is + * {@link Payload.Projects } + * + */ + public Payload.Projects getProjects() { + return projects; + } + + /** + * Sets the value of the projects property. + * + * @param value + * allowed object is + * {@link Payload.Projects } + * + */ + public void setProjects(Payload.Projects value) { + this.projects = value; + } + /** * Gets the value of the cities property. * @@ -171,6 +210,66 @@ public List getCity() { } + /** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+     * <complexType>
+     *   <complexContent>
+     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *       <sequence maxOccurs="unbounded">
+     *         <element ref="{http://javaops.ru}Project"/>
+     *       </sequence>
+     *     </restriction>
+     *   </complexContent>
+     * </complexType>
+     * 
+ * + * + */ + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "", propOrder = { + "project" + }) + public static class Projects { + + @XmlElement(name = "Project", namespace = "http://javaops.ru", required = true) + protected List project; + + /** + * Gets the value of the project property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the project property. + * + *

+ * For example, to add a new item, do as follows: + *

+         *    getProject().add(newItem);
+         * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Project } + * + * + */ + public List getProject() { + if (project == null) { + project = new ArrayList(); + } + return this.project; + } + + } + + /** *

Java class for anonymous complex type. * diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/Project.java b/src/main/java/ru/javaops/masterjava/xml/schema/Project.java new file mode 100644 index 000000000..7e9cd961a --- /dev/null +++ b/src/main/java/ru/javaops/masterjava/xml/schema/Project.java @@ -0,0 +1,223 @@ + +package ru.javaops.masterjava.xml.schema; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="description" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <sequence maxOccurs="unbounded">
+ *           <element name="Group">
+ *             <complexType>
+ *               <complexContent>
+ *                 <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                   <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *                   <attribute name="type" use="required" type="{http://javaops.ru}groupType" />
+ *                 </restriction>
+ *               </complexContent>
+ *             </complexType>
+ *           </element>
+ *         </sequence>
+ *       </sequence>
+ *       <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "description", + "group" +}) +@XmlRootElement(name = "Project", namespace = "http://javaops.ru") +public class Project { + + @XmlElement(namespace = "http://javaops.ru", required = true) + protected String description; + @XmlElement(name = "Group", namespace = "http://javaops.ru", required = true) + protected List group; + @XmlAttribute(name = "name", required = true) + protected String name; + + /** + * Gets the value of the description property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDescription() { + return description; + } + + /** + * Sets the value of the description property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDescription(String value) { + this.description = value; + } + + /** + * Gets the value of the group property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the group property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getGroup().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Project.Group } + * + * + */ + public List getGroup() { + if (group == null) { + group = new ArrayList(); + } + return this.group; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + + /** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+     * <complexType>
+     *   <complexContent>
+     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *       <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}ID" />
+     *       <attribute name="type" use="required" type="{http://javaops.ru}groupType" />
+     *     </restriction>
+     *   </complexContent>
+     * </complexType>
+     * 
+ * + * + */ + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "") + public static class Group { + + @XmlAttribute(name = "name", required = true) + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String name; + @XmlAttribute(name = "type", required = true) + protected GroupType type; + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link GroupType } + * + */ + public GroupType getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link GroupType } + * + */ + public void setType(GroupType value) { + this.type = value; + } + + } + +} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/User.java b/src/main/java/ru/javaops/masterjava/xml/schema/User.java index b3430ce71..9f19c0ad7 100644 --- a/src/main/java/ru/javaops/masterjava/xml/schema/User.java +++ b/src/main/java/ru/javaops/masterjava/xml/schema/User.java @@ -1,14 +1,9 @@ package ru.javaops.masterjava.xml.schema; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlIDREF; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlSchemaType; -import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.*; +import java.util.ArrayList; +import java.util.List; /** @@ -18,16 +13,14 @@ * *
  * <complexType>
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="email" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="fullName" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *       </sequence>
+ *   <simpleContent>
+ *     <extension base="<http://www.w3.org/2001/XMLSchema>string">
+ *       <attribute name="email" type="{http://javaops.ru}emailAddressType" />
  *       <attribute name="flag" use="required" type="{http://javaops.ru}flagType" />
  *       <attribute name="city" use="required" type="{http://www.w3.org/2001/XMLSchema}IDREF" />
- *     </restriction>
- *   </complexContent>
+ *       <attribute name="groupRefs" type="{http://www.w3.org/2001/XMLSchema}IDREFS" />
+ *     </extension>
+ *   </simpleContent>
  * </complexType>
  * 
* @@ -35,69 +28,72 @@ */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { - "email", - "fullName" + "value" }) @XmlRootElement(name = "User", namespace = "http://javaops.ru") public class User { - @XmlElement(namespace = "http://javaops.ru", required = true) + @XmlValue + protected String value; + @XmlAttribute(name = "email") protected String email; - @XmlElement(namespace = "http://javaops.ru", required = true) - protected String fullName; @XmlAttribute(name = "flag", required = true) protected FlagType flag; @XmlAttribute(name = "city", required = true) @XmlIDREF @XmlSchemaType(name = "IDREF") protected Object city; + @XmlAttribute(name = "groupRefs") + @XmlIDREF + @XmlSchemaType(name = "IDREFS") + protected List groupRefs; /** - * Gets the value of the email property. + * Gets the value of the value property. * * @return * possible object is * {@link String } * */ - public String getEmail() { - return email; + public String getValue() { + return value; } /** - * Sets the value of the email property. + * Sets the value of the value property. * * @param value * allowed object is * {@link String } * */ - public void setEmail(String value) { - this.email = value; + public void setValue(String value) { + this.value = value; } /** - * Gets the value of the fullName property. + * Gets the value of the email property. * * @return * possible object is * {@link String } * */ - public String getFullName() { - return fullName; + public String getEmail() { + return email; } /** - * Sets the value of the fullName property. + * Sets the value of the email property. * * @param value * allowed object is * {@link String } * */ - public void setFullName(String value) { - this.fullName = value; + public void setEmail(String value) { + this.email = value; } /** @@ -148,4 +144,39 @@ public void setCity(Object value) { this.city = value; } + /** + * Gets the value of the groupRefs property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the groupRefs property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getGroupRefs().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Object } + * + * + */ + public List getGroupRefs() { + if (groupRefs == null) { + groupRefs = new ArrayList(); + } + return this.groupRefs; + } + + @Override + public String toString() { + return value + '(' + email + ')'; + } + + } diff --git a/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java index 81b759e1d..ce507b764 100644 --- a/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java +++ b/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java @@ -24,15 +24,26 @@ public XMLStreamReader getReader() { } public boolean doUntil(int stopEvent, String value) throws XMLStreamException { + return doUntilAny(stopEvent, value) != null; + } + + public String getAttribute(String name) throws XMLStreamException { + return reader.getAttributeValue(null, name); + } + + public String doUntilAny(int stopEvent, String... values) throws XMLStreamException { while (reader.hasNext()) { int event = reader.next(); if (event == stopEvent) { - if (value.equals(getValue(event))) { - return true; + String xmlValue = getValue(event); + for (String value : values) { + if (value.equals(xmlValue)) { + return xmlValue; + } } } } - return false; + return null; } public String getValue(int event) throws XMLStreamException { diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java b/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java index 359a379ea..4a395ba3e 100644 --- a/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java +++ b/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java @@ -45,4 +45,8 @@ public void transform(Reader sourceReader, Writer result) throws TransformerExce public static String getXsltHeader(String xslt) { return "\n"; } + + public void setParameter(String name, String value) { + xformer.setParameter(name, value); + } } diff --git a/src/main/resources/groups.xsl b/src/main/resources/groups.xsl new file mode 100644 index 000000000..dcb6901a2 --- /dev/null +++ b/src/main/resources/groups.xsl @@ -0,0 +1,36 @@ + + + + + + + + + <xsl:value-of select="$projectName"/> groups + + + +

+ groups +

+ + + + + + + + + + + +
GroupType
+ + + +
+ + +
+
\ No newline at end of file diff --git a/src/main/resources/payload.xsd b/src/main/resources/payload.xsd index 9ef1e46eb..3d545ec54 100644 --- a/src/main/resources/payload.xsd +++ b/src/main/resources/payload.xsd @@ -6,7 +6,14 @@ - + + + + + + + + @@ -21,18 +28,39 @@ - + - + - - + + + + + + + + + - - + + + + + + + + + + + + + + + + @@ -44,7 +72,13 @@ - + + + + + + + @@ -53,4 +87,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/MainXml.java b/src/test/java/ru/javaops/masterjava/MainXml.java new file mode 100644 index 000000000..a4cd759b1 --- /dev/null +++ b/src/test/java/ru/javaops/masterjava/MainXml.java @@ -0,0 +1,144 @@ +package ru.javaops.masterjava; + +import com.google.common.base.Splitter; +import com.google.common.io.Resources; +import j2html.tags.ContainerTag; +import one.util.streamex.StreamEx; +import ru.javaops.masterjava.xml.schema.ObjectFactory; +import ru.javaops.masterjava.xml.schema.Payload; +import ru.javaops.masterjava.xml.schema.Project; +import ru.javaops.masterjava.xml.schema.User; +import ru.javaops.masterjava.xml.util.JaxbParser; +import ru.javaops.masterjava.xml.util.Schemas; +import ru.javaops.masterjava.xml.util.StaxStreamProcessor; +import ru.javaops.masterjava.xml.util.XsltProcessor; + +import javax.xml.stream.events.XMLEvent; +import java.io.InputStream; +import java.io.Writer; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; +import java.util.stream.Collectors; + +import static com.google.common.base.Strings.nullToEmpty; +import static j2html.TagCreator.*; + + +/** + * User: gkislin + */ +public class MainXml { + private static final Comparator USER_COMPARATOR = Comparator.comparing(User::getValue).thenComparing(User::getEmail); + + public static void main(String[] args) throws Exception { + if (args.length != 1) { + System.out.println("Format: projectName"); + System.exit(1); + } + String projectName = args[0]; + URL payloadUrl = Resources.getResource("payload.xml"); + + Set users = parseByJaxb(projectName, payloadUrl); + users.forEach(System.out::println); + + String html = toHtml(users, projectName); + System.out.println(html); + try (Writer writer = Files.newBufferedWriter(Paths.get("out/users.html"))) { + writer.write(html); + } + + System.out.println(); + users = processByStax(projectName, payloadUrl); + users.forEach(System.out::println); + + html = transform(projectName, payloadUrl); + try (Writer writer = Files.newBufferedWriter(Paths.get("out/groups.html"))) { + writer.write(html); + } + } + + private static Set parseByJaxb(String projectName, URL payloadUrl) throws Exception { + JaxbParser parser = new JaxbParser(ObjectFactory.class); + parser.setSchema(Schemas.ofClasspath("payload.xsd")); + Payload payload; + try (InputStream is = payloadUrl.openStream()) { + payload = parser.unmarshal(is); + } + + Project project = StreamEx.of(payload.getProjects().getProject()) + .filter(p -> p.getName().equals(projectName)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException("Invalid project name '" + projectName + '\'')); + + final Set groups = new HashSet<>(project.getGroup()); // identity compare + return StreamEx.of(payload.getUsers().getUser()) + .filter(u -> !Collections.disjoint(groups, u.getGroupRefs())) + .collect(Collectors.toCollection(() -> new TreeSet<>(USER_COMPARATOR))); + } + + private static Set processByStax(String projectName, URL payloadUrl) throws Exception { + + try (InputStream is = payloadUrl.openStream()) { + StaxStreamProcessor processor = new StaxStreamProcessor(is); + final Set groupNames = new HashSet<>(); + + // Projects loop + projects: + while (processor.doUntil(XMLEvent.START_ELEMENT, "Project")) { + if (projectName.equals(processor.getAttribute("name"))) { + // Groups loop + String element; + while ((element = processor.doUntilAny(XMLEvent.START_ELEMENT, "Project", "Group", "Users")) != null) { + if (!element.equals("Group")) { + break projects; + } + groupNames.add(processor.getAttribute("name")); + } + } + } + if (groupNames.isEmpty()) { + throw new IllegalArgumentException("Invalid " + projectName + " or no groups"); + } + + // Users loop + Set users = new TreeSet<>(USER_COMPARATOR); + + while (processor.doUntil(XMLEvent.START_ELEMENT, "User")) { + String groupRefs = processor.getAttribute("groupRefs"); + if (!Collections.disjoint(groupNames, Splitter.on(' ').splitToList(nullToEmpty(groupRefs)))) { + User user = new User(); + user.setEmail(processor.getAttribute("email")); + user.setValue(processor.getText()); + users.add(user); + } + } + return users; + } + } + + private static String toHtml(Set users, String projectName) { + final ContainerTag table = table().with( + tr().with(th("FullName"), th("email"))) + .attr("border", "1") + .attr("cellpadding", "8") + .attr("cellspacing", "0"); + + users.forEach(u -> table.with(tr().with(td(u.getValue()), td(u.getEmail())))); + + return html().with( + head().with(title(projectName + " users")), + body().with(h1(projectName + " users"), table) + ).render(); + } + + private static String transform(String projectName, URL payloadUrl) throws Exception { + URL xsl = Resources.getResource("groups.xsl"); + try (InputStream xmlStream = payloadUrl.openStream(); InputStream xslStream = xsl.openStream()) { + XsltProcessor processor = new XsltProcessor(xslStream); + processor.setParameter("projectName", projectName); + return processor.transform(xmlStream); + } + } +} diff --git a/src/test/resources/payload.xml b/src/test/resources/payload.xml index 796e99cb3..fadf8c64a 100644 --- a/src/test/resources/payload.xml +++ b/src/test/resources/payload.xml @@ -1,23 +1,31 @@ - - - gmail@gmail.com - Full Name - - - admin@javaops.ru - Admin - - - mail@yandex.ru - Deleted - - + + + + Topjava + + + + + + Masterjava + + + Санкт-Петербург + Москва Киев Минск + + Full Name + Admin + Deleted + User1 + User2 + User3 + \ No newline at end of file From bad66ce5a4fd8664432e43f107b7397822e11f7e Mon Sep 17 00:00:00 2001 From: pinky83 Date: Thu, 16 Mar 2017 11:43:18 +0200 Subject: [PATCH 43/92] clean --- IntelliLang.xml | 9 - _windows/git.xml | 6 - _windows/keymap.xml | 5 - _windows/laf.xml | 5 - _windows/path.macros.xml | 6 - colors.scheme.xml | 5 - databaseSettings.xml | 26 --- debugger.renderers.xml | 34 ---- debugger.xml | 82 --------- diff.xml | 29 --- filetypes.xml | 7 - find.xml | 7 - gradle.run.settings.xml | 5 - ignore.xml | 27 --- inspection/Default.xml | 3 - markdown_navigator.shared.xml | 62 ------- mavenVersion.xml | 3 - multimarkdown.shared.xml | 3 - templates.xml | 328 ---------------------------------- toStringTemplates.xml | 5 - ui.lnf.xml | 6 - web-browsers.xml | 10 -- 22 files changed, 673 deletions(-) delete mode 100644 IntelliLang.xml delete mode 100644 _windows/git.xml delete mode 100644 _windows/keymap.xml delete mode 100644 _windows/laf.xml delete mode 100644 _windows/path.macros.xml delete mode 100644 colors.scheme.xml delete mode 100644 databaseSettings.xml delete mode 100644 debugger.renderers.xml delete mode 100644 debugger.xml delete mode 100644 diff.xml delete mode 100644 filetypes.xml delete mode 100644 find.xml delete mode 100644 gradle.run.settings.xml delete mode 100644 ignore.xml delete mode 100644 inspection/Default.xml delete mode 100644 markdown_navigator.shared.xml delete mode 100644 mavenVersion.xml delete mode 100644 multimarkdown.shared.xml delete mode 100644 templates.xml delete mode 100644 toStringTemplates.xml delete mode 100644 ui.lnf.xml delete mode 100644 web-browsers.xml diff --git a/IntelliLang.xml b/IntelliLang.xml deleted file mode 100644 index 621d5ba9f..000000000 --- a/IntelliLang.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/_windows/git.xml b/_windows/git.xml deleted file mode 100644 index 63bbfa263..000000000 --- a/_windows/git.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/_windows/keymap.xml b/_windows/keymap.xml deleted file mode 100644 index 743029a4b..000000000 --- a/_windows/keymap.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/_windows/laf.xml b/_windows/laf.xml deleted file mode 100644 index c1f98d951..000000000 --- a/_windows/laf.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/_windows/path.macros.xml b/_windows/path.macros.xml deleted file mode 100644 index 5de6318a8..000000000 --- a/_windows/path.macros.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml deleted file mode 100644 index 39308cdb1..000000000 --- a/colors.scheme.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/databaseSettings.xml b/databaseSettings.xml deleted file mode 100644 index 8691bf5ca..000000000 --- a/databaseSettings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/debugger.renderers.xml b/debugger.renderers.xml deleted file mode 100644 index cad6048ab..000000000 --- a/debugger.renderers.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - \ No newline at end of file diff --git a/debugger.xml b/debugger.xml deleted file mode 100644 index 49914986e..000000000 --- a/debugger.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/diff.xml b/diff.xml deleted file mode 100644 index 74a3af3a2..000000000 --- a/diff.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/filetypes.xml b/filetypes.xml deleted file mode 100644 index 52e2946eb..000000000 --- a/filetypes.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/find.xml b/find.xml deleted file mode 100644 index b0f46e403..000000000 --- a/find.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/gradle.run.settings.xml b/gradle.run.settings.xml deleted file mode 100644 index 98883fd09..000000000 --- a/gradle.run.settings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/ignore.xml b/ignore.xml deleted file mode 100644 index bf6ce1a74..000000000 --- a/ignore.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/inspection/Default.xml b/inspection/Default.xml deleted file mode 100644 index 60121f310..000000000 --- a/inspection/Default.xml +++ /dev/null @@ -1,3 +0,0 @@ - - \ No newline at end of file diff --git a/markdown_navigator.shared.xml b/markdown_navigator.shared.xml deleted file mode 100644 index 2b2887fcc..000000000 --- a/markdown_navigator.shared.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mavenVersion.xml b/mavenVersion.xml deleted file mode 100644 index 553070bb8..000000000 --- a/mavenVersion.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/multimarkdown.shared.xml b/multimarkdown.shared.xml deleted file mode 100644 index b4323c8d0..000000000 --- a/multimarkdown.shared.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/templates.xml b/templates.xml deleted file mode 100644 index 33fac6afe..000000000 --- a/templates.xml +++ /dev/null @@ -1,328 +0,0 @@ - - - - - \ No newline at end of file diff --git a/toStringTemplates.xml b/toStringTemplates.xml deleted file mode 100644 index dd12a8ae0..000000000 --- a/toStringTemplates.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/ui.lnf.xml b/ui.lnf.xml deleted file mode 100644 index d680ca9b0..000000000 --- a/ui.lnf.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/web-browsers.xml b/web-browsers.xml deleted file mode 100644 index 10814a3f0..000000000 --- a/web-browsers.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file From 39ad73969fc5e64553c569f97fa1aa7b66d91c8f Mon Sep 17 00:00:00 2001 From: pinky83 Date: Thu, 16 Mar 2017 12:07:03 +0200 Subject: [PATCH 44/92] multymodule --- .gitignore | 4 +- common/pom.xml | 21 +++++++++ export/pom.xml | 39 ++++++++++++++++ parent/pom.xml | 69 ++++++++++++++++++++++++++++ pom.xml | 121 +++++-------------------------------------------- 5 files changed, 144 insertions(+), 110 deletions(-) create mode 100644 common/pom.xml create mode 100644 export/pom.xml create mode 100644 parent/pom.xml diff --git a/.gitignore b/.gitignore index ad02a2599..3e52fd158 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ out target *.iml -log \ No newline at end of file +log +inspection +_windows \ No newline at end of file diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 000000000..33d3da8ed --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + + ru.javaops + parent + ../parent/pom.xml + 1.0-SNAPSHOT + + + common + 1.0-SNAPSHOT + jar + Common + + + + \ No newline at end of file diff --git a/export/pom.xml b/export/pom.xml new file mode 100644 index 000000000..0d2d1b34c --- /dev/null +++ b/export/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + + ru.javaops + parent + ../parent/pom.xml + 1.0-SNAPSHOT + + + export + 1.0-SNAPSHOT + war + Export + + + + + org.apache.maven.plugins + maven-war-plugin + 3.0.0 + + false + + + + + + + + ru.javaops + common + ${project.version} + + + \ No newline at end of file diff --git a/parent/pom.xml b/parent/pom.xml new file mode 100644 index 000000000..6fe28bda3 --- /dev/null +++ b/parent/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + ru.javaops + parent + pom + 1.0-SNAPSHOT + Parent + + + 1.8 + UTF-8 + UTF-8 + + + + install + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + -Dfile.encoding=UTF-8 + + + + + + + + com.google.guava + guava + 21.0 + + + one.util + streamex + RELEASE + + + + + junit + junit + 4.12 + test + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 85411116f..ed9773f64 100644 --- a/pom.xml +++ b/pom.xml @@ -4,119 +4,22 @@ ru.javaops masterjava - jar + pom 1.0-SNAPSHOT Master Java https://github.com/JavaOPs/masterjava - - 1.8 - UTF-8 - UTF-8 - - - - masterjava - install - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - ${java.version} - ${java.version} - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - -Dfile.encoding=UTF-8 - - - - org.apache.maven.plugins - maven-shade-plugin - 2.2 - - - package - - shade - - - benchmarks - - - org.openjdk.jmh.Main - - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - - - - - - - org.openjdk.jmh - jmh-core - RELEASE - - - org.openjdk.jmh - jmh-generator-annprocess - RELEASE - provided - - - com.google.guava - guava - 21.0 - - - one.util - streamex - RELEASE - - - - com.j2html - j2html - RELEASE - - - - - junit - junit - 4.12 - test - - - - - - - - + + export + common + + + From a233a339700df49dfc6bf41c00e45d9e961c3e88 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Thu, 16 Mar 2017 15:09:59 +0200 Subject: [PATCH 45/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Update=20ignore.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ignore.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ignore.xml b/ignore.xml index bf6ce1a74..a31e71fb0 100644 --- a/ignore.xml +++ b/ignore.xml @@ -1,5 +1,5 @@ - + From f302bffbae6cea3d498c8d6496d5db96092099f3 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 20 Mar 2017 20:23:04 +0200 Subject: [PATCH 46/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20IntelliLang.xml,?= =?UTF-8?q?=20git.xml,=20diff.xml,=20laf.xml,=20path.macros.xml,=20ignore.?= =?UTF-8?q?xml,=20find.xml,=20ui.lnf.xml,=20web-browsers.xml,=20filetypes.?= =?UTF-8?q?xml,=20keymap.xml,=20gradle.run.settings.xml,=20colors.scheme.x?= =?UTF-8?q?ml,=20databaseSettings.xml,=20multimarkdown.shared.xml,=20markd?= =?UTF-8?q?own=5Fnavigator.shared.xml,=20mavenVersion.xml,=20templates.xml?= =?UTF-8?q?,=20debugger.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntelliLang.xml | 9 + _windows/git.xml | 6 + _windows/keymap.xml | 5 + _windows/laf.xml | 5 + _windows/path.macros.xml | 6 + colors.scheme.xml | 5 + databaseSettings.xml | 26 +++ debugger.xml | 82 +++++++++ diff.xml | 32 ++++ filetypes.xml | 8 + find.xml | 7 + gradle.run.settings.xml | 5 + ignore.xml | 27 +++ markdown_navigator.shared.xml | 62 +++++++ mavenVersion.xml | 3 + multimarkdown.shared.xml | 3 + templates.xml | 328 ++++++++++++++++++++++++++++++++++ ui.lnf.xml | 6 + web-browsers.xml | 10 ++ 19 files changed, 635 insertions(+) create mode 100644 IntelliLang.xml create mode 100644 _windows/git.xml create mode 100644 _windows/keymap.xml create mode 100644 _windows/laf.xml create mode 100644 _windows/path.macros.xml create mode 100644 colors.scheme.xml create mode 100644 databaseSettings.xml create mode 100644 debugger.xml create mode 100644 diff.xml create mode 100644 filetypes.xml create mode 100644 find.xml create mode 100644 gradle.run.settings.xml create mode 100644 ignore.xml create mode 100644 markdown_navigator.shared.xml create mode 100644 mavenVersion.xml create mode 100644 multimarkdown.shared.xml create mode 100644 templates.xml create mode 100644 ui.lnf.xml create mode 100644 web-browsers.xml diff --git a/IntelliLang.xml b/IntelliLang.xml new file mode 100644 index 000000000..621d5ba9f --- /dev/null +++ b/IntelliLang.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/_windows/git.xml b/_windows/git.xml new file mode 100644 index 000000000..63bbfa263 --- /dev/null +++ b/_windows/git.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/_windows/keymap.xml b/_windows/keymap.xml new file mode 100644 index 000000000..743029a4b --- /dev/null +++ b/_windows/keymap.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/_windows/laf.xml b/_windows/laf.xml new file mode 100644 index 000000000..c1f98d951 --- /dev/null +++ b/_windows/laf.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/_windows/path.macros.xml b/_windows/path.macros.xml new file mode 100644 index 000000000..5de6318a8 --- /dev/null +++ b/_windows/path.macros.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml new file mode 100644 index 000000000..39308cdb1 --- /dev/null +++ b/colors.scheme.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/databaseSettings.xml b/databaseSettings.xml new file mode 100644 index 000000000..8691bf5ca --- /dev/null +++ b/databaseSettings.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/debugger.xml b/debugger.xml new file mode 100644 index 000000000..49914986e --- /dev/null +++ b/debugger.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/diff.xml b/diff.xml new file mode 100644 index 000000000..ae07d4cb0 --- /dev/null +++ b/diff.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/filetypes.xml b/filetypes.xml new file mode 100644 index 000000000..27b003d9c --- /dev/null +++ b/filetypes.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/find.xml b/find.xml new file mode 100644 index 000000000..b0f46e403 --- /dev/null +++ b/find.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/gradle.run.settings.xml b/gradle.run.settings.xml new file mode 100644 index 000000000..98883fd09 --- /dev/null +++ b/gradle.run.settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/ignore.xml b/ignore.xml new file mode 100644 index 000000000..a31e71fb0 --- /dev/null +++ b/ignore.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/markdown_navigator.shared.xml b/markdown_navigator.shared.xml new file mode 100644 index 000000000..2b2887fcc --- /dev/null +++ b/markdown_navigator.shared.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mavenVersion.xml b/mavenVersion.xml new file mode 100644 index 000000000..553070bb8 --- /dev/null +++ b/mavenVersion.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/multimarkdown.shared.xml b/multimarkdown.shared.xml new file mode 100644 index 000000000..b4323c8d0 --- /dev/null +++ b/multimarkdown.shared.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/templates.xml b/templates.xml new file mode 100644 index 000000000..33fac6afe --- /dev/null +++ b/templates.xml @@ -0,0 +1,328 @@ + + + + + \ No newline at end of file diff --git a/ui.lnf.xml b/ui.lnf.xml new file mode 100644 index 000000000..d680ca9b0 --- /dev/null +++ b/ui.lnf.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/web-browsers.xml b/web-browsers.xml new file mode 100644 index 000000000..10814a3f0 --- /dev/null +++ b/web-browsers.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file From 4a5b262ebe757cc6e8a8b7037b7984eb56d073c7 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Tue, 21 Mar 2017 22:21:51 +0200 Subject: [PATCH 47/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20debugger.renderer?= =?UTF-8?q?s.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debugger.renderers.xml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 debugger.renderers.xml diff --git a/debugger.renderers.xml b/debugger.renderers.xml new file mode 100644 index 000000000..cad6048ab --- /dev/null +++ b/debugger.renderers.xml @@ -0,0 +1,34 @@ + + + + \ No newline at end of file From 93f3b04a251a2f2e8473167d6f0c64f4bab9e830 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Tue, 28 Mar 2017 21:11:42 +0300 Subject: [PATCH 48/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Update=20mavenVersion.xml?= =?UTF-8?q?=09Create=20databaseDrivers.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- databaseDrivers.xml | 58 +++++++++++++++++++++++++++++++++++++++++++++ mavenVersion.xml | 2 +- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 databaseDrivers.xml diff --git a/databaseDrivers.xml b/databaseDrivers.xml new file mode 100644 index 000000000..2174ca6d8 --- /dev/null +++ b/databaseDrivers.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mavenVersion.xml b/mavenVersion.xml index 553070bb8..8b7167a17 100644 --- a/mavenVersion.xml +++ b/mavenVersion.xml @@ -1,3 +1,3 @@ - + \ No newline at end of file From 2fdb88fc0c8917784f728d493a41e5a115bd34b4 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Wed, 29 Mar 2017 11:52:10 +0300 Subject: [PATCH 49/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Update=20mavenVersion.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mavenVersion.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mavenVersion.xml b/mavenVersion.xml index 8b7167a17..553070bb8 100644 --- a/mavenVersion.xml +++ b/mavenVersion.xml @@ -1,3 +1,3 @@ - + \ No newline at end of file From 8f3bac7de1e30a60d35e421f6fc04fca239a9b18 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Wed, 29 Mar 2017 12:26:45 +0300 Subject: [PATCH 50/92] HW3 patches applied --- 3_5_multimodule.patch | 294 ------------------ config_templates/context.xml | 49 +++ config_templates/logback-test.xml | 21 ++ config_templates/logback.xml | 40 +++ config_templates/sql/initDB.sql | 15 + {export => parent-web}/pom.xml | 37 ++- parent/pom.xml | 54 +++- persist/pom.xml | 46 +++ .../masterjava/persist/DBIProvider.java | 56 ++++ .../masterjava/persist/dao/AbstractDao.java | 11 + .../masterjava/persist/dao/UserDao.java | 43 +++ .../masterjava/persist/model/BaseEntity.java | 41 +++ .../masterjava/persist/model/User.java | 82 +++++ .../masterjava/persist/model/UserFlag.java | 11 + pom.xml | 16 +- services/mail-api/pom.xml | 26 ++ services/mail-service/pom.xml | 26 ++ .../masterjava/service/mail}/MailService.java | 2 +- services/pom.xml | 15 + test/pom.xml | 76 +++++ .../javaops/masterjava/matrix/MainMatrix.java | 0 .../masterjava/matrix/MatrixBenchmark.java | 0 .../javaops/masterjava/matrix/MatrixUtil.java | 2 +- web/common-web/pom.xml | 43 +++ web/export/pom.xml | 42 +++ .../masterjava/common/web/ThymeleafUtil.java | 24 ++ .../masterjava/export/ThymeleafListener.java | 21 ++ .../masterjava/export/UploadServlet.java | 48 +++ .../javaops/masterjava/export/UserExport.java | 32 ++ .../masterjava/xml/schema/CityType.java | 0 .../masterjava/xml/schema/FlagType.java | 0 .../masterjava/xml/schema/GroupType.java | 0 .../masterjava/xml/schema/ObjectFactory.java | 0 .../masterjava/xml/schema/Payload.java | 0 .../masterjava/xml/schema/Project.java | 0 .../javaops/masterjava/xml/schema/User.java | 0 .../masterjava/xml/util/JaxbMarshaller.java | 0 .../masterjava/xml/util/JaxbParser.java | 0 .../masterjava/xml/util/JaxbUnmarshaller.java | 0 .../javaops/masterjava/xml/util/Schemas.java | 0 .../xml/util/StaxStreamProcessor.java | 0 .../masterjava/xml/util/XPathProcessor.java | 0 .../masterjava/xml/util/XsltProcessor.java | 0 .../export/src}/main/resources/cities.xsl | 2 +- .../export/src}/main/resources/groups.xsl | 2 +- .../export/src}/main/resources/payload.xsd | 2 +- .../webapp/WEB-INF/templates/exception.html | 19 ++ .../main/webapp/WEB-INF/templates/export.html | 17 + .../main/webapp/WEB-INF/templates/result.html | 26 ++ .../java/ru/javaops/masterjava/MainXml.java | 0 .../masterjava/persist/DBITestProvider.java | 24 ++ .../masterjava/persist/UserTestData.java | 41 +++ .../persist/dao/AbstractDaoTest.java | 20 ++ .../masterjava/persist/dao/UserDaoTest.java | 39 +++ .../masterjava/xml/util/JaxbParserTest.java | 2 +- .../xml/util/StaxStreamProcessorTest.java | 2 +- .../xml/util/XPathProcessorTest.java | 2 +- .../xml/util/XsltProcessorTest.java | 0 .../export/src}/test/resources/city.xml | 2 +- .../export/src}/test/resources/payload.xml | 2 +- web/pom.xml | 16 + web/webapp/pom.xml | 26 ++ 62 files changed, 1097 insertions(+), 320 deletions(-) delete mode 100644 3_5_multimodule.patch create mode 100644 config_templates/context.xml create mode 100644 config_templates/logback-test.xml create mode 100644 config_templates/logback.xml create mode 100644 config_templates/sql/initDB.sql rename {export => parent-web}/pom.xml (53%) create mode 100644 persist/pom.xml create mode 100644 persist/src/main/java/ru/javaops/masterjava/persist/DBIProvider.java create mode 100644 persist/src/main/java/ru/javaops/masterjava/persist/dao/AbstractDao.java create mode 100644 persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java create mode 100644 persist/src/main/java/ru/javaops/masterjava/persist/model/BaseEntity.java create mode 100644 persist/src/main/java/ru/javaops/masterjava/persist/model/User.java create mode 100644 persist/src/main/java/ru/javaops/masterjava/persist/model/UserFlag.java create mode 100644 services/mail-api/pom.xml create mode 100644 services/mail-service/pom.xml rename {src/main/java/ru/javaops/masterjava/service => services/mail-service/src/main/java/ru/javaops/masterjava/service/mail}/MailService.java (99%) create mode 100644 services/pom.xml create mode 100644 test/pom.xml rename {src => test/src}/main/java/ru/javaops/masterjava/matrix/MainMatrix.java (100%) rename {src => test/src}/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java (100%) rename {src => test/src}/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java (99%) create mode 100644 web/common-web/pom.xml create mode 100644 web/export/pom.xml create mode 100644 web/export/src/main/java/ru/javaops/masterjava/common/web/ThymeleafUtil.java create mode 100644 web/export/src/main/java/ru/javaops/masterjava/export/ThymeleafListener.java create mode 100644 web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java create mode 100644 web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/schema/CityType.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/schema/FlagType.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/schema/GroupType.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/schema/Payload.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/schema/Project.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/schema/User.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/util/Schemas.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java (100%) rename {src => web/export/src}/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java (100%) rename {src => web/export/src}/main/resources/cities.xsl (95%) rename {src => web/export/src}/main/resources/groups.xsl (98%) rename {src => web/export/src}/main/resources/payload.xsd (99%) create mode 100644 web/export/src/main/webapp/WEB-INF/templates/exception.html create mode 100644 web/export/src/main/webapp/WEB-INF/templates/export.html create mode 100644 web/export/src/main/webapp/WEB-INF/templates/result.html rename {src => web/export/src}/test/java/ru/javaops/masterjava/MainXml.java (100%) create mode 100644 web/export/src/test/java/ru/javaops/masterjava/persist/DBITestProvider.java create mode 100644 web/export/src/test/java/ru/javaops/masterjava/persist/UserTestData.java create mode 100644 web/export/src/test/java/ru/javaops/masterjava/persist/dao/AbstractDaoTest.java create mode 100644 web/export/src/test/java/ru/javaops/masterjava/persist/dao/UserDaoTest.java rename {src => web/export/src}/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java (99%) rename {src => web/export/src}/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java (99%) rename {src => web/export/src}/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java (99%) rename {src => web/export/src}/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java (100%) rename {src => web/export/src}/test/resources/city.xml (95%) rename {src => web/export/src}/test/resources/payload.xml (99%) create mode 100644 web/pom.xml create mode 100644 web/webapp/pom.xml diff --git a/3_5_multimodule.patch b/3_5_multimodule.patch deleted file mode 100644 index 78fbe1823..000000000 --- a/3_5_multimodule.patch +++ /dev/null @@ -1,294 +0,0 @@ -Index: export/pom.xml -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- export/pom.xml (revision ) -+++ export/pom.xml (revision ) -@@ -0,0 +1,39 @@ -+ -+ -+ 4.0.0 -+ -+ -+ ru.javaops -+ parent -+ ../parent/pom.xml -+ 1.0-SNAPSHOT -+ -+ -+ export -+ 1.0-SNAPSHOT -+ war -+ Export -+ -+ -+ -+ -+ org.apache.maven.plugins -+ maven-war-plugin -+ 3.0.0 -+ -+ false -+ -+ -+ -+ -+ -+ -+ -+ ru.javaops -+ common -+ ${project.version} -+ -+ -+ -\ No newline at end of file -Index: parent/pom.xml -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- parent/pom.xml (revision ) -+++ parent/pom.xml (revision ) -@@ -0,0 +1,69 @@ -+ -+ -+ 4.0.0 -+ -+ ru.javaops -+ parent -+ pom -+ 1.0-SNAPSHOT -+ Parent -+ -+ -+ 1.8 -+ UTF-8 -+ UTF-8 -+ -+ -+ -+ install -+ -+ -+ org.apache.maven.plugins -+ maven-compiler-plugin -+ 3.1 -+ -+ ${java.version} -+ ${java.version} -+ -+ -+ -+ org.apache.maven.plugins -+ maven-surefire-plugin -+ 2.19.1 -+ -+ -Dfile.encoding=UTF-8 -+ -+ -+ -+ -+ -+ -+ -+ com.google.guava -+ guava -+ 21.0 -+ -+ -+ one.util -+ streamex -+ RELEASE -+ -+ -+ -+ -+ junit -+ junit -+ 4.12 -+ test -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -\ No newline at end of file -Index: common/pom.xml -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- common/pom.xml (revision ) -+++ common/pom.xml (revision ) -@@ -0,0 +1,21 @@ -+ -+ -+ 4.0.0 -+ -+ -+ ru.javaops -+ parent -+ ../parent/pom.xml -+ 1.0-SNAPSHOT -+ -+ -+ common -+ 1.0-SNAPSHOT -+ jar -+ Common -+ -+ -+ -+ -\ No newline at end of file -Index: pom.xml -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- pom.xml (date 1489432214000) -+++ pom.xml (revision ) -@@ -4,119 +4,22 @@ - - ru.javaops - masterjava -- jar -+ pom - - 1.0-SNAPSHOT - - Master Java - https://github.com/JavaOPs/masterjava - -- -- 1.8 -- UTF-8 -- UTF-8 -- -+ -+ export -+ common - -- -- masterjava -- install -- -- -- org.apache.maven.plugins -- maven-compiler-plugin -- 3.1 -- -- ${java.version} -- ${java.version} -- -- -- -- org.apache.maven.plugins -- maven-surefire-plugin -- 2.19.1 -- -- -Dfile.encoding=UTF-8 -- -- -- -- org.apache.maven.plugins -- maven-shade-plugin -- 2.2 -- -- -- package -- -- shade -- -- -- benchmarks -- -- -- org.openjdk.jmh.Main -- -- -- -- -- -- *:* -- -- META-INF/*.SF -- META-INF/*.DSA -- META-INF/*.RSA -- -- -- -- -- -- -- -- -- -- -- -- -- org.openjdk.jmh -- jmh-core -- RELEASE -- -- -- org.openjdk.jmh -- jmh-generator-annprocess -- RELEASE -- provided -- -- -- com.google.guava -- guava -- 21.0 -- -- -- one.util -- streamex -- RELEASE -- -- -- -- com.j2html -- j2html -- RELEASE -- -- -- -- -- junit -- junit -- 4.12 -- test -- -- -- -- -- -- -- -- -+ -+ - diff --git a/config_templates/context.xml b/config_templates/context.xml new file mode 100644 index 000000000..40bb8aa0c --- /dev/null +++ b/config_templates/context.xml @@ -0,0 +1,49 @@ + + + + + + + + WEB-INF/web.xml + ${catalina.base}/conf/web.xml + + + + + + + + + diff --git a/config_templates/logback-test.xml b/config_templates/logback-test.xml new file mode 100644 index 000000000..fa0c7f8b0 --- /dev/null +++ b/config_templates/logback-test.xml @@ -0,0 +1,21 @@ + + + + true + + + + + UTF-8 + %-5level %logger{0} [%file:%line] %msg%n + + + + + + + + + + + diff --git a/config_templates/logback.xml b/config_templates/logback.xml new file mode 100644 index 000000000..352ee14a0 --- /dev/null +++ b/config_templates/logback.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + ${LOG_DIR}/${project.build.finalName}.log + + UTF-8 + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{0} [%file:%line] - %msg%n + + + + ${LOG_DIR}/archived/${project.build.finalName}.%d{yyyy-MM-dd}.%i.log + + + 5MB + + + + + + + UTF-8 + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} [%file:%line] - %msg%n + + + + + + + + + + diff --git a/config_templates/sql/initDB.sql b/config_templates/sql/initDB.sql new file mode 100644 index 000000000..888ba8141 --- /dev/null +++ b/config_templates/sql/initDB.sql @@ -0,0 +1,15 @@ +DROP TABLE IF EXISTS users; +DROP SEQUENCE IF EXISTS user_seq; +DROP TYPE IF EXISTS user_flag; + +CREATE TYPE user_flag AS ENUM ('active', 'deleted', 'superuser'); + +CREATE SEQUENCE user_seq START 100000; + +CREATE TABLE users ( + id INTEGER PRIMARY KEY DEFAULT nextval('user_seq'), + full_name TEXT NOT NULL, + email TEXT NOT NULL, + flag user_flag NOT NULL +); + diff --git a/export/pom.xml b/parent-web/pom.xml similarity index 53% rename from export/pom.xml rename to parent-web/pom.xml index 0d2d1b34c..b12253852 100644 --- a/export/pom.xml +++ b/parent-web/pom.xml @@ -11,10 +11,10 @@ 1.0-SNAPSHOT - export + parent-web + pom 1.0-SNAPSHOT - war - Export + Parent Web @@ -27,13 +27,38 @@ + + + + ${masterjava.config} + true + + logback.xml + + + + src/main/resources + + - ru.javaops - common + ${project.groupId} + common-web ${project.version} + + javax.servlet + javax.servlet-api + 3.1.0 + provided + - \ No newline at end of file + + + + + + + diff --git a/parent/pom.xml b/parent/pom.xml index 6fe28bda3..35fcafa9a 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -14,6 +14,12 @@ 1.8 UTF-8 UTF-8 + + 1.2.2 + 1.7.25 + + /apps/masterjava/config/ + false @@ -36,7 +42,37 @@ -Dfile.encoding=UTF-8 + + org.apache.maven.plugins + maven-enforcer-plugin + 1.4.1 + + + enforce + + + + + + + enforce + + + + + + + + ${masterjava.config} + + logback-test.xml + + + + src/test/resources + + @@ -48,7 +84,21 @@ one.util streamex - RELEASE + 0.6.2 + + + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + runtime + + + + ch.qos.logback + logback-classic + ${logback.version} @@ -66,4 +116,4 @@ - \ No newline at end of file + diff --git a/persist/pom.xml b/persist/pom.xml new file mode 100644 index 000000000..5816258ef --- /dev/null +++ b/persist/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + + ru.javaops + parent + ../parent/pom.xml + 1.0-SNAPSHOT + + + persist + 1.0-SNAPSHOT + Persist + + + + ${project.groupId} + common + ${project.version} + + + org.jdbi + jdbi + 2.78 + + + com.bertoncelj.jdbi.entitymapper + jdbi-entity-mapper + 1.0.0 + + + org.jdbi + jdbi + + + + + org.postgresql + postgresql + 9.4.1211 + + + \ No newline at end of file diff --git a/persist/src/main/java/ru/javaops/masterjava/persist/DBIProvider.java b/persist/src/main/java/ru/javaops/masterjava/persist/DBIProvider.java new file mode 100644 index 000000000..69904ce80 --- /dev/null +++ b/persist/src/main/java/ru/javaops/masterjava/persist/DBIProvider.java @@ -0,0 +1,56 @@ +package ru.javaops.masterjava.persist; + +import org.skife.jdbi.v2.DBI; +import org.skife.jdbi.v2.logging.SLF4JLog; +import org.skife.jdbi.v2.tweak.ConnectionFactory; +import org.slf4j.Logger; +import ru.javaops.masterjava.persist.dao.AbstractDao; + +import javax.naming.InitialContext; +import javax.sql.DataSource; + +import static org.slf4j.LoggerFactory.getLogger; + +/** + * gkislin + * 01.11.2016 + */ +public class DBIProvider { + private static final Logger log = getLogger(DBIProvider.class); + + private volatile static ConnectionFactory connectionFactory = null; + + private static class DBIHolder { + static final DBI jDBI; + + static { + final DBI dbi; + if (connectionFactory != null) { + log.info("Init jDBI with connectionFactory"); + dbi = new DBI(connectionFactory); + } else { + try { + log.info("Init jDBI with JNDI"); + InitialContext ctx = new InitialContext(); + dbi = new DBI((DataSource) ctx.lookup("java:/comp/env/jdbc/masterjava")); + } catch (Exception ex) { + throw new IllegalStateException("PostgreSQL initialization failed", ex); + } + } + jDBI = dbi; + jDBI.setSQLLog(new SLF4JLog()); + } + } + + public static void init(ConnectionFactory connectionFactory) { + DBIProvider.connectionFactory = connectionFactory; + } + + public static DBI getDBI() { + return DBIHolder.jDBI; + } + + public static T getDao(Class daoClass) { + return DBIHolder.jDBI.onDemand(daoClass); + } +} diff --git a/persist/src/main/java/ru/javaops/masterjava/persist/dao/AbstractDao.java b/persist/src/main/java/ru/javaops/masterjava/persist/dao/AbstractDao.java new file mode 100644 index 000000000..f7e97e459 --- /dev/null +++ b/persist/src/main/java/ru/javaops/masterjava/persist/dao/AbstractDao.java @@ -0,0 +1,11 @@ +package ru.javaops.masterjava.persist.dao; + +/** + * gkislin + * 27.10.2016 + *

+ *

+ */ +public interface AbstractDao { + void clean(); +} diff --git a/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java b/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java new file mode 100644 index 000000000..915efdf27 --- /dev/null +++ b/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java @@ -0,0 +1,43 @@ +package ru.javaops.masterjava.persist.dao; + +import com.bertoncelj.jdbi.entitymapper.EntityMapperFactory; +import org.skife.jdbi.v2.sqlobject.*; +import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapperFactory; +import ru.javaops.masterjava.persist.model.User; + +import java.util.List; + +/** + * gkislin + * 27.10.2016 + *

+ *

+ */ +@RegisterMapperFactory(EntityMapperFactory.class) +public abstract class UserDao implements AbstractDao { + + public User insert(User user) { + if (user.isNew()) { + int id = insertGeneratedId(user); + user.setId(id); + } else { + insertWitId(user); + } + return user; + } + + @SqlUpdate("INSERT INTO users (full_name, email, flag) VALUES (:fullName, :email, CAST(:flag AS user_flag)) ") + @GetGeneratedKeys + abstract int insertGeneratedId(@BindBean User user); + + @SqlUpdate("INSERT INTO users (id, full_name, email, flag) VALUES (:id, :fullName, :email, CAST(:flag AS user_flag)) ") + abstract void insertWitId(@BindBean User user); + + @SqlQuery("SELECT * FROM users ORDER BY full_name, email LIMIT :it") + public abstract List getWithLimit(@Bind int limit); + + // http://stackoverflow.com/questions/13223820/postgresql-delete-all-content + @SqlUpdate("TRUNCATE users") + @Override + public abstract void clean(); +} diff --git a/persist/src/main/java/ru/javaops/masterjava/persist/model/BaseEntity.java b/persist/src/main/java/ru/javaops/masterjava/persist/model/BaseEntity.java new file mode 100644 index 000000000..c967068e9 --- /dev/null +++ b/persist/src/main/java/ru/javaops/masterjava/persist/model/BaseEntity.java @@ -0,0 +1,41 @@ +package ru.javaops.masterjava.persist.model; + +/** + * gkislin + * 28.10.2016 + */ +abstract public class BaseEntity { + protected BaseEntity() { + } + + protected BaseEntity(Integer id) { + this.id = id; + } + + protected Integer id; + + public Integer getId() { + return id; + } + + protected void setId(Integer id) { + this.id = id; + } + + public boolean isNew() { + return id == null; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BaseEntity baseEntity = (BaseEntity) o; + return id != null && id.equals(baseEntity.id); + } + + @Override + public int hashCode() { + return id == null ? 0 : id; + } +} diff --git a/persist/src/main/java/ru/javaops/masterjava/persist/model/User.java b/persist/src/main/java/ru/javaops/masterjava/persist/model/User.java new file mode 100644 index 000000000..f4445cb50 --- /dev/null +++ b/persist/src/main/java/ru/javaops/masterjava/persist/model/User.java @@ -0,0 +1,82 @@ +package ru.javaops.masterjava.persist.model; + +import com.bertoncelj.jdbi.entitymapper.Column; + +import java.util.Objects; + +public class User extends BaseEntity { + @Column("full_name") + private String fullName; + + private String email; + + private UserFlag flag; + + public User() { + } + + public User(String fullName, String email, UserFlag flag) { + this(null, fullName, email, flag); + } + + public User(Integer id, String fullName, String email, UserFlag flag) { + super(id); + this.fullName = fullName; + this.email = email; + this.flag = flag; + } + + public String getFullName() { + return fullName; + } + + public String getEmail() { + return email; + } + + public UserFlag getFlag() { + return flag; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public void setEmail(String email) { + this.email = email; + } + + public void setFlag(UserFlag flag) { + this.flag = flag; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(fullName, user.fullName) && + Objects.equals(email, user.email) && + flag == user.flag; + } + + @Override + public int hashCode() { + return Objects.hash(id, fullName, email, flag); + } + + @Override + public String toString() { + return "User (" + + "id=" + id + + ", fullName='" + fullName + '\'' + + ", email='" + email + '\'' + + ", flag=" + flag + + ')'; + } +} \ No newline at end of file diff --git a/persist/src/main/java/ru/javaops/masterjava/persist/model/UserFlag.java b/persist/src/main/java/ru/javaops/masterjava/persist/model/UserFlag.java new file mode 100644 index 000000000..31ecdf4e3 --- /dev/null +++ b/persist/src/main/java/ru/javaops/masterjava/persist/model/UserFlag.java @@ -0,0 +1,11 @@ +package ru.javaops.masterjava.persist.model; + +/** + * gkislin + * 13.10.2016 + */ +public enum UserFlag { + active, + deleted, + superuser +} diff --git a/pom.xml b/pom.xml index ed9773f64..e6aa92b8b 100644 --- a/pom.xml +++ b/pom.xml @@ -8,18 +8,18 @@ 1.0-SNAPSHOT - Master Java + MasterJava Root https://github.com/JavaOPs/masterjava - export - common + parent + parent-web - + + web + services diff --git a/services/mail-api/pom.xml b/services/mail-api/pom.xml new file mode 100644 index 000000000..25c53388e --- /dev/null +++ b/services/mail-api/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + + ru.javaops + parent + ../../parent/pom.xml + 1.0-SNAPSHOT + + + mail-api + 1.0-SNAPSHOT + Mail API + + + + ${project.groupId} + common + ${project.version} + + + + \ No newline at end of file diff --git a/services/mail-service/pom.xml b/services/mail-service/pom.xml new file mode 100644 index 000000000..2b4be6bad --- /dev/null +++ b/services/mail-service/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + + ru.javaops + parent-web + ../../parent-web/pom.xml + 1.0-SNAPSHOT + + + mail-service + 1.0-SNAPSHOT + war + Mail Service + + + + ${project.groupId} + mail-api + ${project.version} + + + \ No newline at end of file diff --git a/src/main/java/ru/javaops/masterjava/service/MailService.java b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/MailService.java similarity index 99% rename from src/main/java/ru/javaops/masterjava/service/MailService.java rename to services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/MailService.java index 8b8722178..49b053b96 100644 --- a/src/main/java/ru/javaops/masterjava/service/MailService.java +++ b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/MailService.java @@ -1,4 +1,4 @@ -package ru.javaops.masterjava.service; +package ru.javaops.masterjava.service.mail; import java.util.ArrayList; import java.util.List; diff --git a/services/pom.xml b/services/pom.xml new file mode 100644 index 000000000..bb7824194 --- /dev/null +++ b/services/pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + + ru.javaops + services + pom + 1.0-SNAPSHOT + + MasterJava Services + + mail-api + mail-service + + diff --git a/test/pom.xml b/test/pom.xml new file mode 100644 index 000000000..edc37fefa --- /dev/null +++ b/test/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + + ru.javaops + parent + ../parent/pom.xml + 1.0-SNAPSHOT + + + test + 1.0-SNAPSHOT + Test + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.2 + + + package + + shade + + + benchmarks + + + org.openjdk.jmh.Main + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + + + + + ${project.groupId} + common + ${project.version} + + + org.openjdk.jmh + jmh-core + 1.15 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.15 + provided + + + diff --git a/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java b/test/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java rename to test/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java b/test/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java rename to test/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java b/test/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java similarity index 99% rename from src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java rename to test/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java index 46fd00ede..858569dd2 100644 --- a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java +++ b/test/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java @@ -207,4 +207,4 @@ public static boolean compare(int[][] matrixA, int[][] matrixB) { } return true; } -} \ No newline at end of file +} diff --git a/web/common-web/pom.xml b/web/common-web/pom.xml new file mode 100644 index 000000000..da4f46174 --- /dev/null +++ b/web/common-web/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + + ru.javaops + parent + ../../parent/pom.xml + 1.0-SNAPSHOT + + + common-web + 1.0-SNAPSHOT + Common Web + + + + ${project.groupId} + common + ${project.version} + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + org.thymeleaf + thymeleaf + 3.0.3.RELEASE + + + org.slf4j + slf4j-api + + + + + \ No newline at end of file diff --git a/web/export/pom.xml b/web/export/pom.xml new file mode 100644 index 000000000..39c149235 --- /dev/null +++ b/web/export/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + + ru.javaops + parent-web + ../../parent-web/pom.xml + 1.0-SNAPSHOT + + + export + 1.0-SNAPSHOT + war + Export + + + export + + + + + ${project.groupId} + persist + ${project.version} + + + com.j2html + j2html + 0.7 + + + com.google.guava + guava + + + + + + diff --git a/web/export/src/main/java/ru/javaops/masterjava/common/web/ThymeleafUtil.java b/web/export/src/main/java/ru/javaops/masterjava/common/web/ThymeleafUtil.java new file mode 100644 index 000000000..bf87ed3eb --- /dev/null +++ b/web/export/src/main/java/ru/javaops/masterjava/common/web/ThymeleafUtil.java @@ -0,0 +1,24 @@ +package ru.javaops.masterjava.common.web; + +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.templatemode.TemplateMode; +import org.thymeleaf.templateresolver.ServletContextTemplateResolver; + +import javax.servlet.ServletContext; + +public class ThymeleafUtil { + + private ThymeleafUtil() { + } + + public static TemplateEngine getTemplateEngine(ServletContext context) { + final ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(context); + templateResolver.setTemplateMode(TemplateMode.HTML); + templateResolver.setPrefix("/WEB-INF/templates/"); + templateResolver.setSuffix(".html"); + templateResolver.setCacheTTLMs(1000L); + final TemplateEngine engine = new TemplateEngine(); + engine.setTemplateResolver(templateResolver); + return engine; + } +} diff --git a/web/export/src/main/java/ru/javaops/masterjava/export/ThymeleafListener.java b/web/export/src/main/java/ru/javaops/masterjava/export/ThymeleafListener.java new file mode 100644 index 000000000..8ec22e3c9 --- /dev/null +++ b/web/export/src/main/java/ru/javaops/masterjava/export/ThymeleafListener.java @@ -0,0 +1,21 @@ +package ru.javaops.masterjava.export; + +import org.thymeleaf.TemplateEngine; +import ru.javaops.masterjava.common.web.ThymeleafUtil; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +@WebListener +public class ThymeleafListener implements ServletContextListener { + + public static TemplateEngine engine; + + public void contextInitialized(ServletContextEvent sce) { + engine = ThymeleafUtil.getTemplateEngine(sce.getServletContext()); + } + + public void contextDestroyed(ServletContextEvent sce) { + } +} diff --git a/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java b/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java new file mode 100644 index 000000000..b254d148e --- /dev/null +++ b/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java @@ -0,0 +1,48 @@ +package ru.javaops.masterjava.export; + +import org.thymeleaf.context.WebContext; +import ru.javaops.masterjava.persist.model.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.MultipartConfig; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.Part; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import static ru.javaops.masterjava.export.ThymeleafListener.engine; + +@WebServlet("/") +@MultipartConfig +public class UploadServlet extends HttpServlet { + + private final UserExport userExport = new UserExport(); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + final WebContext webContext = new WebContext(req, resp, req.getServletContext(), req.getLocale()); + engine.process("export", webContext, resp.getWriter()); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + final WebContext webContext = new WebContext(req, resp, req.getServletContext(), req.getLocale()); + + try { +// http://docs.oracle.com/javaee/6/tutorial/doc/glraq.html + Part filePart = req.getPart("fileToUpload"); + try (InputStream is = filePart.getInputStream()) { + List users = userExport.process(is); + webContext.setVariable("users", users); + engine.process("result", webContext, resp.getWriter()); + } + } catch (Exception e) { + webContext.setVariable("exception", e); + engine.process("exception", webContext, resp.getWriter()); + } + } +} diff --git a/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java b/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java new file mode 100644 index 000000000..078268b30 --- /dev/null +++ b/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java @@ -0,0 +1,32 @@ +package ru.javaops.masterjava.export; + +import ru.javaops.masterjava.persist.model.User; +import ru.javaops.masterjava.persist.model.UserFlag; +import ru.javaops.masterjava.xml.util.StaxStreamProcessor; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.XMLEvent; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +/** + * gkislin + * 14.10.2016 + */ +public class UserExport { + + public List process(final InputStream is) throws XMLStreamException { + final StaxStreamProcessor processor = new StaxStreamProcessor(is); + List users = new ArrayList<>(); + + while (processor.doUntil(XMLEvent.START_ELEMENT, "User")) { + final String email = processor.getAttribute("email"); + final UserFlag flag = UserFlag.valueOf(processor.getAttribute("flag")); + final String fullName = processor.getReader().getElementText(); + final User user = new User(fullName, email, flag); + users.add(user); + } + return users; + } +} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java b/web/export/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/CityType.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java b/web/export/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java b/web/export/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java b/web/export/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java b/web/export/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/Payload.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/Project.java b/web/export/src/main/java/ru/javaops/masterjava/xml/schema/Project.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/Project.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/schema/Project.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/User.java b/web/export/src/main/java/ru/javaops/masterjava/xml/schema/User.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/User.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/schema/User.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java b/web/export/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java b/web/export/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java b/web/export/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java b/web/export/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/Schemas.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java b/web/export/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java b/web/export/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java b/web/export/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java rename to web/export/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java diff --git a/src/main/resources/cities.xsl b/web/export/src/main/resources/cities.xsl similarity index 95% rename from src/main/resources/cities.xsl rename to web/export/src/main/resources/cities.xsl index 1c509124b..55380ad23 100644 --- a/src/main/resources/cities.xsl +++ b/web/export/src/main/resources/cities.xsl @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/src/main/resources/groups.xsl b/web/export/src/main/resources/groups.xsl similarity index 98% rename from src/main/resources/groups.xsl rename to web/export/src/main/resources/groups.xsl index dcb6901a2..f1396f563 100644 --- a/src/main/resources/groups.xsl +++ b/web/export/src/main/resources/groups.xsl @@ -33,4 +33,4 @@ - \ No newline at end of file + diff --git a/src/main/resources/payload.xsd b/web/export/src/main/resources/payload.xsd similarity index 99% rename from src/main/resources/payload.xsd rename to web/export/src/main/resources/payload.xsd index 3d545ec54..9dbee7b65 100644 --- a/src/main/resources/payload.xsd +++ b/web/export/src/main/resources/payload.xsd @@ -94,4 +94,4 @@ - \ No newline at end of file + diff --git a/web/export/src/main/webapp/WEB-INF/templates/exception.html b/web/export/src/main/webapp/WEB-INF/templates/exception.html new file mode 100644 index 000000000..6123126d2 --- /dev/null +++ b/web/export/src/main/webapp/WEB-INF/templates/exception.html @@ -0,0 +1,19 @@ + + + + Export XML + + + +

+
+
+

Application error:

+

exception.message

+
    +
  • +
+
+
+ + \ No newline at end of file diff --git a/web/export/src/main/webapp/WEB-INF/templates/export.html b/web/export/src/main/webapp/WEB-INF/templates/export.html new file mode 100644 index 000000000..0cf0428b2 --- /dev/null +++ b/web/export/src/main/webapp/WEB-INF/templates/export.html @@ -0,0 +1,17 @@ + + + + Export XML + + +
+

Select xml file to upload

+

+
+

+

+ +

+
+ + \ No newline at end of file diff --git a/web/export/src/main/webapp/WEB-INF/templates/result.html b/web/export/src/main/webapp/WEB-INF/templates/result.html new file mode 100644 index 000000000..ca4baa915 --- /dev/null +++ b/web/export/src/main/webapp/WEB-INF/templates/result.html @@ -0,0 +1,26 @@ + + + + Uploaded users + + +

Export XML

+

Uploaded users

+ + + + + + + + + + + + + + + +
Full NameEmailFlag
+ + \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/MainXml.java b/web/export/src/test/java/ru/javaops/masterjava/MainXml.java similarity index 100% rename from src/test/java/ru/javaops/masterjava/MainXml.java rename to web/export/src/test/java/ru/javaops/masterjava/MainXml.java diff --git a/web/export/src/test/java/ru/javaops/masterjava/persist/DBITestProvider.java b/web/export/src/test/java/ru/javaops/masterjava/persist/DBITestProvider.java new file mode 100644 index 000000000..79467af1c --- /dev/null +++ b/web/export/src/test/java/ru/javaops/masterjava/persist/DBITestProvider.java @@ -0,0 +1,24 @@ +package ru.javaops.masterjava.persist; + +import java.sql.DriverManager; + +/** + * gkislin + * 27.10.2016 + */ +public class DBITestProvider { + public static void initDBI() { + initDBI("jdbc:postgresql://localhost:5432/masterjava", "user", "password"); + } + + public static void initDBI(String dbUrl, String dbUser, String dbPassword) { + DBIProvider.init(() -> { + try { + Class.forName("org.postgresql.Driver"); + } catch (ClassNotFoundException e) { + throw new IllegalStateException("PostgreSQL driver not found", e); + } + return DriverManager.getConnection(dbUrl, dbUser, dbPassword); + }); + } +} \ No newline at end of file diff --git a/web/export/src/test/java/ru/javaops/masterjava/persist/UserTestData.java b/web/export/src/test/java/ru/javaops/masterjava/persist/UserTestData.java new file mode 100644 index 000000000..bc80bba38 --- /dev/null +++ b/web/export/src/test/java/ru/javaops/masterjava/persist/UserTestData.java @@ -0,0 +1,41 @@ +package ru.javaops.masterjava.persist; + +import com.google.common.collect.ImmutableList; +import ru.javaops.masterjava.persist.dao.UserDao; +import ru.javaops.masterjava.persist.model.User; +import ru.javaops.masterjava.persist.model.UserFlag; + +import java.util.List; + +/** + * gkislin + * 14.11.2016 + */ +public class UserTestData { + public static User ADMIN; + public static User DELETED; + public static User FULL_NAME; + public static User USER1; + public static User USER2; + public static User USER3; + public static List FIST5_USERS; + + public static void init() { + ADMIN = new User("Admin", "admin@javaops.ru", UserFlag.superuser); + DELETED = new User("Deleted", "deleted@yandex.ru", UserFlag.deleted); + FULL_NAME = new User("Full Name", "gmail@gmail.com", UserFlag.active); + USER1 = new User("User1", "user1@gmail.com", UserFlag.active); + USER2 = new User("User2", "user2@yandex.ru", UserFlag.active); + USER3 = new User("User3", "user3@yandex.ru", UserFlag.active); + FIST5_USERS = ImmutableList.of(ADMIN, DELETED, FULL_NAME, USER1, USER2); + } + + public static void setUp() { + UserDao dao = DBIProvider.getDao(UserDao.class); + dao.clean(); + DBIProvider.getDBI().useTransaction((conn, status) -> { + FIST5_USERS.forEach(dao::insert); + dao.insert(USER3); + }); + } +} diff --git a/web/export/src/test/java/ru/javaops/masterjava/persist/dao/AbstractDaoTest.java b/web/export/src/test/java/ru/javaops/masterjava/persist/dao/AbstractDaoTest.java new file mode 100644 index 000000000..76ceb141c --- /dev/null +++ b/web/export/src/test/java/ru/javaops/masterjava/persist/dao/AbstractDaoTest.java @@ -0,0 +1,20 @@ +package ru.javaops.masterjava.persist.dao; + +import ru.javaops.masterjava.persist.DBIProvider; +import ru.javaops.masterjava.persist.DBITestProvider; + +/** + * gkislin + * 27.10.2016 + */ +public abstract class AbstractDaoTest { + static { + DBITestProvider.initDBI(); + } + + protected DAO dao; + + protected AbstractDaoTest(Class daoClass) { + this.dao = DBIProvider.getDao(daoClass); + } +} diff --git a/web/export/src/test/java/ru/javaops/masterjava/persist/dao/UserDaoTest.java b/web/export/src/test/java/ru/javaops/masterjava/persist/dao/UserDaoTest.java new file mode 100644 index 000000000..e47dbac09 --- /dev/null +++ b/web/export/src/test/java/ru/javaops/masterjava/persist/dao/UserDaoTest.java @@ -0,0 +1,39 @@ +package ru.javaops.masterjava.persist.dao; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import ru.javaops.masterjava.persist.UserTestData; +import ru.javaops.masterjava.persist.model.User; + +import java.util.List; + +import static ru.javaops.masterjava.persist.UserTestData.FIST5_USERS; + +/** + * gkislin + * 27.10.2016 + */ +public class UserDaoTest extends AbstractDaoTest { + + public UserDaoTest() { + super(UserDao.class); + } + + @BeforeClass + public static void init() throws Exception { + UserTestData.init(); + } + + @Before + public void setUp() throws Exception { + UserTestData.setUp(); + } + + @Test + public void getWithLimit() { + List users = dao.getWithLimit(5); + Assert.assertEquals(FIST5_USERS, users); + } +} \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java b/web/export/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java similarity index 99% rename from src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java rename to web/export/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java index ab1e365e5..1df8e9f79 100644 --- a/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java +++ b/web/export/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java @@ -41,4 +41,4 @@ public void testCity() throws Exception { JAXB_PARSER.validate(strCity); System.out.println(strCity); } -} \ No newline at end of file +} diff --git a/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java b/web/export/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java similarity index 99% rename from src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java rename to web/export/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java index 229e2da64..b8ba6433e 100644 --- a/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java +++ b/web/export/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java @@ -37,4 +37,4 @@ public void readCities2() throws Exception { } } } -} \ No newline at end of file +} diff --git a/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java b/web/export/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java similarity index 99% rename from src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java rename to web/export/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java index 18b6efdc2..d9ecd3248 100644 --- a/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java +++ b/web/export/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java @@ -27,4 +27,4 @@ public void getCities() throws Exception { ); } } -} \ No newline at end of file +} diff --git a/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java b/web/export/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java similarity index 100% rename from src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java rename to web/export/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java diff --git a/src/test/resources/city.xml b/web/export/src/test/resources/city.xml similarity index 95% rename from src/test/resources/city.xml rename to web/export/src/test/resources/city.xml index 8b0abcf8a..f6a4f9738 100644 --- a/src/test/resources/city.xml +++ b/web/export/src/test/resources/city.xml @@ -1,4 +1,4 @@ Санкт-Петербург - \ No newline at end of file + diff --git a/src/test/resources/payload.xml b/web/export/src/test/resources/payload.xml similarity index 99% rename from src/test/resources/payload.xml rename to web/export/src/test/resources/payload.xml index fadf8c64a..3cf63093c 100644 --- a/src/test/resources/payload.xml +++ b/web/export/src/test/resources/payload.xml @@ -28,4 +28,4 @@ User2 User3 - \ No newline at end of file + diff --git a/web/pom.xml b/web/pom.xml new file mode 100644 index 000000000..bf9ef21c3 --- /dev/null +++ b/web/pom.xml @@ -0,0 +1,16 @@ + + 4.0.0 + + ru.javaops + web + pom + 1.0-SNAPSHOT + MasterJava Web + + + common-web + export + webapp + + diff --git a/web/webapp/pom.xml b/web/webapp/pom.xml new file mode 100644 index 000000000..0cf8c6098 --- /dev/null +++ b/web/webapp/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + + ru.javaops + parent-web + ../../parent-web/pom.xml + 1.0-SNAPSHOT + + + webapp + 1.0-SNAPSHOT + war + WebApp + + + + ${project.groupId} + common + ${project.version} + + + \ No newline at end of file From 65333f66a97826d792d4e3356d42c5c613af061b Mon Sep 17 00:00:00 2001 From: pinky83 Date: Wed, 29 Mar 2017 13:08:54 +0300 Subject: [PATCH 51/92] HW3 patches applied --- IntelliLang.xml | 9 - _windows/git.xml | 6 - _windows/keymap.xml | 5 - _windows/laf.xml | 5 - _windows/path.macros.xml | 6 - colors.scheme.xml | 5 - databaseDrivers.xml | 58 ------ databaseSettings.xml | 26 --- debugger.renderers.xml | 34 ---- debugger.xml | 82 --------- diff.xml | 32 ---- filetypes.xml | 8 - find.xml | 7 - gradle.run.settings.xml | 5 - ignore.xml | 27 --- markdown_navigator.shared.xml | 62 ------- mavenVersion.xml | 3 - multimarkdown.shared.xml | 3 - templates.xml | 328 ---------------------------------- ui.lnf.xml | 6 - web-browsers.xml | 10 -- 21 files changed, 727 deletions(-) delete mode 100644 IntelliLang.xml delete mode 100644 _windows/git.xml delete mode 100644 _windows/keymap.xml delete mode 100644 _windows/laf.xml delete mode 100644 _windows/path.macros.xml delete mode 100644 colors.scheme.xml delete mode 100644 databaseDrivers.xml delete mode 100644 databaseSettings.xml delete mode 100644 debugger.renderers.xml delete mode 100644 debugger.xml delete mode 100644 diff.xml delete mode 100644 filetypes.xml delete mode 100644 find.xml delete mode 100644 gradle.run.settings.xml delete mode 100644 ignore.xml delete mode 100644 markdown_navigator.shared.xml delete mode 100644 mavenVersion.xml delete mode 100644 multimarkdown.shared.xml delete mode 100644 templates.xml delete mode 100644 ui.lnf.xml delete mode 100644 web-browsers.xml diff --git a/IntelliLang.xml b/IntelliLang.xml deleted file mode 100644 index 621d5ba9f..000000000 --- a/IntelliLang.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/_windows/git.xml b/_windows/git.xml deleted file mode 100644 index 63bbfa263..000000000 --- a/_windows/git.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/_windows/keymap.xml b/_windows/keymap.xml deleted file mode 100644 index 743029a4b..000000000 --- a/_windows/keymap.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/_windows/laf.xml b/_windows/laf.xml deleted file mode 100644 index c1f98d951..000000000 --- a/_windows/laf.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/_windows/path.macros.xml b/_windows/path.macros.xml deleted file mode 100644 index 5de6318a8..000000000 --- a/_windows/path.macros.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml deleted file mode 100644 index 39308cdb1..000000000 --- a/colors.scheme.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/databaseDrivers.xml b/databaseDrivers.xml deleted file mode 100644 index 2174ca6d8..000000000 --- a/databaseDrivers.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/databaseSettings.xml b/databaseSettings.xml deleted file mode 100644 index 8691bf5ca..000000000 --- a/databaseSettings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/debugger.renderers.xml b/debugger.renderers.xml deleted file mode 100644 index cad6048ab..000000000 --- a/debugger.renderers.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - \ No newline at end of file diff --git a/debugger.xml b/debugger.xml deleted file mode 100644 index 49914986e..000000000 --- a/debugger.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/diff.xml b/diff.xml deleted file mode 100644 index ae07d4cb0..000000000 --- a/diff.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/filetypes.xml b/filetypes.xml deleted file mode 100644 index 27b003d9c..000000000 --- a/filetypes.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/find.xml b/find.xml deleted file mode 100644 index b0f46e403..000000000 --- a/find.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/gradle.run.settings.xml b/gradle.run.settings.xml deleted file mode 100644 index 98883fd09..000000000 --- a/gradle.run.settings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/ignore.xml b/ignore.xml deleted file mode 100644 index a31e71fb0..000000000 --- a/ignore.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/markdown_navigator.shared.xml b/markdown_navigator.shared.xml deleted file mode 100644 index 2b2887fcc..000000000 --- a/markdown_navigator.shared.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mavenVersion.xml b/mavenVersion.xml deleted file mode 100644 index 8b7167a17..000000000 --- a/mavenVersion.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/multimarkdown.shared.xml b/multimarkdown.shared.xml deleted file mode 100644 index b4323c8d0..000000000 --- a/multimarkdown.shared.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/templates.xml b/templates.xml deleted file mode 100644 index 33fac6afe..000000000 --- a/templates.xml +++ /dev/null @@ -1,328 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ui.lnf.xml b/ui.lnf.xml deleted file mode 100644 index d680ca9b0..000000000 --- a/ui.lnf.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/web-browsers.xml b/web-browsers.xml deleted file mode 100644 index 10814a3f0..000000000 --- a/web-browsers.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file From ba8cffb5d7179c56a476d9d84ad3b5a0f9589896 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Wed, 29 Mar 2017 13:10:16 +0300 Subject: [PATCH 52/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20IntelliLang.xml,?= =?UTF-8?q?=20diff.xml,=20laf.xml,=20debugger.renderers.xml,=20path.macros?= =?UTF-8?q?.xml,=20ignore.xml,=20ui.lnf.xml,=20web-browsers.xml,=20filetyp?= =?UTF-8?q?es.xml,=20keymap.xml,=20databaseSettings.xml,=20databaseDrivers?= =?UTF-8?q?.xml,=20editor.xml,=20multimarkdown.shared.xml,=20markdown=5Fna?= =?UTF-8?q?vigator.shared.xml,=20debugger.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntelliLang.xml | 9 ++++ _windows/keymap.xml | 5 +++ _windows/laf.xml | 5 +++ _windows/path.macros.xml | 6 +++ databaseDrivers.xml | 58 +++++++++++++++++++++++++ databaseSettings.xml | 26 +++++++++++ debugger.renderers.xml | 34 +++++++++++++++ debugger.xml | 82 +++++++++++++++++++++++++++++++++++ diff.xml | 32 ++++++++++++++ editor.xml | 14 ++++++ filetypes.xml | 8 ++++ ignore.xml | 27 ++++++++++++ markdown_navigator.shared.xml | 62 ++++++++++++++++++++++++++ multimarkdown.shared.xml | 3 ++ ui.lnf.xml | 6 +++ web-browsers.xml | 10 +++++ 16 files changed, 387 insertions(+) create mode 100644 IntelliLang.xml create mode 100644 _windows/keymap.xml create mode 100644 _windows/laf.xml create mode 100644 _windows/path.macros.xml create mode 100644 databaseDrivers.xml create mode 100644 databaseSettings.xml create mode 100644 debugger.renderers.xml create mode 100644 debugger.xml create mode 100644 diff.xml create mode 100644 editor.xml create mode 100644 filetypes.xml create mode 100644 ignore.xml create mode 100644 markdown_navigator.shared.xml create mode 100644 multimarkdown.shared.xml create mode 100644 ui.lnf.xml create mode 100644 web-browsers.xml diff --git a/IntelliLang.xml b/IntelliLang.xml new file mode 100644 index 000000000..621d5ba9f --- /dev/null +++ b/IntelliLang.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/_windows/keymap.xml b/_windows/keymap.xml new file mode 100644 index 000000000..743029a4b --- /dev/null +++ b/_windows/keymap.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/_windows/laf.xml b/_windows/laf.xml new file mode 100644 index 000000000..dbf49b40f --- /dev/null +++ b/_windows/laf.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/_windows/path.macros.xml b/_windows/path.macros.xml new file mode 100644 index 000000000..5de6318a8 --- /dev/null +++ b/_windows/path.macros.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/databaseDrivers.xml b/databaseDrivers.xml new file mode 100644 index 000000000..2174ca6d8 --- /dev/null +++ b/databaseDrivers.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/databaseSettings.xml b/databaseSettings.xml new file mode 100644 index 000000000..8691bf5ca --- /dev/null +++ b/databaseSettings.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/debugger.renderers.xml b/debugger.renderers.xml new file mode 100644 index 000000000..cad6048ab --- /dev/null +++ b/debugger.renderers.xml @@ -0,0 +1,34 @@ + + + + \ No newline at end of file diff --git a/debugger.xml b/debugger.xml new file mode 100644 index 000000000..49914986e --- /dev/null +++ b/debugger.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/diff.xml b/diff.xml new file mode 100644 index 000000000..ae07d4cb0 --- /dev/null +++ b/diff.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/editor.xml b/editor.xml new file mode 100644 index 000000000..09591fd81 --- /dev/null +++ b/editor.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/filetypes.xml b/filetypes.xml new file mode 100644 index 000000000..27b003d9c --- /dev/null +++ b/filetypes.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ignore.xml b/ignore.xml new file mode 100644 index 000000000..a31e71fb0 --- /dev/null +++ b/ignore.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/markdown_navigator.shared.xml b/markdown_navigator.shared.xml new file mode 100644 index 000000000..2b2887fcc --- /dev/null +++ b/markdown_navigator.shared.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/multimarkdown.shared.xml b/multimarkdown.shared.xml new file mode 100644 index 000000000..b4323c8d0 --- /dev/null +++ b/multimarkdown.shared.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/ui.lnf.xml b/ui.lnf.xml new file mode 100644 index 000000000..d680ca9b0 --- /dev/null +++ b/ui.lnf.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/web-browsers.xml b/web-browsers.xml new file mode 100644 index 000000000..10814a3f0 --- /dev/null +++ b/web-browsers.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file From ce8229acf49bb25e0b7f1ee878aff5222a777fdb Mon Sep 17 00:00:00 2001 From: pinky83 Date: Wed, 29 Mar 2017 13:15:07 +0300 Subject: [PATCH 53/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20git.xml,=20colors?= =?UTF-8?q?.scheme.xml=09Delete=20editor.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _windows/git.xml | 5 +++++ colors.scheme.xml | 5 +++++ editor.xml | 14 -------------- 3 files changed, 10 insertions(+), 14 deletions(-) create mode 100644 _windows/git.xml create mode 100644 colors.scheme.xml delete mode 100644 editor.xml diff --git a/_windows/git.xml b/_windows/git.xml new file mode 100644 index 000000000..c4ae9e38b --- /dev/null +++ b/_windows/git.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml new file mode 100644 index 000000000..39308cdb1 --- /dev/null +++ b/colors.scheme.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/editor.xml b/editor.xml deleted file mode 100644 index 09591fd81..000000000 --- a/editor.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - \ No newline at end of file From ed4fa304cbd618c39183fa89e523cd361119cd3b Mon Sep 17 00:00:00 2001 From: pinky83 Date: Wed, 29 Mar 2017 16:31:33 +0300 Subject: [PATCH 54/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20gradle.run.settin?= =?UTF-8?q?gs.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.run.settings.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 gradle.run.settings.xml diff --git a/gradle.run.settings.xml b/gradle.run.settings.xml new file mode 100644 index 000000000..98883fd09 --- /dev/null +++ b/gradle.run.settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file From e1f1c5b96107a1daa74e1730243a46b5fa140c8b Mon Sep 17 00:00:00 2001 From: pinky83 Date: Thu, 30 Mar 2017 12:32:22 +0300 Subject: [PATCH 55/92] ready to HW03 --- parent-web/pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/parent-web/pom.xml b/parent-web/pom.xml index b12253852..936794a48 100644 --- a/parent-web/pom.xml +++ b/parent-web/pom.xml @@ -56,9 +56,6 @@
- - - From 85f108ccbcd3f138f73b2928f5a1ba767fdedc2b Mon Sep 17 00:00:00 2001 From: pinky83 Date: Thu, 30 Mar 2017 13:17:36 +0300 Subject: [PATCH 56/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Update=20databaseDrivers.x?= =?UTF-8?q?ml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- databaseDrivers.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/databaseDrivers.xml b/databaseDrivers.xml index 2174ca6d8..2f7096ed6 100644 --- a/databaseDrivers.xml +++ b/databaseDrivers.xml @@ -30,6 +30,13 @@ +
+ +
\ No newline at end of file From 3a2d3ef087bcb35fe8699441ef0463d9eddc5d27 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 10 Apr 2017 21:08:14 +0300 Subject: [PATCH 68/92] 5_2 HW4 patch applied --- web/webapp/pom.xml | 8 ++++-- .../masterjava/webapp/UsersServlet.java | 28 +++++++++++++++++++ .../main/webapp/WEB-INF/templates/users.html | 27 ++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 web/webapp/src/main/java/ru/javaops/masterjava/webapp/UsersServlet.java create mode 100644 web/webapp/src/main/webapp/WEB-INF/templates/users.html diff --git a/web/webapp/pom.xml b/web/webapp/pom.xml index 0cf8c6098..b543f44ec 100644 --- a/web/webapp/pom.xml +++ b/web/webapp/pom.xml @@ -16,11 +16,15 @@ war WebApp + + webapp + + ${project.groupId} - common + persist ${project.version} - \ No newline at end of file + diff --git a/web/webapp/src/main/java/ru/javaops/masterjava/webapp/UsersServlet.java b/web/webapp/src/main/java/ru/javaops/masterjava/webapp/UsersServlet.java new file mode 100644 index 000000000..d068401fe --- /dev/null +++ b/web/webapp/src/main/java/ru/javaops/masterjava/webapp/UsersServlet.java @@ -0,0 +1,28 @@ +package ru.javaops.masterjava.webapp; + +import com.google.common.collect.ImmutableMap; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.WebContext; +import ru.javaops.masterjava.common.web.ThymeleafUtil; +import ru.javaops.masterjava.persist.DBIProvider; +import ru.javaops.masterjava.persist.dao.UserDao; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("") +public class UsersServlet extends HttpServlet { + private UserDao userDao = DBIProvider.getDao(UserDao.class); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + final WebContext webContext = new WebContext(req, resp, req.getServletContext(), req.getLocale(), + ImmutableMap.of("users", userDao.getWithLimit(20))); + final TemplateEngine engine = ThymeleafUtil.getTemplateEngine(getServletContext()); + engine.process("users", webContext, resp.getWriter()); + } +} diff --git a/web/webapp/src/main/webapp/WEB-INF/templates/users.html b/web/webapp/src/main/webapp/WEB-INF/templates/users.html new file mode 100644 index 000000000..3991c8d07 --- /dev/null +++ b/web/webapp/src/main/webapp/WEB-INF/templates/users.html @@ -0,0 +1,27 @@ + + + + Users + + + + + + + + + + + + + + + + + + + + +
Full NameEmailFlag
+ + \ No newline at end of file From b1e73952222898a0b3878b22ad291325a2300f1a Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 10 Apr 2017 21:08:46 +0300 Subject: [PATCH 69/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20ignore.xml,=20ui.?= =?UTF-8?q?lnf.xml,=20IntelliLang.xml,=20web-browsers.xml,=20filetypes.xml?= =?UTF-8?q?,=20colors.scheme.xml,=20databaseSettings.xml,=20databaseDriver?= =?UTF-8?q?s.xml,=20multimarkdown.shared.xml,=20debugger.renderers.xml,=20?= =?UTF-8?q?markdown=5Fnavigator.shared.xml,=20debugger.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntelliLang.xml | 9 ++++ colors.scheme.xml | 5 +++ databaseDrivers.xml | 65 +++++++++++++++++++++++++++ databaseSettings.xml | 26 +++++++++++ debugger.renderers.xml | 34 +++++++++++++++ debugger.xml | 82 +++++++++++++++++++++++++++++++++++ filetypes.xml | 8 ++++ ignore.xml | 27 ++++++++++++ markdown_navigator.shared.xml | 62 ++++++++++++++++++++++++++ multimarkdown.shared.xml | 3 ++ ui.lnf.xml | 6 +++ web-browsers.xml | 10 +++++ 12 files changed, 337 insertions(+) create mode 100644 IntelliLang.xml create mode 100644 colors.scheme.xml create mode 100644 databaseDrivers.xml create mode 100644 databaseSettings.xml create mode 100644 debugger.renderers.xml create mode 100644 debugger.xml create mode 100644 filetypes.xml create mode 100644 ignore.xml create mode 100644 markdown_navigator.shared.xml create mode 100644 multimarkdown.shared.xml create mode 100644 ui.lnf.xml create mode 100644 web-browsers.xml diff --git a/IntelliLang.xml b/IntelliLang.xml new file mode 100644 index 000000000..621d5ba9f --- /dev/null +++ b/IntelliLang.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml new file mode 100644 index 000000000..39308cdb1 --- /dev/null +++ b/colors.scheme.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/databaseDrivers.xml b/databaseDrivers.xml new file mode 100644 index 000000000..2f7096ed6 --- /dev/null +++ b/databaseDrivers.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/databaseSettings.xml b/databaseSettings.xml new file mode 100644 index 000000000..8691bf5ca --- /dev/null +++ b/databaseSettings.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/debugger.renderers.xml b/debugger.renderers.xml new file mode 100644 index 000000000..cad6048ab --- /dev/null +++ b/debugger.renderers.xml @@ -0,0 +1,34 @@ + + + + \ No newline at end of file diff --git a/debugger.xml b/debugger.xml new file mode 100644 index 000000000..49914986e --- /dev/null +++ b/debugger.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/filetypes.xml b/filetypes.xml new file mode 100644 index 000000000..27b003d9c --- /dev/null +++ b/filetypes.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ignore.xml b/ignore.xml new file mode 100644 index 000000000..a31e71fb0 --- /dev/null +++ b/ignore.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/markdown_navigator.shared.xml b/markdown_navigator.shared.xml new file mode 100644 index 000000000..2b2887fcc --- /dev/null +++ b/markdown_navigator.shared.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/multimarkdown.shared.xml b/multimarkdown.shared.xml new file mode 100644 index 000000000..b4323c8d0 --- /dev/null +++ b/multimarkdown.shared.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/ui.lnf.xml b/ui.lnf.xml new file mode 100644 index 000000000..d680ca9b0 --- /dev/null +++ b/ui.lnf.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/web-browsers.xml b/web-browsers.xml new file mode 100644 index 000000000..10814a3f0 --- /dev/null +++ b/web-browsers.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file From d466d2df9d1a352dfa8c39753a924889afbe3c31 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 10 Apr 2017 21:17:47 +0300 Subject: [PATCH 70/92] 5_3 HW4 patch applied --- 5_2_HW4_webapp_users.patch | 95 -------------- 5_3_HW4_already_present.patch | 117 ------------------ config_templates/sql/initDB.sql | 1 + diff.xml | 32 ----- .../masterjava/persist/dao/UserDao.java | 8 +- .../masterjava/export/UploadServlet.java | 6 +- .../javaops/masterjava/export/UserExport.java | 15 ++- .../main/webapp/WEB-INF/templates/result.html | 6 +- 8 files changed, 25 insertions(+), 255 deletions(-) delete mode 100644 5_2_HW4_webapp_users.patch delete mode 100644 5_3_HW4_already_present.patch delete mode 100644 diff.xml diff --git a/5_2_HW4_webapp_users.patch b/5_2_HW4_webapp_users.patch deleted file mode 100644 index 99d8b044b..000000000 --- a/5_2_HW4_webapp_users.patch +++ /dev/null @@ -1,95 +0,0 @@ -Index: web/webapp/src/main/java/ru/javaops/masterjava/webapp/UsersServlet.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- web/webapp/src/main/java/ru/javaops/masterjava/webapp/UsersServlet.java (revision ) -+++ web/webapp/src/main/java/ru/javaops/masterjava/webapp/UsersServlet.java (revision ) -@@ -0,0 +1,28 @@ -+package ru.javaops.masterjava.webapp; -+ -+import com.google.common.collect.ImmutableMap; -+import org.thymeleaf.TemplateEngine; -+import org.thymeleaf.context.WebContext; -+import ru.javaops.masterjava.common.web.ThymeleafUtil; -+import ru.javaops.masterjava.persist.DBIProvider; -+import ru.javaops.masterjava.persist.dao.UserDao; -+ -+import javax.servlet.ServletException; -+import javax.servlet.annotation.WebServlet; -+import javax.servlet.http.HttpServlet; -+import javax.servlet.http.HttpServletRequest; -+import javax.servlet.http.HttpServletResponse; -+import java.io.IOException; -+ -+@WebServlet("") -+public class UsersServlet extends HttpServlet { -+ private UserDao userDao = DBIProvider.getDao(UserDao.class); -+ -+ @Override -+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { -+ final WebContext webContext = new WebContext(req, resp, req.getServletContext(), req.getLocale(), -+ ImmutableMap.of("users", userDao.getWithLimit(20))); -+ final TemplateEngine engine = ThymeleafUtil.getTemplateEngine(getServletContext()); -+ engine.process("users", webContext, resp.getWriter()); -+ } -+} -Index: web/webapp/src/main/webapp/WEB-INF/templates/users.html -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- web/webapp/src/main/webapp/WEB-INF/templates/users.html (revision ) -+++ web/webapp/src/main/webapp/WEB-INF/templates/users.html (revision ) -@@ -0,0 +1,27 @@ -+ -+ -+ -+ Users -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
Full NameEmailFlag
-+ -+ -\ No newline at end of file -Index: web/webapp/pom.xml -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- web/webapp/pom.xml (date 1490735901000) -+++ web/webapp/pom.xml (revision ) -@@ -16,10 +16,14 @@ - war - WebApp - -+ -+ webapp -+ -+ - - - ${project.groupId} -- common -+ persist - ${project.version} - - diff --git a/5_3_HW4_already_present.patch b/5_3_HW4_already_present.patch deleted file mode 100644 index 59e29fab5..000000000 --- a/5_3_HW4_already_present.patch +++ /dev/null @@ -1,117 +0,0 @@ -Index: persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java (date 1490737306000) -+++ persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java (revision ) -@@ -42,7 +42,9 @@ - @Override - public abstract void clean(); - -- @SqlBatch("INSERT INTO users (full_name, email, flag) VALUES (:fullName, :email, CAST(:flag AS USER_FLAG))") -- public abstract void insertBatch(@BindBean List users, @BatchChunkSize int chunkSize); -- -+ // https://habrahabr.ru/post/264281/ -+ @SqlBatch("INSERT INTO users (full_name, email, flag) VALUES (:fullName, :email, CAST(:flag AS USER_FLAG))" + -+ "ON CONFLICT DO NOTHING") -+// "ON CONFLICT (email) DO UPDATE SET full_name=:fullName, flag=CAST(:flag AS USER_FLAG)") -+ public abstract int[] insertBatch(@BindBean List users, @BatchChunkSize int chunkSize); - } -Index: web/export/src/main/webapp/WEB-INF/templates/result.html -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- web/export/src/main/webapp/WEB-INF/templates/result.html (date 1490737306000) -+++ web/export/src/main/webapp/WEB-INF/templates/result.html (revision ) -@@ -1,11 +1,11 @@ - - - -- Uploaded users -+ Already present users - - -

Export XML

--

Uploaded users

-+

Already present users

- - - -Index: config_templates/sql/initDB.sql -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- config_templates/sql/initDB.sql (date 1490737306000) -+++ config_templates/sql/initDB.sql (revision ) -@@ -13,3 +13,4 @@ - flag user_flag NOT NULL - ); - -+CREATE UNIQUE INDEX email_idx ON users (email); -\ No newline at end of file -Index: web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java (date 1490737306000) -+++ web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java (revision ) -@@ -1,5 +1,6 @@ - package ru.javaops.masterjava.export; - -+import one.util.streamex.IntStreamEx; - import ru.javaops.masterjava.persist.DBIProvider; - import ru.javaops.masterjava.persist.dao.UserDao; - import ru.javaops.masterjava.persist.model.User; -@@ -20,6 +21,12 @@ - - private UserDao userDao = DBIProvider.getDao(UserDao.class); - -+ /** -+ * @param is thr payload input stream -+ * @param chunkSize the batch chunk size -+ * @return users, already present in DB -+ * @throws XMLStreamException -+ */ - public List process(final InputStream is, int chunkSize) throws XMLStreamException { - final StaxStreamProcessor processor = new StaxStreamProcessor(is); - List users = new ArrayList<>(); -@@ -31,7 +38,11 @@ - final User user = new User(fullName, email, flag); - users.add(user); - } -- userDao.insertBatch(users, chunkSize); -- return users; -+ -+ int[] result = userDao.insertBatch(users, chunkSize); -+ return IntStreamEx.range(0, users.size()) -+ .filter(i -> result[i] == 0) -+ .mapToObj(users::get) -+ .toList(); - } - } -Index: web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java (date 1490737306000) -+++ web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java (revision ) -@@ -44,11 +44,11 @@ - } else { - Part filePart = req.getPart("fileToUpload"); - try (InputStream is = filePart.getInputStream()) { -- List users = userExport.process(is, chunkSize); -- log.info("Successfully uploaded " + users.size() + " users"); -+ List alreadyPresentUsers = userExport.process(is, chunkSize); -+ log.info("Already present in DB " + alreadyPresentUsers.size() + " users"); - final WebContext webContext = - new WebContext(req, resp, req.getServletContext(), req.getLocale(), -- ImmutableMap.of("users", users)); -+ ImmutableMap.of("users", alreadyPresentUsers)); - engine.process("result", webContext, resp.getWriter()); - return; - } diff --git a/config_templates/sql/initDB.sql b/config_templates/sql/initDB.sql index 888ba8141..09b463d69 100644 --- a/config_templates/sql/initDB.sql +++ b/config_templates/sql/initDB.sql @@ -13,3 +13,4 @@ CREATE TABLE users ( flag user_flag NOT NULL ); +CREATE UNIQUE INDEX email_idx ON users (email); \ No newline at end of file diff --git a/diff.xml b/diff.xml deleted file mode 100644 index ae07d4cb0..000000000 --- a/diff.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java b/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java index 284c162a1..0e1325726 100644 --- a/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java +++ b/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java @@ -42,7 +42,9 @@ public User insert(User user) { @Override public abstract void clean(); - @SqlBatch("INSERT INTO users (full_name, email, flag) VALUES (:fullName, :email, CAST(:flag AS USER_FLAG))") - public abstract void insertBatch(@BindBean List users, @BatchChunkSize int chunkSize); - + // https://habrahabr.ru/post/264281/ + @SqlBatch("INSERT INTO users (full_name, email, flag) VALUES (:fullName, :email, CAST(:flag AS USER_FLAG))" + + "ON CONFLICT DO NOTHING") +// "ON CONFLICT (email) DO UPDATE SET full_name=:fullName, flag=CAST(:flag AS USER_FLAG)") + public abstract int[] insertBatch(@BindBean List users, @BatchChunkSize int chunkSize); } diff --git a/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java b/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java index d6e16475c..dfe7a8096 100644 --- a/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java +++ b/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java @@ -44,11 +44,11 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S } else { Part filePart = req.getPart("fileToUpload"); try (InputStream is = filePart.getInputStream()) { - List users = userExport.process(is, chunkSize); - log.info("Successfully uploaded " + users.size() + " users"); + List alreadyPresentUsers = userExport.process(is, chunkSize); + log.info("Already present in DB " + alreadyPresentUsers.size() + " users"); final WebContext webContext = new WebContext(req, resp, req.getServletContext(), req.getLocale(), - ImmutableMap.of("users", users)); + ImmutableMap.of("users", alreadyPresentUsers)); engine.process("result", webContext, resp.getWriter()); return; } diff --git a/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java b/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java index 9c45da1a0..95b4d4352 100644 --- a/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java +++ b/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java @@ -1,5 +1,6 @@ package ru.javaops.masterjava.export; +import one.util.streamex.IntStreamEx; import ru.javaops.masterjava.persist.DBIProvider; import ru.javaops.masterjava.persist.dao.UserDao; import ru.javaops.masterjava.persist.model.User; @@ -20,6 +21,12 @@ public class UserExport { private UserDao userDao = DBIProvider.getDao(UserDao.class); + /** + * @param is thr payload input stream + * @param chunkSize the batch chunk size + * @return users, already present in DB + * @throws XMLStreamException + */ public List process(final InputStream is, int chunkSize) throws XMLStreamException { final StaxStreamProcessor processor = new StaxStreamProcessor(is); List users = new ArrayList<>(); @@ -31,7 +38,11 @@ public List process(final InputStream is, int chunkSize) throws XMLStreamE final User user = new User(fullName, email, flag); users.add(user); } - userDao.insertBatch(users, chunkSize); - return users; + + int[] result = userDao.insertBatch(users, chunkSize); + return IntStreamEx.range(0, users.size()) + .filter(i -> result[i] == 0) + .mapToObj(users::get) + .toList(); } } diff --git a/web/export/src/main/webapp/WEB-INF/templates/result.html b/web/export/src/main/webapp/WEB-INF/templates/result.html index ca4baa915..245756a02 100644 --- a/web/export/src/main/webapp/WEB-INF/templates/result.html +++ b/web/export/src/main/webapp/WEB-INF/templates/result.html @@ -1,11 +1,11 @@ - Uploaded users + Already present users

Export XML

-

Uploaded users

+

Already present users

@@ -23,4 +23,4 @@

Uploaded users

- \ No newline at end of file + From fadda3237cf28a096bc4bd5a4c498e6af8ef761e Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 10 Apr 2017 21:20:29 +0300 Subject: [PATCH 71/92] 5_4 HW4 patch applied --- IntelliLang.xml | 9 -- colors.scheme.xml | 5 - databaseDrivers.xml | 65 ----------- databaseSettings.xml | 26 ----- debugger.renderers.xml | 34 ------ debugger.xml | 82 ------------- filetypes.xml | 8 -- ignore.xml | 27 ----- markdown_navigator.shared.xml | 62 ---------- multimarkdown.shared.xml | 3 - .../masterjava/persist/dao/UserDao.java | 23 +++- .../masterjava/persist/dao/UserDaoTest.java | 7 ++ ui.lnf.xml | 6 - web-browsers.xml | 10 -- .../masterjava/export/UploadServlet.java | 7 +- .../javaops/masterjava/export/UserExport.java | 108 ++++++++++++++---- .../main/webapp/WEB-INF/templates/result.html | 26 ++--- 17 files changed, 125 insertions(+), 383 deletions(-) delete mode 100644 IntelliLang.xml delete mode 100644 colors.scheme.xml delete mode 100644 databaseDrivers.xml delete mode 100644 databaseSettings.xml delete mode 100644 debugger.renderers.xml delete mode 100644 debugger.xml delete mode 100644 filetypes.xml delete mode 100644 ignore.xml delete mode 100644 markdown_navigator.shared.xml delete mode 100644 multimarkdown.shared.xml delete mode 100644 ui.lnf.xml delete mode 100644 web-browsers.xml diff --git a/IntelliLang.xml b/IntelliLang.xml deleted file mode 100644 index 621d5ba9f..000000000 --- a/IntelliLang.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml deleted file mode 100644 index 39308cdb1..000000000 --- a/colors.scheme.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/databaseDrivers.xml b/databaseDrivers.xml deleted file mode 100644 index 2f7096ed6..000000000 --- a/databaseDrivers.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/databaseSettings.xml b/databaseSettings.xml deleted file mode 100644 index 8691bf5ca..000000000 --- a/databaseSettings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/debugger.renderers.xml b/debugger.renderers.xml deleted file mode 100644 index cad6048ab..000000000 --- a/debugger.renderers.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - \ No newline at end of file diff --git a/debugger.xml b/debugger.xml deleted file mode 100644 index 49914986e..000000000 --- a/debugger.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/filetypes.xml b/filetypes.xml deleted file mode 100644 index 27b003d9c..000000000 --- a/filetypes.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/ignore.xml b/ignore.xml deleted file mode 100644 index a31e71fb0..000000000 --- a/ignore.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/markdown_navigator.shared.xml b/markdown_navigator.shared.xml deleted file mode 100644 index 2b2887fcc..000000000 --- a/markdown_navigator.shared.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/multimarkdown.shared.xml b/multimarkdown.shared.xml deleted file mode 100644 index b4323c8d0..000000000 --- a/multimarkdown.shared.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java b/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java index 0e1325726..aab183fd7 100644 --- a/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java +++ b/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java @@ -1,9 +1,11 @@ package ru.javaops.masterjava.persist.dao; import com.bertoncelj.jdbi.entitymapper.EntityMapperFactory; +import one.util.streamex.IntStreamEx; import org.skife.jdbi.v2.sqlobject.*; import org.skife.jdbi.v2.sqlobject.customizers.BatchChunkSize; import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapperFactory; +import ru.javaops.masterjava.persist.DBIProvider; import ru.javaops.masterjava.persist.model.User; import java.util.List; @@ -27,6 +29,16 @@ public User insert(User user) { return user; } + @SqlQuery("SELECT nextval('user_seq')") + abstract int getNextVal(); + + @Transaction + public int getSeqAndSkip(int step) { + int id = getNextVal(); + DBIProvider.getDBI().useHandle(h -> h.execute("ALTER SEQUENCE user_seq RESTART WITH " + (id + step))); + return id; + } + @SqlUpdate("INSERT INTO users (full_name, email, flag) VALUES (:fullName, :email, CAST(:flag AS USER_FLAG)) ") @GetGeneratedKeys abstract int insertGeneratedId(@BindBean User user); @@ -43,8 +55,17 @@ public User insert(User user) { public abstract void clean(); // https://habrahabr.ru/post/264281/ - @SqlBatch("INSERT INTO users (full_name, email, flag) VALUES (:fullName, :email, CAST(:flag AS USER_FLAG))" + + @SqlBatch("INSERT INTO users (id, full_name, email, flag) VALUES (:id, :fullName, :email, CAST(:flag AS USER_FLAG))" + "ON CONFLICT DO NOTHING") // "ON CONFLICT (email) DO UPDATE SET full_name=:fullName, flag=CAST(:flag AS USER_FLAG)") public abstract int[] insertBatch(@BindBean List users, @BatchChunkSize int chunkSize); + + + public List insertAndGetAlreadyPresent(List users) { + int[] result = insertBatch(users, users.size()); + return IntStreamEx.range(0, users.size()) + .filter(i -> result[i] == 0) + .mapToObj(index -> users.get(index).getEmail()) + .toList(); + } } diff --git a/persist/src/test/java/ru/javaops/masterjava/persist/dao/UserDaoTest.java b/persist/src/test/java/ru/javaops/masterjava/persist/dao/UserDaoTest.java index 50e86da31..1dd6ed408 100644 --- a/persist/src/test/java/ru/javaops/masterjava/persist/dao/UserDaoTest.java +++ b/persist/src/test/java/ru/javaops/masterjava/persist/dao/UserDaoTest.java @@ -43,4 +43,11 @@ public void insertBatch() throws Exception { dao.insertBatch(FIST5_USERS, 3); Assert.assertEquals(5, dao.getWithLimit(100).size()); } + + @Test + public void getSeqAndSkip() throws Exception { + int seq1 = dao.getSeqAndSkip(5); + int seq2 = dao.getSeqAndSkip(1); + Assert.assertEquals(5, seq2 - seq1); + } } \ No newline at end of file diff --git a/ui.lnf.xml b/ui.lnf.xml deleted file mode 100644 index d680ca9b0..000000000 --- a/ui.lnf.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/web-browsers.xml b/web-browsers.xml deleted file mode 100644 index 10814a3f0..000000000 --- a/web-browsers.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java b/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java index dfe7a8096..bcaa685ce 100644 --- a/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java +++ b/web/export/src/main/java/ru/javaops/masterjava/export/UploadServlet.java @@ -4,7 +4,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.thymeleaf.context.WebContext; -import ru.javaops.masterjava.persist.model.User; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; @@ -44,11 +43,11 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S } else { Part filePart = req.getPart("fileToUpload"); try (InputStream is = filePart.getInputStream()) { - List alreadyPresentUsers = userExport.process(is, chunkSize); - log.info("Already present in DB " + alreadyPresentUsers.size() + " users"); + List failed = userExport.process(is, chunkSize); + log.info("Failed users: " + failed); final WebContext webContext = new WebContext(req, resp, req.getServletContext(), req.getLocale(), - ImmutableMap.of("users", alreadyPresentUsers)); + ImmutableMap.of("failed", failed)); engine.process("result", webContext, resp.getWriter()); return; } diff --git a/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java b/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java index 95b4d4352..353a7b902 100644 --- a/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java +++ b/web/export/src/main/java/ru/javaops/masterjava/export/UserExport.java @@ -1,6 +1,8 @@ package ru.javaops.masterjava.export; -import one.util.streamex.IntStreamEx; +import one.util.streamex.StreamEx; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.javaops.masterjava.persist.DBIProvider; import ru.javaops.masterjava.persist.dao.UserDao; import ru.javaops.masterjava.persist.model.User; @@ -12,37 +14,99 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; /** * gkislin * 14.10.2016 */ public class UserExport { + private static final Logger log = LoggerFactory.getLogger(UserExport.class); private UserDao userDao = DBIProvider.getDao(UserDao.class); + private static final int NUMBER_THREADS = 4; + private ExecutorService executorService = Executors.newFixedThreadPool(NUMBER_THREADS); - /** - * @param is thr payload input stream - * @param chunkSize the batch chunk size - * @return users, already present in DB - * @throws XMLStreamException - */ - public List process(final InputStream is, int chunkSize) throws XMLStreamException { - final StaxStreamProcessor processor = new StaxStreamProcessor(is); - List users = new ArrayList<>(); - - while (processor.doUntil(XMLEvent.START_ELEMENT, "User")) { - final String email = processor.getAttribute("email"); - final UserFlag flag = UserFlag.valueOf(processor.getAttribute("flag")); - final String fullName = processor.getReader().getElementText(); - final User user = new User(fullName, email, flag); - users.add(user); + public static class FailedEmail { + public String emailOrRange; + public String reason; + + public FailedEmail(String emailOrRange, String reason) { + this.emailOrRange = emailOrRange; + this.reason = reason; + } + + @Override + public String toString() { + return emailOrRange + " : " + reason; } + } + + public List process(final InputStream is, int chunkSize) throws XMLStreamException { + log.info("Start proseccing with chunkSize=" + chunkSize); + + return new Callable>() { + class ChunkFuture { + String emailRange; + Future> future; + + public ChunkFuture(List chunk, Future> future) { + this.future = future; + this.emailRange = chunk.get(0).getEmail(); + if (chunk.size() > 1) { + this.emailRange += '-' + chunk.get(chunk.size() - 1).getEmail(); + } + } + } + + @Override + public List call() throws XMLStreamException { + List futures = new ArrayList<>(); + + int id = userDao.getSeqAndSkip(chunkSize); + List chunk = new ArrayList<>(chunkSize); + final StaxStreamProcessor processor = new StaxStreamProcessor(is); + + while (processor.doUntil(XMLEvent.START_ELEMENT, "User")) { + final String email = processor.getAttribute("email"); + final UserFlag flag = UserFlag.valueOf(processor.getAttribute("flag")); + final String fullName = processor.getReader().getElementText(); + final User user = new User(id++, fullName, email, flag); + chunk.add(user); + if (chunk.size() == chunkSize) { + futures.add(submit(chunk)); + chunk.clear(); + id = userDao.getSeqAndSkip(chunkSize); + } + } + + if (!chunk.isEmpty()) { + futures.add(submit(chunk)); + } + + List failed = new ArrayList<>(); + futures.forEach(cf -> { + try { + failed.addAll(StreamEx.of(cf.future.get()).map(email -> new FailedEmail(email, "already present")).toList()); + log.info(cf.emailRange + " successfully executed"); + } catch (Exception e) { + log.error(cf.emailRange + " failed", e); + failed.add(new FailedEmail(cf.emailRange, e.toString())); + } + }); + return failed; + } - int[] result = userDao.insertBatch(users, chunkSize); - return IntStreamEx.range(0, users.size()) - .filter(i -> result[i] == 0) - .mapToObj(users::get) - .toList(); + private ChunkFuture submit(List chunk) { + ChunkFuture chunkFuture = new ChunkFuture(chunk, + executorService.submit(() -> userDao.insertAndGetAlreadyPresent(chunk)) + ); + log.info("Submit " + chunkFuture.emailRange); + return chunkFuture; + } + }.call(); } } diff --git a/web/export/src/main/webapp/WEB-INF/templates/result.html b/web/export/src/main/webapp/WEB-INF/templates/result.html index 245756a02..db5a25e39 100644 --- a/web/export/src/main/webapp/WEB-INF/templates/result.html +++ b/web/export/src/main/webapp/WEB-INF/templates/result.html @@ -1,26 +1,14 @@ - Already present users + Failed users

Export XML

-

Already present users

- - - - - - - - - - - - - - - -
Full NameEmailFlag
+

Failed users

+
    + +
  • +
- + \ No newline at end of file From fa00b3eeaad8041f346d8082dbbc631500c667f6 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 10 Apr 2017 21:20:39 +0300 Subject: [PATCH 72/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Create=20diff.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diff.xml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 diff.xml diff --git a/diff.xml b/diff.xml new file mode 100644 index 000000000..ce59f50ec --- /dev/null +++ b/diff.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file From d41f49254bc0e9239325a9eb97ed3347f13ad1f5 Mon Sep 17 00:00:00 2001 From: pinky83 Date: Mon, 10 Apr 2017 21:31:13 +0300 Subject: [PATCH 73/92] =?UTF-8?q?IU-2016.2.4=20<=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B9@DESKTOP-Q5F3FJI=20Update=20diff.xml=09Create?= =?UTF-8?q?=20ignore.xml,=20ui.lnf.xml,=20IntelliLang.xml,=20web-browsers.?= =?UTF-8?q?xml,=20filetypes.xml,=20colors.scheme.xml,=20databaseSettings.x?= =?UTF-8?q?ml,=20databaseDrivers.xml,=20multimarkdown.shared.xml,=20debugg?= =?UTF-8?q?er.renderers.xml,=20markdown=5Fnavigator.shared.xml,=20debugger?= =?UTF-8?q?.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntelliLang.xml | 9 ++++ colors.scheme.xml | 5 +++ databaseDrivers.xml | 65 +++++++++++++++++++++++++++ databaseSettings.xml | 26 +++++++++++ debugger.renderers.xml | 34 +++++++++++++++ debugger.xml | 82 +++++++++++++++++++++++++++++++++++ diff.xml | 3 ++ filetypes.xml | 8 ++++ ignore.xml | 27 ++++++++++++ markdown_navigator.shared.xml | 62 ++++++++++++++++++++++++++ multimarkdown.shared.xml | 3 ++ ui.lnf.xml | 6 +++ web-browsers.xml | 10 +++++ 13 files changed, 340 insertions(+) create mode 100644 IntelliLang.xml create mode 100644 colors.scheme.xml create mode 100644 databaseDrivers.xml create mode 100644 databaseSettings.xml create mode 100644 debugger.renderers.xml create mode 100644 debugger.xml create mode 100644 filetypes.xml create mode 100644 ignore.xml create mode 100644 markdown_navigator.shared.xml create mode 100644 multimarkdown.shared.xml create mode 100644 ui.lnf.xml create mode 100644 web-browsers.xml diff --git a/IntelliLang.xml b/IntelliLang.xml new file mode 100644 index 000000000..621d5ba9f --- /dev/null +++ b/IntelliLang.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml new file mode 100644 index 000000000..39308cdb1 --- /dev/null +++ b/colors.scheme.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/databaseDrivers.xml b/databaseDrivers.xml new file mode 100644 index 000000000..2f7096ed6 --- /dev/null +++ b/databaseDrivers.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/databaseSettings.xml b/databaseSettings.xml new file mode 100644 index 000000000..8691bf5ca --- /dev/null +++ b/databaseSettings.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/debugger.renderers.xml b/debugger.renderers.xml new file mode 100644 index 000000000..cad6048ab --- /dev/null +++ b/debugger.renderers.xml @@ -0,0 +1,34 @@ + + + + \ No newline at end of file diff --git a/debugger.xml b/debugger.xml new file mode 100644 index 000000000..49914986e --- /dev/null +++ b/debugger.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/diff.xml b/diff.xml index ce59f50ec..3cdeee1a3 100644 --- a/diff.xml +++ b/diff.xml @@ -1,6 +1,9 @@