001/*
002 * Copyright (c) 2006-2013 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     Vladimir Pasquier <vpasquier@nuxeo.com>
011 *     Antoine Taillefer <ataillefer@nuxeo.com>
012 *
013 */
014package org.nuxeo.ecm.platform.thumbnail.factories;
015
016import static org.nuxeo.ecm.platform.thumbnail.ThumbnailConstants.ANY_TO_THUMBNAIL_CONVERTER_NAME;
017
018import java.io.IOException;
019import java.io.InputStream;
020import java.io.Serializable;
021import java.util.HashMap;
022import java.util.Map;
023
024import javax.faces.context.FacesContext;
025
026import org.apache.commons.logging.Log;
027import org.apache.commons.logging.LogFactory;
028import org.nuxeo.ecm.core.api.Blob;
029import org.nuxeo.ecm.core.api.Blobs;
030import org.nuxeo.ecm.core.api.CoreSession;
031import org.nuxeo.ecm.core.api.DocumentModel;
032import org.nuxeo.ecm.core.api.NuxeoException;
033import org.nuxeo.ecm.core.api.PropertyException;
034import org.nuxeo.ecm.core.api.blobholder.BlobHolder;
035import org.nuxeo.ecm.core.api.thumbnail.ThumbnailFactory;
036import org.nuxeo.ecm.core.convert.api.ConversionService;
037import org.nuxeo.ecm.platform.thumbnail.ThumbnailConstants;
038import org.nuxeo.ecm.platform.types.adapter.TypeInfo;
039import org.nuxeo.runtime.api.Framework;
040
041/**
042 * Default thumbnail factory for all non folderish documents Return the main blob converted in thumbnail or get the
043 * document big icon as a thumbnail
044 *
045 * @since 5.7
046 */
047public class ThumbnailDocumentFactory implements ThumbnailFactory {
048
049    private static final Log log = LogFactory.getLog(ThumbnailDocumentFactory.class);
050
051    @Override
052    public Blob getThumbnail(DocumentModel doc, CoreSession session) {
053        Blob thumbnailBlob = null;
054        try {
055            if (doc.hasFacet(ThumbnailConstants.THUMBNAIL_FACET)) {
056                thumbnailBlob = (Blob) doc.getPropertyValue(ThumbnailConstants.THUMBNAIL_PROPERTY_NAME);
057            }
058        } catch (PropertyException e) {
059            log.warn("Could not fetch the thumbnail blob", e);
060        }
061        if (thumbnailBlob == null) {
062            thumbnailBlob = getDefaultThumbnail(doc);
063        }
064        return thumbnailBlob;
065    }
066
067    @Override
068    public Blob computeThumbnail(DocumentModel doc, CoreSession session) {
069        // TODO: convert non pix attachment
070        // Image converter before thumbnail converter
071        // params.put("targetFilePath", "readyToThumbnail.png");
072        // BlobHolder bh = conversionService.convertToMimeType(
073        // ThumbnailConstants.THUMBNAIL_MIME_TYPE, blobHolder,
074        // params);
075        // params.clear();
076        ConversionService conversionService;
077        Blob thumbnailBlob = null;
078        try {
079            conversionService = Framework.getService(ConversionService.class);
080            BlobHolder bh = doc.getAdapter(BlobHolder.class);
081            if (bh != null) {
082                Map<String, Serializable> params = new HashMap<String, Serializable>();
083                // Thumbnail converter
084                params.put(ThumbnailConstants.THUMBNAIL_SIZE_PARAMETER_NAME, ThumbnailConstants.THUMBNAIL_DEFAULT_SIZE);
085                bh = conversionService.convert(ANY_TO_THUMBNAIL_CONVERTER_NAME, bh, params);
086                if (bh != null) {
087                    thumbnailBlob = bh.getBlob();
088                }
089            }
090        } catch (NuxeoException e) {
091            log.warn("Cannot compute document thumbnail", e);
092        }
093        return thumbnailBlob;
094    }
095
096    protected Blob getDefaultThumbnail(DocumentModel doc) {
097        if (doc == null) {
098            return null;
099        }
100        TypeInfo docType = doc.getAdapter(TypeInfo.class);
101        String iconPath = docType.getBigIcon();
102        if (iconPath == null) {
103            iconPath = docType.getIcon();
104        }
105        if (iconPath == null) {
106            return null;
107        }
108        FacesContext ctx = FacesContext.getCurrentInstance();
109        if (ctx == null) {
110            return null;
111        }
112        try {
113            try (InputStream iconStream = ctx.getExternalContext().getResourceAsStream(iconPath)) {
114                if (iconStream != null) {
115                    return Blobs.createBlob(iconStream);
116                }
117            }
118        } catch (IOException e) {
119            log.warn(String.format("Could not fetch the thumbnail blob from icon path '%s'", iconPath), e);
120        }
121        return null;
122    }
123
124}