001/*
002 * (C) Copyright 2015 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Thomas Roger
018 */
019
020package org.nuxeo.ecm.platform.rendition.service;
021
022import java.util.ArrayList;
023import java.util.HashMap;
024import java.util.List;
025import java.util.Map;
026
027import org.nuxeo.ecm.core.api.CoreSession;
028import org.nuxeo.ecm.core.api.DocumentModel;
029import org.nuxeo.ecm.platform.actions.ActionContext;
030import org.nuxeo.ecm.platform.actions.ELActionContext;
031import org.nuxeo.ecm.platform.actions.ejb.ActionManager;
032import org.nuxeo.runtime.api.Framework;
033import org.nuxeo.runtime.model.ContributionFragmentRegistry;
034
035/**
036 * Registry for {@link RenditionDefinitionProviderDescriptor} objects.
037 *
038 * @since 7.2
039 */
040public class RenditionDefinitionProviderRegistry extends
041        ContributionFragmentRegistry<RenditionDefinitionProviderDescriptor> {
042
043    protected Map<String, RenditionDefinitionProviderDescriptor> descriptors = new HashMap<>();
044
045    public List<RenditionDefinition> getRenditionDefinitions(DocumentModel doc) {
046        List<RenditionDefinition> renditionDefinitions = new ArrayList<>();
047
048        for (RenditionDefinitionProviderDescriptor descriptor : descriptors.values()) {
049            if (canUseRenditionDefinitionProvider(descriptor, doc)) {
050                RenditionDefinitionProvider provider = descriptor.getProvider();
051                renditionDefinitions.addAll(provider.getRenditionDefinitions(doc));
052            }
053        }
054
055        return renditionDefinitions;
056    }
057
058    public RenditionDefinition getRenditionDefinition(String name, DocumentModel doc) {
059        List<RenditionDefinition> renditionDefinitions = getRenditionDefinitions(doc);
060        for (RenditionDefinition renditionDefinition : renditionDefinitions) {
061            if (renditionDefinition.getName().equals(name)) {
062                return renditionDefinition;
063            }
064        }
065        return null;
066    }
067
068    protected boolean canUseRenditionDefinitionProvider(
069            RenditionDefinitionProviderDescriptor renditionDefinitionProviderDescriptor, DocumentModel doc) {
070        ActionManager actionService = Framework.getService(ActionManager.class);
071        return actionService.checkFilters(renditionDefinitionProviderDescriptor.getFilterIds(),
072                createActionContext(doc));
073    }
074
075    protected ActionContext createActionContext(DocumentModel doc) {
076        ActionContext actionContext = new ELActionContext();
077        actionContext.setCurrentDocument(doc);
078        CoreSession coreSession = doc.getCoreSession();
079        actionContext.setDocumentManager(coreSession);
080        if (coreSession != null) {
081            actionContext.setCurrentPrincipal(coreSession.getPrincipal());
082        }
083        return actionContext;
084    }
085
086    @Override
087    public String getContributionId(RenditionDefinitionProviderDescriptor contrib) {
088        return contrib.getName();
089    }
090
091    @Override
092    public void contributionUpdated(String id, RenditionDefinitionProviderDescriptor contrib,
093            RenditionDefinitionProviderDescriptor newOrigContrib) {
094        if (contrib.isEnabled()) {
095            descriptors.put(id, contrib);
096        } else {
097            descriptors.remove(id);
098        }
099    }
100
101    @Override
102    public void contributionRemoved(String id, RenditionDefinitionProviderDescriptor contrib) {
103        descriptors.remove(id);
104    }
105
106    @Override
107    public RenditionDefinitionProviderDescriptor clone(RenditionDefinitionProviderDescriptor contrib) {
108        return contrib.clone();
109    }
110
111    @Override
112    public void merge(RenditionDefinitionProviderDescriptor source, RenditionDefinitionProviderDescriptor dest) {
113        if (source.isEnabledSet() && source.isEnabled() != dest.isEnabled()) {
114            dest.setEnabled(source.isEnabled());
115        }
116
117        Class<? extends RenditionDefinitionProvider> providerClass = source.getProviderClass();
118        if (providerClass != null) {
119            dest.setProviderClass(providerClass);
120        }
121
122        List<String> newFilterIds = new ArrayList<>();
123        newFilterIds.addAll(dest.getFilterIds());
124        newFilterIds.addAll(source.getFilterIds());
125        dest.setFilterIds(newFilterIds);
126    }
127}