AnalyzeController.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. package edu.nju.controller;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.net.URLDecoder;
  5. import java.util.Arrays;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import javax.servlet.http.HttpServletResponse;
  10. import edu.nju.dao.TaskDao;
  11. import edu.nju.entities.Task;
  12. import edu.nju.entities.ShortToken;
  13. import edu.nju.model.*;
  14. import edu.nju.util.AESUtil;
  15. import edu.nju.util.BlockChainAspect;
  16. import org.json.JSONArray;
  17. import org.json.JSONObject;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Controller;
  22. import org.springframework.util.DigestUtils;
  23. import org.springframework.web.bind.annotation.*;
  24. import edu.nju.service.AnalyzeService;
  25. import edu.nju.service.ReportService;
  26. @Controller
  27. @RequestMapping(value = "/analyze")
  28. @CrossOrigin(origins = "*", maxAge = 3600, allowCredentials = "true")
  29. public class AnalyzeController {
  30. @Autowired
  31. AnalyzeService aservice;
  32. @Autowired
  33. ReportService rservice;
  34. @Autowired
  35. BlockChainAspect blockChainAspect;
  36. @Autowired
  37. TaskDao taskDao;
  38. Logger log= LoggerFactory.getLogger(AnalyzeController.class);
  39. //根据用例获取所有有效bug
  40. @RequestMapping(value = "/valid")
  41. @ResponseBody
  42. public void getValid(String case_take_id, HttpServletResponse response) {
  43. try {
  44. PrintWriter out = response.getWriter();
  45. JSONObject result = new JSONObject();
  46. List<String> list = aservice.getValid(case_take_id);
  47. result.put("Count", list.size());
  48. result.put("Detail", new JSONArray(list));
  49. out.print(result);
  50. out.flush();
  51. out.close();
  52. } catch (Exception e) {
  53. // TODO Auto-generated catch block
  54. e.printStackTrace();
  55. }
  56. }
  57. //根据用例获取所有有效bug
  58. @RequestMapping(value = "/validByBugId")
  59. @ResponseBody
  60. public void getValidByBugId(String id, HttpServletResponse response) {
  61. try {
  62. PrintWriter out = response.getWriter();
  63. JSONObject result = new JSONObject();
  64. List<String> list = aservice.getValidByBugId(id);
  65. result.put("Count", list.size());
  66. result.put("Detail", new JSONArray(list));
  67. out.print(result);
  68. out.flush();
  69. out.close();
  70. } catch (Exception e) {
  71. // TODO Auto-generated catch block
  72. e.printStackTrace();
  73. }
  74. }
  75. //根据用例获取所有有效bug
  76. @RequestMapping(value = "/bugData")
  77. @ResponseBody
  78. public List<BugDataVO> getBugDataVO(String case_take_id) {
  79. return aservice.getBugDataVO(case_take_id);
  80. }
  81. //获取所有有点赞记录的bug
  82. @RequestMapping(value = "/thums")
  83. @ResponseBody
  84. public void getThums(String case_take_id, HttpServletResponse response) {
  85. try {
  86. JSONObject result = new JSONObject();
  87. PrintWriter out = response.getWriter();
  88. Map<String, String> map = aservice.getThums(case_take_id);
  89. result.put("Count", map.size());
  90. result.put("Detail", new JSONObject(map));
  91. out.print(result);
  92. out.flush();
  93. out.close();
  94. } catch (Exception e) {
  95. // TODO Auto-generated catch block
  96. e.printStackTrace();
  97. }
  98. }
  99. /**
  100. * 47.99.140.117:9001/Bug/api/analyze/scores
  101. *
  102. * @param case_take_id
  103. * caseId - taskId,示例1632-2927
  104. * @return [{"名字":"庄坤涛","report_id":"10010000035757","报告得分":28,"审查得分":4,"worker_id":"39669"}]
  105. */
  106. @RequestMapping(value = "/scores")
  107. @ResponseBody
  108. public void getScores(String case_take_id, HttpServletResponse response) {
  109. try {
  110. PrintWriter out = response.getWriter();
  111. out.print(aservice.getScores(case_take_id));
  112. out.flush();
  113. out.close();
  114. } catch (Exception e) {
  115. // TODO Auto-generated catch block
  116. e.printStackTrace();
  117. }
  118. }
  119. /**
  120. * 47.99.140.117:9001/Bug/api/analyze/newScores
  121. *
  122. * @param case_take_id
  123. * caseId - taskId,示例1632-2927
  124. * @return [{"名字":"庄坤涛","report_id":"10010000035757","报告得分":28,"审查得分":4,"worker_id":"39669"}]
  125. */
  126. @RequestMapping(value = "/newScores")
  127. @ResponseBody
  128. public void getNewScores(String case_take_id, HttpServletResponse response) {
  129. try {
  130. PrintWriter out = response.getWriter();
  131. out.print(aservice.getNewScores(aservice.getScores(case_take_id)));
  132. out.flush();
  133. out.close();
  134. } catch (Exception e) {
  135. // TODO Auto-generated catch block
  136. e.printStackTrace();
  137. }
  138. }
  139. //获取所有的参与用户,这个方法之前写的,ms有点问题啊
  140. @RequestMapping(value = "/users")
  141. @ResponseBody
  142. public void getUsers(String case_take_id, HttpServletResponse response) {
  143. try {
  144. PrintWriter out = response.getWriter();
  145. out.print(new JSONArray(aservice.getReports(case_take_id)));
  146. out.flush();
  147. out.close();
  148. } catch (Exception e) {
  149. // TODO Auto-generated catch block
  150. e.printStackTrace();
  151. }
  152. }
  153. //真正获取所有的参与用户
  154. @RequestMapping(value = "/workers")
  155. @ResponseBody
  156. public List<Long> getUserss(Long examId) {
  157. return aservice.getUsers(String.valueOf(examId));
  158. }
  159. //获取指定bug的打分等级
  160. @RequestMapping(value = "/grade")
  161. @ResponseBody
  162. public void getGrade(String id, HttpServletResponse response) {
  163. try {
  164. JSONObject result = new JSONObject();
  165. result.put("grade", aservice.getGrade(id));
  166. PrintWriter out = response.getWriter();
  167. out.print(result);
  168. out.flush();
  169. out.close();
  170. } catch (Exception e) {
  171. // TODO Auto-generated catch block
  172. e.printStackTrace();
  173. }
  174. }
  175. //存储单个bug的打分等级
  176. @RequestMapping(value = "/save")
  177. @ResponseBody
  178. public void saveGrade(String id, String grade, HttpServletResponse response) {
  179. try {
  180. JSONObject result = new JSONObject();
  181. if(aservice.saveGrade(id, Integer.parseInt(grade))) {result.put("status", "200");}
  182. else {result.put("status", "500");}
  183. PrintWriter out = response.getWriter();
  184. out.print(result);
  185. out.flush();
  186. out.close();
  187. } catch (Exception e) {
  188. // TODO Auto-generated catch block
  189. e.printStackTrace();
  190. }
  191. }
  192. @RequestMapping(value = "/saveSimiliar")
  193. @ResponseBody
  194. public void saveSimiliarGrade(String id, String grade,String similiarBug, HttpServletResponse response) {
  195. try {
  196. JSONObject result = new JSONObject();
  197. if(aservice.saveSimiliarGrade(id, Integer.parseInt(grade),similiarBug)) {result.put("status", "200");}
  198. else {result.put("status", "500");}
  199. PrintWriter out = response.getWriter();
  200. out.print(result);
  201. out.flush();
  202. out.close();
  203. } catch (Exception e) {
  204. // TODO Auto-generated catch block
  205. e.printStackTrace();
  206. }
  207. }
  208. @RequestMapping(value = "/saveByWorker")
  209. @ResponseBody
  210. public void saveGradeByWorker(String id,String worker_id, String grade, HttpServletResponse response) {
  211. try {
  212. JSONObject result = new JSONObject();
  213. if(aservice.saveGradeByWorker(id, worker_id,Integer.parseInt(grade))) {result.put("status", "200");}
  214. else {result.put("status", "500");}
  215. PrintWriter out = response.getWriter();
  216. out.print(result);
  217. out.flush();
  218. out.close();
  219. } catch (Exception e) {
  220. // TODO Auto-generated catch block
  221. e.printStackTrace();
  222. }
  223. }
  224. //获取页面和种类的分布情况
  225. @RequestMapping(value = "/bugDetail")
  226. @ResponseBody
  227. public void getDetail(String case_take_id, HttpServletResponse response) {
  228. try {
  229. PrintWriter out = response.getWriter();
  230. out.print(aservice.getCaseDetail(case_take_id));
  231. out.flush();
  232. out.close();
  233. } catch (Exception e) {
  234. // TODO Auto-generated catch block
  235. e.printStackTrace();
  236. }
  237. }
  238. //获取所有打分等级
  239. @RequestMapping(value = "/allGrades")
  240. @ResponseBody
  241. public void getAllGrades(String case_take_id, HttpServletResponse response) {
  242. try {
  243. JSONObject result = new JSONObject();
  244. Map<String, Integer> map = aservice.getAllGrades(case_take_id);
  245. result.put("Count", map.size());
  246. result.put("Detail", new JSONObject(map));
  247. PrintWriter out = response.getWriter();
  248. out.print(result);
  249. out.flush();
  250. out.close();
  251. } catch (Exception e) {
  252. // TODO Auto-generated catch block
  253. e.printStackTrace();
  254. }
  255. }
  256. //判断哪些还没有打分,split后面是用例表中不存在的bug
  257. @RequestMapping(value = "/diff")
  258. @ResponseBody
  259. public void getDiff(String case_take_id, HttpServletResponse response) {
  260. try {
  261. PrintWriter out = response.getWriter();
  262. JSONObject result = new JSONObject();
  263. List<String> list = aservice.getDiff(case_take_id);
  264. result.put("Count", list.size());
  265. result.put("Detail", new JSONArray(list));
  266. out.print(result);
  267. out.flush();
  268. out.close();
  269. } catch (Exception e) {
  270. // TODO Auto-generated catch block
  271. e.printStackTrace();
  272. }
  273. }
  274. //获取路径信息
  275. @RequestMapping(value = "/path")
  276. @ResponseBody
  277. public void getUserPath(String case_take_id, String report_id, HttpServletResponse response) {
  278. try {
  279. PrintWriter out = response.getWriter();
  280. JSONObject result = new JSONObject();
  281. result.put("all", filter(aservice.getBugDetail(case_take_id)));
  282. result.put("self", filter(rservice.getUserPath(report_id, case_take_id)));
  283. out.print(result);
  284. out.flush();
  285. out.close();
  286. } catch (Exception e) {
  287. // TODO Auto-generated catch block
  288. e.printStackTrace();
  289. }
  290. }
  291. private Map<String, Integer> filter(Map<String, Integer> maps) {
  292. Map<String, Integer> result = new HashMap<String, Integer>();
  293. for(Map.Entry<String, Integer> entry : maps.entrySet()) {
  294. String[] pages = entry.getKey().split("-");
  295. if(pages.length > 0) {
  296. String key = pages[pages.length - 1];
  297. result.put(key, result.getOrDefault(key, 0) + entry.getValue());
  298. }
  299. }
  300. return result;
  301. }
  302. @RequestMapping(value = "/afterSimilarBug")
  303. @ResponseBody
  304. public void getAfterSimilarBug(String bug_id, HttpServletResponse response){
  305. try {
  306. PrintWriter out = response.getWriter();
  307. JSONObject result = new JSONObject();
  308. result.put("bugList",aservice.getAfterSimilarBug(bug_id));
  309. out.print(result);
  310. out.flush();
  311. out.close();
  312. } catch (Exception e) {
  313. e.printStackTrace();
  314. }
  315. }
  316. @RequestMapping(value = "/analyseExam")
  317. @ResponseBody
  318. public void analyseExam(String caseId, String taskId, HttpServletResponse response){
  319. try {
  320. PrintWriter out = response.getWriter();
  321. AnalyseVO analyseVO=aservice.getReviewAnalyseVO(caseId, taskId);
  322. out.print(new JSONObject(analyseVO));
  323. out.flush();
  324. out.close();
  325. } catch (Exception e) {
  326. e.printStackTrace();
  327. }
  328. }
  329. /**
  330. * todo 引进 guvva 来做缓存
  331. * @param caseId
  332. * @param taskId
  333. * @param workId
  334. * @param response
  335. */
  336. @RequestMapping(value = "/analysePeople")
  337. @ResponseBody
  338. public void analysePeople(String caseId, String taskId, String workId , HttpServletResponse response){
  339. try {
  340. response.setCharacterEncoding("utf-8");
  341. response.setContentType("text/html;charset=utf-8");
  342. PrintWriter out = response.getWriter();
  343. AnalysePeopleVO analyseVO=aservice.getReviewAnalysePeopleVO(caseId, taskId,workId);
  344. out.print(new JSONObject(analyseVO));
  345. out.flush();
  346. out.close();
  347. } catch (Exception e) {
  348. e.printStackTrace();
  349. }
  350. }
  351. @RequestMapping(value = "/analyse/getTaskToken")
  352. @ResponseBody
  353. public String getAnalyseTaskToken(String caseId,String taskId,HttpServletResponse response ){
  354. return AESUtil.encrypt("taskId="+taskId+"&caseId="+caseId);
  355. }
  356. @RequestMapping(value = "/analyse/task")
  357. public void analyseTask(String token, HttpServletResponse response ){
  358. String realUrl = AESUtil.decrypt(token);
  359. String [] decoder = url2decode(realUrl);
  360. analyseExam2(decoder[1],decoder[0],response);
  361. // return "redirect:/analyze/analyseExam2?"+realUrl;
  362. }
  363. /**
  364. * todo 引进 guvva 来做缓存
  365. * @param workId
  366. * @param response
  367. */
  368. @RequestMapping(value = "/analyse/people")
  369. public void analyseSinglePeople(String token, String workId , HttpServletResponse response){
  370. String realUrl = AESUtil.decrypt(token);
  371. String [] decoder = url2decode(realUrl);
  372. analysePeople(decoder[1],decoder[0],workId,response);
  373. // return "redirect:/analyze/analysePeople?"+realUrl+"&workId="+workId;
  374. }
  375. @RequestMapping(value = "/historicalData")
  376. @ResponseBody
  377. public HistoricalDataVO getHistoricalData(Long workerId,int caseTypeId){
  378. return aservice.getHistoricalData(workerId, caseTypeId);
  379. }
  380. @RequestMapping(value = "/uploadTestReportToBlockChain")
  381. @ResponseBody
  382. public void uploadTestReport(String bug_id,HttpServletResponse response){
  383. try {
  384. PrintWriter out = response.getWriter();
  385. JSONObject result = new JSONObject();
  386. if (blockChainAspect.uploadTestReportInfoToBlockChain(bug_id)) {
  387. result.put("status","200");
  388. }else{
  389. result.put("status","500");
  390. }
  391. out.print(result);
  392. out.flush();
  393. out.close();
  394. }catch (IOException e){
  395. e.printStackTrace();
  396. }
  397. }
  398. @RequestMapping(value = "/analyseExam2", method = RequestMethod.GET)
  399. @ResponseBody
  400. public void analyseExam2(@RequestParam("caseId") String caseId, @RequestParam("taskId") String taskId, HttpServletResponse response){
  401. try {
  402. response.setCharacterEncoding("utf-8");
  403. response.setContentType("text/html;charset=utf-8");
  404. PrintWriter out = response.getWriter();
  405. AnalyseVO2 analyseVO=aservice.getReviewAnalyseVO2(caseId, taskId);
  406. out.print(new JSONObject(analyseVO));
  407. out.flush();
  408. out.close();
  409. } catch (Exception e) {
  410. e.printStackTrace();
  411. }
  412. }
  413. @RequestMapping(value = "/analysePageCover", method = RequestMethod.GET)
  414. @ResponseBody
  415. public void analysePageCover(@RequestParam("caseId") String caseId, @RequestParam("taskId") String taskId, HttpServletResponse response){
  416. try {
  417. response.setCharacterEncoding("utf-8");
  418. response.setContentType("text/html;charset=utf-8");
  419. PrintWriter out = response.getWriter();
  420. Map<String,Integer>map=aservice.getPageCover(taskId, caseId);
  421. out.print(new JSONObject(map));
  422. out.flush();
  423. out.close();
  424. } catch (Exception e) {
  425. e.printStackTrace();
  426. }
  427. }
  428. @RequestMapping(value = "/analyseBugInfo", method = RequestMethod.GET)
  429. @ResponseBody
  430. public void analyseBugInfo(@RequestParam("caseId") String caseId, @RequestParam("taskId") String taskId, HttpServletResponse response){
  431. try {
  432. response.setCharacterEncoding("utf-8");
  433. response.setContentType("text/html;charset=utf-8");
  434. PrintWriter out = response.getWriter();
  435. int[][]bugInfo=aservice.getBugInfo(taskId, caseId);
  436. JSONArray res = new JSONArray();
  437. for(int i =0;i<bugInfo.length;i++){
  438. for(int j =0;j<bugInfo[0].length;j++){
  439. if(bugInfo[i][j]!=0){
  440. JSONArray temp = new JSONArray();
  441. temp.put(BugSeverity.getValue(i));
  442. temp.put(BugRecurrent.getValue(j));
  443. temp.put(bugInfo[i][j]);
  444. temp.put(bugInfo[i][j]+"个");
  445. temp.put("报告数量 ");
  446. res.put(temp);
  447. }
  448. }
  449. }
  450. out.print(res);
  451. out.flush();
  452. out.close();
  453. } catch (Exception e) {
  454. e.printStackTrace();
  455. }
  456. }
  457. @RequestMapping(value = "/analyse/BugInfo", method = RequestMethod.GET)
  458. public void analyseBugInfoByToken(@RequestParam("token") String token, HttpServletResponse response){
  459. try {
  460. String realUrl = AESUtil.decrypt(token);
  461. String [] decoder = url2decode(realUrl);
  462. analyseBugInfo(decoder[1],decoder[0],response);
  463. } catch (Exception e) {
  464. e.printStackTrace();
  465. }
  466. }
  467. @RequestMapping(value = "/analyseBugSubmitInfo", method = RequestMethod.GET)
  468. public void analyseBugSubmitInfo(@RequestParam("caseId") String caseId, @RequestParam("taskId") String taskId,@RequestParam("piece") int piece, HttpServletResponse response){
  469. try {
  470. response.setCharacterEncoding("utf-8");
  471. response.setContentType("text/html;charset=utf-8");
  472. PrintWriter out = response.getWriter();
  473. Map<String,Integer>map=aservice.getBugSubmitInfo(taskId,caseId,piece);
  474. JSONObject res = new JSONObject();
  475. JSONArray label = new JSONArray(map.keySet());
  476. JSONArray data = new JSONArray(map.values());
  477. res.put("label",label);
  478. res.put("data",data);
  479. out.print(res);
  480. out.flush();
  481. out.close();
  482. } catch (Exception e) {
  483. e.printStackTrace();
  484. }
  485. }
  486. @RequestMapping(value = "/analyse/BugSubmitInfo", method = RequestMethod.GET)
  487. @ResponseBody
  488. public void analyseBugSubmitInfoByToken(@RequestParam("token") String token ,@RequestParam("piece") int piece, HttpServletResponse response){
  489. try {
  490. String realUrl = AESUtil.decrypt(token);
  491. String [] decoder = url2decode(realUrl);
  492. analyseBugSubmitInfo(decoder[1],decoder[0],piece,response);
  493. } catch (Exception e) {
  494. e.printStackTrace();
  495. }
  496. }
  497. /**
  498. * 根据token获取众测任务具体信息
  499. * @param token
  500. * @param response
  501. */
  502. @RequestMapping(value = "/tokenToDetail")
  503. @ResponseBody
  504. public void tokenToDetailUrl(String token ,HttpServletResponse response){
  505. try {
  506. JSONObject result = new JSONObject();
  507. ShortToken shortToken=aservice.tokenToDetail(token);
  508. if(shortToken==null){
  509. result.put("result","fail");
  510. result.put("cause","no such token");
  511. }else {
  512. result.put("result", "success");
  513. result.put("examId",shortToken.getExamId());
  514. result.put("caseId",shortToken.getCaseId());
  515. result.put("userId",shortToken.getUserId());
  516. result.put("beginTime",shortToken.getBeginTime());
  517. result.put("endTime",shortToken.getEndTime());
  518. }
  519. PrintWriter out = response.getWriter();
  520. out.print(result);
  521. out.flush();
  522. out.close();
  523. } catch (Exception e) {
  524. e.printStackTrace();
  525. }
  526. }
  527. /**
  528. * 根据众测信息获取对应token
  529. * @param examId
  530. * @param caseId
  531. * @param userId
  532. * @param beginTime
  533. * @param endTime
  534. * @return
  535. */
  536. @RequestMapping(value = "/detailToToken")
  537. @ResponseBody
  538. public String detailToToken(String examId,String caseId,String userId,String beginTime,String endTime){
  539. JSONObject result = new JSONObject();
  540. try {
  541. ShortToken shortToken=aservice.findTokenByDetail(examId,caseId,userId);
  542. if(shortToken==null){
  543. // String token=AESUtil.encrypt(examId+"/"+caseId+"/"+userId);
  544. String token= DigestUtils.md5DigestAsHex((examId+"/"+caseId+"/"+userId).getBytes());
  545. ShortToken newShortToken=new ShortToken(token,beginTime,endTime,caseId,examId,userId,true);
  546. aservice.saveShortToken(newShortToken);
  547. result.put("result","success");
  548. result.put("token",token);
  549. }else{
  550. shortToken.setBeginTime(beginTime);
  551. shortToken.setEndTime(endTime);
  552. aservice.saveShortToken(shortToken);
  553. result.put("result","success");
  554. result.put("token",shortToken.getToken());
  555. }
  556. return result.toString();
  557. } catch (Exception e) {
  558. e.printStackTrace();
  559. }
  560. result.put("result","fail");
  561. return result.toString();
  562. }
  563. @RequestMapping(value = "/progress", method = RequestMethod.GET)
  564. @ResponseBody
  565. public Double crowdTestProgress(String token){
  566. String realUrl = AESUtil.decrypt(token);
  567. String [] decoder = url2decode(realUrl);
  568. String taskId=decoder[0];
  569. String caseId=decoder[1];
  570. Task task=taskDao.findById(taskId);
  571. if(task.getEnd_time()>System.currentTimeMillis()){
  572. return aservice.crowdTestProgressFromDB(caseId,taskId);
  573. }else{
  574. return aservice.crowdTestProgress(caseId,taskId);
  575. }
  576. }
  577. private String [] url2decode(String str){
  578. log.info("#AnalyseController url2decode(): "+str);
  579. String [] res = new String[2];
  580. String [] temp = str.split("&");
  581. if(temp[0].startsWith("taskId=")){
  582. res[0] = temp[0].substring(7);
  583. }
  584. if(temp[1].startsWith("caseId=")){
  585. res[1] = temp[1].substring(7);
  586. }
  587. return res;
  588. }
  589. }