From 70f02c384144ffc5985b35dad1c50c8d856e7b36 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Thu, 11 Jan 2024 19:57:07 +0700 Subject: [PATCH] Tried to enable picking method --- .../repository/impl/NodeRepositoryImpl.java | 3 + .../repository/impl/PickerRepository.java | 59 +++++++++++++++++++ .../repository/impl/RoomRepositoryImpl.java | 15 +++-- 3 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/ru/dragonestia/picker/repository/impl/PickerRepository.java diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/NodeRepositoryImpl.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/NodeRepositoryImpl.java index 6929357..a9c7eb6 100644 --- a/app/src/main/java/ru/dragonestia/picker/repository/impl/NodeRepositoryImpl.java +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/NodeRepositoryImpl.java @@ -16,6 +16,7 @@ import java.util.concurrent.ConcurrentHashMap; public class NodeRepositoryImpl implements NodeRepository { private final RoomRepository roomRepository; + private final PickerRepository pickerRepository; private final Map nodeMap = new ConcurrentHashMap<>(); @Override @@ -26,6 +27,7 @@ public class NodeRepositoryImpl implements NodeRepository { } nodeMap.put(node.id(), node); + pickerRepository.create(node.id(), node.mode()); } roomRepository.onCreateNode(node); @@ -35,6 +37,7 @@ public class NodeRepositoryImpl implements NodeRepository { public void delete(Node node) { synchronized (nodeMap) { nodeMap.remove(node.id()); + pickerRepository.remove(node.id()); } roomRepository.onRemoveNode(node); diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/PickerRepository.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/PickerRepository.java new file mode 100644 index 0000000..0001e1f --- /dev/null +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/PickerRepository.java @@ -0,0 +1,59 @@ +package ru.dragonestia.picker.repository.impl; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import ru.dragonestia.picker.model.Room; +import ru.dragonestia.picker.model.User; +import ru.dragonestia.picker.model.type.PickingMode; +import ru.dragonestia.picker.repository.UserRepository; +import ru.dragonestia.picker.repository.impl.picker.LeastPickedPicker; +import ru.dragonestia.picker.repository.impl.picker.Picker; +import ru.dragonestia.picker.repository.impl.picker.RoundRobinPicker; +import ru.dragonestia.picker.repository.impl.picker.SequentialFillingPicker; + +import java.security.InvalidParameterException; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Component +@RequiredArgsConstructor +public class PickerRepository { + + private final UserRepository userRepository; + private final Map> pickers = new ConcurrentHashMap<>(); + + public void create(String nodeId, PickingMode mode) { + pickers.put(nodeId, of(mode)); + } + + public void remove(String nodeId) { + pickers.remove(nodeId); + } + + public Picker find(String nodeId) { + return pickers.get(nodeId); + } + + public Room pick(String nodeId, Collection users) { + return pickers.get(nodeId).pick(users); + } + + private Picker of(PickingMode mode) { + switch (mode) { + case SEQUENTIAL_FILLING -> { + return new SequentialFillingPicker(userRepository); + } + + case ROUND_ROBIN -> { + return new RoundRobinPicker(userRepository); + } + + case LEAST_PICKED -> { + return new LeastPickedPicker(userRepository); + } + + default -> throw new InvalidParameterException("Taken: " + mode); + } + } +} diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/RoomRepositoryImpl.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/RoomRepositoryImpl.java index e7db423..ea8d249 100644 --- a/app/src/main/java/ru/dragonestia/picker/repository/impl/RoomRepositoryImpl.java +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/RoomRepositoryImpl.java @@ -17,6 +17,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class RoomRepositoryImpl implements RoomRepository { private final UserRepository userRepository; + private final PickerRepository pickerRepository; private final Map node2roomsMap = new ConcurrentHashMap<>(); @Override @@ -37,6 +38,7 @@ public class RoomRepositoryImpl implements RoomRepository { throw new IllegalArgumentException("Room already exists"); } rooms.put(room.getId(), new RoomContainer(room, new AtomicInteger(0))); + pickerRepository.find(room.getNodeId()).add(room); } } @@ -53,6 +55,7 @@ public class RoomRepositoryImpl implements RoomRepository { } node2roomsMap.get(node.get()).remove(room.getId()); + pickerRepository.find(room.getNodeId()).remove(room); } userRepository.onRemoveRoom(room); @@ -91,10 +94,14 @@ public class RoomRepositoryImpl implements RoomRepository { throw new IllegalArgumentException("Node '" + node.id() + "' does not exist"); } - var requiredSlots = users.size(); - var container = node2roomsMap.get(node).values().stream() // TODO: pick room with used node balancing mode - .filter(r -> r.isAvailable(requiredSlots)) - .findFirst(); + Room room = null; + try { + room = pickerRepository.pick(node.id(), users); + } catch (RuntimeException ignore) {} // TODO: may be problem. Check it later + + Optional container = room == null? + Optional.empty() : + Optional.of(node2roomsMap.get(node).get(room.getId())); if (container.isPresent()) { var cont = container.get();