/**
   * @param id
   * @param comment
   * @param siteId
   * @return
   * @throws Throwable
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasBenderPermission('TemplatingDjango', 'Site' , #siteId, @userService.getConnected(), #id)")
  @RequestMapping(value = "/bender/{siteId:.+}/resource/{id}", method = RequestMethod.DELETE)
  @ResponseBody
  public Map<String, Object> deleteResource(
      @PathVariable("id") String id,
      @RequestHeader("Comment") String comment,
      @PathVariable("siteId") String siteId)
      throws Throwable {

    Map<String, Object> result = new HashMap<>();
    Site site = siteService.getSite(siteId);
    if (site == null) {
      throw new ValidationException("le site est inconnu");
    }

    BenderResource resource = benderService.getResourceById(id, null);
    if (resource == null) {
      throw new ValidationException("Le fichier n'existe pas");
    }

    // supprimer la ressource de la base mongo
    benderService.deleteResource(resource, comment);

    result.put("response", true);
    return result;
  }
  /**
   * @param resourceDTO
   * @param siteId
   * @param id
   * @param response
   * @param comment
   * @return
   * @throws com.sfr.tiilta.client.exception.ValidationException
   * @throws java.io.IOException
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasBenderPermission('TemplatingDjango', 'Site' , #siteId, @userService.getConnected(), #id)")
  @RequestMapping(
      value = "/bender/{siteId:.+}/resource/{id}",
      method = RequestMethod.PUT,
      headers = {"content-type=application/json"})
  public ResponseEntity<BenderResource> updateResource(
      @RequestBody @Valid BenderResource resourceDTO,
      @PathVariable("siteId") String siteId,
      @PathVariable("id") String id,
      HttpServletResponse response,
      @RequestParam(value = "comment", required = false) String comment)
      throws ValidationException, IOException {

    ResponseEntity<BenderResource> result =
        new ResponseEntity<>(null, new HttpHeaders(), HttpStatus.BAD_REQUEST);

    boolean isSaved = false;

    Site site = siteService.getSite(siteId);
    if (site == null) {
      throw new ValidationException("le site est inconnu");
    }

    if (resourceDTO != null) {

      User user = userService.getConnected();
      BenderResource originResource = benderService.getResourceById(id, null);

      if (originResource == null) {
        throw new ValidationException("Le fichier n'existe pas");
      }

      resourceDTO.setModifiedBy(user.getName());
      resourceDTO.setUpdateDate(new Date());
      resourceDTO.setSite(siteId);

      // Admin only fields
      if (!tiiltaAuthorization.hasPermission(
          Permission.Admin, Subject.Site, siteId, userService.getConnected())) {

        resourceDTO.setSensitive(originResource.isSensitive());
        resourceDTO.setExecutable(originResource.isExecutable());
        resourceDTO.setExecutorType(originResource.getExecutorType());
      }
      benderService.persist(resourceDTO);

      // récupération de la resource sauvegardée avec la dernière version dans SVN
      result =
          new ResponseEntity<>(
              this.getResourceById(id, null, siteId), new HttpHeaders(), HttpStatus.OK);
    }
    return result;
  }
  /**
   * @param id
   * @param sensitive
   * @return
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasPermission('TemplatingDjango','Site',#siteId, @userService.getConnected())")
  @RequestMapping(
      value = "/bender/{siteId:.+}/resource/{id}/toggle/sensitive/{sensitive}",
      method = RequestMethod.PUT)
  @ResponseBody
  public Map<String, String> toggleSensitiveResource(
      @PathVariable("id") String id,
      @PathVariable("sensitive") boolean sensitive,
      @PathVariable("siteId") String siteId) {

    Map<String, String> result = new HashMap<>();
    boolean toggled = false;

    BenderResource resource = benderService.getResourceById(id, null);
    if (resource != null) {

      resource.setSensitive(sensitive);
      // enregistrement de la ressource dans une base mongo
      provider.persist(resource);
      toggled = true;
    }
    result.put("toggled", String.valueOf(toggled));
    return result;
  }
  /**
   * @param siteId
   * @param env
   * @param version
   * @param id
   * @return
   * @throws ValidationException
   * @throws IOException
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasBenderPermission('TemplatingDjango', 'Site' , #siteId, @userService.getConnected(), #id)")
  @RequestMapping(
      value = "/bender/{siteId:.+}/{env}/resource/{id}/publish",
      method = RequestMethod.PUT)
  @ResponseBody
  public Map<String, Object> publish(
      @PathVariable("siteId") String siteId,
      @PathVariable("env") String env,
      @RequestParam(value = "version", required = false) String version,
      @PathVariable("id") String id)
      throws ValidationException, IOException {

    BenderResource resourceDTO = this.getResourceById(id, version, siteId);

    Site site = siteService.getSite(siteId);
    if (site == null) {
      throw new ValidationException("le site est inconnu");
    }

    if (resourceDTO != null) {
      return benderService.publishResource(site, env, resourceDTO, ncdnClient);
    } else {
      return null;
    }
  }
  /**
   * @param siteId
   * @param id
   * @return
   * @throws com.sfr.tiilta.client.exception.ValidationException
   * @throws java.io.IOException
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasBenderPermission('TemplatingDjango', 'Site' , #siteId, @userService.getConnected(), #id)")
  @RequestMapping(value = "/bender/{siteId:.+}/{env}/resource/{id}/run", method = RequestMethod.PUT)
  @ResponseBody
  public Map<String, Object> run(
      @PathVariable("siteId") String siteId,
      @PathVariable("env") String env,
      @PathVariable("id") String id,
      @RequestParam(value = "version", required = false) String version)
      throws ValidationException, IOException {

    Site site = siteService.getSite(siteId);
    if (site == null) {
      throw new ValidationException("Le site est inconnu");
    }

    boolean isExecuted = false;
    BenderResource resourceDTO = this.getResourceById(id, version, siteId);
    if (resourceDTO != null) {
      isExecuted = benderService.executeResource(site, env, resourceDTO);
    }

    Map<String, Object> result = Maps.newHashMap();
    result.put("isExecuted", isExecuted);
    return result;
  }
  /**
   * @param name
   * @param listType
   * @param sort
   * @param page
   * @param siteId
   * @return
   * @throws ValidationException
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasPermission('TemplatingDjango', @userService.getConnected())")
  @RequestMapping(value = "/bender/{siteId:.+}/resource/search", method = RequestMethod.GET)
  @ResponseBody
  public List<BenderResource> getResourceByNameOrTypes(
      @RequestParam(value = "name") String name,
      @RequestParam(value = "type", required = false) List<String> listType,
      @RequestParam(value = "sort", required = false) List<String> sort,
      @RequestParam(value = "page", required = false) Integer page,
      @PathVariable("siteId") String siteId)
      throws ValidationException {

    Site site = siteService.getSite(siteId);
    if (site == null) {
      throw new ValidationException("le site est inconnu");
    }

    List<BenderResource> listResourceDTO = new ArrayList<>();
    // par défaut on affiche la première page
    if (page == null) {
      page = 0;
    }

    List<BenderResourceDO> listResource =
        benderService.getListResourcesByNameOrType(name, listType, sort, page, siteId);

    for (BenderResourceDO resource : listResource) {
      listResourceDTO.add(BenderResourceDO.getResourceDTO(resource));
    }
    return listResourceDTO;
  }
  /**
   * @param siteId
   * @param id
   * @return
   * @throws ValidationException
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasPermission('TemplatingDjango', @userService.getConnected())")
  @RequestMapping(value = "/bender/{siteId:.+}/resource/{id}/revisions", method = RequestMethod.GET)
  @ResponseBody
  public List<EntityVersionInfo> getListRevision(
      @PathVariable("siteId") String siteId, @PathVariable("id") String id)
      throws ValidationException {

    List<EntityVersionInfo> versionBeans = new ArrayList<>();
    Site site = siteService.getSite(siteId);
    if (site == null) {
      throw new ValidationException("Le site est inconnu");
    }

    BenderResource resourceDTO = new BenderResource();
    resourceDTO = benderService.getResourceById(id, null);
    if (resourceDTO != null) {

      versionBeans.addAll(
          benderService.getListRevision(site.getEditoRootPath(), resourceDTO.getPath(), 10l));
    }
    return versionBeans;
  }
  /**
   * @param resourceDTO
   * @param siteId
   * @param comment
   * @return
   * @throws IOException
   * @throws ValidationException
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasPermission('TemplatingDjango', @userService.getConnected())")
  @RequestMapping(
      value = "/bender/{siteId:.+}/resource",
      method = RequestMethod.POST,
      headers = {"content-type=application/json"})
  public ResponseEntity<BenderResource> createResource(
      @RequestBody @Valid BenderResource resourceDTO,
      @PathVariable("siteId") String siteId,
      @RequestParam(value = "comment", required = false) String comment)
      throws IOException, ValidationException {

    ResponseEntity<BenderResource> result =
        new ResponseEntity<>(null, new HttpHeaders(), HttpStatus.BAD_REQUEST);

    Site site = siteService.getSite(siteId);
    if (site == null) {
      throw new ValidationException("Le site est inconnu");
    }

    User user = userService.getConnected();
    resourceDTO.setSite(siteId);
    resourceDTO.setCreationDate(new Date());
    resourceDTO.setUpdateDate(new Date());
    // set Resource Path
    // format path with Path.get
    resourceDTO.setPath(
        Paths.get(
                resourceDTO.getPath()
                    + File.separator
                    + resourceDTO.getName()
                    + "."
                    + StringUtils.lowerCase(resourceDTO.getType()))
            .toString());
    BenderResource createdResource = benderService.persist(resourceDTO);
    if (createdResource != null)
      result =
          new ResponseEntity<>(
              this.getResourceById(createdResource.getId(), null, siteId),
              new HttpHeaders(),
              HttpStatus.OK);

    return result;
  }
  /**
   * @param id
   * @param version
   * @param siteId
   * @return
   * @throws IOException
   * @throws ValidationException
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasPermission('TemplatingDjango', @userService.getConnected())")
  @RequestMapping(value = "/bender/{siteId:.+}/resource/{id}", method = RequestMethod.GET)
  @ResponseBody
  public BenderResource getResourceById(
      @PathVariable("id") String id,
      @RequestParam(value = "version", required = false) String version,
      @PathVariable("siteId") String siteId)
      throws IOException, ValidationException {

    BenderResource resourceDTO = null;
    Site site = siteService.getSite(siteId);
    if (site == null) {
      throw new ValidationException("Le site est inconnu");
    }
    resourceDTO = benderService.getResourceById(id, version);

    return resourceDTO;
  }
  /**
   * @param siteId
   * @param path
   * @param listType
   * @return
   * @throws ValidationException
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasPermission('TemplatingDjango', @userService.getConnected())")
  @RequestMapping(value = "/bender/{siteId:.+}/resource/browse", method = RequestMethod.GET)
  @ResponseBody
  public List<BenderResource> browseDirectory(
      @PathVariable("siteId") String siteId,
      @RequestParam("path") String path,
      @RequestParam("type") List<String> listType)
      throws ValidationException {

    Site site = siteService.getSite(siteId);
    List<BenderResource> listResource = new ArrayList<>();
    if (site == null) {
      throw new ValidationException("le site est inconnu");
    } else {
      listResource = benderService.browseDirectory(site, path, listType);
    }
    return listResource;
  }
  /**
   * @param siteId
   * @param path
   * @throws ValidationException
   */
  @PreAuthorize(
      "@tiiltaAuthorization.hasPermission('TemplatingDjango', @userService.getConnected())")
  @RequestMapping(value = "/bender/{siteId:.+}/resource/rescan", method = RequestMethod.POST)
  @ResponseStatus(value = HttpStatus.OK)
  public void scanResources(
      @PathVariable("siteId") String siteId,
      @RequestParam(value = "path", required = false) String path)
      throws ValidationException {

    // récupérer le répertoire à scanner
    Site site = siteService.getSite(siteId);
    if (site == null) {
      throw new ValidationException("Le site est inconnu");
    } else {

      LOGGER.info("Démarrage du scan du siteId : {}, path : {}", site.getId(), path);
      benderService.scanLocalResources(site, path);
      LOGGER.info("Fin du scan du siteId : {}, path : {}", site.getId(), path);
    }
  }