Refactored model Node
This commit is contained in:
parent
cb76bd1604
commit
a9847e8da7
@ -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'
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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?
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user