Newer
Older
task-bldg / src / main / java / osm / surveyor / task / city / TaskService.java
  1. package osm.surveyor.task.city;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.security.core.userdetails.UserDetails;
  5. import org.springframework.stereotype.Service;
  6.  
  7. import osm.surveyor.task.city.model.Citymesh;
  8. import osm.surveyor.task.city.model.CitymeshPK;
  9. import osm.surveyor.task.city.model.Operation;
  10. import osm.surveyor.task.city.model.Status;
  11. import osm.surveyor.task.city.model.Task;
  12.  
  13. import javax.transaction.Transactional;
  14.  
  15. import java.util.Date;
  16. import java.util.List;
  17. import java.util.UUID;
  18.  
  19. @Service
  20. @Transactional // メソッド開始時にトランザクションを開始、終了時にコミットする
  21. public class TaskService {
  22.  
  23. @Autowired
  24. TaskRepository repository;
  25. @Autowired
  26. CitymeshRepository meshRepository;
  27.  
  28. public void add(Task task, UserDetails user) {
  29. if (task.getOperation() == Operation.RESERVE) {
  30. task.setStatus(Status.RESERVED);
  31. }
  32. else if (task.getOperation() == Operation.CANCEL) {
  33. task.setStatus(Status.ACCEPTING);
  34. }
  35. else if (task.getOperation() == Operation.DONE) {
  36. task.setStatus(Status.IMPORTED);
  37. }
  38. else if (task.getOperation() == Operation.NG) {
  39. task.setStatus(Status.NG);
  40. }
  41. else if (task.getOperation() == Operation.OK) {
  42. task.setStatus(Status.END);
  43. }
  44. else {
  45. NotAcceptableException e = new NotAcceptableException("未サポートのオペレーションです: "+ task.getOperation());
  46. e.setTask(task);
  47. throw e;
  48. }
  49. String uuid = UUID.randomUUID().toString();
  50.  
  51. CitymeshPK pk = new CitymeshPK();
  52. pk.setCitycode(task.getCitycode());
  53. pk.setMeshcode(task.getMeshcode());
  54. Citymesh mesh = meshRepository.getById(pk);
  55. Task ctask = getTaskByMesh(task.getCitycode(), task.getMeshcode());
  56. if (ctask == null) {
  57. task.setPreId(uuid);
  58. task.setCurrentId(uuid);
  59. }
  60. else {
  61. if (!ctask.getCurrentId().equals(task.getCurrentId())) {
  62. ConflictException e = new ConflictException("他のスレッドによってタスクが変更されたため更新できませんでした。");
  63. e.setTask(task);
  64. throw e;
  65. }
  66. if (task.getOperation() == Operation.RESERVE) {
  67. if ((ctask.getStatus() != Status.ACCEPTING) && (ctask.getStatus() != Status.NG)) {
  68. NotAcceptableException e = new NotAcceptableException("予約受付中ではないためタスク予約できませんでした : "+ task.getOperation());
  69. e.setTask(task);
  70. throw e;
  71. }
  72. }
  73. else if (task.getOperation() == Operation.CANCEL) {
  74. if (ctask.getStatus() != Status.RESERVED) {
  75. NotAcceptableException e = new NotAcceptableException("ステータスが予約中ではないため予約取消できませんでした : "+ task.getOperation());
  76. e.setTask(task);
  77. throw e;
  78. }
  79. if (!ctask.getUsername().equals(user.getUsername())) {
  80. NotAcceptableException e = new NotAcceptableException("他のマッパーのタスク予約はCANCELできません");
  81. e.setTask(task);
  82. throw e;
  83. }
  84. }
  85. else if (task.getOperation() == Operation.DONE) {
  86. // タスク予約していなくてもインポートできる
  87. // 他のマッパーが予約していてもインポート可能
  88. if (ctask.getStatus() == Status.PREPARATION) {
  89. NotAcceptableException e = new NotAcceptableException("準備中のため登録できませんでした");
  90. e.setTask(task);
  91. throw e;
  92. }
  93. if (ctask.getStatus() == Status.END) {
  94. NotAcceptableException e = new NotAcceptableException("既にタスクが完了しているため登録できませんでした");
  95. e.setTask(task);
  96. throw e;
  97. }
  98.  
  99. String changeset = task.getChangeSet();
  100. if (changeset == null) {
  101. TaskException e = new TaskException("変更セットNoが入力されていません");
  102. e.setTask(task);
  103. throw e;
  104. }
  105. else if (changeset.isEmpty()) {
  106. TaskException e = new TaskException("変更セットNoが入力されていません");
  107. e.setTask(task);
  108. throw e;
  109. }
  110. else {
  111. try {
  112. Long.parseLong(changeset);
  113. }
  114. catch (NumberFormatException nfe) {
  115. TaskException e = new TaskException("変更セットNoに数字以外の文字が入っています");
  116. e.setTask(task);
  117. throw e;
  118. }
  119. }
  120. }
  121. else if ((task.getOperation() == Operation.NG) || (task.getOperation() == Operation.OK)) {
  122. if (ctask.getStatus() != Status.IMPORTED) {
  123. NotAcceptableException e = new NotAcceptableException("編集されていないため検証できません");
  124. e.setTask(task);
  125. throw e;
  126. }
  127. if (ctask.getUsername().equals(user.getUsername())) {
  128. TaskException e = new TaskException("自己の編集を検証することはできません");
  129. e.setTask(task);
  130. throw e;
  131. }
  132.  
  133. String comment = task.getComment();
  134. if (comment == null || comment.isEmpty()) {
  135. TaskException e = new TaskException("コメントが入力されていません");
  136. e.setTask(task);
  137. throw e;
  138. }
  139. }
  140. task.setPreId(ctask.getCurrentId());
  141. task.setCurrentId(uuid);
  142. }
  143. task.setUpdateTime(new Date());
  144. mesh.setStatus(task.getStatus());
  145. mesh.setUsername(task.getUsername());
  146. mesh.setValidator(task.getValidator());
  147. // データベースに格納
  148. repository.save(task);
  149. meshRepository.save(mesh);
  150. }
  151. public Task getTaskByMesh(String citycode, String meshcode) {
  152. List<Task> tasks = repository.serchByMesh(citycode, meshcode);
  153. for (Task t : tasks) {
  154. return t;
  155. }
  156. return null;
  157. }
  158.  
  159. public List<Task> getTasks() {
  160. return repository.findAll();
  161. }
  162.  
  163. }