Skip to content

schottkey/homework1

Repository files navigation

Домашняя работа #1

Задание

Реализовать программу, которая получает ключевое слово для поиска на Wikipedia, достает из результатов текст и на основе динамически загружаемых плагинов на выходе формирует отчет и записывает результат в файл.

Требования

  1. Консольное приложение на вход получает слово или фразу для поиска статьи на английской Wikipedia как аргументы запуска или через stdin.
  2. Необходимо реализовать класс, выполняющий запрос к Wikipeadia, результат получать в формате JSON и с помощью Json Parser'а или JsonPath достать текст статьи.
  3. В полученном тексте заменить все \\n на \n и привести текст к нижнему регистру. (text.replaceAll("\\\\n", "\n").toLowerCase())
  4. Необходимо реализовать динамическую загрузку и исполнение кода из jar файлов, реализующих дополнительный функционал. Для простоты будем называть это плагинами. Плагины должны реализовывать интерфейс PluginInterface, а после загрузки приложение должно через Reflection API вызвать метод String apply(String text).
    В проекте созданы подпроекты для двух плагинов:
    • Counter Plugin – подсчет количество строк, слов, букв. На вход плагин получает текст, на выходе формирует только строку в формате <lines>;<words>;<letters>.
    • Frequency Dictionary Plugin – частотный словарь, подсчитывает сколько раз встречается каждое слово. Словоформы не учитывать, т.е. слова аргумент и аргументы считаются двумя разными словами. Союзы, предлоги и прочие части речи длиной в одну букву учитываются, знаки препинания не учитываются. На выходе формировать упорядоченный в алфавитном порядке список строк в формате <слово> <количество вхождений>.
  5. С помощью gradle плагины собираются в jar и подкладываются в папку $rootDir/plugins.
  6. Результат обработки текста плагином записывать в папку results в формате results-.txt.
  7. Для автоматизации проверки реализованы интеграционные тесты, выполняемые на GitHub через Actions. Процесс тестирования состоит из 2х шагов:
  • прогон тестов и сборка (сначала плагины, потом main-module);
  • запуск bash-скрипта, который вызывает java -jar main-module.jar и на вход направляет имена статей. После прогона выполнения скрипт сравнивает результаты в папке $rootDir/results и образцовые результаты в папке integration-test/results.

Сборка приложения

# загружает gradle wrapper 6.6
./gradlew wrapper

# сборка проекта, прогон тестов и копирование плагинов в /plugins
./gradlew clean build 

# запуск приложения, важно что это нужно делать из $rootDir, т.к. пути папок plugins/ и results/ строятся от корня
java -jar main-module/build/libs/main-module.jar  

Комментарии

  1. Все классы, в которых необходимо реализовать требуемое поведение, содержат TODO: NotImplemented и на них описаны тесты, чтобы гарантировать корректность поведения.
  2. Пример запроса к Wikipedia https://en.wikipedia.org/w/api.php?action=query&format=json&titles=HTML&prop=extracts&explaintext.
  3. Для выполнения запроса к Wikipedia использовать Apache HTTP Client. Пример.
  4. Для парсинга ответа использовать Json (реализацию от Google Gson) или JsonPath.
  5. Для разбиения текста на слова использовать RegExp (\b[a-zA-Z][a-zA-Z.0-9]*\b) (Пояснение).
  6. Для загрузки плагинов использовать URLCLassLoader.
  7. Если требуется добавить какие-то дополнительные библиотеки, то делать это через Gradle. Пример.

Как сдавать?

  • Fork этого репозитория
  • Merge request вашей реализации в этот репозиторий

Дедлайн

11 октября 23:59

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published