/taskManager

Server maven application. Task manager

Primary LanguageJava

Менеджер задач

Cервер отвечает за менеджмент списка дел.

TODOs

Центральным для логики программы компонентом будет класс Todos. Объект этого класса должен содержать в себе набор задач, добавленных в систему.

Каждая задача представляет собой обычное значение типа String. Например: "Сходить в магазин", "Пойти на пробежку". Все задачи добавленные в менеджер можно считать уникальными, т.е. без повторов.

Изначально объект этого класса не должен содержать никаких задач, но должна быть возможность:

  • добавить их через метод add;
  • удалить через метод remove.

У этого объекта есть возможность получить все актуальные задачи разом через метод getAllTasks - метод возвращает все задачи через пробел в отсортированном лексикографическом (словарном) порядке. Например, если мы добавили задачу "Пробежка", "Акробатика" и "Учёба", то этот метод должен вернуть строку вида Акробатика Пробежка Учёба.

В списке задач не должно быть больше чем 7 задач. Поэтому, при попытке добавления 8й задачи она добавляться не должна.

Сервер

Сервер создаётя и запускается в классе Main. После старта, он в бесконечном цикле принимает подключения и считывает с них одну строку, в которой будет располагаться json вида:

{ "type": "ADD", "task": "Название задачи" }

где type - тип операции (ADD или REMOVE), а task - сама задача.

Таким образом, одна операция соответствует одному запросу (а не один запрос с кучей строк-операций).

Для парсинга входных данных подключения используется библиотека GSon (com.google.code.gson:gson:2.8.9). Предполагается, что на сервер всегда приходят корректные данные.

В ответ на запрос сервер присылает текущее состояние списка задач после совершения операции и в том виде, в котором его возвращает операция getAllTasks (т.е. без всяких json и тп).

Простой сервер
      try (ServerSocket serverSocket = new ServerSocket(8989);) { // стартуем сервер один(!) раз
          while (true) { // в цикле(!) принимаем подключения
              try (
                      Socket socket = serverSocket.accept();
                      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                      PrintWriter out = new PrintWriter(socket.getOutputStream());
                  ) {
                  // обработка одного подключения
              }
          }
      } catch (IOException e) {
          System.out.println("Не могу стартовать сервер");
          e.printStackTrace();
      }

Клиент

Для демонстрационных целей написан класс клиента.

Добавлена поддержка третьей операции. Она задается json-ом вида { "type": "RESTORE" }. В случае получения такой операции, сервер должен отменить действие последней не-RESTORE-операции. Т.е. после операций

  • { "type": "ADD", "task": "Первая" }
  • { "type": "ADD", "task": "Вторая" }
  • { "type": "REMOVE", "task": "Первая" }
  • { "type": "ADD", "task": "Третья" }
  • { "type": "RESTORE" }
  • { "type": "RESTORE" }

В списке задач в ответ на последнюю операцию должно быть прислано: "Вторая Первая".