From 8b73dee6b61e3c6937bc993b1e8ba8287f115edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?qkr7828=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Wed, 6 Sep 2023 18:35:06 +0900 Subject: [PATCH] =?UTF-8?q?(prod)=EB=B9=84=ED=96=89=EA=B3=84=ED=9A=8D?= =?UTF-8?q?=EC=84=9C=20=EB=93=B1=EB=A1=9D=20=EC=8B=9C=20=EC=A2=8C=ED=91=9C?= =?UTF-8?q?=20kml=20=EB=B3=80=ED=99=98=20=ED=9B=84=20sftp=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 19 ++- .../controller/BasFlightController.java | 4 +- .../bas/flight/service/BasFlightService.java | 49 ++++++- .../java/com/palnet/comn/utils/KmlUtils.java | 71 +++++++++ .../java/com/palnet/comn/utils/SftpUtils.java | 138 ++++++++++++++++++ src/main/resources/application.properties | 9 +- src/main/resources/application.yml | 2 +- 7 files changed, 282 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/palnet/comn/utils/KmlUtils.java create mode 100644 src/main/java/com/palnet/comn/utils/SftpUtils.java 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