001/*
002 * (C) Copyright 2015 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 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-2.1.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 *
014 * Contributors:
015 *     Thomas Roger
016 */
017
018package org.nuxeo.ecm.platform.rendition.service;
019
020import java.util.ArrayList;
021import java.util.HashMap;
022import java.util.List;
023import java.util.Map;
024
025import org.jboss.el.ExpressionFactoryImpl;
026import org.nuxeo.ecm.core.api.DocumentModel;
027import org.nuxeo.ecm.platform.actions.ActionContext;
028import org.nuxeo.ecm.platform.actions.ELActionContext;
029import org.nuxeo.ecm.platform.actions.ejb.ActionManager;
030import org.nuxeo.ecm.platform.el.ExpressionContext;
031import org.nuxeo.runtime.api.Framework;
032import org.nuxeo.runtime.model.ContributionFragmentRegistry;
033
034/**
035 * Registry for {@link RenditionDefinitionProviderDescriptor} objects.
036 *
037 * @since 7.2
038 */
039public class RenditionDefinitionProviderRegistry extends
040        ContributionFragmentRegistry<RenditionDefinitionProviderDescriptor> {
041
042    protected Map<String, RenditionDefinitionProviderDescriptor> descriptors = new HashMap<>();
043
044    public List<RenditionDefinition> getRenditionDefinitions(DocumentModel doc) {
045        List<RenditionDefinition> renditionDefinitions = new ArrayList<>();
046
047        for (RenditionDefinitionProviderDescriptor descriptor : descriptors.values()) {
048            if (canUseRenditionDefinitionProvider(descriptor, doc)) {
049                RenditionDefinitionProvider provider = descriptor.getProvider();
050                renditionDefinitions.addAll(provider.getRenditionDefinitions(doc));
051            }
052        }
053
054        return renditionDefinitions;
055    }
056
057    public RenditionDefinition getRenditionDefinition(String name, DocumentModel doc) {
058        List<RenditionDefinition> renditionDefinitions = getRenditionDefinitions(doc);
059        for (RenditionDefinition renditionDefinition : renditionDefinitions) {
060            if (renditionDefinition.getName().equals(name)) {
061                return renditionDefinition;
062            }
063        }
064        return null;
065    }
066
067    protected boolean canUseRenditionDefinitionProvider(
068            RenditionDefinitionProviderDescriptor renditionDefinitionProviderDescriptor, DocumentModel doc) {
069        ActionManager actionService = Framework.getService(ActionManager.class);
070        return actionService.checkFilters(renditionDefinitionProviderDescriptor.getFilterIds(),
071                createActionContext(doc));
072    }
073
074    protected ActionContext createActionContext(DocumentModel doc) {
075        ActionContext actionContext = new ELActionContext(new ExpressionContext(), new ExpressionFactoryImpl());
076        actionContext.setCurrentDocument(doc);
077        actionContext.setDocumentManager(doc.getCoreSession());
078        return actionContext;
079    }
080
081    @Override
082    public String getContributionId(RenditionDefinitionProviderDescriptor contrib) {
083        return contrib.getName();
084    }
085
086    @Override
087    public void contributionUpdated(String id, RenditionDefinitionProviderDescriptor contrib,
088            RenditionDefinitionProviderDescriptor newOrigContrib) {
089        if (contrib.isEnabled()) {
090            descriptors.put(id, contrib);
091        } else {
092            descriptors.remove(id);
093        }
094    }
095
096    @Override
097    public void contributionRemoved(String id, RenditionDefinitionProviderDescriptor contrib) {
098        descriptors.remove(id);
099    }
100
101    @Override
102    public RenditionDefinitionProviderDescriptor clone(RenditionDefinitionProviderDescriptor contrib) {
103        return contrib.clone();
104    }
105
106    @Override
107    public void merge(RenditionDefinitionProviderDescriptor source, RenditionDefinitionProviderDescriptor dest) {
108        if (source.isEnabledSet() && source.isEnabled() != dest.isEnabled()) {
109            dest.setEnabled(source.isEnabled());
110        }
111
112        Class<? extends RenditionDefinitionProvider> providerClass = source.getProviderClass();
113        if (providerClass != null) {
114            dest.setProviderClass(providerClass);
115        }
116
117        List<String> newFilterIds = new ArrayList<>();
118        newFilterIds.addAll(dest.getFilterIds());
119        newFilterIds.addAll(source.getFilterIds());
120        dest.setFilterIds(newFilterIds);
121    }
122}