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