Обработка аргументов с помощью JCommander

Обработка аргументов с помощью JCommander #

Обработка аргументов с помощью JCommander #

Презентацию по теме можно посмотреть по ссылке

Видео-запись: Rutube

Классы для работы с датами в JVM #

Презентацию по теме можно посмотреть по ссылке

Уникальные идентификаторы UUID #

Презентацию по теме можно посмотреть по ссылке

Задание #

Доработайте приложение треугольника, чтобы оно соответствовало данной спецификации.

Данные #

Элемент списка: треугольник.

Название поля Описание поля Тип поля
Id Уникальный идентификатор UUID
SideA Длина стороны Натуральное число
SideB Длина стороны Натуральное число
SideC Длина стороны Натуральное число
RegistrationDateTime Дата регистрации в системе Дата и время в формате YYYY-MM-DDThh:mm:ss.sss
BorderColor Цвет границы Из списка цветов
FillColor Цвет заливки Из списка цветов
Description Описание Текст

Пример описания треугольника в формате JSON:

 
{
  "borderColor": "BLUE",
  "description": "обычный сине-красный треугольник",
  "fillColor": "RED",
  "id": "782418f0-86d3-4de0-8450-05e2e1083766",
  "registrationDateTime": "2024-08-19T02:45:41.142977656",
  "sideA": 395,
  "sideB": 165,
  "sideC": 408
}

Приложение должно считывать список треугольников из CSV-файла (разделитель – запятая). Пример данных:

Id,SideA,SideB,SideC,RegistrationDateTime,BorderColor,FillColor,Description
66ade672-2301-4408-9471-8a17aa883d65,1,2,5,2024-08-26T19:01:41.114511727,GREEN,RED,"странные данные, это неправильный треугольник"
a6be5e23-b8d4-4d78-8aa3-1c204d0befc8,2,3,5,2024-07-10T17:26:41.129567382,RED,GREEN,"точки расположены на отрезке"
baa30333-23d6-4eba-a8ed-7c235adf4228,2,3,4,2024-07-27T00:10:41.129642513,RED,GREEN,"обычный треугольник"

Имя файла с исходными данными должно передаваться приложению с ключом --triangles-file

... --triangles-file="../data/file.csv"
... --triangles-file="C:\Users\AM\data\app-3968942893870838401.csv"

Список цветов #

Цвет Описание RGB
BLACK Чёрный #000000
WHITE Белый #FFFFFF
RED Красный #FF0000
GREEN Зелёный #00FF00
BLUE Синий #0000FF
YELLOW Желтый #FFFF00
CYAN Голубой #00FFFF
MAGENTA Пурпурный #FF00FF
SILVER Серебряный #C0C0C0
GRAY Серый #808080
MAROON Бордовый #800000
OLIVE Оливковый #808000
DARKGREEN Тёмно-зелёный #008000
PURPLE Фиолетовый #800080
TEAL Бирюзовый #008080

Команды приложения #

Первый аргумент приложения определяет команду, которую приложение должно выпполнить.

В зависимости от аргументов вызова приложение должно выполнять следующие команды:

  1. list – получить список треугольников.
    Выходные данные: список всех треугольников в формате JSON, упорядоченный по возрастанию даты регистрации и id (при равенстве даты регистрации).
    Информация о треугольнике должна содержать только идентификатор, дату регистрации и описание.

    {
      "triangles": [ 
        {
            "description": "обычный треугольник",
            "id": "baa30333-23d6-4eba-a8ed-7c235adf4228",
            "registrationDateTime": "2024-07-27T00:10:41.129642513"
        }, 
        {
            "description": "точки расположены на отрезке",
            "id": "a6be5e23-b8d4-4d78-8aa3-1c204d0befc8",
            "registrationDateTime": "2024-07-10T17:26:41.129567382"
        }
      ]
    }
    {
      "triangles": []
    }

  2. show – получить один элемент списка по идентификатору.
    --id=ID – обязательный параметр. Корректное значение: идентификатор существующего в списке треугольника.
    Выходные данные: полная информация о треугольнике в формате JSON.

       show --id=66ade672-2301-4408-9471-8a17aa883d65
       
    {
      "id": "66ade672-2301-4408-9471-8a17aa883d65",
      "triangle": {
        "borderColor": "GREEN", "fillColor": "RED",
        "description": "странные данные, это не треугольник",
        "id": "66ade672-2301-4408-9471-8a17aa883d65",
        "registrationDateTime": "2024-08-26T19:01:41.114511727",
        "sideA": 1, "sideB": 2, "sideC": 5,
        "area": null, "type": "некорректный"
      }
    }

  3. list-color – получить список треугольников, отфильтрованный по цвету границы.
    --border-color=COLOR – обязательный параметр. Корректное значение: цвет из списка цветов.
    Выходные данные: информация о треугольниках (только идентификатор и размеры) в формате JSON, список треугольников упорядочен по возрастанию даты регистрации и id (при равенстве даты регистрации).

       list-color --border-color=RED
       
    {
      "BorderColor": "RED",
      "triangles": [
        {
            "id": "a6be5e23-b8d4-4d78-8aa3-1c204d0befc8",
            "sideA": 2, "sideB": 3, "sideC": 5
        }, 
        {
            "id": "baa30333-23d6-4eba-a8ed-7c235adf4228",
            "sideA": 2, "sideB": 3, "sideC": 4
        }
      ]
    }
    {
      "BorderColor": "BLUE",
      "triangles": []
    }

  4. list-area – получить список треугольников, отфильтрованный по площади треугольника.
    --area-min=FLOAT – необязательный параметр нижней границы фильтрации. Корректное значение: вещественное число.
    --area-max=FLOAT – необязательный параметр верхней границы фильтрации. Корректное значение: вещественное число.
    Обязательно должен быть передан хотя бы один из параметров.

    Выходные данные: информация о треугольниках (только идентификатор и размеры) в формате JSON, список треугольников упорядочен по возрастанию даты регистрации и id (при равенстве даты регистрации).

       list-area --area-min=1
       list-area --area-max=1
       list-area --area-min=0 --area-max=3.0
       
    {
        "AreaMin": 0.0,
        "AreaMax": 3.0,
        "triangles": [
          {
            "id": "a6be5e23-b8d4-4d78-8aa3-1c204d0befc8",
            "sideA": 2, "sideB": 3, "sideC": 5
          }, 
          {
            "id": "baa30333-23d6-4eba-a8ed-7c235adf4228",
            "sideA": 2, "sideB": 3, "sideC": 4
          }
        ]
    }
    {
        "AreaMin": 1.0,
        "triangles": [
          {
            "id": "baa30333-23d6-4eba-a8ed-7c235adf4228",
            "sideA": 2, "sideB": 3, "sideC": 4
          }
        ]
    }
  5. statistic – получить статистическую информацию о списке треугольников.

    • --by=[color/type] – обязательный параметр типа отображаемой статистики. Возможные значения:
      • color – статистика по цвету заливки
      • type – статистика по типу треугольника:
        • некорректный (наибольшая сторона больше суммы двух других)
        • отрезок (наибольшая сторона равна сумме двух других)
        • остроугольный (квадрат наибольшей стороны меньше суммы квадратов двух других)
        • прямоугольный (квадрат наибольшей стороны равен сумме квадратов двух других)
        • тупоугольный (квадрат наибольшей стороны больше суммы квадратов двух других)

    Выходные данные: статистика в формате JSON. В выдаче должны присутствовать только те цвета или типы треугольника, которые есть в списке данных. Списки упорядочены лексикографически по возрастанию color и type соответственно.

    statistic --by=color
    statistic --by=type
    statistic --by=color,type
    {
      "statisticByColor": [
        { "color": "GREEN", "count": 2 }, 
        { "color": "RED", "count": 1 }
      ]
    }
       
    {
       "statisticByType": [
         { "type": "некорректный", "count": 1 },
         { "type": "остроугольный", "count": 1 },
         { "type": "отрезок", "count": 1 }
       ]
     }
    {
       "statisticByColor": [
         { "color": "GREEN", "count": 2 }, 
         { "color": "RED", "count": 1 }
       ], 
       "statisticByType": [
         { "type": "некорректный", "count": 1 },
         { "type": "остроугольный", "count": 1 },
         { "type": "отрезок", "count": 1 }
       ]
     }

Выходные данные #

При корректных входных данных приложение должно завершать работу с кодом возврата 0 и возвращать данные в формате JSON.

При некорректных входных данных приложение должно завершать работу с ненулевым кодом возврата и возвращать сообщение об ошибке. Некорректными данными считается:

  • отсутствие аргумента команды или некорректная команда.
  • отсутствие обязательного параметра команды, его некорректное значение или несоответствие значения указанному типу данных.
  • отсутствие аргумента --triangles-file или его некорректное значение.

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

© A. M. Васильев, 2024, CC BY-SA 4.0, andrey@crafted.su