From ee21843a5fc2ffcac9c739fc3df31be6a6ea9c96 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Thu, 11 Jan 2024 18:27:23 +0700 Subject: [PATCH] Implemented RoundRobinPicker --- .../impl/picker/RoundRobinPicker.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java new file mode 100644 index 0000000..bbdcd76 --- /dev/null +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java @@ -0,0 +1,48 @@ +package ru.dragonestia.picker.repository.impl.picker; + +import ru.dragonestia.picker.model.Room; +import ru.dragonestia.picker.model.User; +import ru.dragonestia.picker.repository.UserRepository; +import ru.dragonestia.picker.repository.impl.collection.QueuedLinkedList; + +import java.util.Collection; + +public class RoundRobinPicker implements Picker { + + private final UserRepository userRepository; + private final QueuedLinkedList list = new QueuedLinkedList<>(); + + public RoundRobinPicker(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public void add(Room room) { + synchronized (list) { + list.add(new RoomWrapper(room, () -> userRepository.usersOf(room).size())); + } + } + + @Override + public void remove(Room room) { + synchronized (list) { + list.removeById(room.getId()); + } + } + + @Override + public Room pick(Collection users) { + int amount = users.size(); + RoomWrapper wrapper; + + synchronized (list) { + try { + while (!(wrapper = list.pick()).canAddUnits(amount)); + } catch (RuntimeException ex) { + throw new RuntimeException("There are no rooms available"); + } + } + + return wrapper.getItem(); + } +}