diff --git a/pom.xml b/pom.xml
index d8cf678..4487c28 100644
--- a/pom.xml
+++ b/pom.xml
@@ -192,7 +192,24 @@
org.springframework.boot
spring-boot-starter-cache
-
+
+
+ javax.xml.bind
+ jaxb-api
+ 2.3.1
+
+
+
+ com.jcraft
+ jsch
+ 0.1.55
+
+
+
+ de.micromata.jak
+ JavaAPIforKml
+ 2.2.0
+
diff --git a/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java b/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
index 52dcde1..4287d55 100644
--- a/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
+++ b/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
@@ -143,8 +143,8 @@ public class BasFlightController {
Map resultMap = new HashMap();
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) {
diff --git a/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java b/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java
index 2012de7..75de7fc 100644
--- a/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java
+++ b/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 coords = new ArrayList();
+ 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 coords = new ArrayList();
+ 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;
}
diff --git a/src/main/java/com/palnet/comn/utils/KmlUtils.java b/src/main/java/com/palnet/comn/utils/KmlUtils.java
new file mode 100644
index 0000000..d562c08
--- /dev/null
+++ b/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 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 coordinatesList) {
+// StringBuilder kmlBuilder = new StringBuilder();
+// kmlBuilder.append("\n");
+// kmlBuilder.append("\n");
+// kmlBuilder.append("\n");
+// for (String coordinates : coordinatesList) {
+// kmlBuilder.append("\n");
+// kmlBuilder.append("Simple placemark\n");
+// kmlBuilder.append("Attached to the ground. Intelligently places itself at the height of the underlying terrain.\n");
+// kmlBuilder.append("\n");
+// kmlBuilder.append("").append(coordinates).append("\n");
+// kmlBuilder.append("\n");
+// kmlBuilder.append("\n");
+// }
+// kmlBuilder.append("\n");
+// kmlBuilder.append("");
+//
+// log.info("kml>>>>>>>>>>>{}", kmlBuilder);
+//
+// return kmlBuilder.toString();
+// }
+
+}
diff --git a/src/main/java/com/palnet/comn/utils/SftpUtils.java b/src/main/java/com/palnet/comn/utils/SftpUtils.java
new file mode 100644
index 0000000..c017747
--- /dev/null
+++ b/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();
+// }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 572c3e1..6bd6a95 100644
--- a/src/main/resources/application.properties
+++ b/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
\ No newline at end of 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
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index f2f4636..7e542a7 100644
--- a/src/main/resources/application.yml
+++ b/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