001/* 002 * Copyright 2021 Anyware Services 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 */ 016package org.ametys.plugins.workspaces.tags; 017 018import java.util.Collection; 019import java.util.HashMap; 020import java.util.Map; 021import java.util.Map.Entry; 022import java.util.stream.Collectors; 023 024import org.apache.avalon.framework.service.ServiceException; 025import org.apache.avalon.framework.service.ServiceManager; 026import org.apache.avalon.framework.service.Serviceable; 027import org.apache.commons.lang3.StringUtils; 028 029import org.ametys.cms.tag.AbstractTagProvider; 030import org.ametys.cms.tag.CMSTag; 031import org.ametys.cms.tag.DefaultTag; 032import org.ametys.cms.tag.TagTargetType; 033import org.ametys.cms.tag.TagTargetTypeExtensionPoint; 034 035/** 036 * Class representing projects' tags as CMS tag provider. 037 * This directly use {@link ProjectJCRTagProvider} and transform the projects' tags in {@link CMSTag} 038 */ 039public class ProjectCMSTagProvider extends AbstractTagProvider<CMSTag> implements Serviceable 040{ 041 /** Target types */ 042 protected TagTargetTypeExtensionPoint _targetTypeEP; 043 044 /** Category tag provider */ 045 protected ProjectTagProviderExtensionPoint _projectTagProviderEP; 046 047 /** The JCR category provider */ 048 protected ProjectJCRTagProvider _jcrProjectTagProvider; 049 050 @Override 051 public void service(ServiceManager smanager) throws ServiceException 052 { 053 _targetTypeEP = (TagTargetTypeExtensionPoint) smanager.lookup(TagTargetTypeExtensionPoint.ROLE); 054 _projectTagProviderEP = (ProjectTagProviderExtensionPoint) smanager.lookup(ProjectTagProviderExtensionPoint.ROLE); 055 _jcrProjectTagProvider = (ProjectJCRTagProvider) _projectTagProviderEP.getExtension(ProjectJCRTagProvider.class.getName()); 056 } 057 058 public Map<String, CMSTag> getTags(Map<String, Object> contextualParameters) 059 { 060 Map<String, CMSTag> cmsTags = new HashMap<>(); 061 062 Map<String, DefaultTag> projectTags = _jcrProjectTagProvider.getTags(contextualParameters); 063 064 for (Entry<String, DefaultTag> projectTag : projectTags.entrySet()) 065 { 066 ProjectCMSTag cmsTag = _transformToCMSTag(projectTag.getValue(), contextualParameters); 067 cmsTags.put(cmsTag.getId(), _transformToCMSTag(projectTag.getValue(), contextualParameters)); 068 } 069 070 return cmsTags; 071 } 072 073 public CMSTag getTag(String tagName, Map<String, Object> contextualParameters) 074 { 075 String projectTagName = tagName; 076 if (projectTagName.startsWith(ProjectCMSTag.TAG_PREFIX)) 077 { 078 projectTagName = StringUtils.substringAfter(tagName, ProjectCMSTag.TAG_PREFIX); 079 } 080 return _transformToCMSTag(_jcrProjectTagProvider.getTag(projectTagName, contextualParameters), contextualParameters); 081 } 082 083 public Collection<CMSTag> getTags(String tagName, Map<String, Object> contextualParameters) 084 { 085 String projectTagName = tagName; 086 if (projectTagName.startsWith(ProjectCMSTag.TAG_PREFIX)) 087 { 088 projectTagName = StringUtils.substringAfter(tagName, ProjectCMSTag.TAG_PREFIX); 089 } 090 Collection<DefaultTag> projectTags = _jcrProjectTagProvider.getTags(projectTagName, contextualParameters); 091 092 return projectTags.stream() 093 .map(tag -> _transformToCMSTag(tag, contextualParameters)) 094 .collect(Collectors.toList()); 095 } 096 097 public boolean hasTag(String tagName, Map<String, Object> contextualParameters) 098 { 099 String projectTagName = tagName; 100 if (projectTagName.startsWith(ProjectCMSTag.TAG_PREFIX)) 101 { 102 projectTagName = StringUtils.substringAfter(tagName, ProjectCMSTag.TAG_PREFIX); 103 } 104 return _jcrProjectTagProvider.hasTag(projectTagName, contextualParameters); 105 } 106 107 /** 108 * Transform a project's tag in a {@link CMSTag}, forcing visibility to public and target to CONTENT 109 * @param projectTag the project tag to transform 110 * @param contextualParameters the contextual parameters 111 * @return a {@link CMSTag} with the same values 112 */ 113 protected ProjectCMSTag _transformToCMSTag(DefaultTag projectTag, Map<String, Object> contextualParameters) 114 { 115 if (projectTag != null) 116 { 117 CMSTag parentTag = null; 118 DefaultTag parentProjectTag = projectTag.getParent(); 119 if (parentProjectTag != null) 120 { 121 parentTag = this.getTag(parentProjectTag.getName(), contextualParameters); 122 } 123 124 TagTargetType targetType = _targetTypeEP.getTagTargetType("CONTENT"); 125 126 return new ProjectCMSTag(projectTag, parentTag, targetType); 127 } 128 else 129 { 130 return null; 131 } 132 } 133}