nc-lab

Лабораторная работа №1

Есть три типа контрактов

Контракт на мобильную связь
Контракт на проводной интернет
Контракт на цифровое телевидение

Все типы контрактов имеют поля

ID
Дата начала контракта
Дата окончания контракта
Номер контракта
Владелец контракта(Сущность Человек)

Кроме того

Контракт на мобильную связь имеет свойства(количество минут, смс и Гб трафика)
Контракт на проводной интернет - скорость соединения
Контракт на цифровое телевидение - пакет каналов

Сущность Человек имеет свойства

ID
Фамилия Имя Отчеcтво
Дата рождения
Пол
Серия и номер паспорта
Вычисляемое свойство - возраст

Необходимо создать репозиторий, который позволял бы хранить контракты этих типов. Репозиторий должен позволять добавлять произвольное количество контрактов, удалять контракты по ID, получать контракты по ID В этом задании нельзя использовать встроенные коллекции. Репозиторий должен быть создан на основе массива, с использованием механизма расширения, который будет вызываться, если места для добавления не хватает.

Лабораторная работа №2

Добавить возможность поиска по репозиторию по различным критериям. Нужно определить метод, который бы принимал в качестве параметра критерии поиска и возвращал результаты поиска по этим критериям. Критерии поиска передаются через предикаты(см. класс Predicate). Результатом поиска будет объект класса вашего репозитория Добавить возможность сортировки по различным критериям:

Нужно описать интерфейс ISorter который будет содержать метод sort принимающий, в том числе, компаратор. Нужно описать несколько классов-имлементаций этого интерфейса(например BoubleSorter, MergeSorter или типа того) Далее, использовать эти классы для сортировки в репозитории. Важный момент: критерий сортировки должен передаваться через компараторы(см. класс Comparator).

Лабораторная работа №3

Работа с CSV файлом

Дан csv файл который содержит информацию о контрактах. Список полей вы определяете исходя из свое модели. Как пример это:

  • ДатаНачалаКонтракта;
  • ДатаКонцаКонтракта;
  • ФИОКлинета;
  • ПолКлиента;
  • ДатаРождения;
  • ДанныеПаспорта;
  • ТипКонтракта;
  • ДопИнформацияПоКонтракту;

Все поля, кроме последних двух, можно подгонять под вашу модель. Предпоследнее поле определяет тип контракта(мобильный, тв или интернет). Последнее поле содержит в себе специфичную для каждого типа контракта информацию. Например для мобильного контракта там находится информация о тарифном плане(минуты, гигабайты, смс). Для ТВ - кпакет каналов и т.д

Нужно написать класс, добавляющий данные из этого файла в ваш репозиторий. Т.е. должен быть некий класс-загрузчик, который на вход принимает файл и репозиторий и добавляет информацию из этого файла в ваш репозиторий.

Для чтения из файла можно использовать либо стандартные бибилотеки Java IO (см. FileReader и BufferReader) или специальную библитеку(например opencsv)

Лабораторная работа №4

Разработать механиз валидации контракта.

Для этого необходимо создать классы которые могли бы проверять переданный им в качестве параметра контракт и возвращать в качестве результата объект, сожержащий информацию о результатате проверки. результат проверки должен содержать:\

  • Статус проверки(например, ок, error, red risk и т.п.)
  • Некий текст описывающий ошибку(если она есть)
  • Далее, опционально на усмотрение(например, можно возвращать имя поля, в котором была найдена ошибка) Добавить использование валидаторов в класс загрузчик CSV.

Лабораторная работа №5

Рефлексия и DI

  1. Создать аннотацию AutoInjectable(или любое другое название). Данной аннотацией будут помечаться поля классов для которых нужно будет осуществить внедрение зависимости
  2. Создать аннотацию Configuration(или любое другое название) со свойством packages(массив String). Данное свойство будет хранить в себе имена пакетов, где нужно будет искать классы, инстансы которых будут внедряться в поля, помеченные аннотацией AutoInjectable
  3. Создать класс Injector(или любое другое имя), который будет осуществлять внедрение зависимостей. Данный класс помечаем аннотацией Configuration. По ее свойству packages определяем в каких пакетах будем искать классы Создаем метод что-то типа public static T inject(T object){....} В этот метод будет передаваться некий объект куда надо осуществить внедрение зависимостей. В теле метода Ищем поля класса, которые помечены аннотацией AutoInjectable Если это простое поле(не коллекция) то ищем класс, среди пакетов, которые указаны в конфигурации, который может быть внедрен(совпадают интерфейсы, или наследники или еще что - правило по которому ищется класс можете придумать сами). Если таких классов больше одного - выкидываете исключение. Если таких классов нет - выкидываете исключение. Если такой класс один - создаете экземпляр и внедряетет его в поле Если поле типа коллекции, то тогда делаем тоже, что и в пункте два, только без проверки на количество классов(сколько нашли, столько и внедрили в коллекцию) Протестировать инъекцию на классе репозитории(пометив поле сортировщика(sorter) аннотацией AutoInjectable)и на Csv loader пометив этой аннотацией поле со списком валидаторов.