RecommendController.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. package edu.nju.controller;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.util.*;
  5. import javax.servlet.http.HttpServletResponse;
  6. import javax.servlet.http.HttpSession;
  7. import org.json.JSONArray;
  8. import org.json.JSONObject;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Controller;
  13. import org.springframework.web.bind.annotation.CrossOrigin;
  14. import org.springframework.web.bind.annotation.RequestMapping;
  15. import org.springframework.web.bind.annotation.ResponseBody;
  16. import edu.nju.entities.Bug;
  17. import edu.nju.entities.BugMirror;
  18. import edu.nju.service.DivRecService;
  19. import edu.nju.service.HistoryService;
  20. import edu.nju.service.RecommendService;
  21. import edu.nju.service.UserBasedService;
  22. import java.util.Map.Entry;
  23. @Controller
  24. @RequestMapping(value = "/rec")
  25. @CrossOrigin(origins = "*", maxAge = 3600, allowCredentials = "true")
  26. public class RecommendController {
  27. @Autowired
  28. RecommendService recservice;
  29. @Autowired
  30. HistoryService historyservice;
  31. @Autowired
  32. UserBasedService ubservice;
  33. @Autowired
  34. DivRecService divservice;
  35. /**
  36. * 每次刷新或进入填写页面,都应该调用一次该方法,因为其中包含了一些初始化操作
  37. * @param case_take_id
  38. * @return 该题目下排完序的BugMirror类的列表
  39. */
  40. @RequestMapping(value = "/getList")
  41. @ResponseBody
  42. public void getList(String case_take_id, String report_id, HttpSession session, HttpServletResponse response) {
  43. try {
  44. if(session.getAttribute("rec") != null) {
  45. session.removeAttribute("rec");
  46. }
  47. if(session.getAttribute("page") != null) {
  48. session.removeAttribute("page");
  49. }
  50. if(session.getAttribute("path") != null) {
  51. session.removeAttribute("path");
  52. }
  53. if(session.getAttribute("title") != null) {
  54. session.removeAttribute("title");
  55. }
  56. if(session.getAttribute("des") != null) {
  57. session.removeAttribute("des");
  58. }
  59. session.setAttribute("case", case_take_id);
  60. session.setAttribute("report", report_id);
  61. PrintWriter out = response.getWriter();
  62. List<BugMirror> mirrors = recservice.getList(case_take_id, report_id);
  63. filter(historyservice.getNew(case_take_id, report_id), mirrors);
  64. out.print(new JSONArray(mirrors));
  65. out.flush();
  66. out.close();
  67. } catch (IOException e) {
  68. // TODO Auto-generated catch block
  69. e.printStackTrace();
  70. }
  71. }
  72. /**
  73. * 用户点击查看一个Bug的详细信息
  74. * @param id
  75. * @return Bug类
  76. */
  77. @RequestMapping(value = "/getDetail")
  78. @ResponseBody
  79. public void getDetail(String id, HttpServletResponse response) {
  80. JSONObject result = new JSONObject();
  81. try {
  82. Bug bug = recservice.getDetail(id);
  83. if(bug != null) {
  84. result.put("detail", new JSONObject(bug));
  85. result.put("history", new JSONObject(historyservice.getHistory(id)));
  86. result.put("mirror", new JSONObject(recservice.getMirror(id)));
  87. }
  88. PrintWriter out = response.getWriter();
  89. out.print(result);
  90. out.flush();
  91. out.close();
  92. } catch (IOException e) {
  93. // TODO Auto-generated catch block
  94. e.printStackTrace();
  95. }
  96. }
  97. /**
  98. * 用户编辑bug时推荐相似bug
  99. * 用户点击六个类别之后,都使用该接口
  100. * @param type("category", "severity", "recurrent", "page1", "page2", "page3"), content
  101. * @return List<BugMirror>
  102. */
  103. @RequestMapping(value = "/recommend")
  104. @ResponseBody
  105. public void recommend(String case_take_id, String type, String content, HttpSession session, HttpServletResponse response) {
  106. try {
  107. JSONObject result = new JSONObject();
  108. PrintWriter out = response.getWriter();
  109. List<BugMirror> mirror1 = new ArrayList<BugMirror>();
  110. List<Float> scores = new ArrayList<Float>();
  111. Set<BugMirror> mirror2 = new HashSet<BugMirror>();
  112. Map<BugMirror, Float> map;
  113. System.out.println(type);
  114. System.out.println(content);
  115. if(type.equals("title") || type.equals("description")) {
  116. if(type.equals("title")) {map = recservice.recommandByTitle(content, session);}
  117. else {map = recservice.recommandByDes(content, session);}
  118. if(mirror1 != null) {
  119. mirror1.addAll(map.keySet());
  120. scores.addAll(map.values());
  121. }
  122. } else {
  123. if(type.contains("page")) {map = recservice.recommndByPage(case_take_id, type, content, true, session);}
  124. else {map = recservice.recommend(case_take_id, type, content, true, session);}
  125. List<String> reports = new ArrayList<String>();
  126. reports.add((String)session.getAttribute("report"));
  127. if(mirror1 != null) {
  128. mirror1.addAll(map.keySet());
  129. scores.addAll(map.values());
  130. }
  131. // for(int i = 1; i <= mirror1.size(); i ++) {
  132. // String temp = recservice.getReport(mirror1.get(i - 1).getId());
  133. // if(!reports.contains(temp)) {reports.add(temp);}
  134. // }
  135. // mirror2.addAll(ubservice.UserBased(reports.toArray(new String[reports.size()])));
  136. }
  137. // mirror2.addAll(historyservice.getNew(case_take_id, (String)session.getAttribute("report")));
  138. // filter(mirror2, mirror1);
  139. List<BugMirror> resultMirror = new ArrayList<BugMirror>();
  140. List<Float> resultScore = new ArrayList<Float>();
  141. Map<BugMirror,Float> hashMap=new HashMap<>();
  142. for(int i=0;i<mirror1.size();i++){
  143. hashMap.put(mirror1.get(i),scores.get(i));
  144. }
  145. //根据score排序
  146. List<Entry<BugMirror, Float>> tList = new ArrayList<>(hashMap.entrySet());
  147. tList.sort((a, b) -> (Float.compare(b.getValue(), a.getValue())));
  148. //最多展示前六项分数最高的
  149. for (int i = 0; i < 6 && i < tList.size(); i++) {
  150. Entry<BugMirror, Float> entry = tList.get(i);
  151. resultMirror.add(entry.getKey());
  152. resultScore.add(entry.getValue());
  153. }
  154. result.put("same", new JSONArray(resultMirror));
  155. result.put("scores", new JSONArray(resultScore));
  156. result.put("new", new JSONArray(mirror2));
  157. // System.out.println("result:"+result);
  158. recservice.createSimilarBugLog(session,resultMirror,resultScore);
  159. out.print(result);
  160. out.flush();
  161. out.close();
  162. } catch (IOException e) {
  163. // TODO Auto-generated catch block
  164. e.printStackTrace();
  165. }
  166. }
  167. @RequestMapping(value = "/diversity")
  168. @ResponseBody
  169. public void diversityRec(String case_take_id, String report_id, HttpServletResponse response) {
  170. try {
  171. PrintWriter out = response.getWriter();
  172. out.println(new JSONArray(divservice.diverseRec(report_id, case_take_id)));
  173. out.flush();
  174. out.close();
  175. } catch (Exception e) {
  176. e.printStackTrace();
  177. }
  178. }
  179. //获取标题
  180. @RequestMapping(value = "/title")
  181. @ResponseBody
  182. public void getTitle(String id, HttpServletResponse response) {
  183. try {
  184. PrintWriter out = response.getWriter();
  185. out.print(recservice.getTitle(id));
  186. out.flush();
  187. out.close();
  188. } catch (Exception e) {
  189. // TODO Auto-generated catch block
  190. e.printStackTrace();
  191. }
  192. }
  193. //fork时,传回所有的选择参数
  194. @RequestMapping(value = "/fork")
  195. @ResponseBody
  196. public void fork(String page1, String page2, String page3, String bug_category, String severity, String recurrent, HttpSession session, HttpServletResponse response) {
  197. try {
  198. PrintWriter out = response.getWriter();
  199. JSONObject result = new JSONObject();
  200. Map<String, String> map = new LinkedHashMap<String, String>();
  201. if(!page1.equals("null")) {map.put("page1", page1);}
  202. if(!page2.equals("null")) {map.put("page2", page2);}
  203. if(!page3.equals("null")) {map.put("page3", page3);}
  204. map.put("bug_category", bug_category);
  205. map.put("severity", severity);
  206. map.put("recurrent", recurrent);
  207. session.setAttribute("path", map);
  208. result.put("status", 200);
  209. out.print(result);
  210. out.flush();
  211. out.close();
  212. } catch (Exception e) {
  213. // TODO Auto-generated catch block
  214. e.printStackTrace();
  215. }
  216. }
  217. public static void filter(List<BugMirror> a, List<BugMirror> b) {
  218. if(a == null) {return;}
  219. for(BugMirror a1: a) {
  220. boolean flag = true;
  221. for(BugMirror b1 : b) {
  222. if(a1.getId().equals(b1.getId())) {flag = false;}
  223. }
  224. if(flag) {b.add(a1);}
  225. }
  226. }
  227. public static void filter(Set<BugMirror> a, List<BugMirror> b) {
  228. if(a == null || b == null) {return;}
  229. for(BugMirror mirror : b) {
  230. if(a.contains(mirror)) {a.remove(mirror);}
  231. }
  232. }
  233. }