От charta (лат.) или харта — одно из названий папируса.
Необходимо написать сервис Chartographer — сервис для восстановления изображений древних свитков и папирусов. Изображения растровые и создаются поэтапно (отдельными фрагментами). Восстановленное изображение можно получать фрагментами (даже если оно лишь частично восстановленное).
Предполагается, что этим сервисом будет одновременно пользоваться множество учёных.
Необходимо реализовать 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 Гбайт места на диске.
Некоторые изображения гарантировано не смогут поместиться целиком в памяти. Необходимо предусмотреть возможность хранения данных на диске.