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