Browse Source

(prod)비행계획서 등록 시 좌표 kml 변환 후 sftp 업로드

master
qkr7828(박재우) 1 year ago
parent
commit
8b73dee6b6
  1. 19
      pom.xml
  2. 4
      src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
  3. 49
      src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java
  4. 71
      src/main/java/com/palnet/comn/utils/KmlUtils.java
  5. 138
      src/main/java/com/palnet/comn/utils/SftpUtils.java
  6. 9
      src/main/resources/application.properties
  7. 2
      src/main/resources/application.yml

19
pom.xml

@ -192,7 +192,24 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
<!-- https://mvnrepository.com/artifact/de.micromata.jak/JavaAPIforKml -->
<dependency>
<groupId>de.micromata.jak</groupId>
<artifactId>JavaAPIforKml</artifactId>
<version>2.2.0</version>
</dependency>
</dependencies>
<build>

4
src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java

@ -143,8 +143,8 @@ public class BasFlightController {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
log.info(">>> rq : {}", rq);
boolean result = basFlightService.createPlan(rq);
resultMap.put("result", result);
basFlightService.createPlan(rq);
resultMap.put("result", true);
log.info(">>> resultMap : " , resultMap);
} catch (CustomException e) {

49
src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java

@ -13,12 +13,15 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.xml.bind.JAXBException;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
@ -57,6 +60,8 @@ import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.EncryptUtils;
import com.palnet.comn.utils.KmlUtils;
import com.palnet.comn.utils.SftpUtils;
import lombok.extern.log4j.Log4j2;
@ -69,6 +74,9 @@ public class BasFlightService {
@Autowired
private CtrTrnsLctnService ctrTrnsLctnService;
@Value("${spring.config.activate.on-profile:}")
private String profile;
private final FltPlanBasRepository fltPlanBasRepository;
private final FltPlanArcrftRepository fltPlanArcrftRepository;
private final FltPlanAreaRepository fltPlanAreaRepository;
@ -78,7 +86,9 @@ public class BasFlightService {
private final PtyGroupQueryRepository ptyPlanQueryRepository;
private final JwtTokenUtil jwtTokenUtil;
private final AreaUtils areaUtils;
private final KmlUtils kmlUtils;
private final SftpUtils sftpUtils;
public BasFlightService(FltPlanBasRepository fltPlanBasRepository,
FltPlanArcrftRepository fltPlanArcrftRepository,
FltPlanAreaRepository fltPlanAreaRepository,
@ -87,7 +97,9 @@ public class BasFlightService {
FltPlanQueryRepository fltPlanQueryRepository,
PtyGroupQueryRepository ptyPlanQueryRepository,
JwtTokenUtil jwtTokenUtil,
AreaUtils areaUtils) {
AreaUtils areaUtils,
KmlUtils kmlUtils,
SftpUtils sftpUtils) {
this.fltPlanBasRepository = fltPlanBasRepository;
this.fltPlanArcrftRepository = fltPlanArcrftRepository;
this.fltPlanAreaRepository = fltPlanAreaRepository;
@ -97,6 +109,8 @@ public class BasFlightService {
this.ptyPlanQueryRepository = ptyPlanQueryRepository;
this.jwtTokenUtil = jwtTokenUtil;
this.areaUtils = areaUtils;
this.kmlUtils = kmlUtils;
this.sftpUtils = sftpUtils;
}
// 비행계획서 조회
@ -289,7 +303,7 @@ public class BasFlightService {
// 비행계획서 등록
@Transactional
public boolean createPlan(BasFlightPlanModel rq) {
public void createPlan(BasFlightPlanModel rq) throws IOException, JAXBException {
// 비행계획서 유효성 검사.
this.planValid(rq);
@ -349,12 +363,26 @@ public class BasFlightService {
fltPlanArcrftRepository.save(arcrftEntity);
}
}
return true;
List<String> coords = new ArrayList<String>();
for(BasFlightPlanAreaCoordModel coordModel : areaModelList.get(0).getCoordList()) {
coords.add(coordModel.getLon() + "," + coordModel.getLat());
}
log.info("profile >>>>>>>>>>>> : {} " , profile);
if(!"local".equals(profile)) {
String kml = kmlUtils.generateKMLFromSimpleKml(coords);
sftpUtils.init(kml, "PLAN-COORDS-" + planSno);
}
// log.info(">>>>>>>>>>>>>> result {}" , result);
}
// 비행계획서 수정
@Transactional
public boolean updatePlan(BasFlightPlanModel rq) {
public boolean updatePlan(BasFlightPlanModel rq) throws IOException, JAXBException {
// 비행계획서 유효성 검사.
this.planValid(rq);
@ -474,7 +502,18 @@ public class BasFlightService {
}).collect(Collectors.toList());
fltPlanArcrftRepository.deleteAll(deleteArcrftEntity);
}
List<String> coords = new ArrayList<String>();
for(BasFlightPlanAreaCoordModel coordModel : areaModelList.get(0).getCoordList()) {
coords.add(coordModel.getLon() + "," + coordModel.getLat());
}
String kml = kmlUtils.generateKMLFromSimpleKml(coords);
sftpUtils.init(kml, "PLAN-COORDS-" + planSno);
}
return true;
}

71
src/main/java/com/palnet/comn/utils/KmlUtils.java

@ -0,0 +1,71 @@
package com.palnet.comn.utils;
import java.io.IOException;
import java.io.StringWriter;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import de.micromata.opengis.kml.v_2_2_0.Document;
import de.micromata.opengis.kml.v_2_2_0.Kml;
import de.micromata.opengis.kml.v_2_2_0.Placemark;
import de.micromata.opengis.kml.v_2_2_0.Point;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class KmlUtils {
public String generateKMLFromSimpleKml(List<String> coordinates) throws IOException, JAXBException {
Kml kml = new Kml();
Document document = kml.createAndSetDocument();
for (String coordinate : coordinates) {
Placemark placemark = document.createAndAddPlacemark();
placemark.setName("Simple placemark");
placemark.setDescription("Attached to the ground. Intelligently places itself at the height of the underlying terrain.");
Point point = placemark.createAndSetPoint();
point.addToCoordinates(coordinate);
}
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance(Kml.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(kml, writer);
String kmlString = writer.toString();
return kmlString;
}
// public String generateKMLFromCoordinates(List<String> coordinatesList) {
// StringBuilder kmlBuilder = new StringBuilder();
// kmlBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
// kmlBuilder.append("<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n");
// kmlBuilder.append("<Document>\n");
// for (String coordinates : coordinatesList) {
// kmlBuilder.append("<Placemark>\n");
// kmlBuilder.append("<name>Simple placemark</name>\n");
// kmlBuilder.append("<description>Attached to the ground. Intelligently places itself at the height of the underlying terrain.</description>\n");
// kmlBuilder.append("<Point>\n");
// kmlBuilder.append("<coordinates>").append(coordinates).append("</coordinates>\n");
// kmlBuilder.append("</Point>\n");
// kmlBuilder.append("</Placemark>\n");
// }
// kmlBuilder.append("</Document>\n");
// kmlBuilder.append("</kml>");
//
// log.info("kml>>>>>>>>>>>{}", kmlBuilder);
//
// return kmlBuilder.toString();
// }
}

138
src/main/java/com/palnet/comn/utils/SftpUtils.java

@ -0,0 +1,138 @@
package com.palnet.comn.utils;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;
@Component
public class SftpUtils {
private Session session = null;
private Channel channel = null;
private ChannelSftp channelSftp = null;
@Value("${spring.sftp.host}")
private String host;
@Value("${spring.sftp.userName}")
private String userName;
@Value("${spring.sftp.password}")
private String password;
@Value("${spring.sftp.port}")
private int port;
@Value("${spring.sftp.uploadPath}")
private String uploadPath;
private final Date today = new Date();
private final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
public void init(String kmlContent, String fileName) {
JSch jSch = new JSch();
try {
session = jSch.getSession(userName, host, port);
session.setPassword(password);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();
// kmlContent를 ByteArrayInputStream으로 변환
ByteArrayInputStream inputStream = new ByteArrayInputStream(kmlContent.getBytes("UTF-8"));
// 파일 업로드
channelSftp.cd(uploadPath); // 원격 디렉토리로 이동
channelSftp.put(inputStream, fileName); // 파일 업로드
} catch (JSchException | SftpException | UnsupportedEncodingException e) {
e.printStackTrace();
} finally {
if (channelSftp != null && channelSftp.isConnected()) {
channelSftp.disconnect();
}
if (session != null && session.isConnected()) {
session.disconnect();
}
}
}
public boolean exists(String path) {
Vector res = null;
try {
res = channelSftp.ls(path);
} catch (SftpException e) {
if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) {
return false;
}
}
return res != null && !res.isEmpty();
}
public boolean upload(String dir, File file) {
boolean isUpload = false;
SftpATTRS attrs;
FileInputStream in = null;
try {
in = new FileInputStream(file);
channelSftp.cd(dir);
channelSftp.put(in, file.getName());
// 업로드했는지 확인
if (this.exists(dir +"/"+file.getName())) {
isUpload = true;
}
} catch (SftpException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return isUpload;
}
// public void sftp(String kml) {
//
// this.init(host, userName, password, port);
//
// // 업로드 테스트
// File uploadfile = new File(uploadPath + "파일명"); // 파일 객체 생성
//
// String mkdirPath = sdf.format(today); //현재날짜 년월일
// boolean isUpload = this.upload(uploadPath+mkdirPath, uploadfile); //업로드
// System.out.println("isUpload -" + isUpload); // 업로드 여부 확인
//
// // 업로드 다운로드 수행 후 꼭 연결을 끊어줘야 한다!!
// channelSftp.quit();
// session.disconnect();
// }
}

9
src/main/resources/application.properties

@ -24,4 +24,11 @@ cloud.aws.stack.auto=false
cloud.aws.s3.bucket=palnet-file
cloud.aws.region.static=ap-northeast-2
cloud.aws.s3.bucket.url=https://s3.ap-northeast-2.amazonaws.com/palnet-file
cloud.aws.s3.bucket.url=https://s3.ap-northeast-2.amazonaws.com/palnet-file
### sftp info ###
spring.sftp.host=211.253.38.218
spring.sftp.userName=root
spring.sftp.password=palnet!234
spring.sftp.port=3022
spring.sftp.uploadPath=/data/coord

2
src/main/resources/application.yml

@ -50,7 +50,7 @@ spring:
# show_sql: true
# format_sql: true
rabbitmq:
host: 192.168.0.26
host: 192.168.0.45
port: 5672
username: palnet
password: palnet!234

Loading…
Cancel
Save