Chartographer
От charta (лат.) или харта — одно из названий папируса.
Необходимо написать сервис Chartographer — сервис для восстановления изображений древних свитков и папирусов. Изображения растровые и создаются поэтапно (отдельными фрагментами). Восстановленное изображение можно получать фрагментами (даже если оно лишь частично восстановленное).
Предполагается, что этим сервисом будет одновременно пользоваться множество учёных.
HTTP API
Необходимо реализовать 4 HTTP-метода:
POST /chartas/?width={width}&height={height}
Создать новое изображение папируса заданного размера (в пикселях), где {width}
и {height}
— положительные целые числа, не превосходящие 20 000
и 50 000
, соответственно.
Тело запроса пустое.
В теле ответа возвращается {id}
— уникальный идентификатор изображения в строковом представлении.
Код ответа: 201 Created
.
POST /chartas/{id}/?x={x}&y={y}&width={width}&height={height}
Сохранить восстановленный фрагмент изображения размера {width} x {height}
с координатами ({x};{y})
. Под координатами подразумевается положение левого верхнего угла фрагмента относительно левого верхнего угла всего изображения. Другими словами, левый верхний угол изображения является началом координат, т.е. эта точка имеет координаты (0;0)
.
Тело запроса: изображение в формате BMP
(цвет в RGB, 24 бита на 1 пиксель).
Тело ответа пустое.
Код ответа: 200 OK
.
GET /chartas/{id}/?x={x}&y={y}&width={width}&height={height}
Получить восстановленную часть изображения размера {width} x {height}
с координатами ({x};{y})
, где {width}
и {height}
— положительные целые числа, не превосходящие 5 000. Под координатами подразумевается положение левого верхнего угла фрагмента относительно левого верхнего угла всего изображения. Другими словами, левый верхний угол изображения является началом координат, т.е. эта точка имеет координаты (0;0)
.
Тело ответа: изображение в формате BMP
(цвет в RGB, 24 бита на 1 пиксель).
Код ответа: 200 OK
.
DELETE /chartas/{id}/
Удалить изображение с идентификатором {id}
.
Тело запроса и ответа пустое.
Код ответа: 200 OK
.
Обработка ошибок
- Запросы по
{id}
изображения, которого не существует, должны завершаться с кодом ответа404 Not Found
. - Запросы с некорректными параметрами
{width}
или{height}
должны завершаться с кодом ответа400 Bad Request
. - Запросы с фрагментами, которые не пересекаются по координатам с изображением, должны завершаться с кодом ответа
400 Bad Request
. При этом фрагменты могут частично находиться вне границ изображения (см. примечания) — такие запросы считаются корректными.
Примечания
- Размер изображений не превосходит
20 000 x 50 000
. - Некоторые изображения гарантировано не смогут поместиться целиком в памяти. Необходимо предусмотреть возможность хранения данных на диске.
- Формат изображений — BMP. Цветность в RGB (без альфа-канала), 24 бита на пиксель.
- В случае, если загружаемый восстановленный фрагмент перекрывает восстановленную ранее часть, то в любом случае применяется новый фрагмент.
- Если запрашивается фрагмент, часть которого ещё не восстановлена, то не восстановленные области закрашиваются чёрным цветом. Аналогично, чёрным цветом закрашивается та часть фрагмента, которая оказывается вне границ изображения (см. пример ниже).
- Если восстанавливаемый фрагмент перекрывает границы изображения, то часть фрагмента вне изображения игнорируется. Пример: размер изображения —
50 x 100
, фрагмент с размером50 x 50
и координатами верхнего левого угла(25;25)
. Правая половина фрагмента игнорируется. Схематически изображено ниже.
╔═════════╗
║ ║
║ ┌────╫────┐
║ │ ║ │
║ │ ║ │
║ │ ║ │
║ └────╫────┘
║ ║
╚═════════╝
Ожидается, что решение будет корректно работать в граничных случаях и успешно обрабатывать ошибки. Настоятельно рекомендуется покрыть основную функциональность Unit-тестами.
Требования к оформлению решения
- Компиляция кода и его исполнение c использованием Java 11.
- Сборка сервиса при помощи Apache Maven командой
mvn package
. - Unit-тесты должны выполняться в процессе сборки.
- Сервис должен собираться в fat jar, т.е. все зависимости должны быть упакованы внутрь одного jar.
- Запуск сервиса осуществляется командой
java -jar chartographer-1.0.0.jar /path/to/content/folder
в каталогеtarget
проекта, где/path/to/content/folder
– путь до каталога, в котором сервис может хранить данные. - Сервис должен принимать HTTP-запросы на стандартном порте (
8080
). - Исходный код соответствует Java Code Conventions и Google Java Style Guide.
Информация по тестированию
Сервис будет запускаться в Docker на многоядерной машине. Контейнеру будет предоставлено не менее 2 Гбайт
оперативной памяти и не менее 20 Гбайт
места на диске.
Некоторые изображения гарантировано не смогут поместиться целиком в памяти. Необходимо предусмотреть возможность хранения данных на диске.