com.silverpeas.thumbnail.control.ThumbnailController.java Source code

Java tutorial

Introduction

Here is the source code for com.silverpeas.thumbnail.control.ThumbnailController.java

Source

/**
 * Copyright (C) 2000 - 2013 Silverpeas
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * As a special exception to the terms and conditions of version 3.0 of
 * the GPL, you may redistribute this Program in connection with Free/Libre
 * Open Source Software ("FLOSS") applications as described in Silverpeas's
 * FLOSS exception.  You should have received a copy of the text describing
 * the FLOSS exception, and it is also available here:
 * "http://www.silverpeas.org/docs/core/legal/floss_exception.html"
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.silverpeas.thumbnail.control;

import com.silverpeas.thumbnail.ThumbnailException;
import com.silverpeas.thumbnail.ThumbnailRuntimeException;
import com.silverpeas.thumbnail.model.ThumbnailDetail;
import com.silverpeas.thumbnail.service.ThumbnailService;
import com.silverpeas.thumbnail.service.ThumbnailServiceFactory;
import com.silverpeas.util.FileUtil;
import com.silverpeas.util.ForeignPK;
import com.silverpeas.util.ImageUtil;
import com.silverpeas.util.StringUtil;
import com.stratelia.silverpeas.silvertrace.SilverTrace;
import com.stratelia.webactiv.util.FileRepositoryManager;
import com.stratelia.webactiv.util.ResourceLocator;
import com.stratelia.webactiv.util.exception.SilverpeasException;
import com.stratelia.webactiv.util.exception.SilverpeasRuntimeException;
import com.stratelia.webactiv.util.fileFolder.FileFolderManager;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.io.FilenameUtils;
import org.silverpeas.file.SilverpeasFile;
import org.silverpeas.file.SilverpeasFileDescriptor;
import org.silverpeas.file.SilverpeasFileProvider;
import org.silverpeas.servlet.FileUploadUtil;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;

public class ThumbnailController {

    private static final ResourceLocator publicationSettings = new ResourceLocator(
            "org.silverpeas.util.publication.publicationSettings", "fr");

    /**
     * the constructor.
     */
    public ThumbnailController() {
    }

    private static ThumbnailService getThumbnailService() {
        return ThumbnailServiceFactory.getThumbnailService();
    }

    public static boolean processThumbnail(ForeignPK pk, String objectType, List<FileItem> parameters)
            throws Exception {
        boolean thumbnailChanged = false;
        String mimeType = null;
        String physicalName = null;
        FileItem uploadedFile = FileUploadUtil.getFile(parameters, "WAIMGVAR0");
        if (uploadedFile != null) {
            String logicalName = uploadedFile.getName().replace('\\', '/');
            if (StringUtil.isDefined(logicalName)) {
                logicalName = FilenameUtils.getName(logicalName);
                mimeType = FileUtil.getMimeType(logicalName);
                String type = FileRepositoryManager.getFileExtension(logicalName);
                if (FileUtil.isImage(logicalName)) {
                    physicalName = String.valueOf(System.currentTimeMillis()) + '.' + type;
                    SilverpeasFileDescriptor descriptor = new SilverpeasFileDescriptor(pk.getInstanceId())
                            .mimeType(mimeType).parentDirectory(publicationSettings.getString("imagesSubDirectory"))
                            .fileName(physicalName);
                    SilverpeasFile target = SilverpeasFileProvider.newFile(descriptor);
                    target.writeFrom(uploadedFile.getInputStream());
                } else {
                    throw new ThumbnailRuntimeException("ThumbnailController.processThumbnail()",
                            SilverpeasRuntimeException.ERROR, "thumbnail_EX_MSG_WRONG_TYPE_ERROR");
                }
            }
        }

        // If no image have been uploaded, check if one have been picked up from a gallery
        if (physicalName == null) {
            // on a pas d'image, regarder s'il y a une provenant de la galerie
            String nameImageFromGallery = FileUploadUtil.getParameter(parameters, "valueImageGallery");
            if (StringUtil.isDefined(nameImageFromGallery)) {
                physicalName = nameImageFromGallery;
                mimeType = "image/jpeg";
            }
        }

        // If one image is defined, save it through Thumbnail service
        if (StringUtil.isDefined(physicalName)) {
            ThumbnailDetail detail = new ThumbnailDetail(pk.getInstanceId(), Integer.parseInt(pk.getId()),
                    ThumbnailDetail.THUMBNAIL_OBJECTTYPE_PUBLICATION_VIGNETTE);
            detail.setOriginalFileName(physicalName);
            detail.setMimeType(mimeType);
            try {
                ThumbnailController.updateThumbnail(detail);
                thumbnailChanged = true;
            } catch (ThumbnailRuntimeException e) {
                SilverTrace.error("thumbnail", "KmeliaRequestRouter.processVignette",
                        "thumbnail_MSG_UPDATE_THUMBNAIL_KO", e);
                try {
                    ThumbnailController.deleteThumbnail(detail);
                } catch (Exception exp) {
                    SilverTrace.info("thumbnail", "KmeliaRequestRouter.processVignette",
                            "thumbnail_MSG_DELETE_THUMBNAIL_KO", exp);
                }
            }
        }
        return thumbnailChanged;
    }

    /**
     * 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);
        }
    }

    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);
        }
    }

    public static ThumbnailDetail createThumbnail(ThumbnailDetail thumbDetail, int thumbnailWidth,
            int thumbnailHeight) {
        try {
            // create line in db
            ThumbnailDetail thumdAdded = getThumbnailService().createThumbnail(thumbDetail);
            // create crop thumbnail
            if (thumdAdded.getCropFileName() == null && thumdAdded.isCropable()) {
                createCropFile(thumbnailWidth, thumbnailHeight, thumdAdded);
            }
            return thumdAdded;
        } catch (Exception e) {
            throw new ThumbnailRuntimeException("ThumbnailController.createThumbnail()",
                    SilverpeasRuntimeException.ERROR, "thumbnail_MSG_CREATE_THUMBNAIL_KO", e);
        }
    }

    public static ThumbnailDetail getCompleteThumbnail(ThumbnailDetail thumbDetail) {
        try {
            // get thumbnail
            return getThumbnailService().getCompleteThumbnail(thumbDetail);
        } catch (Exception e) {
            throw new ThumbnailRuntimeException("ThumbnailController.getCompleteThumbnail()",
                    SilverpeasRuntimeException.ERROR, "thumbnail_MSG_GET_COMPLETE_THUMBNAIL_KO", e);
        }
    }

    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);
        }
    }

    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("/")) {
                    SilverpeasFileProvider fileProvider = SilverpeasFileProvider.getInstance();
                    String path = getImageDirectory(fromPK.getInstanceId()) + File.separatorChar
                            + thumbnail.getOriginalFileName();
                    String destinationPath = getImageDirectory(toPK.getInstanceId());
                    SilverpeasFile image = fileProvider.getSilverpeasFile(path);
                    image.moveInto(destinationPath);

                    // move cropped thumbnail
                    if (thumbnail.getCropFileName() != null) {
                        path = getImageDirectory(fromPK.getInstanceId()) + File.separatorChar
                                + thumbnail.getCropFileName();
                        image = fileProvider.getSilverpeasFile(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);
        }
    }

    private static void deleteThumbnailFileOnServer(String componentId, String fileName) {
        String path = getImageDirectory(componentId) + fileName;
        try {
            SilverpeasFile image = SilverpeasFileProvider.getFile(path);
            image.delete();
        } catch (Exception e) {
            SilverTrace.warn("thumbnail",
                    "ThumbnailController.deleteThumbnailFileOnServer(String componentId, String fileName)",
                    "thumbnail_MSG_NOT_DELETE_FILE", "filePath=" + path, e);
        }
    }

    public static String getImage(String instanceId, int objectId, int objectType) {
        ThumbnailDetail thumbDetail = new ThumbnailDetail(instanceId, objectId, objectType);
        // default size if creation
        String[] imageProps = getImageAndMimeType(thumbDetail);
        return imageProps[0];
    }

    public static String getImageMimeType(String instanceId, int objectId, int objectType) {
        ThumbnailDetail thumbDetail = new ThumbnailDetail(instanceId, objectId, objectType);

        // default size if creation
        String[] imageProps = getImageAndMimeType(thumbDetail);
        return imageProps[1];
    }

    /**
     *
     * @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 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);
    }

    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);
        }
    }

    protected static String getImageDirectory(String instanceId) {
        return FileRepositoryManager.getAbsolutePath(instanceId)
                + publicationSettings.getString("imagesSubDirectory") + File.separatorChar;
    }
}