Browse Source

refactor: dron 오타 수정 > drone

feature/socket
지대한 7 months ago
parent
commit
8fd0194ec3
  1. 2
      app/kac-app/src/main/java/kr/co/palnet/kac/app/KacAppApplication.java
  2. 4
      app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java
  3. 24
      app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/scheduled/InnerSocketScheduled.java
  4. 114
      app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java
  5. 48
      app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/storage/ControlGpsStorage.java
  6. 16
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DroneDecoder.java
  7. 14
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DroneEncoder.java
  8. 8
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DronCommand.java
  9. 8
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DroneCommand.java
  10. 78
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDroneCommandImpl.java
  11. 76
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDroneCommandImpl.java
  12. 76
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDroneCommandImpl.java
  13. 34
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DroneHandler.java
  14. 6
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DroneRq.java
  15. 2
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DroneRs.java
  16. 12
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/socket/ChannelInitializer.java
  17. 4
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/ControlStorage.java
  18. 60
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DroneStorage.java
  19. 10
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/util/DronUtil.java
  20. 6
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java
  21. 14
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ScheduledService.java
  22. 10
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/WebSocketService.java
  23. 10
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java
  24. 4
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/codec/Encoder.java
  25. 14
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/storage/ControlStorage.java
  26. 10
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/util/DronUtil.java
  27. 18
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ControlService.java
  28. 8
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java
  29. 6
      common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneControlDto.java
  30. 8
      common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneDto.java
  31. 2
      common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneHistoryDto.java
  32. 39
      common/util/src/main/java/kr/co/palnet/kac/util/CoordUtil.java
  33. 10
      common/util/src/main/java/kr/co/palnet/kac/util/DroneUtil.java
  34. 13
      common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtil.java
  35. 2
      data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/model/CtrCntrlHstryArea.java
  36. 3
      data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/repository/CtrCntrlHstryRepository.java
  37. 4
      web/security/src/main/java/kr/co/palnet/kac/config/security/exception/BaseAuthenticationExceptionHandler.java
  38. 6
      web/security/src/main/java/kr/co/palnet/kac/config/security/filter/JwtLoginFilter.java

2
app/kac-app/src/main/java/kr/co/palnet/kac/app/KacAppApplication.java

@ -3,7 +3,9 @@ package kr.co.palnet.kac.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication(scanBasePackages = {
"kr.co.palnet.kac.app",
"kr.co.palnet.kac.data",

4
app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java

@ -1,7 +1,7 @@
package kr.co.palnet.kac.app.api.v1.inner.socket.controller;
import kr.co.palnet.kac.app.api.v1.inner.socket.service.InnerSocketService;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.common.model.common.SimpleControlDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -28,7 +28,7 @@ public class InnerSocketController {
}
// dron 정보 저장
@PostMapping("/receiver/dron")
public ResponseEntity<Void> receiverDronData(@RequestBody DronDto dronDto) {
public ResponseEntity<Void> receiverDronData(@RequestBody DroneDto dronDto) {
log.debug(">>>>> receiver <<<<<");
innerSocketService.setDronData(dronDto);
return ResponseEntity.ok().build();

24
app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/scheduled/InnerSocketScheduled.java

@ -0,0 +1,24 @@
package kr.co.palnet.kac.app.api.v1.inner.socket.scheduled;
import kr.co.palnet.kac.app.api.v1.inner.socket.service.InnerSocketService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Slf4j
@RequiredArgsConstructor
@Component
public class InnerSocketScheduled {
private final InnerSocketService innerSocketService;
/**
* 최신 수신일로 부터 특정 시간동안 데이터 수신되지 않는 경우 종료 처리
*/
@Scheduled(fixedDelay = 10 * 1000)
public void stopDronFlight() {
log.debug("drone flight stop scheduler started.");
innerSocketService.stopDronFlight();
}
}

114
app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java

@ -1,21 +1,23 @@
package kr.co.palnet.kac.app.api.v1.inner.socket.service;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.app.api.v1.inner.socket.storage.ControlGpsStorage;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.common.model.common.SimpleControlDto;
import kr.co.palnet.kac.data.ctr.model.CtrCntrlBas;
import kr.co.palnet.kac.data.ctr.model.CtrCntrlHstry;
import kr.co.palnet.kac.data.ctr.model.CtrCntrlHstryArea;
import kr.co.palnet.kac.data.ctr.repository.CtrCntrlBasRepository;
import kr.co.palnet.kac.data.ctr.repository.CtrCntrlHstryAreaRepository;
import kr.co.palnet.kac.data.ctr.repository.CtrCntrlHstryRepository;
import kr.co.palnet.kac.util.CoordUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.UUID;
import java.util.*;
@Slf4j
@RequiredArgsConstructor
@ -25,7 +27,11 @@ public class InnerSocketService {
private final CtrCntrlBasRepository ctrCntrlBasRepository;
private final CtrCntrlHstryRepository ctrCntrlHstryRepository;
private final CtrCntrlHstryAreaRepository ctrCntrlHstryAreaRepository;
private long STOP_UNKON = 5;
// socket에 보내줄 control 조회 (controlId 발급용도)
public SimpleControlDto getControlId(String objectId) {
log.debug(">>>>> getControlId <<<<<");
log.debug(">>>>> objectId : {} <<<<<", objectId);
@ -58,28 +64,104 @@ public class InnerSocketService {
simpleControlDto.setTypeCd("02");
simpleControlDto.setAreaTrnsYn("E");
} else {
simpleControlDto.setControlId(UUID.randomUUID().toString());
String controlId = UUID.randomUUID().toString();
simpleControlDto.setControlId(controlId);
simpleControlDto.setTypeCd("01");
simpleControlDto.setAreaTrnsYn("N");
// 기체 식별번호의 관제 ID 저장 (single ton)
// shareContext.putIdntfKey(id, controlID);
ControlGpsStorage simpleControlStorage = ControlGpsStorage.getInstance();
simpleControlStorage.put(objectId, controlId);
}
return simpleControlDto;
}
public static void main(String[] args) {
Instant now = Instant.now();
Instant d = now.plus(12, ChronoUnit.MINUTES);
long diffMinutes = ChronoUnit.MINUTES.between(now, d);
System.out.println(diffMinutes);
long diffMinutes2 = ChronoUnit.MINUTES.between(d, now);
System.out.println(diffMinutes2);
}
// socket으로부터 받은 dron 정보 저장
public void setDronData(DronDto dronDto) {
public void setDronData(DroneDto dronDto) {
// TODO
}
/**
* 특정 시간동안 비행하지않는 데이터 종료처리
*/
public void stopDronFlight() {
ControlGpsStorage simpleControlStorage = ControlGpsStorage.getInstance();
Map<String, String> keys = simpleControlStorage.getAll();
keys.forEach((objectId, controlId) -> {
CtrCntrlHstry history = ctrCntrlHstryRepository.findFirstByCntrlIdOrderBySrvrRcvDtDesc(controlId).orElse(null);
if (Objects.nonNull(history)) {
long diffMinute = ChronoUnit.MINUTES.between(history.getSrvrRcvDt(), Instant.now());
if (diffMinute > 5) {
CtrCntrlBas ctrCntrlBas = ctrCntrlBasRepository.findById(controlId).orElse(null);
if (ctrCntrlBas != null) {
// 기존
ctrCntrlBas.setEndTypeCd("01");
ctrCntrlBas.setCntrlEndDt(Instant.now());
ctrCntrlBas.setStatusCd("99");
// 총 비행거리 Update
Double distance = getDistancSum(history.getCntrlId());
if (distance == null) log.error("No Search - CntrlId => {}", history.getCntrlId());
ctrCntrlBas.setTtlDstnc(distance);
ctrCntrlBas.setTtlDstncType("M");
ctrCntrlBas.setUpdateDt(Instant.now());
ctrCntrlBasRepository.save(ctrCntrlBas);
}
/* 종료지점 주소 저장 */
CtrCntrlHstryArea area = CtrCntrlHstryArea.builder()
.cntrlId(history.getCntrlId())
.actnType("99")
.prcsYn("N")
.lat(history.getLat())
.lon(history.getLon())
.hstrySno(history.getHstrySno())
.createDt(Instant.now())
.updateDt(Instant.now())
.build();
ctrCntrlHstryAreaRepository.save(area);
simpleControlStorage.remove(objectId);
}
}
});
}
private Double getDistancSum(String cntrlId) {
List<CtrCntrlHstry> result = ctrCntrlHstryRepository.findAllByCntrlIdOrderBySrvrRcvDt(cntrlId);
if (result.size() == 0) return null;
List<Double> distanceList = new ArrayList<>();
for (int i = 0; i < result.size(); i++) {
if (i == 0) continue;
CtrCntrlHstry prevNode = result.get(i - 1);
CtrCntrlHstry node = result.get(i);
CoordUtil.Coordinates prevCoord = CoordUtil.Coordinates.builder()
.x(prevNode.getLat())
.y(prevNode.getLon())
.build();
CoordUtil.Coordinates coord = CoordUtil.Coordinates.builder()
.x(node.getLat())
.y(node.getLon())
.build();
Double distance = CoordUtil.calculateDistance(prevCoord, coord);
distanceList.add(distance);
}
return distanceList.stream().mapToDouble(Double::doubleValue).sum();
}
}

48
app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/storage/ControlGpsStorage.java

@ -0,0 +1,48 @@
package kr.co.palnet.kac.app.api.v1.inner.socket.storage;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ControlGpsStorage {
private Map<String, String> mappingMap;
private ControlGpsStorage() {
mappingMap = new ConcurrentHashMap<>();
}
public static ControlGpsStorage getInstance() {
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
private static final ControlGpsStorage INSTANCE = new ControlGpsStorage();
}
public void put(String objectId, String controlId) {
mappingMap.put(objectId, controlId);
}
public String get(String objectId) {
return mappingMap.get(objectId);
}
public String remove(String objectId) {
return mappingMap.remove(objectId);
}
public boolean containsKey(String objectId) {
return mappingMap.containsKey(objectId);
}
public List<String> getAllList() {
return (List<String>) mappingMap.values();
}
public Map<String, String> getAll() {
return mappingMap;
}
}

16
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DronDecoder.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DroneDecoder.java

@ -3,8 +3,8 @@ package kr.co.palnet.kac.socket.core.codec;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import kr.co.palnet.kac.socket.core.model.DronRq;
import kr.co.palnet.kac.util.ObjectMapperUtils;
import kr.co.palnet.kac.socket.core.model.DroneRq;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -13,17 +13,17 @@ import java.util.List;
@Slf4j
@RequiredArgsConstructor
public class DronDecoder extends MessageToMessageDecoder<String> {
public class DroneDecoder extends MessageToMessageDecoder<String> {
// private int DATA_LENGTH = 100;
private final ObjectMapper objectMapper = ObjectMapperUtils.getObjectMapper();
private final ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
@Override
protected void decode(ChannelHandlerContext ctx, String in, List<Object> out) throws Exception {
log.info(">>>>> decode <<<<<");
log.debug(">>>>> decode <<<<<");
try {
DronRq payload = objectMapper.readValue(in, DronRq.class);
if (payload != null) {
out.add(payload);
DroneRq droneRq = objectMapper.readValue(in, DroneRq.class);
if (droneRq != null) {
out.add(droneRq);
}
} catch (Exception e) {
log.warn("decode parsing error : {} :: {}", e.getMessage(), in);

14
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DronEncoder.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DroneEncoder.java

@ -3,7 +3,7 @@ package kr.co.palnet.kac.socket.core.codec;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
import kr.co.palnet.kac.util.ObjectMapperUtils;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -11,18 +11,18 @@ import java.util.List;
@Slf4j
@RequiredArgsConstructor
public class DronEncoder extends MessageToMessageEncoder<Object> {
public class DroneEncoder extends MessageToMessageEncoder<Object> {
private final ObjectMapper objectMapper = ObjectMapperUtils.getObjectMapper();
private final ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
@Override
protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
log.info(">>>>> encode <<<");
protected void encode(ChannelHandlerContext ctx, Object in, List<Object> out) throws Exception {
log.debug(">>>>> encode <<<");
try {
String json = objectMapper.writeValueAsString(msg);
String json = objectMapper.writeValueAsString(in);
out.add(json);
} catch (Exception e) {
log.warn("json parsing error : {} :: {}", e.getMessage(), msg);
log.warn("json parsing error : {} :: {}", e.getMessage(), in);
}
}
}

8
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DronCommand.java

@ -1,8 +0,0 @@
package kr.co.palnet.kac.socket.core.command;
import kr.co.palnet.kac.socket.core.model.DronRq;
public interface DronCommand {
void command(final DronRq rq);
String getCommandName();
}

8
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DroneCommand.java

@ -0,0 +1,8 @@
package kr.co.palnet.kac.socket.core.command;
import kr.co.palnet.kac.socket.core.model.DroneRq;
public interface DroneCommand {
void command(final DroneRq rq);
String getCommandName();
}

78
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDronCommandImpl.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDroneCommandImpl.java

@ -1,15 +1,15 @@
package kr.co.palnet.kac.socket.core.command.impl;
import kr.co.palnet.kac.common.model.common.ControlDto;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DronHistoryDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.common.model.common.DroneHistoryDto;
import kr.co.palnet.kac.common.model.common.SimpleControlDto;
import kr.co.palnet.kac.socket.core.command.DronCommand;
import kr.co.palnet.kac.socket.core.model.DronRq;
import kr.co.palnet.kac.socket.core.command.DroneCommand;
import kr.co.palnet.kac.socket.core.model.DroneRq;
import kr.co.palnet.kac.socket.core.storage.ControlStorage;
import kr.co.palnet.kac.socket.core.util.DronUtil;
import kr.co.palnet.kac.socket.service.KacAppService;
import kr.co.palnet.kac.socket.service.WebSocketService;
import kr.co.palnet.kac.util.DroneUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@ -22,7 +22,7 @@ import java.util.List;
@Slf4j
@RequiredArgsConstructor
@Component
public class AdsbDronCommandImpl implements DronCommand {
public class AdsbDroneCommandImpl implements DroneCommand {
private final WebSocketService webSocketService;
private final KacAppService kacAppService;
@ -37,59 +37,59 @@ public class AdsbDronCommandImpl implements DronCommand {
}
@Override
public void command(DronRq rq) {
public void command(DroneRq rq) {
log.info(">>>> AdsbCommandServiceImpl <<<<<");
List<DronDto> resultList = rq.getBody();
List<DroneDto> resultList = rq.getBody();
/** 전문 설정 ***/
final String messageType = "LTEM";
final String objectType = "DRON";
/** 데이터 모델링 **/
for (DronDto dron : resultList) {
for (DroneDto drone : resultList) {
// 위,경도 좌표가 0으로 들어오는 것은 무시 처리
if (DronUtil.latlonCheck(dron.getLat(), dron.getLon())) {
if (DroneUtil.checkCoordinates(drone.getLat(), drone.getLon())) {
dron.setObjectType(objectType);
dron.setMessageType(messageType);
dron.setTerminalId(rq.getTerminalId());
dron.setRegDt(Instant.now());
drone.setObjectType(objectType);
drone.setMessageType(messageType);
drone.setTerminalId(rq.getTerminalId());
drone.setRegDt(Instant.now());
// 서버 수신 시간 정보
dron.setServerRcvDt(Instant.now());
drone.setServerRcvDt(Instant.now());
// 관제 이력 정보
List<DronHistoryDto> hisList;
List<DroneHistoryDto> hisList;
DronHistoryDto history = DronHistoryDto.builder()
.objectId(dron.getObjectId())
.lat(dron.getLat())
.lon(dron.getLon())
DroneHistoryDto history = DroneHistoryDto.builder()
.objectId(drone.getObjectId())
.lat(drone.getLat())
.lon(drone.getLon())
.build();
if (dron.getPostionHistory() != null) {
hisList = dron.getPostionHistory();
if (drone.getPostionHistory() != null) {
hisList = drone.getPostionHistory();
} else {
hisList = new ArrayList<>();
}
hisList.add(history);
dron.setPostionHistory(hisList);
drone.setPostionHistory(hisList);
// STEP 1. 전에 내부 메모리에서 controlId 조회
ControlStorage controlStorage = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlStorage.get(dron.getObjectId());
ControlDto droneCacheDTO = controlStorage.get(drone.getObjectId());
if (dronCacheDTO == null) {
if (droneCacheDTO == null) {
// STEP 1. Control ID 발급 -> Application Server Http 통신
try {
SimpleControlDto simpleControlDto = kacAppService.getControlId(dron.getObjectId());
SimpleControlDto simpleControlDto = kacAppService.getControlId(drone.getObjectId());
dron.setControlId(simpleControlDto.getControlId());
dron.setTypeCd(simpleControlDto.getTypeCd());
dron.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
dron.setControlStartDt(Instant.now());
drone.setControlId(simpleControlDto.getControlId());
drone.setTypeCd(simpleControlDto.getTypeCd());
drone.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
drone.setControlStartDt(Instant.now());
ControlDto controlDto = new ControlDto();
controlDto.setControlId(simpleControlDto.getControlId());
@ -102,13 +102,13 @@ public class AdsbDronCommandImpl implements DronCommand {
}
} else {
dron.setControlId(dronCacheDTO.getControlId());
dron.setTypeCd("02");
dron.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn());
dron.setControlWarnCd(dronCacheDTO.isControlWarnCd());
dronCacheDTO.setRegTime(System.currentTimeMillis());
drone.setControlId(droneCacheDTO.getControlId());
drone.setTypeCd("02");
drone.setAreaTrnsYn(droneCacheDTO.getAreaTrnsYn());
drone.setControlWarnCd(droneCacheDTO.isControlWarnCd());
droneCacheDTO.setRegTime(System.currentTimeMillis());
controlStorage.put(dron.getObjectId(), dronCacheDTO);
controlStorage.put(drone.getObjectId(), droneCacheDTO);
}
// STEP 2. 이력 생성할 전문 전달 -> DRON의 대한 식별정보만 이력 관리
try {
@ -117,7 +117,7 @@ public class AdsbDronCommandImpl implements DronCommand {
DronStorage dronStorage = DronStorage.getInstance();
dronStorage.add(dron);
*/
kacAppService.sendData(dron);
kacAppService.sendData(drone);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
}
@ -125,8 +125,8 @@ public class AdsbDronCommandImpl implements DronCommand {
// STEP 3. 화면에 표출할 정보 WebSocket 전달
try {
if ("PA".equals(dron.getObjectId().substring(0, 2))) {
webSocketService.sendData(dron);
if ("PA".equals(drone.getObjectId().substring(0, 2))) {
webSocketService.sendData(drone);
}
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());

76
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDronCommandImpl.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDroneCommandImpl.java

@ -1,15 +1,15 @@
package kr.co.palnet.kac.socket.core.command.impl;
import kr.co.palnet.kac.common.model.common.ControlDto;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DronHistoryDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.common.model.common.DroneHistoryDto;
import kr.co.palnet.kac.common.model.common.SimpleControlDto;
import kr.co.palnet.kac.socket.core.command.DronCommand;
import kr.co.palnet.kac.socket.core.model.DronRq;
import kr.co.palnet.kac.socket.core.command.DroneCommand;
import kr.co.palnet.kac.socket.core.model.DroneRq;
import kr.co.palnet.kac.socket.core.storage.ControlStorage;
import kr.co.palnet.kac.socket.core.util.DronUtil;
import kr.co.palnet.kac.socket.service.KacAppService;
import kr.co.palnet.kac.socket.service.WebSocketService;
import kr.co.palnet.kac.util.DroneUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@ -22,7 +22,7 @@ import java.util.List;
@Slf4j
@RequiredArgsConstructor
@Component
public class AntosDronCommandImpl implements DronCommand {
public class AntosDroneCommandImpl implements DroneCommand {
private final WebSocketService webSocketService;
private final KacAppService kacAppService;
@ -36,59 +36,59 @@ public class AntosDronCommandImpl implements DronCommand {
}
@Override
public void command(DronRq rq) {
public void command(DroneRq rq) {
log.info(">>>> AntosCommandServiceImpl <<<<<");
List<DronDto> resultList = rq.getBody();
List<DroneDto> resultList = rq.getBody();
/** 전문 설정 ***/
final String messageType = "LTEM";
final String objectType = "DRON";
/** 데이터 모델링 **/
for (DronDto dron : resultList) {
for (DroneDto drone : resultList) {
// 위,경도 좌표가 0으로 들어오는 것은 무시 처리
if (DronUtil.latlonCheck(dron.getLat(), dron.getLon())) {
if (DroneUtil.checkCoordinates(drone.getLat(), drone.getLon())) {
dron.setObjectType(objectType);
dron.setMessageType(messageType);
dron.setTerminalId(rq.getTerminalId());
dron.setRegDt(Instant.now());
drone.setObjectType(objectType);
drone.setMessageType(messageType);
drone.setTerminalId(rq.getTerminalId());
drone.setRegDt(Instant.now());
// 서버 수신 시간 정보
dron.setServerRcvDt(Instant.now());
drone.setServerRcvDt(Instant.now());
// 관제 이력 정보
List<DronHistoryDto> hisList;
List<DroneHistoryDto> hisList;
DronHistoryDto history = DronHistoryDto.builder()
.objectId(dron.getObjectId())
.lat(dron.getLat())
.lon(dron.getLon())
DroneHistoryDto history = DroneHistoryDto.builder()
.objectId(drone.getObjectId())
.lat(drone.getLat())
.lon(drone.getLon())
.build();
if (dron.getPostionHistory() != null) {
hisList = dron.getPostionHistory();
if (drone.getPostionHistory() != null) {
hisList = drone.getPostionHistory();
} else {
hisList = new ArrayList<>();
}
hisList.add(history);
dron.setPostionHistory(hisList);
drone.setPostionHistory(hisList);
// STEP 1. 전에 내부 메모리에서 controlId 조회
ControlStorage controlStorage = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlStorage.get(dron.getObjectId());
ControlDto dronCacheDTO = controlStorage.get(drone.getObjectId());
if (dronCacheDTO == null) {
// STEP 1. Control ID 발급 -> Application Server Http 통신
try {
SimpleControlDto simpleControlDto = kacAppService.getControlId(dron.getObjectId());
SimpleControlDto simpleControlDto = kacAppService.getControlId(drone.getObjectId());
dron.setControlId(simpleControlDto.getControlId());
dron.setTypeCd(simpleControlDto.getTypeCd());
dron.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
dron.setControlStartDt(Instant.now());
drone.setControlId(simpleControlDto.getControlId());
drone.setTypeCd(simpleControlDto.getTypeCd());
drone.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
drone.setControlStartDt(Instant.now());
ControlDto controlDto = new ControlDto();
controlDto.setControlId(simpleControlDto.getControlId());
@ -96,20 +96,20 @@ public class AntosDronCommandImpl implements DronCommand {
controlDto.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
controlDto.setRegTime(System.currentTimeMillis());
controlStorage.put(dron.getObjectId(), controlDto);
controlStorage.put(drone.getObjectId(), controlDto);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
}
} else {
dron.setControlId(dronCacheDTO.getControlId());
dron.setTypeCd("02");
dron.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn());
dron.setControlWarnCd(dronCacheDTO.isControlWarnCd());
drone.setControlId(dronCacheDTO.getControlId());
drone.setTypeCd("02");
drone.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn());
drone.setControlWarnCd(dronCacheDTO.isControlWarnCd());
dronCacheDTO.setRegTime(System.currentTimeMillis());
controlStorage.put(dron.getObjectId(), dronCacheDTO);
controlStorage.put(drone.getObjectId(), dronCacheDTO);
}
// STEP 2. 이력 생성할 전문 전달 -> DRON의 대한 식별정보만 이력 관리
try {
@ -118,7 +118,7 @@ public class AntosDronCommandImpl implements DronCommand {
DronStorage dronStorage = DronStorage.getInstance();
dronStorage.add(dron);
*/
kacAppService.sendData(dron);
kacAppService.sendData(drone);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
}
@ -126,8 +126,8 @@ public class AntosDronCommandImpl implements DronCommand {
// STEP 3. 화면에 표출할 정보 WebSocket 전달
try {
if ("PA".equals(dron.getObjectId().substring(0, 2))) {
webSocketService.sendData(dron);
if ("PA".equals(drone.getObjectId().substring(0, 2))) {
webSocketService.sendData(drone);
}
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());

76
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDronCommandImpl.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDroneCommandImpl.java

@ -1,15 +1,15 @@
package kr.co.palnet.kac.socket.core.command.impl;
import kr.co.palnet.kac.common.model.common.ControlDto;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DronHistoryDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.common.model.common.DroneHistoryDto;
import kr.co.palnet.kac.common.model.common.SimpleControlDto;
import kr.co.palnet.kac.socket.core.command.DronCommand;
import kr.co.palnet.kac.socket.core.model.DronRq;
import kr.co.palnet.kac.socket.core.command.DroneCommand;
import kr.co.palnet.kac.socket.core.model.DroneRq;
import kr.co.palnet.kac.socket.core.storage.ControlStorage;
import kr.co.palnet.kac.socket.core.util.DronUtil;
import kr.co.palnet.kac.socket.service.KacAppService;
import kr.co.palnet.kac.socket.service.WebSocketService;
import kr.co.palnet.kac.util.DroneUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@ -22,7 +22,7 @@ import java.util.List;
@Slf4j
@RequiredArgsConstructor
@Component
public class SandboxDronCommandImpl implements DronCommand {
public class SandboxDroneCommandImpl implements DroneCommand {
private final WebSocketService webSocketService;
private final KacAppService kacAppService;
@ -36,59 +36,59 @@ public class SandboxDronCommandImpl implements DronCommand {
}
@Override
public void command(DronRq rq) {
public void command(DroneRq rq) {
log.info(">>>> SandboxCommandServiceImpl <<<<<");
List<DronDto> resultList = rq.getBody();
List<DroneDto> resultList = rq.getBody();
/** 전문 설정 ***/
final String messageType = "LTEM";
final String objectType = "DRON";
/** 데이터 모델링 **/
for (DronDto dron : resultList) {
for (DroneDto drone : resultList) {
// 위,경도 좌표가 0으로 들어오는 것은 무시 처리
if (DronUtil.latlonCheck(dron.getLat(), dron.getLon())) {
if (DroneUtil.checkCoordinates(drone.getLat(), drone.getLon())) {
dron.setObjectType(objectType);
dron.setMessageType(messageType);
dron.setTerminalId(rq.getTerminalId());
dron.setRegDt(Instant.now());
drone.setObjectType(objectType);
drone.setMessageType(messageType);
drone.setTerminalId(rq.getTerminalId());
drone.setRegDt(Instant.now());
// 서버 수신 시간 정보
dron.setServerRcvDt(Instant.now());
drone.setServerRcvDt(Instant.now());
// 관제 이력 정보
List<DronHistoryDto> hisList;
List<DroneHistoryDto> hisList;
DronHistoryDto history = DronHistoryDto.builder()
.objectId(dron.getObjectId())
.lat(dron.getLat())
.lon(dron.getLon())
DroneHistoryDto history = DroneHistoryDto.builder()
.objectId(drone.getObjectId())
.lat(drone.getLat())
.lon(drone.getLon())
.build();
if (dron.getPostionHistory() != null) {
hisList = dron.getPostionHistory();
if (drone.getPostionHistory() != null) {
hisList = drone.getPostionHistory();
} else {
hisList = new ArrayList<>();
}
hisList.add(history);
dron.setPostionHistory(hisList);
drone.setPostionHistory(hisList);
Long start = System.currentTimeMillis();
// STEP 1. 전에 내부 메모리에서 controlId 조회
ControlStorage controlStorage = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlStorage.get(dron.getObjectId());
ControlDto dronCacheDTO = controlStorage.get(drone.getObjectId());
if (dronCacheDTO == null) {
// STEP 1. Control ID 발급 -> Application Server Http 통신
try {
SimpleControlDto simpleControlDto = kacAppService.getControlId(dron.getObjectId());
SimpleControlDto simpleControlDto = kacAppService.getControlId(drone.getObjectId());
dron.setControlId(simpleControlDto.getControlId());
dron.setTypeCd(simpleControlDto.getTypeCd());
dron.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
dron.setControlStartDt(Instant.now());
drone.setControlId(simpleControlDto.getControlId());
drone.setTypeCd(simpleControlDto.getTypeCd());
drone.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
drone.setControlStartDt(Instant.now());
ControlDto controlDto = new ControlDto();
controlDto.setControlId(simpleControlDto.getControlId());
@ -96,20 +96,20 @@ public class SandboxDronCommandImpl implements DronCommand {
controlDto.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
controlDto.setRegTime(System.currentTimeMillis());
controlStorage.put(dron.getObjectId(), controlDto);
controlStorage.put(drone.getObjectId(), controlDto);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
}
} else {
dron.setControlId(dronCacheDTO.getControlId());
dron.setTypeCd("02");
dron.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn());
dron.setControlWarnCd(dronCacheDTO.isControlWarnCd());
drone.setControlId(dronCacheDTO.getControlId());
drone.setTypeCd("02");
drone.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn());
drone.setControlWarnCd(dronCacheDTO.isControlWarnCd());
dronCacheDTO.setRegTime(System.currentTimeMillis());
controlStorage.put(dron.getObjectId(), dronCacheDTO);
controlStorage.put(drone.getObjectId(), dronCacheDTO);
}
@ -120,20 +120,20 @@ public class SandboxDronCommandImpl implements DronCommand {
DronStorage dronStorage = DronStorage.getInstance();
dronStorage.add(dron);
*/
kacAppService.sendData(dron);
kacAppService.sendData(drone);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
}
// STEP 3. 화면에 표출할 정보 WebSocket 전달
try {
webSocketService.sendData(dron);
webSocketService.sendData(drone);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
}
Long end = System.currentTimeMillis();
log.info(">>> during time : {} - {}", dron.getObjectId(), end - start);
log.info(">>> during time : {} - {}", drone.getObjectId(), end - start);
} else {
log.error("좌표 정보가 존재하지 않습니다.");

34
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DronHandler.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DroneHandler.java

@ -3,9 +3,9 @@ package kr.co.palnet.kac.socket.core.handler;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import kr.co.palnet.kac.socket.core.command.DronCommand;
import kr.co.palnet.kac.socket.core.model.DronRq;
import kr.co.palnet.kac.socket.core.model.DronRs;
import kr.co.palnet.kac.socket.core.command.DroneCommand;
import kr.co.palnet.kac.socket.core.model.DroneRq;
import kr.co.palnet.kac.socket.core.model.DroneRs;
import kr.co.palnet.kac.socket.core.storage.AuthKeyStorage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -17,25 +17,25 @@ import java.util.Map;
@Slf4j
@ChannelHandler.Sharable
@Component
public class DronHandler extends SimpleChannelInboundHandler<DronRq> {
public class DroneHandler extends SimpleChannelInboundHandler<DroneRq> {
private final Map<String, DronCommand> commandMap;
private final Map<String, DroneCommand> commandMap;
public DronHandler(List<DronCommand> commandList) {
public DroneHandler(List<DroneCommand> commandList) {
commandMap = new HashMap<>();
for (DronCommand command : commandList) {
for (DroneCommand command : commandList) {
commandMap.put(command.getCommandName(), command);
}
}
//
@Override
protected void channelRead0(ChannelHandlerContext ctx, DronRq rq) throws Exception {
protected void channelRead0(ChannelHandlerContext ctx, DroneRq rq) throws Exception {
log.info(">>>> channelRead0 <<<<<");
// key 검사
if (rq == null) {
ctx.writeAndFlush(DronRs.builder()
ctx.writeAndFlush(DroneRs.builder()
.code("-1000")
.message("data is empty.")
.build());
@ -43,7 +43,7 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRq> {
}
if (rq.getCommand() == null || rq.getCommand().isEmpty()) {
ctx.writeAndFlush(DronRs.builder()
ctx.writeAndFlush(DroneRs.builder()
.code("-1001")
.message("command is empty.")
.build());
@ -51,7 +51,7 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRq> {
}
if (rq.getAuthKey() == null || rq.getAuthKey().isEmpty()) {
ctx.writeAndFlush(DronRs.builder()
ctx.writeAndFlush(DroneRs.builder()
.code("-2000")
.message("auth key is empty.")
.build());
@ -59,7 +59,7 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRq> {
}
if (AuthKeyStorage.getInstance().checkAuthKey(rq.getCommand())) {
ctx.writeAndFlush(DronRs.builder()
ctx.writeAndFlush(DroneRs.builder()
.code("-2000")
.message("Invalid auth key.")
.build());
@ -68,10 +68,10 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRq> {
log.info(">>> rq : {}", rq);
DronCommand commandService = commandMap.get(rq.getCommand().trim());
DroneCommand commandService = commandMap.get(rq.getCommand().trim());
if (commandService == null) {
ctx.writeAndFlush(DronRs.builder()
ctx.writeAndFlush(DroneRs.builder()
.code("-2100")
.message("this command is not exist.")
.build());
@ -80,13 +80,13 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRq> {
try {
commandService.command(rq);
} catch (Exception e) {
ctx.writeAndFlush(DronRs.builder()
ctx.writeAndFlush(DroneRs.builder()
.code("-500")
.message("server error - execute command")
.build());
return;
}
ctx.writeAndFlush(DronRs.builder()
ctx.writeAndFlush(DroneRs.builder()
.code("0")
.message("success")
.build());
@ -96,7 +96,7 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRq> {
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
log.info(">>>> exceptionCaught <<<<<");
DronRs rs = DronRs.builder()
DroneRs rs = DroneRs.builder()
.code("-9999")
.message("error - etc")
.build();

6
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRq.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DroneRq.java

@ -1,6 +1,6 @@
package kr.co.palnet.kac.socket.core.model;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -12,7 +12,7 @@ import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronRq {
public class DroneRq {
private String authKey;
@ -20,6 +20,6 @@ public class DronRq {
private String command;
private List<DronDto> body;
private List<DroneDto> body;
}

2
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRs.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DroneRs.java

@ -9,7 +9,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronRs {
public class DroneRs {
private String code;
private String message;
}

12
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/socket/ChannelInitializer.java

@ -6,9 +6,9 @@ import io.netty.handler.codec.json.JsonObjectDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.util.CharsetUtil;
import kr.co.palnet.kac.socket.core.codec.DronDecoder;
import kr.co.palnet.kac.socket.core.codec.DronEncoder;
import kr.co.palnet.kac.socket.core.handler.DronHandler;
import kr.co.palnet.kac.socket.core.codec.DroneDecoder;
import kr.co.palnet.kac.socket.core.codec.DroneEncoder;
import kr.co.palnet.kac.socket.core.handler.DroneHandler;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -18,7 +18,7 @@ import org.springframework.stereotype.Component;
@Component
public class ChannelInitializer extends io.netty.channel.ChannelInitializer<SocketChannel> {
private final DronHandler dronSocketHandler;
private final DroneHandler dronSocketHandler;
// 클라이언트 소켓 채널이 생성될 때 호출
@Override
@ -31,8 +31,8 @@ public class ChannelInitializer extends io.netty.channel.ChannelInitializer<Sock
pipeline.addLast("json-decoder", new JsonObjectDecoder());
pipeline.addLast("string-decoder", new StringDecoder(CharsetUtil.UTF_8));
pipeline.addLast("string-encoder", new StringEncoder(CharsetUtil.UTF_8));
pipeline.addLast("dron-decoder", new DronDecoder());
pipeline.addLast("dron-encoder", new DronEncoder());
pipeline.addLast("dron-decoder", new DroneDecoder());
pipeline.addLast("dron-encoder", new DroneEncoder());
pipeline.addLast("dron-handler", dronSocketHandler);
}

4
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/ControlStorage.java

@ -42,8 +42,8 @@ public class ControlStorage {
@Scheduled(fixedDelay = 1000 * 10)
public void remove() {
for (String key : controlMap.keySet()) {
ControlDto dronCacheDTO = controlMap.get(key);
long diff = System.currentTimeMillis() - dronCacheDTO.getRegTime();
ControlDto droneCacheDTO = controlMap.get(key);
long diff = System.currentTimeMillis() - droneCacheDTO.getRegTime();
if(diff > REMOVE_TIME){
remove(key);
}

60
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DronStorage.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DroneStorage.java

@ -1,6 +1,6 @@
package kr.co.palnet.kac.socket.core.storage;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import lombok.extern.slf4j.Slf4j;
import java.time.Instant;
@ -10,64 +10,64 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class DronStorage {
public class DroneStorage {
private final Map<String, List<DronDto>> dronMap;
private final Map<String, List<DroneDto>> droneMap;
private final int REMOVE_TIME = 1000 * 10;
private DronStorage() {
dronMap = new ConcurrentHashMap<>();
private DroneStorage() {
droneMap = new ConcurrentHashMap<>();
}
public static DronStorage getInstance() {
public static DroneStorage getInstance() {
return LazyHolder.INSTANCE;
}
public static class LazyHolder {
private static final DronStorage INSTANCE = new DronStorage();
private static final DroneStorage INSTANCE = new DroneStorage();
}
public Map<String, List<DronDto>> getAll() {
if (dronMap.keySet().isEmpty()) {
public Map<String, List<DroneDto>> getAll() {
if (droneMap.keySet().isEmpty()) {
return null;
}
return dronMap;
return droneMap;
}
public List<DronDto> get(String objectId) {
public List<DroneDto> get(String objectId) {
if (objectId == null || objectId.isEmpty()) {
return null;
}
if (dronMap.get(objectId) == null) {
if (droneMap.get(objectId) == null) {
return null;
}
return dronMap.get(objectId);
return droneMap.get(objectId);
}
public void add(DronDto dron) {
if (dron == null || dron.getObjectId() == null || dron.getObjectId().isEmpty()) {
public void add(DroneDto drone) {
if (drone == null || drone.getObjectId() == null || drone.getObjectId().isEmpty()) {
return;
}
List<DronDto> list = dronMap.get(dron.getObjectId());
List<DroneDto> list = droneMap.get(drone.getObjectId());
if (list == null) {
list = new ArrayList<>();
}
list.add(dron);
dronMap.put(dron.getObjectId(), list);
list.add(drone);
droneMap.put(drone.getObjectId(), list);
}
// 1분 이상된 데이터 삭제 또는 처리가 끝난 데이터 삭제
public void removeByCondition() {
for (String key : dronMap.keySet()) {
List<DronDto> list = dronMap.get(key);
for (String key : droneMap.keySet()) {
List<DroneDto> list = droneMap.get(key);
if (list == null) {
continue;
} else if (list.isEmpty()) {
dronMap.remove(key);
droneMap.remove(key);
continue;
}
@ -75,37 +75,37 @@ public class DronStorage {
Instant compareTime = Instant.now().minusSeconds(60);
// 마지막 데이터가 1분 이상된 데이터라면 삭제
DronDto lastDronDto = list.getLast();
DroneDto lastDronDto = list.getLast();
if ((lastDronDto.isSendHistroy() && lastDronDto.isSendUtm()) || compareTime.isAfter(lastDronDto.getRegDt())) {
list.remove(lastDronDto);
continue;
}
// 그외 데이터에서 조건에 맞는 데이터들만 삭제
list.removeIf(dron -> (dron.isSendHistroy() && dron.isSendUtm()) || compareTime.isAfter(dron.getRegDt()));
list.removeIf(drone -> (drone.isSendHistroy() && drone.isSendUtm()) || compareTime.isAfter(drone.getRegDt()));
}
}
public List<DronDto> getAllByUtm() {
public List<DroneDto> getAllByUtm() {
// 보내지 않은 모든 데이터 추출
return dronMap.values().stream().reduce((list, result) -> {
return droneMap.values().stream().reduce((list, result) -> {
result.addAll(list);
return result;
}).orElse(new ArrayList<>()).stream().filter(dronDto -> !dronDto.isSendUtm()).toList();
}
public List<DronDto> getAllByHistory() {
public List<DroneDto> getAllByHistory() {
// 보내지 않은 모든 데이터 추출
return dronMap.values().stream().reduce((list, result) -> {
return droneMap.values().stream().reduce((list, result) -> {
result.addAll(list);
return result;
}).orElse(new ArrayList<>()).stream().filter(dronDto -> !dronDto.isSendHistroy()).toList();
}
public static void main(String[] args) {
DronStorage dronStorage = DronStorage.getInstance();
DroneStorage dronStorage = DroneStorage.getInstance();
DronDto dronDto = new DronDto();
DroneDto dronDto = new DroneDto();
dronDto.setObjectId("test");
dronDto.setSendHistroy(false);
dronDto.setSendUtm(false);
@ -113,7 +113,7 @@ public class DronStorage {
dronStorage.add(dronDto);
List<DronDto> allByUtm = dronStorage.getAllByUtm();
List<DroneDto> allByUtm = dronStorage.getAllByUtm();
allByUtm.forEach(c -> c.setSendUtm(true));
log.info("...");
}

10
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/util/DronUtil.java

@ -1,10 +0,0 @@
package kr.co.palnet.kac.socket.core.util;
public class DronUtil {
public static boolean latlonCheck(double lat, double lon) {
if (lat > 32 && lat < 44 && lon > 124 && lon < 133) {
return true;
}
return false;
}
}

6
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java

@ -1,6 +1,6 @@
package kr.co.palnet.kac.socket.service;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.common.model.common.SimpleControlDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -37,8 +37,8 @@ public class KacAppService {
return resp.getBody();
}
// dron 데이터 전송
public void sendData(DronDto dto) {
// drone 데이터 전송
public void sendData(DroneDto dto) {
RestClient client = getRestClient();
ResponseEntity<Void> resp = client.post()
.uri(SEND_ALL)

14
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ScheduledService.java

@ -1,8 +1,8 @@
package kr.co.palnet.kac.socket.service;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.socket.core.model.UtmDto;
import kr.co.palnet.kac.socket.core.storage.DronStorage;
import kr.co.palnet.kac.socket.core.storage.DroneStorage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
@ -24,8 +24,8 @@ public class ScheduledService {
@Scheduled(fixedDelay = 1000 * 2)
public void sendDataToUtm() {
log.info(">>>> sendDataToUtm <<<<<");
DronStorage dronStorage = DronStorage.getInstance();
List<DronDto> list = dronStorage.getAllByUtm();
DroneStorage dronStorage = DroneStorage.getInstance();
List<DroneDto> list = dronStorage.getAllByUtm();
// 가공
List<UtmDto.DronInfo> dronInfoList = list.stream().map(model -> {
@ -50,18 +50,18 @@ public class ScheduledService {
.build();
// if (externalService.sendDataToUtm(utmDto)) {
// list.forEach(dron -> dron.setSendUtm(true));
// list.forEach(drone -> drone.setSendUtm(true));
// }
// TODO 현재 통신이 안되므로 모두 보낸다는 가정으로 진행
list.forEach(dron -> dron.setSendUtm(true));
list.forEach(drone -> drone.setSendUtm(true));
}
@Scheduled(fixedDelay = 1000 * 30)
public void removeDron() {
log.info(">>>> removeDron <<<<<");
DronStorage dronStorage = DronStorage.getInstance();
DroneStorage dronStorage = DroneStorage.getInstance();
dronStorage.removeByCondition();
}
}

10
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/WebSocketService.java

@ -1,6 +1,6 @@
package kr.co.palnet.kac.socket.service;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@ -8,8 +8,6 @@ import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
import java.time.Instant;
@Slf4j
@RequiredArgsConstructor
@Service
@ -17,12 +15,12 @@ public class WebSocketService {
@Value("${app.web-socket-web.host}")
private String webSocketWebHost;
private final String SEND_DRON_DATA = "/v1/api/ws/dron";
private final String SEND_DRONE_DATA = "/v1/api/ws/dron";
public void sendData(DronDto dto) {
public void sendData(DroneDto dto) {
RestClient client = RestClient.create();
client.post()
.uri(webSocketWebHost + SEND_DRON_DATA)
.uri(webSocketWebHost + SEND_DRONE_DATA)
.contentType(MediaType.APPLICATION_JSON)
.body(dto)
.retrieve()

10
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java

@ -1,8 +1,8 @@
package kr.co.palnet.kac.websocket.controller;
import kr.co.palnet.kac.common.model.common.DronControlDto;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DroneControlDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.websocket.core.storage.ControlStorage;
import kr.co.palnet.kac.websocket.service.ControlService;
import lombok.RequiredArgsConstructor;
@ -21,11 +21,11 @@ public class SocketReceiverController {
private final ControlService controlService;
@PostMapping("/dron")
public ResponseEntity<Void> receiver(@RequestBody DronDto dronDTO) {
@PostMapping("/drone")
public ResponseEntity<Void> receiver(@RequestBody DroneDto dronDTO) {
log.info("websocket message receiver : {}", dronDTO);
DronControlDto history = controlService.dronDtoToControlDtoConvert(dronDTO);
DroneControlDto history = controlService.dronDtoToControlDtoConvert(dronDTO);
// DRON의 대한 식별정보만 이력 관리
ControlStorage controlCache = ControlStorage.getInstance();

4
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/codec/Encoder.java

@ -3,7 +3,7 @@ package kr.co.palnet.kac.websocket.core.codec;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
import kr.co.palnet.kac.util.ObjectMapperUtils;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -13,7 +13,7 @@ import java.util.List;
@RequiredArgsConstructor
public class Encoder extends MessageToMessageEncoder<Object> {
private final ObjectMapper objectMapper = ObjectMapperUtils.getObjectMapper();
private final ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
@Override
protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {

14
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/storage/ControlStorage.java

@ -1,6 +1,6 @@
package kr.co.palnet.kac.websocket.core.storage;
import kr.co.palnet.kac.common.model.common.DronControlDto;
import kr.co.palnet.kac.common.model.common.DroneControlDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@ -15,7 +15,7 @@ public class ControlStorage {
private final int REMOVE_TIME_SECOND = 60; // 화면 노출 시간
private final Map<String, DronControlDto> controlMap;
private final Map<String, DroneControlDto> controlMap;
private ControlStorage() {
controlMap = new ConcurrentHashMap<>();
@ -29,14 +29,14 @@ public class ControlStorage {
private static final ControlStorage INSTANCE = new ControlStorage();
}
public Map<String, DronControlDto> getAll() {
public Map<String, DroneControlDto> getAll() {
if (controlMap.keySet().isEmpty()) {
return null;
}
return controlMap;
}
public DronControlDto get(String objectId) {
public DroneControlDto get(String objectId) {
if (objectId == null || objectId.isEmpty()) {
return null;
}
@ -46,7 +46,7 @@ public class ControlStorage {
return controlMap.get(objectId);
}
public DronControlDto put(DronControlDto control) {
public DroneControlDto put(DroneControlDto control) {
if (control == null || control.getObjectId() == null || control.getObjectId().isEmpty()) {
return null;
}
@ -54,11 +54,11 @@ public class ControlStorage {
return controlMap.put(control.getObjectId(), control);
}
public List<DronControlDto> getList() {
public List<DroneControlDto> getList() {
return new ArrayList<>(controlMap.values());
}
public DronControlDto remove(String objectId) {
public DroneControlDto remove(String objectId) {
return controlMap.remove(objectId);
}

10
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/util/DronUtil.java

@ -1,10 +0,0 @@
package kr.co.palnet.kac.websocket.core.util;
public class DronUtil {
public static boolean latlonCheck(double lat, double lon) {
if (lat > 32 && lat < 44 && lon > 124 && lon < 133) {
return true;
}
return false;
}
}

18
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ControlService.java

@ -1,7 +1,7 @@
package kr.co.palnet.kac.websocket.service;
import kr.co.palnet.kac.common.model.common.DronControlDto;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.common.model.common.DroneControlDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.websocket.core.storage.ControlStorage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -15,11 +15,11 @@ import java.util.*;
public class ControlService {
public List<DronControlDto> getList() {
List<DronControlDto> list = new ArrayList<>();
public List<DroneControlDto> getList() {
List<DroneControlDto> list = new ArrayList<>();
ControlStorage controlCache = ControlStorage.getInstance();
Map<String, DronControlDto> allHistory = controlCache.getAll();
Map<String, DroneControlDto> allHistory = controlCache.getAll();
log.info(">>> getList :: {}", allHistory);
@ -53,12 +53,12 @@ public class ControlService {
return list;
}
public DronControlDto dronDtoToControlDtoConvert(DronDto dronDTO) {
public DroneControlDto dronDtoToControlDtoConvert(DroneDto dronDTO) {
ControlStorage controlCache = ControlStorage.getInstance();
DronControlDto prevControlDTO = controlCache.get(dronDTO.getObjectId());
DroneControlDto prevControlDTO = controlCache.get(dronDTO.getObjectId());
DronControlDto controlDTO = new DronControlDto();
DroneControlDto controlDTO = new DroneControlDto();
controlDTO.setObjectId(dronDTO.getObjectId());
controlDTO.setControlId(dronDTO.getControlId());
@ -72,7 +72,7 @@ public class ControlService {
controlDTO.setSpeed(dronDTO.getSpeed());
controlDTO.setBetteryLevel(dronDTO.getBetteryLevel());
controlDTO.setBetteryVoltage(dronDTO.getBetteryVoltage());
controlDTO.setDronStatus(dronDTO.getDronStatus());
controlDTO.setDroneStatus(dronDTO.getDroneStatus());
controlDTO.setHeading(dronDTO.getHeading());
controlDTO.setMoveDistance(dronDTO.getMoveDistance());
controlDTO.setMoveDistanceType(dronDTO.getMoveDistanceType());

8
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java

@ -4,8 +4,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.netty.channel.group.ChannelGroup;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import kr.co.palnet.kac.common.model.common.DronControlDto;
import kr.co.palnet.kac.util.ObjectMapperUtils;
import kr.co.palnet.kac.common.model.common.DroneControlDto;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import kr.co.palnet.kac.websocket.core.storage.ChannelStorage;
import kr.co.palnet.kac.websocket.core.storage.ControlStorage;
import lombok.RequiredArgsConstructor;
@ -20,7 +20,7 @@ import java.util.List;
@Service
public class ScheduledService {
private final ObjectMapper objectMapper = ObjectMapperUtils.getObjectMapper();
private final ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
// 접속한 모든 채널에 데이터 전송
@ -32,7 +32,7 @@ public class ScheduledService {
ChannelGroup channelGroup = channelStorage.getGroup();
// 데이터 가져오기
ControlStorage controlStorage = ControlStorage.getInstance();
List<DronControlDto> controlDtoList = controlStorage.getList();
List<DroneControlDto> controlDtoList = controlStorage.getList();
if (controlDtoList == null || controlDtoList.isEmpty()) return;

6
common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronControlDto.java → common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneControlDto.java

@ -13,7 +13,7 @@ import java.util.Map;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronControlDto implements Comparable<DronControlDto> {
public class DroneControlDto implements Comparable<DroneControlDto> {
private String messageTypeCd;
@ -43,7 +43,7 @@ public class DronControlDto implements Comparable<DronControlDto> {
private String takeOffPositon;
private String dronStatus;
private String droneStatus;
private Double heading;
@ -76,7 +76,7 @@ public class DronControlDto implements Comparable<DronControlDto> {
private Instant regDt;
@Override
public int compareTo(DronControlDto o) {
public int compareTo(DroneControlDto o) {
if (o.getControlStartDt() != null && controlStartDt != null) {
return o.getControlStartDt().compareTo(controlStartDt);
}

8
common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronDto.java → common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneDto.java

@ -12,7 +12,7 @@ import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronDto {
public class DroneDto {
private String typeCd; // 01 : 최초 들어온 데이터 , 99 : 종료 시킬 데이터
private String messageType;
@ -52,7 +52,7 @@ public class DronDto {
@Builder.Default
private Double betteryVoltage = 0.0;
private String dronStatus;
private String droneStatus;
@Builder.Default
private Double heading = 0.0;
@ -80,10 +80,10 @@ public class DronDto {
private Double sensorDust = 0.0;
//최근 5건만 저장
private List<DronHistoryDto> recentPositionHistory;
private List<DroneHistoryDto> recentPositionHistory;
// 전체 히스토리 저장
private List<DronHistoryDto> postionHistory;
private List<DroneHistoryDto> postionHistory;
// 비정상 상황 식별 코드
private boolean controlWarnCd;

2
common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronHistoryDto.java → common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneHistoryDto.java

@ -10,7 +10,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronHistoryDto {
public class DroneHistoryDto {
private String objectId;
@Builder.Default

39
common/util/src/main/java/kr/co/palnet/kac/util/CoordUtil.java

@ -0,0 +1,39 @@
package kr.co.palnet.kac.util;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
public class CoordUtil {
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class Coordinates {
public double x;
public double y;
}
public static double calculateDistance(Coordinates c1, Coordinates c2) {
double earthRadius = 6371; // 지구의 반지름 (단위: km)
// 위도와 경도를 라디안으로 변환
double lat1 = Math.toRadians(c1.x);
double lon1 = Math.toRadians(c1.y);
double lat2 = Math.toRadians(c2.x);
double lon2 = Math.toRadians(c2.y);
// Haversine 공식을 사용하여 두 지점 간의 거리 계산
double dlon = lon2 - lon1;
double dlat = lat2 - lat1;
double a = Math.sin(dlat / 2) * Math.sin(dlat / 2)
+ Math.cos(lat1) * Math.cos(lat2) * Math.sin(dlon / 2) * Math.sin(dlon / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double distance = earthRadius * c;
return distance;
}
}

10
common/util/src/main/java/kr/co/palnet/kac/util/DroneUtil.java

@ -0,0 +1,10 @@
package kr.co.palnet.kac.util;
public class DroneUtil {
public static boolean checkCoordinates(double lat, double lon) {
if (lat > 32 && lat < 44 && lon > 124 && lon < 133) {
return true;
}
return false;
}
}

13
common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtils.java → common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtil.java

@ -1,21 +1,10 @@
package kr.co.palnet.kac.util;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.time.format.DateTimeFormatter;
import java.util.TimeZone;
public class ObjectMapperUtils {
public class ObjectMapperUtil {
public static ObjectMapper getObjectMapper() {
return getObjectMapperBuilder().build();
}

2
data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/model/CtrCntrlHstryArea.java

@ -29,7 +29,7 @@ public class CtrCntrlHstryArea {
// 이력일련번호
@Column(name = "HSTRY_SNO", nullable = false) // mysql :: "int unsigned"
private int hstrySno;
private Long hstrySno;
// 관제ID
@Column(name = "CNTRL_ID", length = 60, nullable = false)

3
data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/repository/CtrCntrlHstryRepository.java

@ -3,10 +3,13 @@ package kr.co.palnet.kac.data.ctr.repository;
import kr.co.palnet.kac.data.ctr.model.CtrCntrlHstry;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
public interface CtrCntrlHstryRepository extends JpaRepository<CtrCntrlHstry, Integer> {
Optional<CtrCntrlHstry> findFirstByCntrlIdOrderBySrvrRcvDtDesc(String cntrlId);
List<CtrCntrlHstry> findAllByCntrlIdOrderBySrvrRcvDt(String cntrlId);
}

4
web/security/src/main/java/kr/co/palnet/kac/config/security/exception/BaseAuthenticationExceptionHandler.java

@ -6,7 +6,7 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import kr.co.palnet.kac.config.security.model.BaseAuthErrorCode;
import kr.co.palnet.kac.config.security.model.AuthErrorRS;
import kr.co.palnet.kac.util.ObjectMapperUtils;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
@ -78,6 +78,6 @@ public class BaseAuthenticationExceptionHandler {
response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.getOutputStream().write(ObjectMapperUtils.getObjectMapper().writeValueAsBytes(rs));
response.getOutputStream().write(ObjectMapperUtil.getObjectMapper().writeValueAsBytes(rs));
}
}

6
web/security/src/main/java/kr/co/palnet/kac/config/security/filter/JwtLoginFilter.java

@ -11,7 +11,7 @@ import kr.co.palnet.kac.config.security.exception.BaseAuthenticationException;
import kr.co.palnet.kac.config.security.model.BaseAuthErrorCode;
import kr.co.palnet.kac.config.security.model.BaseUserDetails;
import kr.co.palnet.kac.config.security.service.BaseUserDetailsService;
import kr.co.palnet.kac.util.ObjectMapperUtils;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.security.authentication.AuthenticationManager;
@ -25,7 +25,7 @@ import java.io.IOException;
public class JwtLoginFilter extends UsernamePasswordAuthenticationFilter {
private BaseUserDetailsService baseUserDetailsService;
private ObjectMapper objectMapper = ObjectMapperUtils.getObjectMapper();
private ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
public JwtLoginFilter(BaseUserDetailsService baseUserDetailsService) {
setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/v1/login", "POST"));
@ -61,6 +61,6 @@ public class JwtLoginFilter extends UsernamePasswordAuthenticationFilter {
response.setHeader("Auth-Token", JwtUtil.makeAuthToken(user));
response.setHeader("Refresh-Token", JwtUtil.makeRefreshToken(user));
response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
response.getOutputStream().write(ObjectMapperUtils.getObjectMapper().writeValueAsBytes(user.toMap()));
response.getOutputStream().write(ObjectMapperUtil.getObjectMapper().writeValueAsBytes(user.toMap()));
}
}

Loading…
Cancel
Save