Giter Site home page Giter Site logo

8laba_javafx's Introduction

Программирование. Desktop-приложение. Семестровый проект.

😞 Генератор вариантов на проекты изменился, поэтому описанное задание может отличаться от реализованного кода.

1 этап

Реализовать консольное приложение, которое реализует управление коллекцией объектов в интерактивном режиме. В коллекции необходимо хранить объекты класса 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 : удалить элемент из коллекции по его id
  • clear : очистить коллекцию
  • 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;
}

2 этап

Разделить программу из лабораторной работы №5 на клиентский и серверный модули. Серверный модуль должен осуществлять выполнение команд по управлению коллекцией. Клиентский модуль должен в интерактивном режиме считывать команды, передавать их для выполнения на сервер и выводить результаты выполнения.

Необходимо выполнить следующие требования:

  • Операции обработки объектов коллекции должны быть реализованы с помощью Stream API с использованием лямбда-выражений.
  • Объекты между клиентом и сервером должны передаваться в сериализованном виде.
  • Объекты в коллекции, передаваемой клиенту, должны быть отсортированы по размеру
  • Клиент должен корректно обрабатывать временную недоступность сервера.
  • Обмен данными между клиентом и сервером должен осуществляться по протоколу TCP
  • Для обмена данными на сервере необходимо использовать сетевой канал
  • Для обмена данными на клиенте необходимо использовать потоки ввода-вывода
  • Сетевые каналы должны использоваться в неблокирующем режиме.

Обязанности серверного приложения:

  • Работа с файлом, хранящим коллекцию.
  • Управление коллекцией объектов.
  • Назначение автоматически генерируемых полей объектов в коллекции.
  • Ожидание подключений и запросов от клиента.
  • Обработка полученных запросов (команд).
  • Сохранение коллекции в файл при завершении работы приложения.
  • Сохранение коллекции в файл при исполнении специальной команды, доступной только серверу (клиент такую команду отправить не может).
Серверное приложение должно состоять из следующих модулей (реализованных в виде одного или нескольких классов):
  • Модуль приёма подключений.
  • Модуль чтения запроса.
  • Модуль обработки полученных команд.
  • Модуль отправки ответов клиенту.

Обязанности клиентского приложения:

  • Чтение команд из консоли.
  • Валидация вводимых данных.
  • Сериализация введённой команды и её аргументов.
  • Отправка полученной команды и её аргументов на сервер.
  • Обработка ответа от сервера (вывод результата исполнения команды в консоль).
  • Команду save из клиентского приложения необходимо убрать.
  • Команда exit завершает работу клиентского приложения.

3 этап

Доработать программу из лабораторной работы №6 следующим образом:

  1. Организовать хранение коллекции в реляционной СУБД (PostgresQL). Убрать хранение коллекции в файле.
  2. Для генерации поля id использовать средства базы данных (sequence).
  3. Обновлять состояние коллекции в памяти только при успешном добавлении объекта в БД
  4. Все команды получения данных должны работать с коллекцией в памяти, а не в БД
  5. Организовать возможность регистрации и авторизации пользователей. У пользователя есть возможность указать пароль.
  6. Пароли при хранении хэшировать алгоритмом SHA-224
  7. Запретить выполнение команд не авторизованным пользователям.
  8. При хранении объектов сохранять информацию о пользователе, который создал этот объект.
  9. Пользователи должны иметь возможность просмотра всех объектов коллекции, но модифицировать могут только принадлежащие им.
  10. Для идентификации пользователя отправлять логин и пароль с каждым запросом.

Необходимо реализовать многопоточную обработку запросов.

  1. Для многопоточного чтения запросов использовать Cached thread pool
  2. Для многопотчной обработки полученного запроса использовать создание нового потока (java.lang.Thread)
  3. Для многопоточной отправки ответа использовать создание нового потока (java.lang.Thread)
  4. Для синхронизации доступа к коллекции использовать java.util.Collections.synchronizedXXX

4 этап

  1. Интерфейс должен быть реализован с помощью библиотеки JavaFX
  2. Графический интерфейс клиентской части должен поддерживать русский, норвежский, латвийский и английский (Индия) языки / локали. Должно обеспечиваться корректное отображение чисел, даты и времени в соответстии с локалью. Переключение языков должно происходить без перезапуска приложения. Локализованные ресурсы должны храниться в файле свойств.

Доработать программу из лабораторной работы №7 следующим образом:

Заменить консольный клиент на клиент с графическим интерфейсом пользователя(GUI). 
В функционал клиента должно входить:

  1. Окно с авторизацией/регистрацией.
  2. Отображение текущего пользователя.
  3. Таблица, отображающая все объекты из коллекции
    1. Каждое поле объекта - отдельная колонка таблицы.
    2. Строки таблицы можно фильтровать/сортировать по значениям любой из колонок. Сортировку и фильтрацию значений столбцов реализовать с помощью Streams API.
  4. Поддержка всех команд из предыдущих лабораторных работ.
  5. Область, визуализирующую объекты коллекции
    1. Объекты должны быть нарисованы с помощью графических примитивов с использованием Graphics, Canvas или аналогичных средств графической библиотеки.
    2. При визуализации использовать данные о координатах и размерах объекта.
    3. Объекты от разных пользователей должны быть нарисованы разными цветами.
    4. При нажатии на объект должна выводиться информация об этом объекте.
    5. При добавлении/удалении/изменении объекта, он должен автоматически появиться/исчезнуть/измениться  на области как владельца, так и всех других клиентов. 
    6. При отрисовке объекта должна воспроизводиться согласованная с преподавателем анимация.
  6. Возможность редактирования отдельных полей любого из объектов (принадлежащего пользователю). Переход к редактированию объекта возможен из таблицы с общим списком объектов и из области с визуализацией объекта.
  7. Возможность удаления выбранного объекта (даже если команды remove ранее не было).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.