001/*
002 * (C) Copyright 2012 Nuxeo SAS (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 * Contributors:
014 * Nuxeo - initial API and implementation
015 */
016
017package org.nuxeo.ecm.platform.rendition.action;
018
019import java.io.Serializable;
020import java.util.ArrayList;
021import java.util.Arrays;
022import java.util.List;
023
024import javax.faces.context.FacesContext;
025import javax.servlet.http.HttpServletRequest;
026
027import org.apache.commons.lang.StringUtils;
028import org.jboss.seam.ScopeType;
029import org.jboss.seam.annotations.Factory;
030import org.jboss.seam.annotations.In;
031import org.jboss.seam.annotations.Name;
032import org.jboss.seam.annotations.Scope;
033import org.nuxeo.ecm.core.api.DocumentModel;
034import org.nuxeo.ecm.platform.rendition.Rendition;
035import org.nuxeo.ecm.platform.rendition.service.RenditionDefinition;
036import org.nuxeo.ecm.platform.rendition.service.RenditionService;
037import org.nuxeo.ecm.platform.ui.web.api.NavigationContext;
038import org.nuxeo.ecm.platform.ui.web.util.BaseURL;
039import org.nuxeo.runtime.api.Framework;
040
041/**
042 * Seam bean used to hold Factory used by summary widget
043 *
044 * @author <a href="mailto:tdelprat@nuxeo.com">Tiry</a>
045 */
046@Name("renditionAction")
047@Scope(ScopeType.PAGE)
048public class RenditionActionBean implements Serializable {
049
050    private static final long serialVersionUID = 1L;
051
052    public static final String RENDITION_REST_URL_FORMAT = "%sapi/v1/id/%s/@rendition/%s";
053
054    @In(create = true)
055    protected transient NavigationContext navigationContext;
056
057    @Factory(value = "currentDocumentRenditions", scope = ScopeType.EVENT)
058    public List<Rendition> getCurrentDocumentRenditions() throws Exception {
059        DocumentModel doc = navigationContext.getCurrentDocument();
060        RenditionService rs = Framework.getLocalService(RenditionService.class);
061        return rs.getAvailableRenditions(doc);
062    }
063
064    @Factory(value = "currentDocumentVisibleRenditionDefinitions", scope = ScopeType.EVENT)
065    public List<RenditionDefinition> getVisibleRenditionDefinitions() throws Exception {
066
067        List<RenditionDefinition> result = new ArrayList<>();
068        DocumentModel doc = navigationContext.getCurrentDocument();
069        RenditionService rs = Framework.getLocalService(RenditionService.class);
070        for (RenditionDefinition rd : rs.getAvailableRenditionDefinitions(doc)) {
071            if (rd.isVisible()) {
072                result.add(rd);
073            }
074        }
075        return result;
076    }
077
078    /**
079     * @since 7.3
080     */
081    public List<Rendition> getVisibleRenditions(String excludedKinds) {
082        DocumentModel doc = navigationContext.getCurrentDocument();
083        RenditionService rs = Framework.getLocalService(RenditionService.class);
084        List<Rendition> availableRenditions = rs.getAvailableRenditions(doc, true);
085
086        List<Rendition> filteredRenditions = availableRenditions;
087        if (StringUtils.isNotBlank(excludedKinds)) {
088            filteredRenditions = new ArrayList<>();
089            List<String> excludedKindList = Arrays.asList(excludedKinds.split(","));
090            for (Rendition rendition : availableRenditions) {
091                if (!excludedKindList.contains(rendition.getKind())) {
092                    filteredRenditions.add(rendition);
093                }
094            }
095        }
096        return filteredRenditions;
097    }
098
099    public boolean hasVisibleRenditions(String excludedKinds) {
100        return !getVisibleRenditions(excludedKinds).isEmpty();
101    }
102
103    /**
104     * @since 7.3
105     */
106    public String getRenditionURL(String renditionName) {
107        return getRenditionURL(navigationContext.getCurrentDocument(), renditionName);
108    }
109
110    /**
111     * @since 7.3
112     */
113    public String getRenditionURL(DocumentModel doc, String renditionName) {
114        FacesContext context = FacesContext.getCurrentInstance();
115        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
116        return String.format(RENDITION_REST_URL_FORMAT, BaseURL.getBaseURL(request), doc.getId(), renditionName);
117    }
118}