Giter Site home page Giter Site logo

chartographer's Introduction

Описание разработанного приложения

Использованный стек технологий:

  • Spring Boot
  • Lombok
  • Junit 5
  • Mockito
  • Apache Maven
  • Swagger 3.0

При запуске приложения в аргументах командной строки есть возможность указать путь для сохранения изображений на диске. Если директории не существует, она будет создана.
По умолчанию изображения будут сохраняться в /images
Для удобства использования фрагменты изображения, используемые при получении и отправке запросов дополнительно сохраняются с пометкой tmp

Обработка запросов тестировалась с помощью утилиты Postman.
Примечание - запрос на вставку фрагмента должен включать изображение .bmp в теле запроса form-data с тегом "file"

Для разработанного приложения автоматически генерируется Javadoc и Swagger - документация по адресу http://localhost:8080/swagger-ui/index.html

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 Гбайт места на диске.

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

chartographer's People

Contributors

egormit avatar gnkoshelev avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.