Added first working prototype.
This commit is contained in:
parent
5c4b21749b
commit
108edac5e7
|
@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
public class RailSignalApiApplication {
|
public class RailSignalApiApplication {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
System.setProperty("org.apache.tomcat.websocket.DISABLE_BUILTIN_EXTENSIONS", "true");
|
||||||
SpringApplication.run(RailSignalApiApplication.class, args);
|
SpringApplication.run(RailSignalApiApplication.class, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,13 @@ import java.util.Optional;
|
||||||
@Repository
|
@Repository
|
||||||
public interface SignalRepository extends JpaRepository<Signal, Long> {
|
public interface SignalRepository extends JpaRepository<Signal, Long> {
|
||||||
Optional<Signal> findByIdAndRailSystem(long id, RailSystem railSystem);
|
Optional<Signal> findByIdAndRailSystem(long id, RailSystem railSystem);
|
||||||
|
Optional<Signal> findByIdAndRailSystemId(long id, long railSystemId);
|
||||||
boolean existsByNameAndRailSystem(String name, RailSystem railSystem);
|
boolean existsByNameAndRailSystem(String name, RailSystem railSystem);
|
||||||
|
|
||||||
@Query("SELECT DISTINCT s FROM Signal s " +
|
@Query("SELECT DISTINCT s FROM Signal s " +
|
||||||
"LEFT JOIN s.branchConnections bc " +
|
"LEFT JOIN s.branchConnections bc " +
|
||||||
"WHERE bc.branch = :branch")
|
"WHERE bc.branch = :branch")
|
||||||
List<Signal> findAllConnectedToBranch(Branch branch);
|
List<Signal> findAllConnectedToBranch(Branch branch);
|
||||||
|
|
||||||
|
List<Signal> findAllByRailSystemOrderByName(RailSystem railSystem);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,8 @@ import nl.andrewl.railsignalapi.rest.dto.SignalResponse;
|
||||||
import nl.andrewl.railsignalapi.service.SignalService;
|
import nl.andrewl.railsignalapi.service.SignalService;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping(path = "/api/railSystems/{rsId}/signals")
|
@RequestMapping(path = "/api/railSystems/{rsId}/signals")
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
|
@ -16,4 +18,14 @@ public class SignalsApiController {
|
||||||
public SignalResponse createSignal(@PathVariable long rsId, @RequestBody SignalCreationPayload payload) {
|
public SignalResponse createSignal(@PathVariable long rsId, @RequestBody SignalCreationPayload payload) {
|
||||||
return signalService.createSignal(rsId, payload);
|
return signalService.createSignal(rsId, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
public List<SignalResponse> getSignals(@PathVariable long rsId) {
|
||||||
|
return signalService.getAllSignals(rsId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping(path = "/{sigId}")
|
||||||
|
public SignalResponse getSignal(@PathVariable long rsId, @PathVariable long sigId) {
|
||||||
|
return signalService.getSignal(rsId, sigId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package nl.andrewl.railsignalapi.rest.dto;
|
||||||
import nl.andrewl.railsignalapi.model.Signal;
|
import nl.andrewl.railsignalapi.model.Signal;
|
||||||
import nl.andrewl.railsignalapi.model.SignalBranchConnection;
|
import nl.andrewl.railsignalapi.model.SignalBranchConnection;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public record SignalResponse(
|
public record SignalResponse(
|
||||||
|
@ -15,6 +16,7 @@ public record SignalResponse(
|
||||||
signal.getId(),
|
signal.getId(),
|
||||||
signal.getName(),
|
signal.getName(),
|
||||||
signal.getBranchConnections().stream()
|
signal.getBranchConnections().stream()
|
||||||
|
.sorted(Comparator.comparing(SignalBranchConnection::getDirection))
|
||||||
.map(ConnectionData::new)
|
.map(ConnectionData::new)
|
||||||
.toList()
|
.toList()
|
||||||
);
|
);
|
||||||
|
|
|
@ -22,10 +22,7 @@ import org.springframework.web.socket.WebSocketMessage;
|
||||||
import org.springframework.web.socket.WebSocketSession;
|
import org.springframework.web.socket.WebSocketSession;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashSet;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
|
@ -93,12 +90,14 @@ public class SignalService {
|
||||||
log.warn("Warning! Train is entering a non-free branch {}.", toBranch.getName());
|
log.warn("Warning! Train is entering a non-free branch {}.", toBranch.getName());
|
||||||
}
|
}
|
||||||
if (toBranch.getStatus() != BranchStatus.OCCUPIED) {
|
if (toBranch.getStatus() != BranchStatus.OCCUPIED) {
|
||||||
|
log.info("Updating branch {} status from {} to {}.", toBranch.getName(), toBranch.getStatus(), BranchStatus.OCCUPIED);
|
||||||
toBranch.setStatus(BranchStatus.OCCUPIED);
|
toBranch.setStatus(BranchStatus.OCCUPIED);
|
||||||
branchRepository.save(toBranch);
|
branchRepository.save(toBranch);
|
||||||
broadcastToConnectedSignals(toBranch);
|
broadcastToConnectedSignals(toBranch);
|
||||||
}
|
}
|
||||||
if (updateType == SignalUpdateType.END) {
|
if (updateType == SignalUpdateType.END) {
|
||||||
if (fromBranch.getStatus() != BranchStatus.FREE) {
|
if (fromBranch.getStatus() != BranchStatus.FREE) {
|
||||||
|
log.info("Updating branch {} status from {} to {}.", fromBranch.getName(), fromBranch.getStatus(), BranchStatus.FREE);
|
||||||
fromBranch.setStatus(BranchStatus.FREE);
|
fromBranch.setStatus(BranchStatus.FREE);
|
||||||
branchRepository.save(fromBranch);
|
branchRepository.save(fromBranch);
|
||||||
broadcastToConnectedSignals(fromBranch);
|
broadcastToConnectedSignals(fromBranch);
|
||||||
|
@ -125,4 +124,20 @@ public class SignalService {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public SignalResponse getSignal(long rsId, long sigId) {
|
||||||
|
var s = signalRepository.findByIdAndRailSystemId(sigId, rsId)
|
||||||
|
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
|
||||||
|
return new SignalResponse(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public List<SignalResponse> getAllSignals(long rsId) {
|
||||||
|
var rs = railSystemRepository.findById(rsId)
|
||||||
|
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Rail system not found."));
|
||||||
|
return signalRepository.findAllByRailSystemOrderByName(rs).stream()
|
||||||
|
.map(SignalResponse::new)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue