Refactored model Node

This commit is contained in:
Andrey Terentev 2024-03-13 15:45:28 +07:00 committed by Andrey Terentev
parent cb76bd1604
commit a9847e8da7
9 changed files with 66 additions and 32 deletions

View File

@ -11,6 +11,7 @@ configurations {
dependencies {
implementation project(":client-api")
implementation 'org.jetbrains:annotations:24.1.0'
developmentOnly("org.springframework.boot:spring-boot-devtools")
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'org.springframework.boot:spring-boot-starter-security'

View File

@ -1,14 +1,51 @@
package ru.dragonestia.picker.model;
import lombok.NonNull;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import ru.dragonestia.picker.api.model.node.INode;
import ru.dragonestia.picker.api.model.node.NodeDetails;
import ru.dragonestia.picker.api.model.node.PickingMethod;
import ru.dragonestia.picker.api.model.node.ResponseNode;
public record Node(@NonNull String id, @NonNull PickingMethod method, boolean persist) {
public class Node implements INode {
private final String identifier;
private final PickingMethod pickingMethod;
private final boolean persist;
public Node(@NotNull String identifier, @NotNull PickingMethod pickingMethod, boolean persist) {
this.identifier = identifier;
this.pickingMethod = pickingMethod;
this.persist = persist;
}
@Override
public @NotNull String getIdentifier() {
return identifier;
}
@Override
public @NotNull PickingMethod getPickingMethod() {
return pickingMethod;
}
@Override
public @NotNull Boolean isPersist() {
return persist;
}
@Override
public @Nullable String getDetail(@NotNull NodeDetails detail) {
throw new UnsupportedOperationException();
}
public @NotNull ResponseNode toResponseObject() {
return new ResponseNode(identifier, pickingMethod);
}
@Override
public int hashCode() {
return id.hashCode();
return identifier.hashCode();
}
@Override
@ -16,12 +53,8 @@ public record Node(@NonNull String id, @NonNull PickingMethod method, boolean pe
if (object == this) return true;
if (object == null) return false;
if (object instanceof Node other) {
return id.equals(other.id);
return identifier.equals(other.identifier);
}
return false;
}
public ResponseNode toResponseObject() {
return new ResponseNode(id, method);
}
}

View File

@ -21,7 +21,7 @@ public class Room {
private boolean locked = false;
public static Room create(String roomId, Node node, SlotLimit limit, String payload, boolean persist) {
return new Room(roomId, node.id(), limit, payload, persist);
return new Room(roomId, node.getIdentifier(), limit, payload, persist);
}
public void setLocked(boolean value) {

View File

@ -26,13 +26,13 @@ public class NodeRepositoryImpl implements NodeRepository {
@Override
public void create(Node node) throws NodeAlreadyExistException {
synchronized (nodeMap) {
if (nodeMap.containsKey(node.id())) {
throw new NodeAlreadyExistException(node.id());
if (nodeMap.containsKey(node.getIdentifier())) {
throw new NodeAlreadyExistException(node.getIdentifier());
}
nodeMap.put(node.id(), node);
var picker = pickerRepository.create(node.id(), node.method());
nodeId2PickerModeCache.put(node.id(), picker);
nodeMap.put(node.getIdentifier(), node);
var picker = pickerRepository.create(node.getIdentifier(), node.getPickingMethod());
nodeId2PickerModeCache.put(node.getIdentifier(), picker);
}
roomRepository.onCreateNode(node);
@ -41,9 +41,9 @@ public class NodeRepositoryImpl implements NodeRepository {
@Override
public List<Room> delete(Node node) {
synchronized (nodeMap) {
nodeMap.remove(node.id());
pickerRepository.remove(node.id());
nodeId2PickerModeCache.remove(node.id());
nodeMap.remove(node.getIdentifier());
pickerRepository.remove(node.getIdentifier());
nodeId2PickerModeCache.remove(node.getIdentifier());
}
return roomRepository.onRemoveNode(node);

View File

@ -28,7 +28,7 @@ public class RoomRepositoryImpl implements RoomRepository {
synchronized (node2roomsMap) {
var node = node2roomsMap.keySet().stream()
.filter(n -> room.getNodeId().equals(n.id()))
.filter(n -> room.getNodeId().equals(n.getIdentifier()))
.findFirst();
if (node.isEmpty()) {
@ -48,7 +48,7 @@ public class RoomRepositoryImpl implements RoomRepository {
public void remove(Room room) {
var nodeId = room.getNodeId();
var node = node2roomsMap.keySet().stream()
.filter(n -> room.getNodeId().equals(n.id()))
.filter(n -> room.getNodeId().equals(n.getIdentifier()))
.findFirst();
synchronized (node2roomsMap) {
@ -67,7 +67,7 @@ public class RoomRepositoryImpl implements RoomRepository {
public Optional<Room> find(Node node, String identifier) {
synchronized (node2roomsMap) {
if (!node2roomsMap.containsKey(node)) {
throw new NodeNotFoundException("Node '" + node.id() + "' does not exist");
throw new NodeNotFoundException("Node '" + node.getIdentifier() + "' does not exist");
}
var result = node2roomsMap.get(node).getOrDefault(identifier, null);
@ -79,7 +79,7 @@ public class RoomRepositoryImpl implements RoomRepository {
public List<Room> all(Node node) {
synchronized (node2roomsMap) {
if (!node2roomsMap.containsKey(node)) {
throw new NodeNotFoundException("Node '%s' does not exists".formatted(node.id()));
throw new NodeNotFoundException("Node '%s' does not exists".formatted(node.getIdentifier()));
}
return node2roomsMap.get(node).values().stream().map(RoomContainer::room).toList();
@ -90,12 +90,12 @@ public class RoomRepositoryImpl implements RoomRepository {
public Optional<Room> pickFree(Node node, Collection<User> users) {
synchronized (node2roomsMap) {
if (!node2roomsMap.containsKey(node)) {
throw new NodeNotFoundException("Node '" + node.id() + "' does not exist");
throw new NodeNotFoundException("Node '" + node.getIdentifier() + "' does not exist");
}
Room room = null;
try {
room = pickerRepository.pick(node.id(), users);
room = pickerRepository.pick(node.getIdentifier(), users);
} catch (RuntimeException ignore) {} // TODO: may be problem. Check it later
Optional<RoomContainer> container = room == null?

View File

@ -29,7 +29,7 @@ public class NodeServiceImpl implements NodeService {
@Override
public void create(Node node) throws InvalidNodeIdentifierException, NodeAlreadyExistException {
namingValidator.validateNodeId(node.id());
namingValidator.validateNodeId(node.getIdentifier());
nodeRepository.create(node);
storage.saveNode(node);
}

View File

@ -44,8 +44,8 @@ public class RoomServiceImpl implements RoomService {
namingValidator.validateRoomId(room.getNodeId(), room.getId());
var node = nodeRepository.find(room.getNodeId()).orElseThrow(() -> new NodeNotFoundException(room.getNodeId()));
if (!node.persist() && room.isPersist()) {
throw new NotPersistedNodeException(node.id(), room.getId());
if (!node.isPersist() && room.isPersist()) {
throw new NotPersistedNodeException(node.getIdentifier(), room.getId());
}
roomRepository.create(room);

View File

@ -65,8 +65,8 @@ public class FileStorageImpl implements NodeAndRoomStorage {
@Override
public void saveNode(Node node) {
if (!node.persist()) return;
var nodeFile = new File(path + "/nodes/" + node.id() + ".json");
if (!node.isPersist()) return;
var nodeFile = new File(path + "/nodes/" + node.getIdentifier() + ".json");
var writer = objectMapper.writer();
try {
@ -78,10 +78,10 @@ public class FileStorageImpl implements NodeAndRoomStorage {
@Override
public void removeNode(Node node) {
if (!node.persist()) return;
new File(path + "/nodes/" + node.id() + ".json").delete();
if (!node.isPersist()) return;
new File(path + "/nodes/" + node.getIdentifier() + ".json").delete();
log.info("Removed node '%s' from disk storage".formatted(node.id()));
log.info("Removed node '%s' from disk storage".formatted(node.getIdentifier()));
}
@SneakyThrows

View File

@ -30,7 +30,7 @@ public class DetailsExtractor {
for (var detail: details) {
if (detail == NodeDetails.PERSIST) {
response.putDetail(NodeDetails.PERSIST, Boolean.toString(node.persist()));
response.putDetail(NodeDetails.PERSIST, Boolean.toString(node.isPersist()));
continue;
}
}