Реализовать программу, которая получает ключевое слово для поиска на Wikipedia, достает из результатов текст и на основе динамически загружаемых плагинов на выходе формирует отчет и записывает результат в файл.
- Консольное приложение на вход получает слово или фразу для поиска статьи на английской Wikipedia как аргументы запуска или через stdin.
- Необходимо реализовать класс, выполняющий запрос к Wikipeadia, результат получать в формате JSON и с помощью Json Parser'а или JsonPath достать текст статьи.
- В полученном тексте заменить все
\\n
на\n
и привести текст к нижнему регистру. (text.replaceAll("\\\\n", "\n").toLowerCase()
) - Необходимо реализовать динамическую загрузку и исполнение кода из jar файлов, реализующих дополнительный функционал.
Для простоты будем называть это плагинами. Плагины должны реализовывать интерфейс PluginInterface,
а после загрузки приложение должно через Reflection API вызвать метод
String apply(String text)
.
В проекте созданы подпроекты для двух плагинов:- Counter Plugin – подсчет количество строк, слов, букв. На вход плагин получает текст,
на выходе формирует только строку в формате
<lines>;<words>;<letters>
. - Frequency Dictionary Plugin – частотный словарь, подсчитывает сколько раз встречается каждое слово.
Словоформы не учитывать, т.е. слова аргумент и аргументы считаются двумя разными словами. Союзы, предлоги и прочие части речи длиной в одну букву учитываются,
знаки препинания не учитываются. На выходе формировать упорядоченный в алфавитном порядке список строк в формате
<слово> <количество вхождений>
.
- Counter Plugin – подсчет количество строк, слов, букв. На вход плагин получает текст,
на выходе формирует только строку в формате
- С помощью
gradle
плагины собираются в jar и подкладываются в папку$rootDir/plugins
. - Результат обработки текста плагином записывать в папку results в формате results-.txt.
- Для автоматизации проверки реализованы интеграционные тесты, выполняемые на 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
- Все классы, в которых необходимо реализовать требуемое поведение, содержат
TODO: NotImplemented
и на них описаны тесты, чтобы гарантировать корректность поведения. - Пример запроса к Wikipedia https://en.wikipedia.org/w/api.php?action=query&format=json&titles=HTML&prop=extracts&explaintext.
- Для выполнения запроса к Wikipedia использовать Apache HTTP Client. Пример.
- Для парсинга ответа использовать Json (реализацию от Google Gson) или JsonPath.
- Для разбиения текста на слова использовать RegExp
(\b[a-zA-Z][a-zA-Z.0-9]*\b)
(Пояснение). - Для загрузки плагинов использовать URLCLassLoader.
- Если требуется добавить какие-то дополнительные библиотеки, то делать это через Gradle. Пример.
- Fork этого репозитория
- Merge request вашей реализации в этот репозиторий
11 октября 23:59