LogParsingServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package com.seecoder.dataanalysis.logic.parser.impl;
  2. import com.alibaba.fastjson.JSONException;
  3. import com.seecoder.dataanalysis.data.dao.devcloud.DevcloudInfoDao;
  4. import com.seecoder.dataanalysis.data.dao.eval.EvalExamInfoDao;
  5. import com.seecoder.dataanalysis.data.dao.eval.EvalExamRecordDao;
  6. import com.seecoder.dataanalysis.data.entity.devcloud.*;
  7. import com.seecoder.dataanalysis.data.entity.eval.EvalExamInfo;
  8. import com.seecoder.dataanalysis.data.entity.eval.EvalExamRecord;
  9. import com.seecoder.dataanalysis.logic.parser.LogParsingService;
  10. import com.seecoder.dataanalysis.logic.parser.ParsingException;
  11. import com.seecoder.dataanalysis.logic.parser.convertor.LogConvertor;
  12. import com.seecoder.dataanalysis.util.JsonUtil;
  13. import com.seecoder.dataanalysis.util.Messages;
  14. import com.seecoder.dataanalysis.vo.*;
  15. import com.seecoder.dataanalysis.vo.devcloud.*;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Service;
  18. import javax.annotation.PostConstruct;
  19. import java.util.*;
  20. /**
  21. * @author miaomuzhi
  22. * @since 2022/1/30
  23. */
  24. @Service
  25. public class LogParsingServiceImpl implements LogParsingService {
  26. /**
  27. * 根据日志元数据操作类型(op_type)查找对应的类名
  28. */
  29. private Map<Integer, String> opTypesTable;
  30. private EvalExamRecordDao evalExamRecordDao;
  31. private EvalExamInfoDao evalExamInfoDao;
  32. private DevcloudInfoDao devcloudInfoDao;
  33. @Autowired
  34. public void setEvalExamRecordDao(EvalExamRecordDao evalExamRecordDao) {
  35. this.evalExamRecordDao = evalExamRecordDao;
  36. }
  37. @Autowired
  38. public void setEvalExamInfoDao(EvalExamInfoDao evalExamInfoDao) {
  39. this.evalExamInfoDao = evalExamInfoDao;
  40. }
  41. @Autowired
  42. public void setDevcloudInfoDao(DevcloudInfoDao devcloudInfoDao) {
  43. this.devcloudInfoDao = devcloudInfoDao;
  44. }
  45. @Override
  46. public SimpleLog parseLog(String log) throws ParsingException{
  47. try {
  48. return JsonUtil.toObject(log, SimpleLog.class);
  49. } catch (JSONException e) {
  50. e.printStackTrace();
  51. throw new ParsingException(e.toString(), 0, log);
  52. }
  53. }
  54. @Override
  55. @SuppressWarnings("unchecked")
  56. public <T> T parseLogData(SimpleLog simpleLog, boolean save) throws ParsingException{
  57. if (simpleLog == null) {
  58. return null;
  59. }
  60. try {
  61. String className = parseOpType(simpleLog.getOpType());
  62. Class clazz = Class.forName(className);
  63. Object data = JsonUtil.toObject(simpleLog.getData(), clazz);
  64. if (save) {
  65. saveToDb(data, className);
  66. }
  67. return (T) data;
  68. } catch (ClassNotFoundException|ClassCastException e){
  69. e.printStackTrace();
  70. throw new ParsingException(e.toString(), 4, simpleLog.getData());
  71. } catch (JSONException e) {
  72. e.printStackTrace();
  73. throw new ParsingException(e.toString(), 1, simpleLog.getData());
  74. }
  75. }
  76. @Override
  77. public String parseOpType(int opType) throws ParsingException {
  78. if (!opTypesTable.containsKey(opType)) {
  79. throw new ParsingException("不支持的操作类型:" + opType, 2);
  80. }
  81. return opTypesTable.get(opType);
  82. }
  83. @PostConstruct
  84. protected void buildOpTypesTable(){
  85. opTypesTable = new HashMap<>();
  86. opTypesTable.put(0, EvalExamInfoDTO.class.getName()); //试卷数据
  87. opTypesTable.put(1, EvalExamInfoDTO.class.getName()); //诗句更新数据
  88. opTypesTable.put(2, EvalExamRecordDTO.class.getName()); //学生提交试卷
  89. opTypesTable.put(100, BugInfoDTO.class.getName()); //修改缺陷信息
  90. opTypesTable.put(101, CommitInfoDTO.class.getName()); //用户进行commit
  91. opTypesTable.put(102, TestInfoDTO.class.getName()); //用户创建并执行接口测试
  92. opTypesTable.put(103, PipelineCreationDTO.class.getName()); //用户创建流水线
  93. opTypesTable.put(104, PipelineDeletionDTO.class.getName()); //用户删除流水线
  94. opTypesTable.put(105, PipelineDeployDTO.class.getName()); //用户部署流水线
  95. opTypesTable.put(106, TreeNodeInfoDTO.class.getName()); //用户插入/更新节点
  96. opTypesTable.put(107, TreeNodeDeletionDTO.class.getName()); //用户删除节点
  97. }
  98. private void saveToDb(Object data, String className) throws ParsingException {
  99. if (className.equals(EvalExamInfoDTO.class.getName())) {
  100. EvalExamInfo info = LogConvertor.convertToEvalExamInfoEntity((EvalExamInfoDTO) data);
  101. evalExamInfoDao.save(info);
  102. } else if (className.equals(EvalExamRecordDTO.class.getName())) {
  103. EvalExamRecord record = LogConvertor.convertToEvalExamRecordEntity((EvalExamRecordDTO) data);
  104. evalExamRecordDao.save(record);
  105. } else if (className.equals(BugInfoDTO.class.getName())) {
  106. BugInfoDTO bugInfoDTO = (BugInfoDTO) data;
  107. if (bugInfoDTO.getProjectId() == null) {
  108. throw new ParsingException(Messages.PROJECT_ID_NOT_FOUND, 3, data.toString());
  109. }
  110. BugInfo info = LogConvertor.convertToBugInfoEntity(bugInfoDTO);
  111. Optional<DevcloudInfo> devcloudInfo = devcloudInfoDao.findById(bugInfoDTO.getProjectId());
  112. DevcloudInfo devcloudInfoEntity = devcloudInfo.orElseGet(() -> createDevCloudInfo(bugInfoDTO.getProjectId()));
  113. devcloudInfoEntity.getBugList().add(info);
  114. devcloudInfoDao.save(devcloudInfoEntity);
  115. } else if (className.equals(CommitInfoDTO.class.getName())) {
  116. CommitInfoDTO commitInfoDTO = (CommitInfoDTO) data;
  117. if (commitInfoDTO.getProjectId() == null) {
  118. throw new ParsingException(Messages.PROJECT_ID_NOT_FOUND, 3, data.toString());
  119. }
  120. CommitInfo info = LogConvertor.convertToCommitInfoEntity(commitInfoDTO);
  121. Optional<DevcloudInfo> devcloudInfo = devcloudInfoDao.findById(commitInfoDTO.getProjectId());
  122. DevcloudInfo devcloudInfoEntity = devcloudInfo.orElseGet(() -> createDevCloudInfo(commitInfoDTO.getProjectId()));
  123. devcloudInfoEntity.getCommitList().add(info);
  124. devcloudInfoDao.save(devcloudInfoEntity);
  125. } else if (className.equals(TestInfoDTO.class.getName())) {
  126. TestInfoDTO testInfoDTO = (TestInfoDTO) data;
  127. if (testInfoDTO.getProjectId() == null) {
  128. throw new ParsingException(Messages.PROJECT_ID_NOT_FOUND, 3, data.toString());
  129. }
  130. TestInfo info = LogConvertor.convertToTestInfoEntity(testInfoDTO);
  131. Optional<DevcloudInfo> devcloudInfo = devcloudInfoDao.findById(testInfoDTO.getProjectId());
  132. DevcloudInfo devcloudInfoEntity = devcloudInfo.orElseGet(() -> createDevCloudInfo(testInfoDTO.getProjectId()));
  133. devcloudInfoEntity.getTestList().add(info);
  134. devcloudInfoDao.save(devcloudInfoEntity);
  135. } else if (className.equals(PipelineCreationDTO.class.getName())) {
  136. PipelineCreationDTO creationDTO = (PipelineCreationDTO) data;
  137. if (creationDTO.getProjectId() == null) {
  138. throw new ParsingException(Messages.PROJECT_ID_NOT_FOUND, 3, data.toString());
  139. }
  140. Optional<DevcloudInfo> devcloudInfo = devcloudInfoDao.findById(creationDTO.getProjectId());
  141. DevcloudInfo devcloudInfoEntity = devcloudInfo.orElseGet(() -> createDevCloudInfo(creationDTO.getProjectId()));
  142. PipelineInfo pipelineInfo = new PipelineInfo();
  143. pipelineInfo.setPipelineId(creationDTO.getPipelineId());
  144. devcloudInfoEntity.getPipelineList().add(pipelineInfo);
  145. devcloudInfoDao.save(devcloudInfoEntity);
  146. } else if (className.equals(PipelineDeletionDTO.class.getName())) {
  147. PipelineDeletionDTO deletionDTO = (PipelineDeletionDTO) data;
  148. Optional<DevcloudInfo> devcloudInfo = devcloudInfoDao.findById(deletionDTO.getProjectId());
  149. //TODO 暂不处理删除部署
  150. } else if (className.equals(PipelineDeployDTO.class.getName())) {
  151. PipelineDeployDTO deployDTO = (PipelineDeployDTO) data;
  152. boolean foundPipeline = false;
  153. for (DevcloudInfo devcloudInfo: devcloudInfoDao.findAll()) {
  154. for (PipelineInfo info: devcloudInfo.getPipelineList()) {
  155. if (info.getPipelineId().equals(deployDTO.getPipelineId())) {
  156. info.setUserId(deployDTO.getUserId()); // 更新用户id
  157. int successInc = (deployDTO.getSuccess() ? 1 : 0);
  158. info.setSuccess(info.getSuccess() + successInc);
  159. info.setTotal(info.getTotal() + 1);
  160. foundPipeline = true;
  161. break;
  162. }
  163. }
  164. if (foundPipeline) {
  165. devcloudInfoDao.save(devcloudInfo);
  166. break;
  167. }
  168. }
  169. } else if (className.equals(TreeNodeInfoDTO.class.getName())) {
  170. TreeNodeInfoDTO nodeInfoDTO = (TreeNodeInfoDTO) data;
  171. if (nodeInfoDTO.getProjectId() == null) {
  172. throw new ParsingException(Messages.PROJECT_ID_NOT_FOUND, 3, data.toString());
  173. }
  174. TreeNodeInfo info = LogConvertor.convertToTreeNodeInfoEntity(nodeInfoDTO);
  175. Optional<DevcloudInfo> devcloudInfo = devcloudInfoDao.findById(nodeInfoDTO.getProjectId());
  176. DevcloudInfo devcloudInfoEntity = devcloudInfo.orElseGet(() -> createDevCloudInfo(nodeInfoDTO.getProjectId()));
  177. devcloudInfoEntity.getTreeNodeList().add(info);
  178. devcloudInfoDao.save(devcloudInfoEntity);
  179. } else if (className.equals(TreeNodeDeletionDTO.class.getName())) {
  180. TreeNodeDeletionDTO deletionDTO = (TreeNodeDeletionDTO) data;
  181. for (DevcloudInfo devcloudInfo: devcloudInfoDao.findAll()) {
  182. boolean updated = false;
  183. List<TreeNodeInfo> deleteList = new ArrayList<>();
  184. for (TreeNodeInfo info: devcloudInfo.getTreeNodeList()) {
  185. if (deletionDTO.getNodeIds().contains(info.getNodeId())) {
  186. deleteList.add(info);
  187. updated = true;
  188. }
  189. }
  190. if (updated) {
  191. devcloudInfo.getTreeNodeList().removeAll(deleteList);
  192. devcloudInfoDao.save(devcloudInfo);
  193. }
  194. }
  195. }
  196. }
  197. private DevcloudInfo createDevCloudInfo(Integer projectId) {
  198. DevcloudInfo devcloudInfo = new DevcloudInfo(projectId, new ArrayList<>(), new ArrayList<>(),
  199. new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
  200. this.devcloudInfoDao.save(devcloudInfo);
  201. return devcloudInfo;
  202. }
  203. }