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 return actionContext; 078 } 079 080 @Override 081 public String getContributionId(RenditionDefinitionProviderDescriptor contrib) { 082 return contrib.getName(); 083 } 084 085 @Override 086 public void contributionUpdated(String id, RenditionDefinitionProviderDescriptor contrib, 087 RenditionDefinitionProviderDescriptor newOrigContrib) { 088 if (contrib.isEnabled()) { 089 descriptors.put(id, contrib); 090 } else { 091 descriptors.remove(id); 092 } 093 } 094 095 @Override 096 public void contributionRemoved(String id, RenditionDefinitionProviderDescriptor contrib) { 097 descriptors.remove(id); 098 } 099 100 @Override 101 public RenditionDefinitionProviderDescriptor clone(RenditionDefinitionProviderDescriptor contrib) { 102 return contrib.clone(); 103 } 104 105 @Override 106 public void merge(RenditionDefinitionProviderDescriptor source, RenditionDefinitionProviderDescriptor dest) { 107 if (source.isEnabledSet() && source.isEnabled() != dest.isEnabled()) { 108 dest.setEnabled(source.isEnabled()); 109 } 110 111 Class<? extends RenditionDefinitionProvider> providerClass = source.getProviderClass(); 112 if (providerClass != null) { 113 dest.setProviderClass(providerClass); 114 } 115 116 List<String> newFilterIds = new ArrayList<>(); 117 newFilterIds.addAll(dest.getFilterIds()); 118 newFilterIds.addAll(source.getFilterIds()); 119 dest.setFilterIds(newFilterIds); 120 } 121}