Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.idea/
solution/target/
61 changes: 60 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,66 @@
4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года.

## Автор решения

Васильков Александр Сергеевич
## Описание реализации

Описание основных классов и их назначения:

_Main.java_:

- Этот класс является главным классом приложения.
- В методе main происходит обработка аргументов командной строки, чтение данных из JSON-файла, инициализация объектов, необходимых для работы с JSON (ObjectMapper), вызов метода solve из класса Solution для обработки заказов и вывод результата.

_Solution.java_:

- Этот класс отвечает за решение задачи по обработке заказов.
- В конструкторе Solution принимаются массив заказов и статус заказа для фильтрации.
- Метод solve осуществляет фильтрацию заказов по статусу, суммирование общей суммы заказов по месяцам и поиск месяцев с максимальным оборотом.
- Вспомогательные методы getMonthlyMaxValue, findOrderedMonthsEqualToMaxTotal и filterOrdersAndSumByMonthTotal используются для выполнения отдельных частей задачи.

_OrderModels.java_:

- Этот класс содержит модели данных для заказов.
- Определяется перечисление Status для статусов заказа.
- Внутри класса определены две записи: Order для хранения данных о заказе и Result для хранения результата обработки заказов.

Алгоритм работы программы :
- Программа получает имя JSON-файла из аргументов командной строки.
- Путь к файлу определяется с помощью вспомогательного класса FileUtils.
- Создается экземпляр ObjectMapper, который используется для чтения данных из JSON-файла в массив объектов заказов.
- Создается экземпляр класса Solution, который принимает массив заказов и статус заказа для фильтрации.
- В методе solve заказы фильтруются по статусу "COMPLETED", суммируется общая сумма заказов по месяцам, находится месяц с максимальным оборотом и возвраащется результат(месяцы), который предварительно отсортирвоан в порядке следования месяцев в течение года.
- Результат обработки заказов преобразуется в формат JSON. JSON-строка выводится в стандартный вывод.
- Программа перехватывает возможные исключения выводит соответствующие сообщения об ошибке.


## Инструкция по сборке и запуску решения
## Windows
> Предварительно: `Необходимо открыть консоль.` ВВодим команды представленные ниже.
```sh
git clone https://github.com/Ioutcast/school2024-test-task1.git
cd .\school2024-test-task1\solution\out
```
Запуск программы с помощью скрипта. Вводим в консоль :
```sh
start.bat
```
Запуск программы ручками. Вводим в консоль :
```sh
java -jar vasilkov-task-solution-jar-with-dependencies.jar input.json
```
## Linux
> Предварительно: `Необходимо открыть консоль.` ВВодим команды представленные ниже.
```sh
git clone https://github.com/Ioutcast/school2024-test-task1.git
cd ./school2024-test-task1/solution/out
```
Запуск программы с помощью скрипта. Вводим в консоль :
```sh
chmod +x start.sh
./start.sh
```
Запуск программы ручками. Вводим в консоль :
```sh
java -jar vasilkov-task-solution-jar-with-dependencies.jar input.json
```
File renamed without changes.
5 changes: 5 additions & 0 deletions solution/out/start.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@echo off
chcp 65001
java -jar vasilkov-task-solution-jar-with-dependencies.jar input.json
echo.
pause
3 changes: 3 additions & 0 deletions solution/out/start.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash
java -jar vasilkov-task-solution-jar-with-dependencies.jar input.json
echo ""
Binary file not shown.
93 changes: 93 additions & 0 deletions solution/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>vasilkov</groupId>
<artifactId>solution</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<lombok.version>1.18.20</lombok.version>
<jackson.version>2.17.0</jackson.version>
<log4j.version>2.23.1</log4j.version>
<junit-jupiter.version>5.10.2</junit-jupiter.version>
</properties>

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit-jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit-jupiter.version}</version>
<scope>test</scope>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>vasilkov.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<outputDirectory>out</outputDirectory>
<finalName>vasilkov-task-solution</finalName>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
37 changes: 37 additions & 0 deletions solution/src/main/java/vasilkov/CustomObjectMapperProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package vasilkov;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.json.JsonWriteFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

/**
* Класс, предоставляющий настраиваемый объект ObjectMapper.
*/
public class CustomObjectMapperProvider implements ObjectMapperProvider {

/**
* Получение настроенного объекта ObjectMapper.
* @return Настроенный объект ObjectMapper.
*/
@Override
public ObjectMapper getObjectMapper() {

ObjectMapper mapper = new ObjectMapper();

// Регистрация модуля для работы с датами и временем в формате Java Time
mapper.registerModule(new JavaTimeModule());

mapper.disable(JsonWriteFeature.QUOTE_FIELD_NAMES.mappedFeature());

return mapper;
}

}
22 changes: 22 additions & 0 deletions solution/src/main/java/vasilkov/FileUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package vasilkov;

import java.nio.file.Path;
import java.nio.file.Paths;

/**
* Утилитарный класс для работы с файлами.
*/
public class FileUtils {

/**
* Получение пути к ресурсному файлу по его имени.
* @param resourceName Имя ресурсного файла.
* @return Путь к ресурсному файлу.
*/
public static String getResourceFilePath(String resourceName) {
// Формирование пути к ресурсному файлу
Path resourcePath = Paths.get(resourceName);
return resourcePath.toString();
}

}
83 changes: 83 additions & 0 deletions solution/src/main/java/vasilkov/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package vasilkov;

import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.File;
import java.io.IOException;
import java.nio.file.AccessDeniedException;
import java.nio.file.InvalidPathException;
import java.nio.file.NoSuchFileException;
import java.nio.file.Paths;
import java.util.*;

/**
* Главный класс приложения для обработки заказов.
*/
public class Main {
// Задание статуса заказа по умолчанию
private static final OrderModels.Status status = OrderModels.Status.COMPLETED;

private static final Logger logger = LogManager.getLogger(Main.class);

/**
* Точка входа в программу.
* @param args Аргументы командной строки (имя JSON-файла).
*/
public static void main(String[] args) {

if (args.length != 1) {
logger.error("Usage: java -jar ваш_файл.jar имя_файла.json");
return;
}

// Получение имени JSON-файла из аргументов командной строки
String fileName = args[0];

// Получение пути к файлу с данными
String filePath = FileUtils.getResourceFilePath(fileName);

try {

//Конфигурирование инструмента для чтения и вывода Json
ObjectMapperProvider objectMapperProvider = new CustomObjectMapperProvider();
ObjectMapper mapper = objectMapperProvider.getObjectMapper();

// Чтение данных из файла и преобразование их в массив заказов
List<OrderModels.Order> orderArray = List.of(
mapper.readValue(
new File(filePath),
OrderModels.Order[].class
)
);

Solution solution = new Solution(orderArray, status);

// Получение результата решения и его преобразование в JSON
OrderModels.Result result = solution.solve();

String json = mapper.writeValueAsString(result);

System.out.print(json);

}catch (NoSuchFileException | AccessDeniedException | InvalidPathException e) {
logger.error("An IO error occurred while accessing the file: \n " + e.getMessage());
}catch (InvalidFormatException e) {
logger.error("Invalid format inside file: \n" + e.getMessage());
}catch (JsonMappingException e) {
logger.error("Error occurred during JSON mapping: \n" + e.getMessage());
}catch (NullPointerException e) {
logger.error("NullPointerException occurred: \n" + e.getMessage());
}catch (IOException e) {
logger.error("An IO error occurred while processing the file: \n" + e.getMessage());
}catch (NoSuchElementException e) {
logger.error("Error occurred because file is empty! \nor\nThere NO!!! elements with \"status\": \"COMPLETED\"!");
}catch (Exception e) {
logger.error("An unexpected error occurred: \n" + e.getMessage());
}
}

}
14 changes: 14 additions & 0 deletions solution/src/main/java/vasilkov/ObjectMapperProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package vasilkov;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
* Интерфейс, определяющий метод для предоставления объекта ObjectMapper.
*/
public interface ObjectMapperProvider {
/**
* Получение объекта ObjectMapper.
* @return Объект ObjectMapper.
*/
ObjectMapper getObjectMapper();
}
Loading