/**
   * Get the details of given path.
   *
   * @param user user
   * @param path user
   * @param revision revision. -1 if HEAD
   * @param model model
   * @return script/scriptEditor
   */
  @RequestMapping("/detail/**")
  public String getDetail(
      User user,
      @RemainedPath String path,
      @RequestParam(value = "r", required = false) Long revision,
      ModelMap model) {
    FileEntry script = fileEntryService.getFileEntry(user, path, revision);
    if (script == null || !script.getFileType().isEditable()) {
      LOG.error(
          "Error while getting file detail on {}. the file does not exist or not editable", path);
      model.clear();
      return "redirect:/script/list";
    }
    model.addAttribute("file", script);
    model.addAttribute("ownerId", user.getUserId());

    return "script/scriptEditor";
  }
 /**
  * Upload files.
  *
  * @param user current user
  * @param path path
  * @param description description
  * @param file multipart file
  * @param model model
  * @return script/scriptList
  */
 @RequestMapping(value = "/upload/**", method = RequestMethod.POST)
 public String uploadFiles(
     User user,
     @RemainedPath String path,
     @RequestParam("description") String description,
     @RequestParam("uploadFile") MultipartFile file,
     ModelMap model) {
   try {
     FileEntry fileEntry = new FileEntry();
     if (fileEntry.getFileType().isEditable()) {
       fileEntry.setContent(new String(file.getBytes()));
     } else {
       fileEntry.setContentBytes(file.getBytes());
     }
     fileEntry.setDescription(description);
     fileEntry.setPath(
         FilenameUtils.separatorsToUnix(FilenameUtils.concat(path, file.getOriginalFilename())));
     fileEntryService.save(user, fileEntry);
     return "redirect:/script/list/" + path;
   } catch (IOException e) {
     LOG.error("Error while getting file content:" + e.getMessage(), e);
     throw new NGrinderRuntimeException("Error while getting file content:" + e.getMessage(), e);
   }
 }