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}