diff --git a/src/main/java/osm/surveyor/task/city/ConflictException.java b/src/main/java/osm/surveyor/task/city/ConflictException.java new file mode 100644 index 0000000..a634dc5 --- /dev/null +++ b/src/main/java/osm/surveyor/task/city/ConflictException.java @@ -0,0 +1,16 @@ +package osm.surveyor.task.city; + +/** + * 409 Conflict + * "タスクが変更されたため更新できません" + * ・サーバに既に存在しているデータが競合しているためリクエストを完了できない + * ・トランザクションはリバースされる + */ +public class ConflictException extends TaskException { + private static final long serialVersionUID = 1L; + + public ConflictException(String errorMessage) { + super(errorMessage); + } + +} diff --git a/src/main/java/osm/surveyor/task/city/ErrorMessage.java b/src/main/java/osm/surveyor/task/city/ErrorMessage.java new file mode 100644 index 0000000..d41404d --- /dev/null +++ b/src/main/java/osm/surveyor/task/city/ErrorMessage.java @@ -0,0 +1,12 @@ +package osm.surveyor.task.city; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ErrorMessage { + + private String errorMessage; + +} diff --git a/src/main/java/osm/surveyor/task/city/NotAcceptableException.java b/src/main/java/osm/surveyor/task/city/NotAcceptableException.java new file mode 100644 index 0000000..3daeb07 --- /dev/null +++ b/src/main/java/osm/surveyor/task/city/NotAcceptableException.java @@ -0,0 +1,15 @@ +package osm.surveyor.task.city; + +/** + * 406 Not Acceptable + * "ACCEPTIONGではないため予約できません" + * ・サーバ側が受付不可能な値(ファイルの種類など)であり提供できない状態 + * ・トランザクションはリバースされる + */ +public class NotAcceptableException extends TaskException { + private static final long serialVersionUID = 1L; + + public NotAcceptableException(String errorMessage) { + super(errorMessage); + } +} diff --git a/src/main/java/osm/surveyor/task/city/TaskController.java b/src/main/java/osm/surveyor/task/city/TaskController.java index 77cc2d9..e527a56 100644 --- a/src/main/java/osm/surveyor/task/city/TaskController.java +++ b/src/main/java/osm/surveyor/task/city/TaskController.java @@ -4,12 +4,14 @@ import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -141,4 +143,60 @@ return "redirect:/tasks?citycode="+ task.getCitycode() +"&meshcode="+ task.getMeshcode(); } + + /** + * 406 Not Acceptable + * "ACCEPTIONGではないため予約できません" + * + * @param e + * @param model + * @param citycode + * @param meshcode + * @return + */ + @ExceptionHandler(NotAcceptableException.class) + public String notAcceptableExceptionHandler(NotAcceptableException e, Model model) + { + model.addAttribute("error", "406 Not Acceptable"); + model.addAttribute("message", e.toString()); + model.addAttribute("status", HttpStatus.NOT_ACCEPTABLE); + + Task task = e.getTask(); + if (task == null) { + return "error"; + } + + model.addAttribute("citycode", task.getCitycode()); + model.addAttribute("meshcode", task.getMeshcode()); + model.addAttribute("task", task); + return "task"; + } + + /** + * 409 Conflict + * "タスクが変更されたため更新できません" + * + * @param e + * @param model + * @param citycode + * @param meshcode + * @return + */ + @ExceptionHandler(ConflictException.class) + public String conflictExceptionHandler(ConflictException e, Model model) + { + model.addAttribute("error", "409 Conflict"); + model.addAttribute("message", e.toString()); + model.addAttribute("status", HttpStatus.CONFLICT); + + Task task = e.getTask(); + if (task == null) { + return "error"; + } + + model.addAttribute("citycode", task.getCitycode()); + model.addAttribute("meshcode", task.getMeshcode()); + model.addAttribute("task", task); + return "task"; + } } diff --git a/src/main/java/osm/surveyor/task/city/TaskException.java b/src/main/java/osm/surveyor/task/city/TaskException.java new file mode 100644 index 0000000..51feb08 --- /dev/null +++ b/src/main/java/osm/surveyor/task/city/TaskException.java @@ -0,0 +1,17 @@ +package osm.surveyor.task.city; + +import lombok.Getter; +import lombok.Setter; +import osm.surveyor.task.city.model.Task; + +@Setter +@Getter +public class TaskException extends RuntimeException { + private static final long serialVersionUID = 1L; + + private Task task; + + public TaskException(String errorMessage) { + super(errorMessage); + } +} diff --git a/src/main/java/osm/surveyor/task/city/TaskService.java b/src/main/java/osm/surveyor/task/city/TaskService.java index 4245c78..6121ac6 100644 --- a/src/main/java/osm/surveyor/task/city/TaskService.java +++ b/src/main/java/osm/surveyor/task/city/TaskService.java @@ -25,7 +25,9 @@ task.setStatus(Status.RESERVED); } else { - throw new RuntimeException("未サポートのオペレーション: "+ task.getOperation()); + NotAcceptableException e = new NotAcceptableException("未サポートのオペレーションです: "+ task.getOperation()); + e.setTask(task); + throw e; } String uuid = UUID.randomUUID().toString(); @@ -37,11 +39,15 @@ } else { if (!ctask.getCurrentId().equals(task.getCurrentId())) { - throw new RuntimeException("タスクが変更されたため更新できません"); + ConflictException e = new ConflictException("他のスレッドによってタスクが変更されたため更新できませんでした。"); + e.setTask(task); + throw e; } if (task.getOperation() == Operation.RESERVE) { if (ctask.getStatus() != Status.ACCEPTING) { - throw new RuntimeException("ACCEPTIONGではないため予約できません: "+ task.getOperation()); + NotAcceptableException e = new NotAcceptableException("ステータスがACCEPTIONGではないためタスク登録できませんでした : "+ task.getOperation()); + e.setTask(task); + throw e; } } task.setPreId(ctask.getCurrentId()); diff --git a/src/main/resources/templates/task.html b/src/main/resources/templates/task.html index 971e5c5..4c52510 100644 --- a/src/main/resources/templates/task.html +++ b/src/main/resources/templates/task.html @@ -82,12 +82,17 @@
+ +

+

+ + diff --git a/src/main/resources/templates/tasks.html b/src/main/resources/templates/tasks.html index ff1e88c..fe5e2bf 100644 --- a/src/main/resources/templates/tasks.html +++ b/src/main/resources/templates/tasks.html @@ -42,6 +42,9 @@ + +
+