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 { dependencies {
implementation project(":client-api") implementation project(":client-api")
implementation 'org.jetbrains:annotations:24.1.0'
developmentOnly("org.springframework.boot:spring-boot-devtools") developmentOnly("org.springframework.boot:spring-boot-devtools")
implementation 'org.springframework.boot:spring-boot-starter-aop' implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-security'

View File

@ -1,14 +1,51 @@
package ru.dragonestia.picker.model; 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.PickingMethod;
import ru.dragonestia.picker.api.model.node.ResponseNode; 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 @Override
public int hashCode() { public int hashCode() {
return id.hashCode(); return identifier.hashCode();
} }
@Override @Override
@ -16,12 +53,8 @@ public record Node(@NonNull String id, @NonNull PickingMethod method, boolean pe
if (object == this) return true; if (object == this) return true;
if (object == null) return false; if (object == null) return false;
if (object instanceof Node other) { if (object instanceof Node other) {
return id.equals(other.id); return identifier.equals(other.identifier);
} }
return false; return false;
} }
public ResponseNode toResponseObject() {
return new ResponseNode(id, method);
}
} }

View File

@ -21,7 +21,7 @@ public class Room {
private boolean locked = false; private boolean locked = false;
public static Room create(String roomId, Node node, SlotLimit limit, String payload, boolean persist) { 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) { public void setLocked(boolean value) {

View File

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

View File

@ -28,7 +28,7 @@ public class RoomRepositoryImpl implements RoomRepository {
synchronized (node2roomsMap) { synchronized (node2roomsMap) {
var node = node2roomsMap.keySet().stream() var node = node2roomsMap.keySet().stream()
.filter(n -> room.getNodeId().equals(n.id())) .filter(n -> room.getNodeId().equals(n.getIdentifier()))
.findFirst(); .findFirst();
if (node.isEmpty()) { if (node.isEmpty()) {
@ -48,7 +48,7 @@ public class RoomRepositoryImpl implements RoomRepository {
public void remove(Room room) { public void remove(Room room) {
var nodeId = room.getNodeId(); var nodeId = room.getNodeId();
var node = node2roomsMap.keySet().stream() var node = node2roomsMap.keySet().stream()
.filter(n -> room.getNodeId().equals(n.id())) .filter(n -> room.getNodeId().equals(n.getIdentifier()))
.findFirst(); .findFirst();
synchronized (node2roomsMap) { synchronized (node2roomsMap) {
@ -67,7 +67,7 @@ public class RoomRepositoryImpl implements RoomRepository {
public Optional<Room> find(Node node, String identifier) { public Optional<Room> find(Node node, String identifier) {
synchronized (node2roomsMap) { synchronized (node2roomsMap) {
if (!node2roomsMap.containsKey(node)) { 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); var result = node2roomsMap.get(node).getOrDefault(identifier, null);
@ -79,7 +79,7 @@ public class RoomRepositoryImpl implements RoomRepository {
public List<Room> all(Node node) { public List<Room> all(Node node) {
synchronized (node2roomsMap) { synchronized (node2roomsMap) {
if (!node2roomsMap.containsKey(node)) { 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(); 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) { public Optional<Room> pickFree(Node node, Collection<User> users) {
synchronized (node2roomsMap) { synchronized (node2roomsMap) {
if (!node2roomsMap.containsKey(node)) { 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; Room room = null;
try { try {
room = pickerRepository.pick(node.id(), users); room = pickerRepository.pick(node.getIdentifier(), users);
} catch (RuntimeException ignore) {} // TODO: may be problem. Check it later } catch (RuntimeException ignore) {} // TODO: may be problem. Check it later
Optional<RoomContainer> container = room == null? Optional<RoomContainer> container = room == null?

View File

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

View File

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

View File

@ -65,8 +65,8 @@ public class FileStorageImpl implements NodeAndRoomStorage {
@Override @Override
public void saveNode(Node node) { public void saveNode(Node node) {
if (!node.persist()) return; if (!node.isPersist()) return;
var nodeFile = new File(path + "/nodes/" + node.id() + ".json"); var nodeFile = new File(path + "/nodes/" + node.getIdentifier() + ".json");
var writer = objectMapper.writer(); var writer = objectMapper.writer();
try { try {
@ -78,10 +78,10 @@ public class FileStorageImpl implements NodeAndRoomStorage {
@Override @Override
public void removeNode(Node node) { public void removeNode(Node node) {
if (!node.persist()) return; if (!node.isPersist()) return;
new File(path + "/nodes/" + node.id() + ".json").delete(); 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 @SneakyThrows

View File

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