public static ThumbnailDetail cropThumbnail(
     ThumbnailDetail thumbnail, int thumbnailWidth, int thumbnailHeight) {
   try {
     ThumbnailDetail thumbDetailComplete = getThumbnailService().getCompleteThumbnail(thumbnail);
     if (thumbDetailComplete.getCropFileName() != null) {
       // on garde toujours le meme nom de fichier par contre on le supprime
       // puis le recreer avec les nouvelles coordonnees
       deleteThumbnailFileOnServer(
           thumbnail.getInstanceId(), thumbDetailComplete.getCropFileName());
     } else {
       // case creation
       String extension = FilenameUtils.getExtension(thumbDetailComplete.getOriginalFileName());
       String cropFileName = String.valueOf(new Date().getTime()) + '.' + extension;
       thumbDetailComplete.setCropFileName(cropFileName);
     }
     String pathCropdir = getImageDirectory(thumbnail.getInstanceId());
     String pathOriginalFile = pathCropdir + thumbDetailComplete.getOriginalFileName();
     String pathCropFile = pathCropdir + thumbDetailComplete.getCropFileName();
     createCropThumbnailFileOnServer(
         pathOriginalFile, pathCropdir, pathCropFile, thumbnail, thumbnailWidth, thumbnailHeight);
     thumbDetailComplete.setXStart(thumbnail.getXStart());
     thumbDetailComplete.setXLength(thumbnail.getXLength());
     thumbDetailComplete.setYStart(thumbnail.getYStart());
     thumbDetailComplete.setYLength(thumbnail.getYLength());
     getThumbnailService().updateThumbnail(thumbDetailComplete);
     return thumbDetailComplete;
   } catch (Exception e) {
     throw new ThumbnailRuntimeException(
         "ThumbnailController.cropThumbnail()",
         SilverpeasRuntimeException.ERROR,
         "thumbnail_MSG_GET_IMAGE_KO",
         e);
   }
 }
  private static void createCropFile(
      int thumbnailWidth, int thumbnailHeight, ThumbnailDetail thumbDetailComplete)
      throws IOException, ThumbnailException {

    String pathOriginalFile =
        getImageDirectory(thumbDetailComplete.getInstanceId())
            + thumbDetailComplete.getOriginalFileName();

    if (thumbnailWidth == -1 && thumbnailHeight != -1) {
      // crop with fix height
      String[] result =
          ImageUtil.getWidthAndHeightByHeight(new File(pathOriginalFile), thumbnailHeight);
      thumbnailWidth = Integer.valueOf(result[0]);
      thumbnailHeight = Integer.valueOf(result[1]);
    } else if (thumbnailHeight == -1 && thumbnailWidth != -1) {
      // crop with fix width
      String[] result =
          ImageUtil.getWidthAndHeightByWidth(new File(pathOriginalFile), thumbnailWidth);
      thumbnailWidth = Integer.valueOf(result[0]);
      thumbnailHeight = Integer.valueOf(result[1]);
    } else if (thumbnailHeight == -1) {
      // crop full file
      String[] result = ImageUtil.getWidthAndHeight(new File(pathOriginalFile));
      thumbnailWidth = Integer.valueOf(result[0]);
      thumbnailHeight = Integer.valueOf(result[1]);
    }

    String extension = FilenameUtils.getExtension(thumbDetailComplete.getOriginalFileName());
    // add 2 to be sure cropfilename is different from original filename
    String cropFileName = String.valueOf(new Date().getTime() + 2) + '.' + extension;
    thumbDetailComplete.setCropFileName(cropFileName);
    // crop sur l image entiere
    cropFromPath(pathOriginalFile, thumbDetailComplete, thumbnailHeight, thumbnailWidth);
  }
  /**
   * To update thumbnails files informations.
   *
   * @param thumbDetail :ThumbnailDetail.
   * @author Sebastien ROCHET
   */
  public static void updateThumbnail(ThumbnailDetail thumbDetail) {

    try {
      ThumbnailDetail completeThumbnail = getThumbnailService().getCompleteThumbnail(thumbDetail);
      // first, delete former thumbnail
      if (completeThumbnail != null) {
        if (completeThumbnail.getCropFileName() != null) {
          deleteThumbnailFileOnServer(
              completeThumbnail.getInstanceId(), completeThumbnail.getCropFileName());
        }
        getThumbnailService().deleteThumbnail(thumbDetail);
      }
      thumbDetail.setCropFileName(null);
      thumbDetail.setXLength(-1);
      thumbDetail.setXStart(-1);
      thumbDetail.setYLength(-1);
      thumbDetail.setYStart(-1);
      getThumbnailService().createThumbnail(thumbDetail);
    } catch (Exception e) {
      throw new ThumbnailRuntimeException(
          "ThumbnailController.updateThumbnail()",
          SilverpeasRuntimeException.ERROR,
          "thumbnail_MSG_UPDATE_THUMBNAIL_KO",
          e);
    }
  }
  protected static void cropFromPath(
      String pathOriginalFile,
      ThumbnailDetail thumbDetailComplete,
      int thumbnailHeight,
      int thumbnailWidth)
      throws IOException, ThumbnailException {
    File originalFile = new File(pathOriginalFile);
    BufferedImage bufferOriginal = ImageIO.read(originalFile);
    if (bufferOriginal == null) {
      SilverTrace.error(
          "thumbnail",
          "ThumbnailController.cropFromPath(int thumbnailWidth, "
              + "int thumbnailHeight,ThumbnailDetail thumbDetailComplete)",
          "thumbnail.EX_MSG_NOT_AN_IMAGE",
          "pathOriginalFile=" + pathOriginalFile);
      throw new ThumbnailException(
          "ThumbnailBmImpl.cropFromPath()",
          SilverpeasException.ERROR,
          "thumbnail.EX_MSG_NOT_AN_IMAGE");
    } else {
      thumbDetailComplete.setXStart(0);
      thumbDetailComplete.setYStart(0);
      thumbDetailComplete.setXLength(bufferOriginal.getWidth());
      thumbDetailComplete.setYLength(bufferOriginal.getHeight());

      String pathCropFile =
          getImageDirectory(thumbDetailComplete.getInstanceId())
              + thumbDetailComplete.getCropFileName();
      createCropThumbnailFileOnServer(
          pathOriginalFile,
          getImageDirectory(thumbDetailComplete.getInstanceId()),
          pathCropFile,
          thumbDetailComplete,
          thumbnailWidth,
          thumbnailHeight);
      getThumbnailService().updateThumbnail(thumbDetailComplete);
    }
  }
  public static void deleteThumbnail(ThumbnailDetail thumbDetail) {

    try {
      // delete the file on server
      ThumbnailDetail completeThumbnail = getThumbnailService().getCompleteThumbnail(thumbDetail);
      if (completeThumbnail != null) {
        if (completeThumbnail.getOriginalFileName() != null) {
          deleteThumbnailFileOnServer(
              completeThumbnail.getInstanceId(), completeThumbnail.getOriginalFileName());
        }
        if (completeThumbnail.getCropFileName() != null) {
          deleteThumbnailFileOnServer(
              completeThumbnail.getInstanceId(), completeThumbnail.getCropFileName());
        }
        getThumbnailService().deleteThumbnail(thumbDetail);
      }
    } catch (Exception fe) {
      throw new ThumbnailRuntimeException(
          "ThumbnailController.deleteThumbnail(ThumbnailDetail thumbDetail)",
          SilverpeasRuntimeException.ERROR,
          "thumbnail_MSG_DELETE_THUMBNAIL_KO",
          fe);
    }
  }