LogParsingServiceImpl.java 13 KB

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