README.md

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.

Обработка ошибок

  1. Запросы по {id} изображения, которого не существует, должны завершаться с кодом ответа 404 Not Found.
  2. Запросы с некорректными параметрами {width} или {height} должны завершаться с кодом ответа 400 Bad Request.
  3. Запросы с фрагментами, которые не пересекаются по координатам с изображением, должны завершаться с кодом ответа 400 Bad Request. При этом фрагменты могут частично находиться вне границ изображения (см. примечания) — такие запросы считаются корректными.

Примечания

  1. Размер изображений не превосходит 20 000 x 50 000.
  2. Некоторые изображения гарантировано не смогут поместиться целиком в памяти. Необходимо предусмотреть возможность хранения данных на диске.
  3. Формат изображений — BMP. Цветность в RGB (без альфа-канала), 24 бита на пиксель.
  4. В случае, если загружаемый восстановленный фрагмент перекрывает восстановленную ранее часть, то в любом случае применяется новый фрагмент.
  5. Если запрашивается фрагмент, часть которого ещё не восстановлена, то не восстановленные области закрашиваются чёрным цветом. Аналогично, чёрным цветом закрашивается та часть фрагмента, которая оказывается вне границ изображения (см. пример ниже).
  6. Если восстанавливаемый фрагмент перекрывает границы изображения, то часть фрагмента вне изображения игнорируется. Пример: размер изображения — 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 Гбайт места на диске.

Некоторые изображения гарантировано не смогут поместиться целиком в памяти. Необходимо предусмотреть возможность хранения данных на диске.

Конвейеры
0 успешных
0 с ошибкой