@Secured({"ROLE_DEVELOPER", "ROLE_TESTER"})
  @RequestMapping(value = "showBug/{bugId}.htm", method = RequestMethod.GET)
  public String showBug(@PathVariable Integer bugId, ModelMap map) {

    Bug bug = aService.findById(Bug.class, bugId);

    List<History> histories =
        aService.queryAllOfCondition(
            History.class,
            DetachedCriteria.forClass(History.class)
                .add(Restrictions.eq("objectType", "bug"))
                .add(Restrictions.eq("objectId", bug.getBugId()))
                .addOrder(Order.asc("operateTime")));
    List<Resource> resources =
        aService.queryAllOfCondition(
            Resource.class,
            DetachedCriteria.forClass(Resource.class)
                .add(Restrictions.eq("objectType", "bug"))
                .add(Restrictions.eq("objectId", bug.getBugId()))
                .addOrder(Order.asc("resourceId")));

    map.put("bug", bug);
    map.put("histories", histories);
    map.put("resources", resources);

    return "bug/showBug";
  }
  @Secured({"ROLE_DEVELOPER", "ROLE_TESTER"})
  @RequestMapping("goAddBug.htm")
  public ModelAndView goAddBug(HttpServletRequest request) {

    Company company = (Company) request.getSession().getAttribute("company");
    DetachedCriteria dCriteria = DetachedCriteria.forClass(Project.class);
    dCriteria.add(Restrictions.eq("company", company));
    List<Project> projectList = aService.queryAllOfCondition(Project.class, dCriteria);

    DetachedCriteria dCriteria1 = DetachedCriteria.forClass(Department.class);
    dCriteria1.add(Restrictions.eq("company", company));
    List<Department> deptList = aService.queryAllOfCondition(Department.class, dCriteria1);

    DetachedCriteria dCriteria2 = DetachedCriteria.forClass(Developer.class);
    dCriteria2.createCriteria("user").add(Restrictions.in("department", deptList));
    List<Developer> userList = aService.queryAllOfCondition(Developer.class, dCriteria2);

    DetachedCriteria dCriteria3 = DetachedCriteria.forClass(User.class);
    dCriteria3.add(Restrictions.in("department", deptList));
    List<User> userList1 = aService.queryAllOfCondition(User.class, dCriteria3);

    ModelMap map = new ModelMap();
    map.put("projectList", projectList);
    map.put("userList", userList);
    map.put("userList1", userList1);

    return new ModelAndView("/bug/addBug", map);
  }
 @Secured({"ROLE_DEVELOPER", "ROLE_TESTER"})
 @RequestMapping(value = "deleteResource.htm", method = RequestMethod.GET)
 public String deleteResource(@RequestParam Integer resourceId) {
   Resource resource = aService.findById(Resource.class, resourceId);
   Integer bugId = resource.getObjectId();
   File file = new File(path + resource.getResourceUrl());
   file.delete();
   aService.delete(resource);
   return "redirect:showBug.htm?bugId=" + bugId;
 }
 @RequestMapping("loadVersion.htm")
 public void loadVersion(HttpServletRequest request, HttpServletResponse response)
     throws Exception {
   String projectId = request.getParameter("projectId");
   Project project = aService.findById(Project.class, Integer.parseInt(projectId));
   DetachedCriteria dCriteria = DetachedCriteria.forClass(Version.class);
   dCriteria.add(Restrictions.eq("project", project));
   List<Version> list = new ArrayList<Version>();
   list = aService.queryAllOfCondition(Version.class, dCriteria);
   System.out.println("version list size " + list.size());
   JsonConfig config1 = new JsonConfig();
   config1.setExcludes(new String[] {"project", "tasks", "affectedVersions"});
   JSONArray json = JSONArray.fromObject(list, config1);
   PrintWriter pt = response.getWriter();
   pt.write(json.toString());
   pt.close();
 }
  @Secured({"ROLE_TESTER"})
  @RequestMapping(value = "openBug.htm", method = RequestMethod.GET)
  public String openBug(HttpServletRequest request, @RequestParam Integer bugId) {
    Bug bug = aService.findById(Bug.class, bugId);
    bug.setStatus("激活");
    bug.setResolution(null);
    aService.update(bug);

    History history = new History();
    Integer userId = (Integer) request.getSession().getAttribute("userId");
    logger.info("user id in session " + userId);
    history.setUser(aService.findById(User.class, userId));
    history.setObjectId(bug.getBugId());
    history.setObjectType("bug");
    history.setOperateTime(new Date());
    history.setOperation("激活");
    aService.save(history);

    return "redirect:showBug.htm?bugId=" + bugId;
  }
 @Secured({"ROLE_DEVELOPER", "ROLE_TESTER"})
 @RequestMapping(value = "addComment.htm", method = RequestMethod.POST)
 public void addBugComment(
     @RequestParam Integer objectId,
     @RequestParam String objectType,
     @RequestParam String comment,
     HttpServletRequest request,
     HttpServletResponse response)
     throws IOException {
   History history = new History();
   Integer userId = (Integer) request.getSession().getAttribute("userId");
   logger.info("user id in session " + userId);
   history.setUser(aService.findById(User.class, userId));
   history.setObjectId(objectId);
   history.setObjectType(objectType);
   history.setOperateTime(new Date());
   history.setOperation("添加了备注");
   history.setComment(comment);
   aService.save(history);
   response.getWriter().write("success");
 }
  @RequestMapping("loadModel.htm")
  public void loadModel(HttpServletRequest request, HttpServletResponse response) throws Exception {
    String projectId = request.getParameter("projectId");

    Project project = aService.findById(Project.class, Integer.parseInt(projectId));

    List<ModuleBean> moduleBean = ModuleUtil.getModuleNameList(aService, project);

    JSONArray json = JSONArray.fromObject(moduleBean);
    PrintWriter pt = response.getWriter();
    pt.write(json.toString());
    System.out.println(json.toString());
    pt.close();
  }
  @RequestMapping(value = "downloadResource.htm", method = RequestMethod.GET)
  public void downloadResource(HttpServletResponse response, @RequestParam Integer resourceId)
      throws IOException {

    Resource resource = aService.findById(Resource.class, resourceId);

    response.setCharacterEncoding("utf-8");
    response.setContentType("multipart/form-data");
    String fileName = resource.getResourceUrl();
    response.setHeader(
        "Content-Disposition",
        "attachment;fileName=" + fileName.substring(fileName.lastIndexOf("/") + 1));
    logger.info("download file name " + fileName.substring(fileName.lastIndexOf("/") + 1));
    InputStream inputStream = new FileInputStream(path + resource.getResourceUrl());
    OutputStream os = response.getOutputStream();
    byte[] b = new byte[1024];
    int length;
    while ((length = inputStream.read(b)) > 0) {
      os.write(b, 0, length);
    }
    inputStream.close();
  }
  @Secured({"ROLE_TESTER"})
  @RequestMapping("goBugFromUc.htm")
  public ModelAndView goBugFromUc(HttpServletRequest request) {

    String ucId = request.getParameter("usercaseId");
    UserCase uc = aService.findById(UserCase.class, Integer.parseInt(ucId));

    Company company = (Company) request.getSession().getAttribute("company");
    DetachedCriteria dCriteria = DetachedCriteria.forClass(Project.class);
    dCriteria.add(Restrictions.eq("company", company));
    List<Project> projectList = aService.queryAllOfCondition(Project.class, dCriteria);

    DetachedCriteria dCriteria1 = DetachedCriteria.forClass(Department.class);
    dCriteria1.add(Restrictions.eq("company", company));
    List<Department> deptList = aService.queryAllOfCondition(Department.class, dCriteria1);

    DetachedCriteria dCriteria2 = DetachedCriteria.forClass(Developer.class);
    dCriteria2.createCriteria("user").add(Restrictions.in("department", deptList));
    List<Developer> userList = aService.queryAllOfCondition(Developer.class, dCriteria2);

    DetachedCriteria dCriteria3 = DetachedCriteria.forClass(User.class);
    dCriteria3.add(Restrictions.in("department", deptList));
    List<User> userList1 = aService.queryAllOfCondition(User.class, dCriteria3);

    DetachedCriteria dCriteria4 = DetachedCriteria.forClass(Step.class);
    dCriteria4.add(Restrictions.eq("userCase", uc));
    List<Step> stepList = aService.queryAllOfCondition(Step.class, dCriteria4);

    ModelMap map = new ModelMap();

    map.put("projectList", projectList);
    map.put("userList", userList);
    map.put("userList1", userList1);
    map.put("uc", uc);
    map.put("stepList", stepList);

    return new ModelAndView("/usecase/ucToBug", map);
  }
  @Secured({"ROLE_TESTER"})
  @RequestMapping("addBugFromUC.htm")
  public ModelAndView addBugFromUC(HttpServletRequest request) throws Exception {
    User user = (User) request.getSession().getAttribute("user");

    String destinationDir = "E:\\workplace\\bugmanagement\\src\\main\\webapp\\source\\bug\\";

    MultipartHttpServletRequest multipartReq = (MultipartHttpServletRequest) request;

    String usercaseId = multipartReq.getParameter("usercaseId");
    String module1 = multipartReq.getParameter("module");
    String assignedTo = multipartReq.getParameter("assignedTo");
    String title = multipartReq.getParameter("title");
    String chongxian = multipartReq.getParameter("chongxian");
    String os = multipartReq.getParameter("os");
    String browser = multipartReq.getParameter("browser");
    String type = multipartReq.getParameter("type");
    String severity = multipartReq.getParameter("severity");
    String keywords = multipartReq.getParameter("keywords");
    String[] version = multipartReq.getParameterValues("version");
    String[] mailto = (String[]) multipartReq.getParameterValues("mailto");

    int size = mailto.length;
    String mail = "";
    String mail1 = "";
    String email = "";
    String email1 = "";
    System.out.println(keywords);
    System.out.println(size);
    for (int j = 0; j < size; j++) {

      System.out.println(" mail to " + mailto[j]);

      User user1 = aService.findById(User.class, Integer.parseInt(mailto[j]));

      if (j == (mailto.length - 1)) {
        email = user1.getEmail();
      } else {
        email = user1.getEmail() + ";";
      }
      email1 = email1 + email;

      if (j == (mailto.length - 1)) {
        mail = user1.getRealName();
      } else {
        mail = user1.getRealName() + ";";
      }
      mail1 = mail1 + mail;
    }

    Module module = aService.findById(Module.class, Integer.parseInt(module1));

    Developer develop = aService.findById(Developer.class, Integer.parseInt(assignedTo));

    UserCase userCase = aService.findById(UserCase.class, Integer.parseInt(usercaseId));

    Bug bug = new Bug();
    bug.setAssignedTo(develop);
    bug.setBrowser(browser);
    bug.setConfirm(false);
    bug.setKeyword(keywords);
    bug.setModule(module);
    bug.setCreatedAt(new Date());
    bug.setCreator(user);
    bug.setMailto(mail1);
    bug.setOs(os);
    bug.setSeverity(Integer.parseInt(severity));
    bug.setTitle(title);
    bug.setType(type);
    bug.setSteps(chongxian);
    bug.setStatus("激活");
    bug.setFromCase(userCase);
    aService.save(bug);

    userCase.setToBug(bug);
    aService.update(userCase);

    History hs = new History();
    hs.setUser(user);
    hs.setObjectId(bug.getBugId());
    hs.setObjectType("bug");
    hs.setOperateTime(new Date());
    hs.setOperation("创建");
    aService.save(hs);

    History hs1 = new History();
    hs1.setUser(user);
    hs1.setObjectId(userCase.getCaseId());
    hs1.setObjectType("usercase");
    hs1.setOperateTime(new Date());
    hs1.setOperation("编辑");
    hs1.setComment("生成BUG");
    aService.save(hs1);

    for (int x = 0; x < version.length; x++) {

      Version ver = aService.findById(Version.class, Integer.parseInt(version[x]));

      AffectedVersion av = new AffectedVersion();
      av.setBug(bug);
      av.setVersion(ver);
      aService.save(av);
    }

    List<MultipartFile> files = multipartReq.getFiles("files");
    System.out.println("files size =====" + files.size());
    for (int i = 0; i < files.size(); i++) {
      String[] labels = multipartReq.getParameterValues("labels");
      MultipartFile file = files.get(i);

      String fileName = file.getOriginalFilename();

      if (!fileName.isEmpty()) {
        String filetype = fileName.substring(fileName.lastIndexOf(".") + 1);

        Resource re = new Resource();

        re.setObjectId(bug.getBugId());
        re.setObjectType("bug");
        re.setResourceName(labels[i]);
        re.setResourceUrl("/source/bug/" + UUID.randomUUID() + "." + filetype);

        aService.save(re);

        File destination = new File(destinationDir + UUID.randomUUID() + "." + filetype);

        file.transferTo(destination);
      }
    }
    SendMailService email2 =
        new SendMailService("smtp.qq.com", 25, 0, true, "2424208347", "1136822939", true);
    String url =
        "尊敬的用户您好,"
            + user.getName()
            + "创建了新BUG,并抄送给了你请注意查收,点击<a href='http://*****:*****@qq.com", "BUG管理系统", email1, "通知", url);
      request.setAttribute("note", "尊敬的用户您好," + user.getName() + "创建了新BUG,并抄送给了你请注意查收");
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("send fail");
      request.setAttribute("note", "尊敬的用户,很不幸的消息,由于网络故障,邮件发送失败。");
    }
    return new ModelAndView("redirect:bug.htm");
  }
  @Secured({"ROLE_DEVELOPER", "ROLE_TESTER"})
  @RequestMapping("goeditBug.htm")
  public ModelAndView goeditBug(HttpServletRequest request) {
    String bugId = request.getParameter("bugId");

    Bug bug = aService.findById(Bug.class, Integer.parseInt(bugId));
    Project project = bug.getModule().getProject();
    List<ModuleBean> modulebean = ModuleUtil.getModuleNameList(aService, project);

    Company company = (Company) request.getSession().getAttribute("company");
    DetachedCriteria dCriteria1 = DetachedCriteria.forClass(Project.class);
    dCriteria1
        .add(Restrictions.eq("company", company))
        .add(Restrictions.ne("projectId", project.getProjectId()));
    List<Project> projectList = aService.queryAllOfCondition(Project.class, dCriteria1);

    DetachedCriteria dCriteria2 = DetachedCriteria.forClass(Version.class);
    dCriteria2.add(Restrictions.eq("project", project));
    List<Version> versionList = aService.queryAllOfCondition(Version.class, dCriteria2);

    DetachedCriteria dCriteria3 = DetachedCriteria.forClass(AffectedVersion.class);
    dCriteria3.add(Restrictions.eq("bug", bug));
    List<AffectedVersion> avList = aService.queryAllOfCondition(AffectedVersion.class, dCriteria3);

    List<Version> aList = new ArrayList<Version>();
    for (AffectedVersion aversion : avList) {
      aList.add(aversion.getVersion());
    }

    DetachedCriteria dCriteria5 = DetachedCriteria.forClass(Department.class);
    dCriteria5.add(Restrictions.eq("company", company));
    List<Department> deptList = aService.queryAllOfCondition(Department.class, dCriteria5);

    DetachedCriteria dCriteria4 =
        DetachedCriteria.forClass(Developer.class)
            .add(Restrictions.ne("developerId", bug.getAssignedTo().getDeveloperId()));
    dCriteria4.createCriteria("user").add(Restrictions.in("department", deptList));
    List<Developer> userList = aService.queryAllOfCondition(Developer.class, dCriteria4);

    DetachedCriteria dCriteria7 = DetachedCriteria.forClass(History.class);
    dCriteria7
        .add(Restrictions.eq("objectId", bug.getBugId()))
        .add(Restrictions.eq("objectType", "bug"))
        .addOrder(Order.asc("operateTime"));
    List<History> hisList = aService.queryAllOfCondition(History.class, dCriteria7);

    DetachedCriteria dCriteria6 = DetachedCriteria.forClass(User.class);
    dCriteria6.add(Restrictions.in("department", deptList));
    List<User> userList1 = aService.queryAllOfCondition(User.class, dCriteria6);
    String mailto = bug.getMailto();

    String[] name = mailto.split(";");
    List<User> userlist = new ArrayList<User>();
    for (int i = 0; i < name.length; i++) {
      User user1 = new User();
      user1.setRealName(name[i]);
      userlist.add(user1);
    }
    ModelMap map = new ModelMap();
    map.put("bug", bug);
    map.put("modulebean", modulebean);
    map.put("projectList", projectList);
    map.put("versionList", versionList);
    map.put("userlist", userlist);
    map.put("userList", userList);
    map.put("userList1", userList1);
    map.put("aList", aList);
    map.put("hisList", hisList);

    return new ModelAndView("/bug/editBug", map);
  }