Задание:
На вход в виде параметра командной строки java-приложению передаётся
имя XML-файла, в котором задано взаимное положение предметов(Item) и ящиков(Box).
Пример такого файла:
<?xml version="1.0" encoding="UTF-8"?>
<Storage>
<Box id="1">
<Item id="1"/>
<Item color="red" id="2"/>
<Box id="3">
<Item id="3" color="red" />
<Item id="4" color="black" />
</Box>
<Box id="6"/>
<Item id="5"/>
</Box>
<Item id="6"/>
</Storage>
- ящики могут быть пустыми или содержать предметы или другие ящики;
- у каждого ящика и предмета есть id;
- id какого-либо предмета и какого-либо ящика могут совпадать,
но в совокупности предметов они уникальны (как и в совокупности ящиков);
- вложенность ящиков может быть любой;
- предметы могут не иметь цвета;
- предметы могут быть не в ящике
Написать приложение, которое:
1. заполняет при старте SQL-БД приведённой ниже структуры в соответствии с переданным XML-файлом
CREATE TABLE BOX
(ID INTEGER PRIMARY KEY,
CONTAINED_IN INTEGER
);
CREATE TABLE ITEM
(ID INTEGER PRIMARY KEY,
CONTAINED_IN INTEGER REFERENCES BOX(ID),
COLOR VARCHAR(100)
);
2. После загрузки файла приложение должно работать, как REST-сервис, который возвращает id предметов
заданного цвета(color) содержащиеся в ящике c заданным идентификатором (box)
с учётом того, что в ящике может быть ещё ящик с предметами требуемого цвета.
Например, на POST-запрос с телом запроса в JSON вида:
POST /test HTTP/1.1
Host: localhost
Accept: application/json
Content-Type:application/json
Content-Length: 25
{"box":"1","color":"red"}
для вышеприведённого XML должен быть ответ вида:
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 01 Sep 2019 12:00:26 GMT
[2,3]
- Использован Spring MVC с Spring Boot для реализации REST-сервиса
- Стандартный функционал Java для парсинга XML-файла
- PostgreSQL в качестве СУБД
- Spring Data для работы с СУБД
- Имеются тесты для проверки REST-контроллера
- Приложение является docker-ready, т.е. можно запустить приложение с СУБД одной командой с помощью docker-compose
- Проектирование: 2ч
- Реализация и подготовка тестов: 4ч
- Ознакомление с docker-compose (ранее не пользовался им), подготовка и отладка конфигурации для него - 1ч
- В начале казалось, что можно будет применить паттерн Composite. Не нашел, куда именно.
- Читал про рекурсивные SQL-запросы, но они показались куда сложнее, чем просто реализовать рекурсию в коде (что, однако, привело к необходимости делать множество мелких запросов, что может влиять на производительность).
- Есть ли иные фреймворки, кроме Spring MVC, которые можно использовать для реализации подобных приложений?