😞 Генератор вариантов на проекты изменился, поэтому описанное задание может отличаться от реализованного кода.
Реализовать консольное приложение, которое реализует управление коллекцией объектов в интерактивном режиме. В коллекции необходимо хранить объекты класса Movie
, описание которого приведено ниже.
Разработанная программа должна удовлетворять следующим требованиям:
- Класс, коллекцией экземпляров которого управляет программа, должен реализовывать сортировку по умолчанию.
- Все требования к полям класса (указанные в виде комментариев) должны быть выполнены.
- Для хранения необходимо использовать коллекцию типа
java.util.ArrayDequeue
- При запуске приложения коллекция должна автоматически заполняться значениями из файла.
- Имя файла должно передаваться программе с помощью: переменная окружения.
- Данные должны храниться в файле в формате
json
- Чтение данных из файла необходимо реализовать с помощью класса
java.io.BufferedReader
- Запись данных в файл необходимо реализовать с помощью класса
java.io.PrintWriter
- Все классы в программе должны быть задокументированы в формате javadoc.
- Программа должна корректно работать с неправильными данными (ошибки пользовательского ввода, отсутсвие прав доступа к файлу и т.п.).
В интерактивном режиме программа должна поддерживать выполнение следующих команд:
help
: вывести справку по доступным командамinfo
: вывести в стандартный поток вывода информацию о коллекции (тип, дата инициализации, количество элементов и т.д.)show
: вывести в стандартный поток вывода все элементы коллекции в строковом представленииadd {element}
: добавить новый элемент в коллекциюupdate id {element}
: обновить значение элемента коллекции, id которого равен заданномуremove_by_id id
: удалить элемент из коллекции по его idclear
: очистить коллекциюsave
: сохранить коллекцию в файлexecute_script file_name
: считать и исполнить скрипт из указанного файла. В скрипте содержатся команды в таком же виде, в котором их вводит пользователь в интерактивном режиме.exit
: завершить программу (без сохранения в файл)remove_greater {element}
: удалить из коллекции все элементы, превышающие заданныйremove_lower {element}
: удалить из коллекции все элементы, меньшие, чем заданныйhistory
: вывести последние 14 команд (без их аргументов)count_less_than_mpaa_rating mpaaRating
: вывести количество элементов, значение поля mpaaRating которых меньше заданногоfilter_by_oscars_count oscarsCount
: вывести элементы, значение поля oscarsCount которых равно заданномуfilter_less_than_genre genre
: вывести элементы, значение поля genre которых меньше заданного
Формат ввода команд:
- Все аргументы команды, являющиеся стандартными типами данных (примитивные типы, классы-оболочки, String, классы для хранения дат), должны вводиться в той же строке, что и имя команды.
- Все составные типы данных (объекты классов, хранящиеся в коллекции) должны вводиться по одному полю в строку.
- При вводе составных типов данных пользователю должно показываться приглашение к вводу, содержащее имя поля (например, "Введите дату рождения:")
- Если поле является enum'ом, то вводится имя одной из его констант (при этом список констант должен быть предварительно выведен).
- При некорректном пользовательском вводе (введена строка, не являющаяся именем константы в enum'е; введена строка вместо числа; введённое число не входит в указанные границы и т.п.) должно быть показано сообщение об ошибке и предложено повторить ввод поля.
- Для ввода значений null использовать пустую строку.
- Поля с комментарием "Значение этого поля должно генерироваться автоматически" не должны вводиться пользователем вручную при добавлении.
Описание хранимых в коллекции классов:
public class Movie {
private long id; //Значение поля должно быть больше 0, Значение этого поля должно быть уникальным, Значение этого поля должно генерироваться автоматически
private String name; //Поле не может быть null, Строка не может быть пустой
private Coordinates coordinates; //Поле не может быть null
private java.util.Date creationDate; //Поле не может быть null, Значение этого поля должно генерироваться автоматически
private int oscarsCount; //Значение поля должно быть больше 0
private long length; //Значение поля должно быть больше 0
private MovieGenre genre; //Поле не может быть null
private MpaaRating mpaaRating; //Поле может быть null
private Person operator; //Поле не может быть null
}
public class Coordinates {
private long x; //Значение поля должно быть больше -223
private Long y; //Поле не может быть null
}
public class Person {
private String name; //Поле не может быть null, Строка не может быть пустой
private long weight; //Значение поля должно быть больше 0
private Color eyeColor; //Поле может быть null
private Color hairColor; //Поле может быть null
private Country nationality; //Поле не может быть null
}
public enum MovieGenre {
ACTION,
MUSICAL,
ADVENTURE,
THRILLER;
}
public enum MpaaRating {
PG,
PG_13,
R,
NC_17;
}
public enum Color {
GREEN,
RED,
BLACK,
BROWN;
}
public enum Color {
BLUE,
WHITE,
BROWN;
}
public enum Country {
CHINA,
ITALY,
THAILAND;
}
Разделить программу из лабораторной работы №5 на клиентский и серверный модули. Серверный модуль должен осуществлять выполнение команд по управлению коллекцией. Клиентский модуль должен в интерактивном режиме считывать команды, передавать их для выполнения на сервер и выводить результаты выполнения.
Необходимо выполнить следующие требования:
- Операции обработки объектов коллекции должны быть реализованы с помощью Stream API с использованием лямбда-выражений.
- Объекты между клиентом и сервером должны передаваться в сериализованном виде.
- Объекты в коллекции, передаваемой клиенту, должны быть отсортированы по размеру
- Клиент должен корректно обрабатывать временную недоступность сервера.
- Обмен данными между клиентом и сервером должен осуществляться по протоколу TCP
- Для обмена данными на сервере необходимо использовать сетевой канал
- Для обмена данными на клиенте необходимо использовать потоки ввода-вывода
- Сетевые каналы должны использоваться в неблокирующем режиме.
Обязанности серверного приложения:
- Работа с файлом, хранящим коллекцию.
- Управление коллекцией объектов.
- Назначение автоматически генерируемых полей объектов в коллекции.
- Ожидание подключений и запросов от клиента.
- Обработка полученных запросов (команд).
- Сохранение коллекции в файл при завершении работы приложения.
- Сохранение коллекции в файл при исполнении специальной команды, доступной только серверу (клиент такую команду отправить не может).
- Модуль приёма подключений.
- Модуль чтения запроса.
- Модуль обработки полученных команд.
- Модуль отправки ответов клиенту.
Обязанности клиентского приложения:
- Чтение команд из консоли.
- Валидация вводимых данных.
- Сериализация введённой команды и её аргументов.
- Отправка полученной команды и её аргументов на сервер.
- Обработка ответа от сервера (вывод результата исполнения команды в консоль).
- Команду
save
из клиентского приложения необходимо убрать. - Команда
exit
завершает работу клиентского приложения.
Доработать программу из лабораторной работы №6 следующим образом:
- Организовать хранение коллекции в реляционной СУБД (PostgresQL). Убрать хранение коллекции в файле.
- Для генерации поля id использовать средства базы данных (sequence).
- Обновлять состояние коллекции в памяти только при успешном добавлении объекта в БД
- Все команды получения данных должны работать с коллекцией в памяти, а не в БД
- Организовать возможность регистрации и авторизации пользователей. У пользователя есть возможность указать пароль.
- Пароли при хранении хэшировать алгоритмом
SHA-224
- Запретить выполнение команд не авторизованным пользователям.
- При хранении объектов сохранять информацию о пользователе, который создал этот объект.
- Пользователи должны иметь возможность просмотра всех объектов коллекции, но модифицировать могут только принадлежащие им.
- Для идентификации пользователя отправлять логин и пароль с каждым запросом.
Необходимо реализовать многопоточную обработку запросов.
- Для многопоточного чтения запросов использовать
Cached thread pool
- Для многопотчной обработки полученного запроса использовать
создание нового потока (java.lang.Thread)
- Для многопоточной отправки ответа использовать
создание нового потока (java.lang.Thread)
- Для синхронизации доступа к коллекции использовать
java.util.Collections.synchronizedXXX
- Интерфейс должен быть реализован с помощью библиотеки JavaFX
- Графический интерфейс клиентской части должен поддерживать русский, норвежский, латвийский и английский (Индия) языки / локали. Должно обеспечиваться корректное отображение чисел, даты и времени в соответстии с локалью. Переключение языков должно происходить без перезапуска приложения. Локализованные ресурсы должны храниться в файле свойств.
Доработать программу из лабораторной работы №7 следующим образом:
Заменить консольный клиент на клиент с графическим интерфейсом пользователя(GUI).
В функционал клиента должно входить:
- Окно с авторизацией/регистрацией.
- Отображение текущего пользователя.
- Таблица, отображающая все объекты из коллекции
- Каждое поле объекта - отдельная колонка таблицы.
- Строки таблицы можно фильтровать/сортировать по значениям любой из колонок. Сортировку и фильтрацию значений столбцов реализовать с помощью Streams API.
- Поддержка всех команд из предыдущих лабораторных работ.
- Область, визуализирующую объекты коллекции
- Объекты должны быть нарисованы с помощью графических примитивов с использованием Graphics, Canvas или аналогичных средств графической библиотеки.
- При визуализации использовать данные о координатах и размерах объекта.
- Объекты от разных пользователей должны быть нарисованы разными цветами.
- При нажатии на объект должна выводиться информация об этом объекте.
- При добавлении/удалении/изменении объекта, он должен автоматически появиться/исчезнуть/измениться на области как владельца, так и всех других клиентов.
- При отрисовке объекта должна воспроизводиться согласованная с преподавателем анимация.
- Возможность редактирования отдельных полей любого из объектов (принадлежащего пользователю). Переход к редактированию объекта возможен из таблицы с общим списком объектов и из области с визуализацией объекта.
- Возможность удаления выбранного объекта (даже если команды remove ранее не было).