package edu.nju.controller; import java.io.IOException; import java.io.PrintWriter; import java.net.URLDecoder; import java.util.*; import javax.servlet.http.HttpServletResponse; import edu.nju.dao.TaskDao; import edu.nju.entities.Task; import edu.nju.entities.ShortToken; import edu.nju.model.*; import edu.nju.util.AESUtil; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.DigestUtils; import org.springframework.web.bind.annotation.*; import edu.nju.service.AnalyzeService; import edu.nju.service.ReportService; /** * 分析接口 /analyze */ @Controller @RequestMapping(value = "/analyze") @CrossOrigin(origins = "*", maxAge = 3600, allowCredentials = "true") public class AnalyzeController { @Autowired AnalyzeService aservice; @Autowired ReportService rservice; // @Autowired // BlockChainAspect blockChainAspect; @Autowired TaskDao taskDao; Logger log= LoggerFactory.getLogger(AnalyzeController.class); //根据用例获取所有有效bug @RequestMapping(value = "/valid") @ResponseBody public void getValid(String case_take_id, HttpServletResponse response) { try { PrintWriter out = response.getWriter(); JSONObject result = new JSONObject(); List list = aservice.getValid(case_take_id); result.put("Count", list.size()); result.put("Detail", new JSONArray(list)); out.print(result); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //根据用例获取所有有效bug @RequestMapping(value = "/validByBugId") @ResponseBody public void getValidByBugId(String id, HttpServletResponse response) { try { PrintWriter out = response.getWriter(); JSONObject result = new JSONObject(); List list = aservice.getValidByBugId(id); result.put("Count", list.size()); result.put("Detail", new JSONArray(list)); out.print(result); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //根据用例获取所有有效bug @RequestMapping(value = "/bugData") @ResponseBody public List getBugDataVO(String case_take_id) { return aservice.getBugDataVO(case_take_id); } //获取所有有点赞记录的bug @RequestMapping(value = "/thums") @ResponseBody public void getThums(String case_take_id, HttpServletResponse response) { try { JSONObject result = new JSONObject(); PrintWriter out = response.getWriter(); Map map = aservice.getThums(case_take_id); result.put("Count", map.size()); result.put("Detail", new JSONObject(map)); out.print(result); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 47.99.140.117:9001/Bug/api/analyze/scores * * @param case_take_id * caseId - taskId,示例1632-2927 * @return [{"名字":"庄坤涛","report_id":"10010000035757","报告得分":28,"审查得分":4,"worker_id":"39669"}] */ @RequestMapping(value = "/scores") @ResponseBody public void getScores(String case_take_id, HttpServletResponse response) { try { PrintWriter out = response.getWriter(); out.print(aservice.getScores(case_take_id)); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 47.99.140.117:9001/Bug/api/analyze/newScores * * @param case_take_id * caseId - taskId,示例1632-2927 * @return [{"名字":"庄坤涛","report_id":"10010000035757","报告得分":28,"审查得分":4,"worker_id":"39669"}] */ @RequestMapping(value = "/newScores") @ResponseBody public void getNewScores(String case_take_id, HttpServletResponse response) { try { PrintWriter out = response.getWriter(); out.print(aservice.getNewScores(aservice.getScores(case_take_id))); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //获取所有的参与用户,这个方法之前写的,ms有点问题啊 @RequestMapping(value = "/users") @ResponseBody public void getUsers(String case_take_id, HttpServletResponse response) { try { PrintWriter out = response.getWriter(); out.print(new JSONArray(aservice.getReports(case_take_id))); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //真正获取所有的参与用户 @RequestMapping(value = "/workers") @ResponseBody public List getUserss(Long examId) { return aservice.getUsers(String.valueOf(examId)); } //获取指定bug的打分等级 @RequestMapping(value = "/grade") @ResponseBody public void getGrade(String id, HttpServletResponse response) { try { JSONObject result = new JSONObject(); result.put("grade", aservice.getGrade(id)); PrintWriter out = response.getWriter(); out.print(result); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //存储单个bug的打分等级 @RequestMapping(value = "/save") @ResponseBody public void saveGrade(String id, String grade, HttpServletResponse response) { try { JSONObject result = new JSONObject(); if(aservice.saveGrade(id, Integer.parseInt(grade))) {result.put("status", "200");} else {result.put("status", "500");} PrintWriter out = response.getWriter(); out.print(result); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @RequestMapping(value = "/saveSimiliar") @ResponseBody public void saveSimiliarGrade(String id, String grade,String similiarBug, HttpServletResponse response) { try { JSONObject result = new JSONObject(); if(aservice.saveSimiliarGrade(id, Integer.parseInt(grade),similiarBug)) {result.put("status", "200");} else {result.put("status", "500");} PrintWriter out = response.getWriter(); out.print(result); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @RequestMapping(value = "/saveByWorker") @ResponseBody public void saveGradeByWorker(String id,String worker_id, String grade, HttpServletResponse response) { try { JSONObject result = new JSONObject(); if(aservice.saveGradeByWorker(id, worker_id,Integer.parseInt(grade))) {result.put("status", "200");} else {result.put("status", "500");} PrintWriter out = response.getWriter(); out.print(result); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //获取页面和种类的分布情况 @RequestMapping(value = "/bugDetail") @ResponseBody public void getDetail(String case_take_id, HttpServletResponse response) { try { PrintWriter out = response.getWriter(); out.print(aservice.getCaseDetail(case_take_id)); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //获取所有打分等级 @RequestMapping(value = "/allGrades") @ResponseBody public void getAllGrades(String case_take_id, HttpServletResponse response) { try { JSONObject result = new JSONObject(); Map map = aservice.getAllGrades(case_take_id); result.put("Count", map.size()); result.put("Detail", new JSONObject(map)); PrintWriter out = response.getWriter(); out.print(result); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //判断哪些还没有打分,split后面是用例表中不存在的bug @RequestMapping(value = "/diff") @ResponseBody public void getDiff(String case_take_id, HttpServletResponse response) { try { PrintWriter out = response.getWriter(); JSONObject result = new JSONObject(); List list = aservice.getDiff(case_take_id); result.put("Count", list.size()); result.put("Detail", new JSONArray(list)); out.print(result); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 获取路径信息 /path 返回整个导图,以及已点亮的导图页面 * @param case_take_id 案例-任务id * @param report_id 报告id * @param response */ @RequestMapping(value = "/path") @ResponseBody public void getUserPath(String case_take_id, String report_id, HttpServletResponse response) { try { PrintWriter out = response.getWriter(); JSONObject result = new JSONObject(); result.put("all", filter(aservice.getBugDetail(case_take_id))); result.put("self", filter(rservice.getUserPath(report_id, case_take_id))); out.print(result); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private Map filter(Map maps) { Map result = new HashMap(); for(Map.Entry entry : maps.entrySet()) { String[] pages = entry.getKey().split("-"); if(pages.length > 0) { String key = pages[pages.length - 1]; result.put(key, result.getOrDefault(key, 0) + entry.getValue()); } } return result; } @RequestMapping(value = "/afterSimilarBug") @ResponseBody public void getAfterSimilarBug(String bug_id, HttpServletResponse response){ try { PrintWriter out = response.getWriter(); JSONObject result = new JSONObject(); result.put("bugList",aservice.getAfterSimilarBug(bug_id)); out.print(result); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } @RequestMapping(value = "/analyseExam") @ResponseBody public void analyseExam(String caseId, String taskId, HttpServletResponse response){ try { PrintWriter out = response.getWriter(); AnalyseVO analyseVO=aservice.getReviewAnalyseVO(caseId, taskId); out.print(new JSONObject(analyseVO)); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } /** * todo 引进 guvva 来做缓存 * @param caseId * @param taskId * @param workId * @param response */ @RequestMapping(value = "/analysePeople") @ResponseBody public void analysePeople(String caseId, String taskId, String workId , HttpServletResponse response){ try { response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); AnalysePeopleVO analyseVO=aservice.getReviewAnalysePeopleVO(caseId, taskId,workId); out.print(new JSONObject(analyseVO)); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } @RequestMapping(value = "/analyse/getTaskToken") @ResponseBody public String getAnalyseTaskToken(String caseId,String taskId,HttpServletResponse response ){ return AESUtil.encrypt("taskId="+taskId+"&caseId="+caseId); } /** * * @param token * @param response */ @RequestMapping(value = "/analyse/task") public void analyseTask(String token, HttpServletResponse response ){ String realUrl = AESUtil.decrypt(token); System.out.println("realUrl " + realUrl); String [] decoder = url2decode(realUrl); analyseExam2(decoder[1],decoder[0],response); // return "redirect:/analyze/analyseExam2?"+realUrl; } /** * todo 引进 guvva 来做缓存 * @param workId * @param response */ @RequestMapping(value = "/analyse/people") public void analyseSinglePeople(String token, String workId , HttpServletResponse response){ String realUrl = AESUtil.decrypt(token); String [] decoder = url2decode(realUrl); analysePeople(decoder[1],decoder[0],workId,response); // return "redirect:/analyze/analysePeople?"+realUrl+"&workId="+workId; } @RequestMapping(value = "/historicalData") @ResponseBody public HistoricalDataVO getHistoricalData(Long workerId,int caseTypeId){ return aservice.getHistoricalData(workerId, caseTypeId); } // @RequestMapping(value = "/uploadTestReportToBlockChain") // @ResponseBody // public void uploadTestReport(String bug_id,HttpServletResponse response){ // try { // PrintWriter out = response.getWriter(); // JSONObject result = new JSONObject(); // if (blockChainAspect.uploadTestReportInfoToBlockChain(bug_id)) { // result.put("status","200"); // }else{ // result.put("status","500"); // } // out.print(result); // out.flush(); // out.close(); // }catch (IOException e){ // e.printStackTrace(); // } // } @RequestMapping(value = "/analyseExam2", method = RequestMethod.GET) @ResponseBody public void analyseExam2(@RequestParam("caseId") String caseId, @RequestParam("taskId") String taskId, HttpServletResponse response){ try { response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); AnalyseVO2 analyseVO=aservice.getReviewAnalyseVO2(caseId, taskId); out.print(new JSONObject(analyseVO)); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } @RequestMapping(value = "/analysePageCover", method = RequestMethod.GET) @ResponseBody public void analysePageCover(@RequestParam("caseId") String caseId, @RequestParam("taskId") String taskId, HttpServletResponse response){ try { response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); Mapmap=aservice.getPageCover(taskId, caseId); out.print(new JSONObject(map)); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } @RequestMapping(value = "/analyseBugInfo", method = RequestMethod.GET) @ResponseBody public void analyseBugInfo(@RequestParam("caseId") String caseId, @RequestParam("taskId") String taskId, HttpServletResponse response){ try { response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); int[][]bugInfo=aservice.getBugInfo(taskId, caseId); JSONArray res = new JSONArray(); for(int i =0;imap=aservice.getBugSubmitInfo(taskId,caseId,piece); JSONObject res = new JSONObject(); JSONArray label = new JSONArray(map.keySet()); JSONArray data = new JSONArray(map.values()); res.put("label",label); res.put("data",data); out.print(res); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); JSONObject res = new JSONObject(); res.put("label",new JSONArray()); res.put("data",new JSONArray()); out.print(res); out.flush(); out.close(); } } @RequestMapping(value = "/analyse/BugSubmitInfo", method = RequestMethod.GET) @ResponseBody public void analyseBugSubmitInfoByToken(@RequestParam("token") String token ,@RequestParam("piece") int piece, HttpServletResponse response){ try { String realUrl = AESUtil.decrypt(token); String [] decoder = url2decode(realUrl); analyseBugSubmitInfo(decoder[1],decoder[0],piece,response); } catch (Exception e) { e.printStackTrace(); } } /** * 根据token获取众测任务具体信息 * @param token * @param response */ @GetMapping(value = "/tokenToDetail") @ResponseBody public void tokenToDetailUrl(String token ,HttpServletResponse response){ try { JSONObject result = new JSONObject(); ShortToken shortToken=aservice.tokenToDetail(token); if(shortToken==null){ result.put("result","fail"); result.put("cause","身份验证失败,请重新点击按钮进入答题页面"); }else { //有效 if(shortToken.isDisabled()){ shortToken.setDisabled(false); // aservice.saveShortToken(shortToken); aservice.deleteShortToken(shortToken); result.put("result", "success"); result.put("examId",shortToken.getExamId()); result.put("caseId",shortToken.getCaseId()); result.put("userId",shortToken.getUserId()); result.put("roleId",shortToken.getRoleId()); result.put("beginTime",shortToken.getBeginTime()); result.put("endTime",shortToken.getEndTime()); } //无效 else{ result.put("result","fail"); result.put("cause","身份验证失败,请重新点击按钮进入答题页面"); } } PrintWriter out = response.getWriter(); out.print(result); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 根据众测信息获取对应token * @param examId * @param caseId * @param userId * @param beginTime * @param endTime * @param roleId 0-学生 1-教师 * @return */ @GetMapping(value = "/detailToToken") @ResponseBody public String detailToToken(String examId,String caseId,String userId, int roleId, String beginTime,String endTime){ JSONObject result = new JSONObject(); try { String token= DigestUtils.md5DigestAsHex((UUID.randomUUID().toString()).getBytes()); ShortToken newShortToken=new ShortToken(token,beginTime,endTime,caseId,examId,userId,roleId,true); aservice.saveShortToken(newShortToken); result.put("result","success"); result.put("token",newShortToken.getToken()); return result.toString(); } catch (Exception e) { e.printStackTrace(); } result.put("result","fail"); return result.toString(); } // // 修改前版本 // /** // * 根据token获取众测任务具体信息 // * @param token // * @param response // */ // @RequestMapping(value = "/tokenToDetail") // @ResponseBody // public void tokenToDetailUrl(String token ,HttpServletResponse response){ // try { // JSONObject result = new JSONObject(); // ShortToken shortToken=aservice.tokenToDetail(token); // if(shortToken==null){ // result.put("result","fail"); // result.put("cause","no such token"); // }else { // result.put("result", "success"); // result.put("examId",shortToken.getExamId()); // result.put("caseId",shortToken.getCaseId()); // result.put("userId",shortToken.getUserId()); // result.put("beginTime",shortToken.getBeginTime()); // result.put("endTime",shortToken.getEndTime()); // } // PrintWriter out = response.getWriter(); // out.print(result); // out.flush(); // out.close(); // } catch (Exception e) { // e.printStackTrace(); // } // } // // /** // * 根据众测信息获取对应token // * @param examId // * @param caseId // * @param userId // * @param beginTime // * @param endTime // * @return // */ // @RequestMapping(value = "/detailToToken") // @ResponseBody // public String detailToToken(String examId,String caseId,String userId,String beginTime,String endTime){ // JSONObject result = new JSONObject(); // try { // ShortToken shortToken=aservice.findTokenByDetail(examId,caseId,userId); // if(shortToken==null){ //// String token=AESUtil.encrypt(examId+"/"+caseId+"/"+userId); // String token= DigestUtils.md5DigestAsHex((examId+"/"+caseId+"/"+userId).getBytes()); // ShortToken newShortToken=new ShortToken(token,beginTime,endTime,caseId,examId,userId,true); // aservice.saveShortToken(newShortToken); // result.put("result","success"); // result.put("token",token); // }else{ // shortToken.setBeginTime(beginTime); // shortToken.setEndTime(endTime); // aservice.saveShortToken(shortToken); // result.put("result","success"); // result.put("token",shortToken.getToken()); // } // return result.toString(); // } catch (Exception e) { // e.printStackTrace(); // } // result.put("result","fail"); // return result.toString(); // } @RequestMapping(value = "/progress", method = RequestMethod.GET) @ResponseBody public Double crowdTestProgress(String token){ // return 50.0; String realUrl = AESUtil.decrypt(token); String [] decoder = url2decode(realUrl); String taskId=decoder[0]; String caseId=decoder[1]; System.out.println("taskId " + taskId); try { Task task=taskDao.findById(taskId); if(task.getEnd_time()>System.currentTimeMillis()){ return aservice.crowdTestProgressFromDB(caseId,taskId); }else{ return aservice.crowdTestProgress(caseId,taskId); } }catch (Exception e){ System.out.println("taskId not found"); return 0.0; } } private String [] url2decode(String str){ log.info("#AnalyseController url2decode(): "+str); String [] res = new String[2]; String [] temp = str.split("&"); if(temp[0].startsWith("taskId=")){ res[0] = temp[0].substring(7); } if(temp[1].startsWith("caseId=")){ res[1] = temp[1].substring(7); } return res; } }