From 9ca33016e17144250aa7be055df1fda5d397ebf0 Mon Sep 17 00:00:00 2001 From: hsoh Date: Fri, 8 Jul 2022 16:01:27 +0900 Subject: [PATCH] =?UTF-8?q?Socket=20Echo=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../httpmockserver/ApiManageController.java | 2 +- .../httpmockserver/ApiServiceImpl.java | 1 + .../socket/BytesMessageSpec.java | 16 +- .../socket/BytesMessageSpecDao.java | 6 + .../socket/BytesMessageSpecService.java | 22 ++ .../socket/BytesMessageSpecServiceImpl.java | 69 +++++ .../socket/EchoReplaceString.java | 3 +- .../socket/EchoSocketServer.java | 2 +- .../socket/SocketServerManageController.java | 102 ++++++++ .../resources/templates/fragment/sidebar.html | 17 ++ .../page/add-edit-bytes-message-spec.html | 239 ++++++++++++++++++ .../page/list-bytes-message-spec.html | 160 ++++++++++++ 12 files changed, 631 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/templates/page/add-edit-bytes-message-spec.html create mode 100644 src/main/resources/templates/page/list-bytes-message-spec.html diff --git a/src/main/java/com/eactive/httpmockserver/ApiManageController.java b/src/main/java/com/eactive/httpmockserver/ApiManageController.java index e12efa7..c7e0dd2 100644 --- a/src/main/java/com/eactive/httpmockserver/ApiManageController.java +++ b/src/main/java/com/eactive/httpmockserver/ApiManageController.java @@ -26,7 +26,7 @@ public class ApiManageController { @GetMapping("/manage/findAllApis") public String getAllApis(Pageable pageable, Model model) { - model.addAttribute("apiInfoList", apiService.findAllApis(pageable)); + //model.addAttribute("apiInfoList", apiService.findAllApis(pageable)); return "page/list-api"; } diff --git a/src/main/java/com/eactive/httpmockserver/ApiServiceImpl.java b/src/main/java/com/eactive/httpmockserver/ApiServiceImpl.java index 6692b46..6b89a1f 100644 --- a/src/main/java/com/eactive/httpmockserver/ApiServiceImpl.java +++ b/src/main/java/com/eactive/httpmockserver/ApiServiceImpl.java @@ -64,6 +64,7 @@ public class ApiServiceImpl implements ApiService { } @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false) public void delete(Long id) { apiDao.deleteById(id); } diff --git a/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpec.java b/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpec.java index cbea2aa..3f26491 100644 --- a/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpec.java +++ b/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpec.java @@ -1,6 +1,7 @@ package com.eactive.httpmockserver.socket; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; @@ -14,7 +15,9 @@ import javax.persistence.JoinColumn; import javax.persistence.Lob; import javax.persistence.OneToMany; import javax.persistence.OrderBy; +import javax.validation.Valid; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import javax.validation.constraints.PositiveOrZero; @@ -36,6 +39,7 @@ public class BytesMessageSpec implements Serializable { private String llFieldLengthInclude; @Positive + @NotNull private Integer llFieldLength; private Integer llFieldLengthAlpha; @@ -50,6 +54,7 @@ public class BytesMessageSpec implements Serializable { private String encode; @Positive + @NotNull private Integer port; @Positive @@ -62,10 +67,11 @@ public class BytesMessageSpec implements Serializable { @Column(length = 1) private String useYn; - @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @Valid + @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "BYTE_MESSAGE_SPEC_ID") @OrderBy("position") - private List EchoReplaceStringList; + private List echoReplaceStringList = new ArrayList(); public Long getId() { return id; @@ -172,11 +178,11 @@ public class BytesMessageSpec implements Serializable { } public List getEchoReplaceStringList() { - return EchoReplaceStringList; + return echoReplaceStringList; } public void setEchoReplaceStringList(List echoReplaceStringList) { - EchoReplaceStringList = echoReplaceStringList; + this.echoReplaceStringList = echoReplaceStringList; } @Override @@ -186,6 +192,6 @@ public class BytesMessageSpec implements Serializable { + ", llFieldLengthAlpha=" + llFieldLengthAlpha + ", llFieldOffset=" + llFieldOffset + ", llFieldType=" + llFieldType + ", encode=" + encode + ", port=" + port + ", sleepSeconds=" + sleepSeconds + ", responseBody=" + responseBody + ", useYn=" + useYn + ", EchoReplaceStringList=" - + EchoReplaceStringList + "]"; + + echoReplaceStringList + "]"; } } diff --git a/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecDao.java b/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecDao.java index d0923be..81ee06e 100644 --- a/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecDao.java +++ b/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecDao.java @@ -1,9 +1,15 @@ package com.eactive.httpmockserver.socket; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @Repository public interface BytesMessageSpecDao extends JpaRepository { BytesMessageSpec findFirstByUseYn(String useYn); + + @Modifying + @Query(value = "update BytesMessageSpec b set b.useYn='N' where b.id <> ?1") + void updateUnuseOthers(Long id); } diff --git a/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecService.java b/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecService.java index 7728ee9..1552261 100644 --- a/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecService.java +++ b/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecService.java @@ -1,5 +1,27 @@ package com.eactive.httpmockserver.socket; +import java.util.List; +import java.util.Optional; + +import org.springframework.data.domain.Example; +import org.springframework.data.domain.Pageable; + public interface BytesMessageSpecService { public BytesMessageSpec findActiveBytesMessageSpec(); + + public List findAllBytesMessageSpecs(Pageable pageable); + + public List findAllBytesMessageSpecs(Example example, Pageable pageable); + + public long getRecordsCount(Example example); + + public Optional findById(Long id); + + public BytesMessageSpec save(BytesMessageSpec spec); + + public BytesMessageSpec update(BytesMessageSpec spec); + + public void delete(Long id); + + public void setUnuseOthers(Long id); } diff --git a/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecServiceImpl.java b/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecServiceImpl.java index d28536a..0467064 100644 --- a/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecServiceImpl.java +++ b/src/main/java/com/eactive/httpmockserver/socket/BytesMessageSpecServiceImpl.java @@ -1,6 +1,13 @@ package com.eactive.httpmockserver.socket; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -15,4 +22,66 @@ public class BytesMessageSpecServiceImpl implements BytesMessageSpecService { public BytesMessageSpec findActiveBytesMessageSpec() { return dao.findFirstByUseYn("Y"); } + + @Override + public List findAllBytesMessageSpecs(Pageable pageable) { + Page pagedResult = dao.findAll(pageable); + if (pagedResult.hasContent()) { + return pagedResult.getContent(); + } else { + return new ArrayList(); + } + } + + @Override + public List findAllBytesMessageSpecs(Example example, Pageable pageable) { + if (example == null) { + return findAllBytesMessageSpecs(pageable); + } + + Page pagedResult = dao.findAll(example, pageable); + if (pagedResult.hasContent()) { + return pagedResult.getContent(); + } else { + return new ArrayList(); + } + } + + @Override + public Optional findById(Long id) { + return dao.findById(id); + } + + @Override + public long getRecordsCount(Example example) { + if (example == null) { + return dao.count(); + } else { + return dao.count(example); + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false) + public BytesMessageSpec save(BytesMessageSpec spec) { + return dao.save(spec); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false) + public BytesMessageSpec update(BytesMessageSpec spec) { + return dao.save(spec); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false) + public void delete(Long id) { + dao.deleteById(id); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false) + public void setUnuseOthers(Long id) { + dao.updateUnuseOthers(id); + } } diff --git a/src/main/java/com/eactive/httpmockserver/socket/EchoReplaceString.java b/src/main/java/com/eactive/httpmockserver/socket/EchoReplaceString.java index cc8a916..4715c0f 100644 --- a/src/main/java/com/eactive/httpmockserver/socket/EchoReplaceString.java +++ b/src/main/java/com/eactive/httpmockserver/socket/EchoReplaceString.java @@ -8,6 +8,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; @SuppressWarnings("serial") @@ -17,8 +18,8 @@ public class EchoReplaceString implements Serializable { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @NotBlank @PositiveOrZero + @NotNull @Column(nullable = false) private Integer position; diff --git a/src/main/java/com/eactive/httpmockserver/socket/EchoSocketServer.java b/src/main/java/com/eactive/httpmockserver/socket/EchoSocketServer.java index 7ae6996..b4f6406 100644 --- a/src/main/java/com/eactive/httpmockserver/socket/EchoSocketServer.java +++ b/src/main/java/com/eactive/httpmockserver/socket/EchoSocketServer.java @@ -78,7 +78,7 @@ public class EchoSocketServer { workerGroup.shutdownGracefully().sync(); channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) { - e.printStackTrace(); + logger.error(e.getMessage()); } } } diff --git a/src/main/java/com/eactive/httpmockserver/socket/SocketServerManageController.java b/src/main/java/com/eactive/httpmockserver/socket/SocketServerManageController.java index 16d1557..5ae00e1 100644 --- a/src/main/java/com/eactive/httpmockserver/socket/SocketServerManageController.java +++ b/src/main/java/com/eactive/httpmockserver/socket/SocketServerManageController.java @@ -1,16 +1,35 @@ package com.eactive.httpmockserver.socket; +import java.util.Optional; + import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.persistence.NoResultException; +import javax.validation.Valid; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.ExampleMatcher; +import org.springframework.data.domain.ExampleMatcher.GenericPropertyMatcher; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import com.eactive.httpmockserver.ApiManageRestController; +import com.eactive.httpmockserver.datatables.DataTablesRequest; +import com.eactive.httpmockserver.datatables.DataTablesResponse; + @Controller public class SocketServerManageController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -20,6 +39,89 @@ public class SocketServerManageController { private EchoSocketServer echoSocketServer; + @GetMapping("/manage/findAllBytesMessageSpecs") + public String getAllBytesMessageSpecs(Pageable pageable, Model model) { + return "page/list-bytes-message-spec"; + } + + @GetMapping(path = { "/manage/getBytesMessageSpecForm", "/manage/getBytesMessageSpecForm/{id}" }) + public String getBytesMessageSpecForm(Model model, @PathVariable Optional id) { + if (id.isPresent()) { + Optional optional = specService.findById(id.get()); + if (optional.isPresent()) { + model.addAttribute("bytesMessageSpec", optional.get()); + } else { + throw new IllegalArgumentException("No data, id: " + id.get()); + } + } else { + BytesMessageSpec spec = new BytesMessageSpec(); + model.addAttribute("bytesMessageSpec", spec); + } + + return "page/add-edit-bytes-message-spec"; + } + + @PostMapping("/manage/saveBytesMessageSpec") + public String saveBytesMessageSpec(@Valid BytesMessageSpec spec, BindingResult result, Model model) { + if (result.hasErrors()) { + return "page/add-edit-bytes-message-spec"; + } + + if (spec.getId() == null) { + specService.save(spec); + } else { + specService.update(spec); + } + + if (BooleanUtils.toBoolean(spec.getUseYn())) { + // + stop(); + + // useYn=N + specService.setUnuseOthers(spec.getId()); + + // ⵿ + start(); + } + + return "redirect:/manage/findAllBytesMessageSpecs"; + } + + @PostMapping("/manage/rest/bytesMessageSpecs") + @ResponseBody + public DataTablesResponse getAllApisForDatatables(@RequestBody DataTablesRequest req) { + Pageable pageable = ApiManageRestController.assignJpaPageable(req); + + // search option + Example example = null; + if (StringUtils.isNotBlank(req.getSearch().getValue())) { + BytesMessageSpec spec = new BytesMessageSpec(); + spec.setSpecName(req.getSearch().getValue()); + + ExampleMatcher matcher = ExampleMatcher.matchingAny().withMatcher("specName", + new GenericPropertyMatcher().contains().ignoreCase()); + example = Example.of(spec, matcher); + } + + DataTablesResponse res = new DataTablesResponse( + specService.findAllBytesMessageSpecs(example, pageable)); + res.setRecordsFiltered(specService.getRecordsCount(example)); + res.setRecordsTotal(specService.getRecordsCount(null)); + res.setDraw(req.getDraw()); + return res; + } + + @RequestMapping("/manage/deleteBytesMessageSpec/{id}") + public String deleteBytesMessageSpec(@PathVariable Long id) { + if (id == null) { + throw new IllegalArgumentException("No data, id: " + id); + } + + specService.delete(id); + + return "redirect:/manage/findAllBytesMessageSpecs"; + } + @PostConstruct public void start() { logger.info("EchoSocketServer starting.."); diff --git a/src/main/resources/templates/fragment/sidebar.html b/src/main/resources/templates/fragment/sidebar.html index 931a45b..7adb923 100644 --- a/src/main/resources/templates/fragment/sidebar.html +++ b/src/main/resources/templates/fragment/sidebar.html @@ -64,6 +64,23 @@ + + diff --git a/src/main/resources/templates/page/add-edit-bytes-message-spec.html b/src/main/resources/templates/page/add-edit-bytes-message-spec.html new file mode 100644 index 0000000..5e1b32d --- /dev/null +++ b/src/main/resources/templates/page/add-edit-bytes-message-spec.html @@ -0,0 +1,239 @@ + + + +
+ +
+
+
+
+

Bytes Message 정보 등록

+

Bytes Message 정보 수정

+
+
+ +
+
+
+ +
+ + +
+
+
+
+
+

Basic Info

+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ + +
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+

Response Message Info

+
+   - 응답 메시지를 입력할 경우 아래 Acho Message Info 정보는 무시 됩니다. +
+
+
+ + +
+
+
+ +
+
+

Acho Message Info

+ + +
+
+ + + + + + + + + + + + + + + + + +
No.Replace 시작 IndexReplace 스트링삭제
1 + + + + + +
+ +
+
+
+
+ + + + +
+
+
+
+ + + + + diff --git a/src/main/resources/templates/page/list-bytes-message-spec.html b/src/main/resources/templates/page/list-bytes-message-spec.html new file mode 100644 index 0000000..c9ef3cd --- /dev/null +++ b/src/main/resources/templates/page/list-bytes-message-spec.html @@ -0,0 +1,160 @@ + + + + + + + + + +
+ +
+
+
+
+

Bytes Message 관리

+
+
+ +
+
+
+ +
+ + +
+
+
+
+
+
+

목록중 하나의 메세지만 사용할 수 있습니다.

+
+
+ + + + + + + + + + + + +
메시지명LL길이LL길이포함Port사용여부수정삭제
+
+ +
+ +
+ +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + +