From b6fa15634dc7fab80efc386216141fbfae1c1da1 Mon Sep 17 00:00:00 2001 From: stvort Date: Tue, 3 Oct 2023 23:37:36 +0400 Subject: [PATCH] hw01-xml-config template added --- templates/hw01-xml-config/.gitignore | 25 ++++ templates/hw01-xml-config/pom.xml | 112 ++++++++++++++++++ .../src/main/java/ru/otus/hw/Application.java | 15 +++ .../java/ru/otus/hw/config/AppConfig.java | 16 +++ .../otus/hw/config/TestFileNameProvider.java | 5 + .../java/ru/otus/hw/dao/CsvQuestionDao.java | 22 ++++ .../main/java/ru/otus/hw/dao/QuestionDao.java | 9 ++ .../otus/hw/dao/dto/AnswerCsvConverter.java | 13 ++ .../java/ru/otus/hw/dao/dto/QuestionDto.java | 25 ++++ .../main/java/ru/otus/hw/domain/Answer.java | 4 + .../main/java/ru/otus/hw/domain/Question.java | 6 + .../hw/exceptions/QuestionReadException.java | 7 ++ .../java/ru/otus/hw/service/IOService.java | 7 ++ .../ru/otus/hw/service/StreamsIOService.java | 22 ++++ .../ru/otus/hw/service/TestRunnerService.java | 5 + .../hw/service/TestRunnerServiceImpl.java | 14 +++ .../java/ru/otus/hw/service/TestService.java | 6 + .../ru/otus/hw/service/TestServiceImpl.java | 16 +++ .../src/main/resources/questions.csv | 4 + .../src/main/resources/spring-context.xml | 15 +++ 20 files changed, 348 insertions(+) create mode 100644 templates/hw01-xml-config/.gitignore create mode 100644 templates/hw01-xml-config/pom.xml create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/Application.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/config/AppConfig.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/config/TestFileNameProvider.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/CsvQuestionDao.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/QuestionDao.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/dto/AnswerCsvConverter.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/dto/QuestionDto.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/domain/Answer.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/domain/Question.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/exceptions/QuestionReadException.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/service/IOService.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/service/StreamsIOService.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestRunnerService.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestRunnerServiceImpl.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestService.java create mode 100644 templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestServiceImpl.java create mode 100644 templates/hw01-xml-config/src/main/resources/questions.csv create mode 100644 templates/hw01-xml-config/src/main/resources/spring-context.xml diff --git a/templates/hw01-xml-config/.gitignore b/templates/hw01-xml-config/.gitignore new file mode 100644 index 00000000..2170ddb4 --- /dev/null +++ b/templates/hw01-xml-config/.gitignore @@ -0,0 +1,25 @@ +target/ +dependency-reduced-pom.xml + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ diff --git a/templates/hw01-xml-config/pom.xml b/templates/hw01-xml-config/pom.xml new file mode 100644 index 00000000..a16f0635 --- /dev/null +++ b/templates/hw01-xml-config/pom.xml @@ -0,0 +1,112 @@ + + + 4.0.0 + + + ru.otus.hw + hw01-xml-config + 1.0 + + + 17 + 17 + UTF-8 + 6.0.12 + 5.8 + 5.10.0 + 5.4.0 + 3.24.2 + 1.18.28 + 3.2.2 + 10.11.0 + + https://raw.githubusercontent.com/OtusTeam/Spring/master/checkstyle.xml + + + + + org.springframework + spring-context + ${spring.version} + + + + com.opencsv + opencsv + ${opencsv.version} + + + commons-collections + commons-collections + + + + + + + + org.junit.jupiter + junit-jupiter-engine + test + ${junit.version} + + + + org.mockito + mockito-core + test + ${mockito.version} + + + + org.assertj + assertj-core + test + ${assertj.version} + + + + org.projectlombok + lombok + true + ${lombok.version} + + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-plugin.version} + + + com.puppycrawl.tools + checkstyle + ${checkstyle.version} + + + + ${checkstyle.config.url} + + + + + check + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.3.0 + + + + + \ No newline at end of file diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/Application.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/Application.java new file mode 100644 index 00000000..284a4adc --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/Application.java @@ -0,0 +1,15 @@ +package ru.otus.hw; + +import org.springframework.context.ApplicationContext; +import ru.otus.hw.service.TestRunnerService; + +public class Application { + public static void main(String[] args) { + + //Прописать бины в spring-context.xml и создать контекст на его основе + ApplicationContext context = null; + var testRunnerService = context.getBean(TestRunnerService.class); + testRunnerService.run(); + + } +} \ No newline at end of file diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/config/AppConfig.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/config/AppConfig.java new file mode 100644 index 00000000..def57dd3 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/config/AppConfig.java @@ -0,0 +1,16 @@ +package ru.otus.hw.config; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class AppConfig implements TestFileNameProvider { + + private String testFileName; + + @Override + public String getTestFileName() { + return testFileName; + } +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/config/TestFileNameProvider.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/config/TestFileNameProvider.java new file mode 100644 index 00000000..c798b220 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/config/TestFileNameProvider.java @@ -0,0 +1,5 @@ +package ru.otus.hw.config; + +public interface TestFileNameProvider { + String getTestFileName(); +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/CsvQuestionDao.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/CsvQuestionDao.java new file mode 100644 index 00000000..3941a647 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/CsvQuestionDao.java @@ -0,0 +1,22 @@ +package ru.otus.hw.dao; + +import lombok.RequiredArgsConstructor; +import ru.otus.hw.config.TestFileNameProvider; +import ru.otus.hw.domain.Question; + +import java.util.ArrayList; +import java.util.List; + +@RequiredArgsConstructor +public class CsvQuestionDao implements QuestionDao { + private final TestFileNameProvider fileNameProvider; + + @Override + public List findAll() { + // Использовать CsvToBean + // https://opencsv.sourceforge.net/#collection_based_bean_fields_one_to_many_mappings + // Использовать QuestionReadException + + return new ArrayList<>(); + } +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/QuestionDao.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/QuestionDao.java new file mode 100644 index 00000000..0e80fc33 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/QuestionDao.java @@ -0,0 +1,9 @@ +package ru.otus.hw.dao; + +import ru.otus.hw.domain.Question; + +import java.util.List; + +public interface QuestionDao { + List findAll(); +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/dto/AnswerCsvConverter.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/dto/AnswerCsvConverter.java new file mode 100644 index 00000000..0f7ccb56 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/dto/AnswerCsvConverter.java @@ -0,0 +1,13 @@ +package ru.otus.hw.dao.dto; + +import com.opencsv.bean.AbstractCsvConverter; +import ru.otus.hw.domain.Answer; + +public class AnswerCsvConverter extends AbstractCsvConverter { + + @Override + public Object convertToRead(String value) { + var valueArr = value.split("%"); + return new Answer(valueArr[0], Boolean.parseBoolean(valueArr[1])); + } +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/dto/QuestionDto.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/dto/QuestionDto.java new file mode 100644 index 00000000..73758e28 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/dao/dto/QuestionDto.java @@ -0,0 +1,25 @@ +package ru.otus.hw.dao.dto; + +import com.opencsv.bean.CsvBindAndSplitByPosition; +import com.opencsv.bean.CsvBindByPosition; +import lombok.Data; +import ru.otus.hw.domain.Answer; +import ru.otus.hw.domain.Question; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class QuestionDto { + + @CsvBindByPosition(position = 0) + private String text; + + @CsvBindAndSplitByPosition(position = 1, collectionType = ArrayList.class, elementType = Answer.class, + converter = AnswerCsvConverter.class, splitOn = "\\|") + private List answers; + + public Question toDomainObject() { + return new Question(text, answers); + } +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/domain/Answer.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/domain/Answer.java new file mode 100644 index 00000000..ca182ae5 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/domain/Answer.java @@ -0,0 +1,4 @@ +package ru.otus.hw.domain; + +public record Answer(String text, boolean isCorrect) { +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/domain/Question.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/domain/Question.java new file mode 100644 index 00000000..c24e330e --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/domain/Question.java @@ -0,0 +1,6 @@ +package ru.otus.hw.domain; + +import java.util.List; + +public record Question(String text, List answers) { +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/exceptions/QuestionReadException.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/exceptions/QuestionReadException.java new file mode 100644 index 00000000..9a44efbb --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/exceptions/QuestionReadException.java @@ -0,0 +1,7 @@ +package ru.otus.hw.exceptions; + +public class QuestionReadException extends RuntimeException { + public QuestionReadException(String message, Throwable ex) { + super(message, ex); + } +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/IOService.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/IOService.java new file mode 100644 index 00000000..76817777 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/IOService.java @@ -0,0 +1,7 @@ +package ru.otus.hw.service; + +public interface IOService { + void printLine(String s); + + void printFormattedLine(String s, Object ...args); +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/StreamsIOService.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/StreamsIOService.java new file mode 100644 index 00000000..9a2bebec --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/StreamsIOService.java @@ -0,0 +1,22 @@ +package ru.otus.hw.service; + +import java.io.PrintStream; + +public class StreamsIOService implements IOService { + private final PrintStream printStream; + + public StreamsIOService(PrintStream printStream) { + + this.printStream = printStream; + } + + @Override + public void printLine(String s) { + printStream.println(s); + } + + @Override + public void printFormattedLine(String s, Object... args) { + printStream.printf(s + "%n", args); + } +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestRunnerService.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestRunnerService.java new file mode 100644 index 00000000..2fb92f9a --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestRunnerService.java @@ -0,0 +1,5 @@ +package ru.otus.hw.service; + +public interface TestRunnerService { + void run(); +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestRunnerServiceImpl.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestRunnerServiceImpl.java new file mode 100644 index 00000000..3b1047d3 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestRunnerServiceImpl.java @@ -0,0 +1,14 @@ +package ru.otus.hw.service; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class TestRunnerServiceImpl implements TestRunnerService { + + private final TestService testService; + + @Override + public void run() { + testService.executeTest(); + } +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestService.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestService.java new file mode 100644 index 00000000..48f4e591 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestService.java @@ -0,0 +1,6 @@ +package ru.otus.hw.service; + +public interface TestService { + + void executeTest(); +} diff --git a/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestServiceImpl.java b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestServiceImpl.java new file mode 100644 index 00000000..5202c924 --- /dev/null +++ b/templates/hw01-xml-config/src/main/java/ru/otus/hw/service/TestServiceImpl.java @@ -0,0 +1,16 @@ +package ru.otus.hw.service; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class TestServiceImpl implements TestService { + + private final IOService ioService; + + @Override + public void executeTest() { + ioService.printLine(""); + ioService.printFormattedLine("Please answer the questions below%n"); + // Получить вопросы из дао и вывести их с вариантами ответов + } +} diff --git a/templates/hw01-xml-config/src/main/resources/questions.csv b/templates/hw01-xml-config/src/main/resources/questions.csv new file mode 100644 index 00000000..fc0f548b --- /dev/null +++ b/templates/hw01-xml-config/src/main/resources/questions.csv @@ -0,0 +1,4 @@ +# Добавить сюда своих вопросов. Эту строку надо пропустить при настройке CsvToBean (withSkipLines) +Is there life on Mars?;Science doesn't know this yet%true|Certainly. The red UFO is from Mars. And green is from Venus%false|Absolutely not%false +How should resources be loaded form jar in Java?;ClassLoader#geResourceAsStream or ClassPathResource#getInputStream%true|ClassLoader#geResource#getFile + FileReader%false|Wingardium Leviosa%false +Which option is a good way to handle the exception?;@SneakyThrow%false|e.printStackTrace()%false|Rethrow with wrapping in business exception (for example, QuestionReadException)%true|Ignoring exception%false \ No newline at end of file diff --git a/templates/hw01-xml-config/src/main/resources/spring-context.xml b/templates/hw01-xml-config/src/main/resources/spring-context.xml new file mode 100644 index 00000000..1a01bf8e --- /dev/null +++ b/templates/hw01-xml-config/src/main/resources/spring-context.xml @@ -0,0 +1,15 @@ + + + + + + + + + +