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);
  }
  public static void copyThumbnail(ForeignPK fromPK, ForeignPK toPK) {
    ThumbnailDetail vignette =
        ThumbnailController.getCompleteThumbnail(
            new ThumbnailDetail(
                fromPK.getInstanceId(),
                Integer.parseInt(fromPK.getId()),
                ThumbnailDetail.THUMBNAIL_OBJECTTYPE_PUBLICATION_VIGNETTE));
    try {
      if (vignette != null) {
        ThumbnailDetail thumbDetail =
            new ThumbnailDetail(
                toPK.getInstanceId(),
                Integer.valueOf(toPK.getId()),
                ThumbnailDetail.THUMBNAIL_OBJECTTYPE_PUBLICATION_VIGNETTE);
        if (vignette.getOriginalFileName().startsWith("/")) {
          thumbDetail.setOriginalFileName(vignette.getOriginalFileName());
          thumbDetail.setMimeType(vignette.getMimeType());
        } else {
          String from = getImageDirectory(fromPK.getInstanceId()) + vignette.getOriginalFileName();

          String type = FilenameUtils.getExtension(vignette.getOriginalFileName());
          String newOriginalImage = String.valueOf(System.currentTimeMillis()) + "." + type;

          String to = getImageDirectory(toPK.getInstanceId()) + newOriginalImage;
          FileRepositoryManager.copyFile(from, to);
          thumbDetail.setOriginalFileName(newOriginalImage);

          // then copy thumbnail image if exists
          if (vignette.getCropFileName() != null) {
            from = getImageDirectory(fromPK.getInstanceId()) + vignette.getCropFileName();
            type = FilenameUtils.getExtension(vignette.getCropFileName());
            String newThumbnailImage = String.valueOf(System.currentTimeMillis()) + "." + type;
            to = getImageDirectory(toPK.getInstanceId()) + newThumbnailImage;
            FileRepositoryManager.copyFile(from, to);
            thumbDetail.setCropFileName(newThumbnailImage);
          }
          thumbDetail.setMimeType(vignette.getMimeType());
          thumbDetail.setXLength(vignette.getXLength());
          thumbDetail.setYLength(vignette.getYLength());
          thumbDetail.setXStart(vignette.getXStart());
          thumbDetail.setYStart(vignette.getYStart());
        }
        getThumbnailService().createThumbnail(thumbDetail);
      }
    } catch (Exception e) {
      throw new ThumbnailRuntimeException(
          "ThumbnailController.copyThumbnail()",
          SilverpeasRuntimeException.ERROR,
          "thumbnail_CANT_COPY_THUMBNAIL",
          e);
    }
  }
 /**
  * @param thumbDetail
  * @return
  */
 public static String[] getImageAndMimeType(ThumbnailDetail thumbDetail) {
   try {
     ThumbnailDetail thumbDetailComplete = getThumbnailService().getCompleteThumbnail(thumbDetail);
     if (thumbDetailComplete != null) {
       if (thumbDetailComplete.getCropFileName() != null) {
         return new String[] {
           thumbDetailComplete.getCropFileName(), thumbDetailComplete.getMimeType()
         };
       } else {
         return new String[] {
           thumbDetailComplete.getOriginalFileName(), thumbDetailComplete.getMimeType()
         };
       }
     } else {
       // case no thumbnail define
       return new String[] {null, null};
     }
   } catch (Exception e) {
     throw new ThumbnailRuntimeException(
         "ThumbnailController.getCompleteThumbnail()",
         SilverpeasRuntimeException.ERROR,
         "thumbnail_MSG_GET_IMAGE_KO",
         e);
   }
 }
  public static void moveThumbnail(ForeignPK fromPK, ForeignPK toPK) {
    ThumbnailDetail thumbnail =
        ThumbnailController.getCompleteThumbnail(
            new ThumbnailDetail(
                fromPK.getInstanceId(),
                Integer.parseInt(fromPK.getId()),
                ThumbnailDetail.THUMBNAIL_OBJECTTYPE_PUBLICATION_VIGNETTE));
    try {
      if (thumbnail != null) {
        // move thumbnail on disk
        if (!thumbnail.getOriginalFileName().startsWith("/")) {
          String path =
              getImageDirectory(fromPK.getInstanceId())
                  + File.separatorChar
                  + thumbnail.getOriginalFileName();
          String destinationPath = getImageDirectory(toPK.getInstanceId());
          SilverpeasFile image = SilverpeasFileProvider.getFile(path);
          image.moveInto(destinationPath);

          // move cropped thumbnail
          if (thumbnail.getCropFileName() != null) {
            path =
                getImageDirectory(fromPK.getInstanceId())
                    + File.separatorChar
                    + thumbnail.getCropFileName();
            image = SilverpeasFileProvider.getFile(path);
            image.moveInto(destinationPath);
          }
        }

        // move thumbnail in DB
        getThumbnailService().moveThumbnail(thumbnail, toPK.getInstanceId());
      }
    } catch (Exception e) {
      throw new ThumbnailRuntimeException(
          "ThumbnailController.moveThumbnail()",
          SilverpeasRuntimeException.ERROR,
          "thumbnail_CANT_MOVE_THUMBNAIL",
          e);
    }
  }
  protected static void createCropThumbnailFileOnServer(
      String pathOriginalFile,
      String pathCropdir,
      String pathCropFile,
      ThumbnailDetail thumbnail,
      int thumbnailWidth,
      int thumbnailHeight) {
    try {
      // Creates folder if not exists
      File dir = new File(pathCropdir);
      if (!dir.exists()) {
        FileFolderManager.createFolder(pathCropdir);
      }
      // create empty file
      File cropFile = new File(pathCropFile);
      if (!cropFile.exists()) {
        cropFile.createNewFile();
      }

      File originalFile = new File(pathOriginalFile);
      BufferedImage bufferOriginal = ImageIO.read(originalFile);
      // crop image
      BufferedImage cropPicture =
          bufferOriginal.getSubimage(
              thumbnail.getXStart(),
              thumbnail.getYStart(),
              thumbnail.getXLength(),
              thumbnail.getYLength());
      BufferedImage cropPictureFinal =
          new BufferedImage(thumbnailWidth, thumbnailHeight, BufferedImage.TYPE_INT_RGB);
      // Redimensionnement de l'image
      Graphics2D g2 = cropPictureFinal.createGraphics();
      g2.setRenderingHint(
          RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
      g2.drawImage(cropPicture, 0, 0, thumbnailWidth, thumbnailHeight, null);
      g2.dispose();

      // save crop image
      String extension = FilenameUtils.getExtension(originalFile.getName());
      ImageIO.write(cropPictureFinal, extension, cropFile);
    } catch (Exception e) {
      SilverTrace.warn(
          "thumbnail",
          "ThumbnailController.createThumbnailFileOnServer()",
          "thumbnail_MSG_CREATE_CROP_FILE_KO",
          "originalFileName="
              + thumbnail.getOriginalFileName()
              + " cropFileName = "
              + thumbnail.getCropFileName(),
          e);
    }
  }
  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);
    }
  }