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}