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}